static int start_gr(void) { if (_gr_fp) { rewind(_gr_fp); #ifdef YP __ypmode = 0; free(__ypcurrent); __ypcurrent = NULL; if (__ypexhead) __ypexclude_free(&__ypexhead); __ypexhead = NULL; #endif return(1); } #ifdef YP /* * Hint to the kernel that a passwd database operation is happening. */ (void)access("/var/run/ypbind.lock", R_OK); #endif return((_gr_fp = fopen(_PATH_GROUP, "re")) ? 1 : 0); }
int setpassent(int stayopen) { _THREAD_PRIVATE_MUTEX_LOCK(pw); _pw_keynum = 0; _pw_stayopen = stayopen; #ifdef YP __ypmode = YPMODE_NONE; free(__ypcurrent); __ypcurrent = NULL; __ypexclude_free(&__ypexhead); __ypproto = NULL; #endif _THREAD_PRIVATE_MUTEX_UNLOCK(pw); return (1); }
static void endgrent_basic(void) { if (_gr_fp) { (void)fclose(_gr_fp); _gr_fp = NULL; #ifdef YP __ypmode = 0; if (__ypcurrent) free(__ypcurrent); __ypcurrent = NULL; if (__ypexhead) __ypexclude_free(&__ypexhead); __ypexhead = NULL; #endif } }
static int start_gr(void) { if (_gr_fp) { rewind(_gr_fp); #ifdef YP __ypmode = 0; if (__ypcurrent) free(__ypcurrent); __ypcurrent = NULL; if (__ypexhead) __ypexclude_free(&__ypexhead); __ypexhead = NULL; #endif return(1); } return((_gr_fp = fopen(_PATH_GROUP, "r")) ? 1 : 0); }
void endpwent(void) { _THREAD_PRIVATE_MUTEX_LOCK(pw); _pw_keynum = 0; if (_pw_db) { (void)(_pw_db->close)(_pw_db); _pw_db = NULL; } #ifdef YP __ypmode = YPMODE_NONE; if (__ypcurrent) free(__ypcurrent); __ypcurrent = NULL; __ypexclude_free(&__ypexhead); __ypproto = NULL; #endif _THREAD_PRIVATE_MUTEX_UNLOCK(pw); }
static void endgrent_basic(void) { int saved_errno; if (_gr_fp) { saved_errno = errno; fclose(_gr_fp); _gr_fp = NULL; #ifdef YP __ypmode = 0; free(__ypcurrent); __ypcurrent = NULL; if (__ypexhead) __ypexclude_free(&__ypexhead); __ypexhead = NULL; #endif errno = saved_errno; } }
static struct passwd * __yppwlookup(int lookup, char *name, uid_t uid, struct passwd *pw, char *buf, size_t buflen, int *flagsp) { char bf[1 + _PW_NAME_LEN], *ypcurrent = NULL, *map = NULL; int yp_pw_flags = 0, ypcurrentlen, r, s = -1, pw_keynum; static long long yppbuf[_PW_BUF_LEN / sizeof(long long)]; struct _ypexclude *ypexhead = NULL; const char *host, *user, *dom; DBT key; for (pw_keynum = 1; pw_keynum; pw_keynum++) { bf[0] = _PW_KEYBYNUM; bcopy((char *)&pw_keynum, &bf[1], sizeof(pw_keynum)); key.data = (u_char *)bf; key.size = 1 + sizeof(pw_keynum); if (__hashpw(&key, buf, buflen, pw, flagsp) == 0) break; switch (pw->pw_name[0]) { case '+': if (!__ypdomain) { if (_yp_check(&__ypdomain) == 0) continue; } __ypproto_set(pw, yppbuf, *flagsp, &yp_pw_flags); if (!map) { if (lookup == LOOKUP_BYNAME) { map = PASSWD_BYNAME; name = strdup(name); } else { map = PASSWD_BYUID; asprintf(&name, "%u", uid); } } switch (pw->pw_name[1]) { case '\0': if (ypcurrent) { free(ypcurrent); ypcurrent = NULL; } r = yp_match(__ypdomain, map, name, strlen(name), &ypcurrent, &ypcurrentlen); if (r != 0 || ypcurrentlen > buflen) { if (ypcurrent) free(ypcurrent); ypcurrent = NULL; continue; } break; case '@': pwnam_netgrp: if (ypcurrent) { free(ypcurrent); ypcurrent = NULL; } if (s == -1) /* first time */ setnetgrent(pw->pw_name + 2); s = getnetgrent(&host, &user, &dom); if (s == 0) { /* end of group */ endnetgrent(); s = -1; continue; } else { if (user && *user) { r = yp_match(__ypdomain, map, user, strlen(user), &ypcurrent, &ypcurrentlen); } else goto pwnam_netgrp; if (r != 0 || ypcurrentlen > buflen) { if (ypcurrent) free(ypcurrent); ypcurrent = NULL; /* * just because this * user is bad, doesn't * mean they all are. */ goto pwnam_netgrp; } } break; default: if (ypcurrent) { free(ypcurrent); ypcurrent = NULL; } user = pw->pw_name + 1; r = yp_match(__ypdomain, map, user, strlen(user), &ypcurrent, &ypcurrentlen); if (r != 0 || ypcurrentlen > buflen) { if (ypcurrent) free(ypcurrent); ypcurrent = NULL; continue; } break; } bcopy(ypcurrent, buf, ypcurrentlen); buf[ypcurrentlen] = '\0'; if (__ypparse(pw, buf, yp_pw_flags) || __ypexclude_is(&ypexhead, pw->pw_name)) { if (s == 1) /* inside netgrp */ goto pwnam_netgrp; continue; } break; case '-': /* attempted exclusion */ switch (pw->pw_name[1]) { case '\0': break; case '@': setnetgrent(pw->pw_name + 2); while (getnetgrent(&host, &user, &dom)) { if (user && *user) __ypexclude_add(&ypexhead, user); } endnetgrent(); break; default: __ypexclude_add(&ypexhead, pw->pw_name + 1); break; } break; } if ((lookup == LOOKUP_BYUID && pw->pw_uid == uid) || (lookup == LOOKUP_BYNAME && strcmp(pw->pw_name, name) == 0)) goto done; if (s == 1) /* inside netgrp */ goto pwnam_netgrp; continue; } pw = NULL; done: __ypexclude_free(&ypexhead); __ypproto = NULL; if (ypcurrent) free(ypcurrent); ypcurrent = NULL; if (map) free(name); return (pw); }