int __nsw_freeconfig(struct __nsw_switchconfig *conf) { struct cons_cell *cellp; if (conf == NULL) { return (-1); } /* * Hacked to make life easy for the code in nss_common.c. Free conf * iff it was created by calling _nsw_getoneconfig() directly * rather than by calling nsw_getconfig. */ lmutex_lock(&serialize_config); for (cellp = concell_list; cellp; cellp = cellp->next) { if (cellp->sw == conf) { break; } } lmutex_unlock(&serialize_config); if (cellp == NULL) { /* Not in the cache; free it */ freeconf(conf); return (1); } else { /* In the cache; don't free it */ return (0); } }
int reload (void){ FILE *fp; int error = -2; conf.paused++; freeconf(&conf); conf.paused++; fp = confopen(); if(fp){ error = readconfig(fp); if(error) { freeconf(&conf); } if(!writable)fclose(fp); } return error; }
/* * Private interface used by nss_common.c, hence this function is not static */ struct __nsw_switchconfig * _nsw_getoneconfig(const char *name, char *linep, enum __nsw_parse_err *errp) /* linep Nota Bene: not const char * */ /* errp Meanings are abused a bit */ { struct __nsw_switchconfig *cfp; struct __nsw_lookup *lkp, **lkq; int end_crit, dup_fail = 0; action_t act; char *p, *tokenp; *errp = __NSW_CONF_PARSE_SUCCESS; if ((cfp = libc_malloc(sizeof (struct __nsw_switchconfig))) == NULL) { *errp = __NSW_CONF_PARSE_SYSERR; return (NULL); } LIBC_STRDUP(cfp->dbase, name); lkq = &cfp->lookups; /* linep points to a naming service name */ for (;;) { int i; /* white space following the last service */ if (*linep == '\0' || *linep == '\n') { return (cfp); } if ((lkp = libc_malloc(sizeof (struct __nsw_lookup))) == NULL) { *errp = __NSW_CONF_PARSE_SYSERR; freeconf(cfp); return (NULL); } *lkq = lkp; lkq = &lkp->next; for (i = 0; i < __NSW_STD_ERRS; i++) if (i == __NSW_SUCCESS) lkp->actions[i] = 1; else lkp->actions[i] = 0; /* get criteria for the naming service */ if (tokenp = skip(&linep, '[')) { /* got criteria */ /* premature end, illegal char following [ */ if (!islabel(*linep)) goto barf_line; LIBC_STRDUP(lkp->service_name, tokenp); cfp->num_lookups++; end_crit = 0; /* linep points to a switch_err */ for (;;) { if ((tokenp = skip(&linep, '=')) == NULL) { goto barf_line; } /* premature end, ill char following = */ if (!islabel(*linep)) goto barf_line; /* linep points to the string following '=' */ p = labelskip(linep); if (*p == ']') end_crit = 1; else if (*p != ' ' && *p != '\t') goto barf_line; *p++ = '\0'; /* null terminate linep */ p = spaceskip(p); if (!end_crit) { if (*p == ']') { end_crit = 1; *p++ = '\0'; } else if (*p == '\0' || *p == '\n') return (cfp); else if (!islabel(*p)) /* p better be the next switch_err */ goto barf_line; } if (strcasecmp(linep, __NSW_STR_RETURN) == 0) act = __NSW_RETURN; else if (strcasecmp(linep, __NSW_STR_CONTINUE) == 0) act = __NSW_CONTINUE; else if (strcasecmp(linep, __NSW_STR_FOREVER) == 0) /* * =forever or =N might be in conf file * but old progs won't expect it. */ act = __NSW_RETURN; else if (alldigits(linep)) act = __NSW_CONTINUE; else goto barf_line; if (strcasecmp(tokenp, __NSW_STR_SUCCESS) == 0) { lkp->actions[__NSW_SUCCESS] = act; } else if (strcasecmp(tokenp, __NSW_STR_NOTFOUND) == 0) { lkp->actions[__NSW_NOTFOUND] = act; } else if (strcasecmp(tokenp, __NSW_STR_UNAVAIL) == 0) { lkp->actions[__NSW_UNAVAIL] = act; } else if (strcasecmp(tokenp, __NSW_STR_TRYAGAIN) == 0) { lkp->actions[__NSW_TRYAGAIN] = act; } else { /*EMPTY*/ /* * convert string tokenp to integer * and put in long_errs */ } if (end_crit) { linep = spaceskip(p); if (*linep == '\0' || *linep == '\n') return (cfp); break; /* process next naming service */ } linep = p; } /* end of while loop for a name service's criteria */ } else { /* * no criteria for this naming service. * linep points to name service, but not null * terminated. */ p = labelskip(linep); if (*p == '\0' || *p == '\n') { *p = '\0'; LIBC_STRDUP(lkp->service_name, linep); cfp->num_lookups++; return (cfp); } if (*p != ' ' && *p != '\t') goto barf_line; *p++ = '\0'; LIBC_STRDUP(lkp->service_name, linep); cfp->num_lookups++; linep = spaceskip(p); } } /* end of while(1) loop for a name service */ barf_line: freeconf(cfp); *errp = dup_fail ? __NSW_CONF_PARSE_SYSERR : __NSW_CONF_PARSE_NOPOLICY; return (NULL); }