int getpwuid_r(uid_t uid, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwretp) { struct passwd *pwret = NULL; int flags = 0, *flagsp; _THREAD_PRIVATE_MUTEX_LOCK(pw); if (!_pw_db && !__initdb()) goto fail; if (pw == &_pw_passwd) flagsp = &_pw_flags; else flagsp = &flags; #ifdef YP if (__has_yppw()) pwret = __yppwlookup(LOOKUP_BYUID, NULL, uid, pw, buf, buflen, flagsp); #endif /* YP */ if (!pwret) pwret = _pwhashbyuid(uid, buf, buflen, pw, flagsp); if (!_pw_stayopen) { (void)(_pw_db->close)(_pw_db); _pw_db = NULL; } fail: if (pwretp) *pwretp = pwret; _THREAD_PRIVATE_MUTEX_UNLOCK(pw); return (pwret ? 0 : 1); }
static int getpwuid_internal(uid_t uid, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwretp, int shadow) { struct passwd *pwret = NULL; int flags = 0, *flagsp; int my_errno = 0; int saved_errno, tmp_errno; _THREAD_PRIVATE_MUTEX_LOCK(pw); saved_errno = errno; errno = 0; if (!_pw_db && !__initdb(shadow)) goto fail; if (pw == &_pw_passwd) flagsp = &_pw_flags; else flagsp = &flags; #ifdef YP if (__has_yppw()) pwret = __yppwlookup(LOOKUP_BYUID, NULL, uid, pw, buf, buflen, flagsp); #endif /* YP */ if (!pwret) pwret = _pwhashbyuid(uid, buf, buflen, pw, flagsp); if (!_pw_stayopen) { tmp_errno = errno; (void)(_pw_db->close)(_pw_db); _pw_db = NULL; errno = tmp_errno; } fail: if (pwretp) *pwretp = pwret; if (pwret == NULL) my_errno = errno; errno = saved_errno; _THREAD_PRIVATE_MUTEX_UNLOCK(pw); return (my_errno); }
int getpwnam_r(const char *name, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwretp) { struct passwd *pwret = NULL; int flags = 0, *flagsp; DB *savedb; _THREAD_PRIVATE_MUTEX_LOCK(pw); savedb = _pw_db; if (!_pw_db && !__initdb()) goto fail; if (pw == &_pw_passwd) flagsp = &_pw_flags; else flagsp = &flags; #ifdef YP if (__has_yppw()) pwret = __yppwlookup(LOOKUP_BYNAME, (char *)name, 0, pw, buf, buflen, flagsp); #endif /* YP */ if (!pwret) pwret = _pwhashbyname(name, buf, buflen, pw, flagsp); if (savedb != _pw_db || !_pw_stayopen) { (void)(_pw_db->close)(_pw_db); _pw_db = NULL; } fail: if (pwretp) *pwretp = pwret; _THREAD_PRIVATE_MUTEX_UNLOCK(pw); return (pwret ? 0 : 1); }