diff options
Diffstat (limited to 'mit-pthreads/gen/getpwnamuid.c')
-rw-r--r-- | mit-pthreads/gen/getpwnamuid.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/mit-pthreads/gen/getpwnamuid.c b/mit-pthreads/gen/getpwnamuid.c new file mode 100644 index 00000000000..0e87081b7a9 --- /dev/null +++ b/mit-pthreads/gen/getpwnamuid.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getpwnamuid.c 5.3 (Berkeley) 12/21/87"; +#endif + +#include <stdio.h> +#include <pwd.h> +#include <sys/file.h> +#include "pwd_internal.h" + +/* + * The following are shared with getpwent.c + */ + +#ifdef DBM_PWD_SUPPORT +static struct passwd * +fetchpw(key) + datum key; +{ + char *cp, *tp; + pwf_context_t *_data; + + _data = _pw_get_data(); + if (!_data) + return 0; + if (key.dptr == 0) + return ((struct passwd *)NULL); + key = dbm_fetch(_data->pw_db, key); + if (key.dptr == 0) + return ((struct passwd *)NULL); + cp = key.dptr; + tp = _data->line; + +#define EXPAND(e) _data->passwd.e = tp; while (*tp++ = *cp++); + EXPAND(pw_name); + EXPAND(pw_passwd); + memcpy((char *)&_data->passwd.pw_uid, cp, sizeof (int)); + cp += sizeof (int); + memcpy((char *)&_data->passwd.pw_gid, cp, sizeof (int)); + cp += sizeof (int); + EXPAND(pw_gecos); + EXPAND(pw_dir); + EXPAND(pw_shell); + return (&_data->passwd); +} +#endif /* DBM_PWD_SUPPORT */ + +struct passwd * +getpwnam(nam) + const char *nam; +{ +#ifdef DBM_PWD_SUPPORT + datum key; +#endif + struct passwd *pw, *getpwent(); + pwf_context_t *_data; + + _data = _pw_get_data(); + if (!_data) + return 0; + +#ifdef DBM_PWD_SUPPORT + if (_data->pw_db == (DBM *)0 && + (_data->pw_db = dbm_open(_data->pw_file, O_RDONLY)) == (DBM *)0) { + oldcode: +#endif + setpwent(); + while ((pw = getpwent()) && strcmp(nam, pw->pw_name)) + ; + if (!_data->pw_stayopen) + endpwent(); + return (pw); +#ifdef DBM_PWD_SUPPORT + } + if (flock(dbm_dirfno(_data->pw_db), LOCK_SH) < 0) { + dbm_close(_data->pw_db); + _data->pw_db = (DBM *)0; + goto oldcode; + } + key.dptr = nam; + key.dsize = strlen(nam); + pw = fetchpw(key); + (void) flock(dbm_dirfno(_data->pw_db), LOCK_UN); + if (!_data->pw_stayopen) { + dbm_close(_data->pw_db); + _data->pw_db = (DBM *)0; + } + return (pw); +#endif +} + +struct passwd * +getpwuid(uid) + uid_t uid; +{ +#ifdef DBM_PWD_SUPPORT + datum key; +#endif + struct passwd *pw, *getpwent(); + pwf_context_t *_data; + + _data = _pw_get_data(); + if (!_data) + return 0; +#ifdef DBM_PWD_SUPPORT + if (_data->pw_db == (DBM *)0 && + (_data->pw_db = dbm_open(_data->pw_file, O_RDONLY)) == (DBM *)0) { + oldcode: +#endif + setpwent(); + while ((pw = getpwent()) && pw->pw_uid != uid) + ; + if (!_data->pw_stayopen) + endpwent(); + return (pw); +#ifdef DBM_PWD_SUPPORT + } + if (flock(dbm_dirfno(_data->pw_db), LOCK_SH) < 0) { + dbm_close(_data->pw_db); + _data->pw_db = (DBM *)0; + goto oldcode; + } + key.dptr = (char *) &uid; + key.dsize = sizeof uid; + pw = fetchpw(key); + (void) flock(dbm_dirfno(_data->pw_db), LOCK_UN); + if (!_data->pw_stayopen) { + dbm_close(_data->pw_db); + _data->pw_db = (DBM *)0; + } + return (pw); +#endif +} |