summaryrefslogtreecommitdiff
path: root/mit-pthreads/gen/getpwnamuid.c
diff options
context:
space:
mode:
Diffstat (limited to 'mit-pthreads/gen/getpwnamuid.c')
-rw-r--r--mit-pthreads/gen/getpwnamuid.c138
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
+}