/* * This is essentially so that we don't reset known good lookup tables when a * YP server goes down. */ static int plt_reset(void) { int i; clock_valid = 0; /* invalidate logging clock */ hlfsd_setpwent(); if (hlfsd_getpwent() == (struct passwd *) NULL) { hlfsd_endpwent(); return -1; /* did not reset table */ } hlfsd_endpwent(); lastchild = (uid2home_t *) NULL; if (max_pwtab_num > 0) /* was used already. cleanup old table */ for (i = 0; i < cur_pwtab_num; ++i) { if (pwtab[i].home) { XFREE(pwtab[i].home); pwtab[i].home = (char *) NULL; } pwtab[i].uid = INVALIDID; /* not a valid uid (yet...) */ pwtab[i].child = (pid_t) 0; pwtab[i].uname = (char *) NULL; /* only a ptr to untab[i].username */ if (untab[i].username) { XFREE(untab[i].username); untab[i].username = (char *) NULL; } untab[i].uid = INVALIDID; /* invalid uid */ untab[i].home = (char *) NULL; /* only a ptr to pwtab[i].home */ } cur_pwtab_num = 0; /* zero current size */ if (root_home) XFREE(root_home); return 0; /* resetting ok */ }
/* * read and hash the passwd file or NIS map */ void plt_init(void) { struct passwd *pent_p; if (plt_reset() < 0) /* could not reset table. skip. */ return; plog(XLOG_INFO, "reading password map"); hlfsd_setpwent(); /* prepare to read passwd entries */ while ((pent_p = hlfsd_getpwent()) != (struct passwd *) NULL) { table_add(pent_p->pw_uid, pent_p->pw_dir, pent_p->pw_name); if (STREQ("root", pent_p->pw_name)) { int len; if (root_home) XFREE(root_home); root_home = strdup(pent_p->pw_dir); len = strlen(root_home); /* remove any trailing '/' chars from root's home (even if just one) */ while (len > 0 && root_home[len - 1] == '/') { len--; root_home[len] = '\0'; } } } hlfsd_endpwent(); qsort((char *) pwtab, cur_pwtab_num, sizeof(uid2home_t), plt_compare_fxn); qsort((char *) untab, cur_pwtab_num, sizeof(username2uid_t), unt_compare_fxn); if (!root_home) root_home = strdup(""); plog(XLOG_INFO, "password map read and sorted"); }
/* * read and hash the passwd file or NIS map */ void plt_init(void) { struct passwd *pent_p; if (plt_reset() < 0) /* could not reset table. skip. */ return; plog(XLOG_INFO, "reading password map"); hlfsd_setpwent(); /* prepare to read passwd entries */ while ((pent_p = hlfsd_getpwent()) != (struct passwd *) NULL) { table_add(pent_p->pw_uid, pent_p->pw_dir, pent_p->pw_name); } hlfsd_endpwent(); qsort((char *) pwtab, cur_pwtab_num, sizeof(uid2home_t), plt_compare_fxn); qsort((char *) untab, cur_pwtab_num, sizeof(username2uid_t), unt_compare_fxn); plog(XLOG_INFO, "password map read and sorted"); }