xref: /csrg-svn/lib/libc/gen/getpwent.c (revision 16416)
1 /* @(#)getpwent.c	4.2 (Berkeley) 04/26/84 */
2 #include <stdio.h>
3 #include <pwd.h>
4 #include <ndbm.h>
5 
6 static char PASSWD[]	= "/etc/passwd";
7 static char EMPTY[] = "";
8 static FILE *pwf = NULL;
9 static char line[BUFSIZ+1];
10 static struct passwd passwd;
11 extern DBM *_pw_db;
12 extern int _pw_stayopen;
13 
14 setpwent()
15 {
16 	if (pwf == NULL)
17 		pwf = fopen(PASSWD, "r");
18 	else
19 		rewind(pwf);
20 }
21 
22 endpwent()
23 {
24 	if (pwf != NULL) {
25 		fclose(pwf);
26 		pwf = NULL;
27 	}
28 	if (_pw_db != (DBM *)0) {
29 		ndbmclose(_pw_db);
30 		_pw_db = (DBM *)0;
31 		_pw_stayopen = 0;
32 	}
33 }
34 
35 static char *
36 pwskip(p)
37 register char *p;
38 {
39 	while (*p && *p != ':')
40 		++p;
41 	if (*p)
42 		*p++ = 0;
43 	return(p);
44 }
45 
46 struct passwd *
47 getpwent()
48 {
49 	register char *p;
50 
51 	if (pwf == NULL) {
52 		if ((pwf = fopen( PASSWD, "r" )) == NULL)
53 			return(0);
54 	}
55 	p = fgets(line, BUFSIZ, pwf);
56 	if (p == NULL)
57 		return(0);
58 	passwd.pw_name = p;
59 	p = pwskip(p);
60 	passwd.pw_passwd = p;
61 	p = pwskip(p);
62 	passwd.pw_uid = atoi(p);
63 	p = pwskip(p);
64 	passwd.pw_gid = atoi(p);
65 	passwd.pw_quota = 0;
66 	passwd.pw_comment = EMPTY;
67 	p = pwskip(p);
68 	passwd.pw_gecos = p;
69 	p = pwskip(p);
70 	passwd.pw_dir = p;
71 	p = pwskip(p);
72 	passwd.pw_shell = p;
73 	while (*p && *p != '\n')
74 		p++;
75 	*p = '\0';
76 	return(&passwd);
77 }
78