summaryrefslogtreecommitdiff
path: root/lib/libpthread/gen/getpwent.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpthread/gen/getpwent.c')
-rw-r--r--lib/libpthread/gen/getpwent.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/lib/libpthread/gen/getpwent.c b/lib/libpthread/gen/getpwent.c
new file mode 100644
index 00000000000..7bcb2cbd610
--- /dev/null
+++ b/lib/libpthread/gen/getpwent.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 1984 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[] = "@(#)getpwent.c 5.2 (Berkeley) 3/9/86";
+#endif
+
+#include <pthread.h>
+#include <stdio.h>
+#include <pwd.h>
+#include "pwd_internal.h"
+
+void
+setpwent()
+{
+ pwf_context_t *_data;
+
+ _data = _pw_get_data();
+
+ if (_data) {
+ if (_data->pwf == NULL)
+ _data->pwf = fopen(_data->pw_file, "r");
+ else
+ rewind(_data->pwf);
+ }
+}
+
+void
+endpwent()
+{
+ pwf_context_t *_data;
+
+ _data = _pw_get_data();
+
+ if (_data) {
+ if (_data->pwf != NULL) {
+ fclose(_data->pwf);
+ _data->pwf = NULL;
+ }
+#ifdef DBM_PWD_SUPPORT
+ if (_data->pw_db != (DBM *)0) {
+ dbm_close(_data->pw_db);
+ _data->pw_db = (DBM *)0;
+ _data->pw_stayopen = 0;
+ }
+#endif /* DBM_PWD_SUPPORT */
+ }
+}
+
+static char *
+pwskip(p)
+ char *p;
+{
+ while (*p && *p != ':' && *p != '\n')
+ ++p;
+ if (*p)
+ *p++ = 0;
+ return(p);
+}
+
+struct passwd *
+getpwent()
+{
+ pwf_context_t *_data;
+ char *p;
+
+ _data = _pw_get_data();
+ if (!_data)
+ return 0;
+
+ if (_data->pwf == NULL) {
+ if ((_data->pwf = fopen(_data->pw_file, "r" )) == NULL)
+ return(0);
+ }
+ p = fgets(_data->line, BUFSIZ, _data->pwf);
+ if (p == NULL)
+ return(0);
+ _data->passwd.pw_name = p;
+ p = pwskip(p);
+ _data->passwd.pw_passwd = p;
+ p = pwskip(p);
+ _data->passwd.pw_uid = atoi(p);
+ p = pwskip(p);
+ _data->passwd.pw_gid = atoi(p);
+ p = pwskip(p);
+ _data->passwd.pw_gecos = p;
+ p = pwskip(p);
+ _data->passwd.pw_dir = p;
+ p = pwskip(p);
+ _data->passwd.pw_shell = p;
+ while (*p && *p != '\n')
+ p++;
+ *p = '\0';
+ return(&_data->passwd);
+}
+
+void
+setpwfile(file)
+ char *file;
+{
+ pwf_context_t *_data;
+
+ _data = _pw_get_data();
+ if (_data)
+ _data->pw_file = file;
+}