xref: /plan9-contrib/sys/src/ape/lib/ap/posix/getpwent.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <stdio.h>
2 #include <pwd.h>
3 
4 static char PASSWD[]	= "/etc/passwd";
5 static FILE *pwf = NULL;
6 static char line[BUFSIZ+2];
7 static struct passwd passwd;
8 
9 setpwent()
10 {
11 	if( pwf == NULL )
12 		pwf = fopen( PASSWD, "r" );
13 	else
14 		rewind( pwf );
15 }
16 
17 endpwent()
18 {
19 	if( pwf != NULL ){
20 		fclose( pwf );
21 		pwf = NULL;
22 	}
23 }
24 
25 static char *
26 pwskip(p)
27 register char *p;
28 {
29 	while( *p && *p != ':' && *p != '\n' )
30 		++p;
31 	if( *p ) *p++ = 0;
32 	else p[1] = 0;
33 	return(p);
34 }
35 
36 struct passwd *
37 pwdecode(p)
38 	register char *p;
39 {
40 	passwd.pw_name = p;
41 	p = pwskip(p);
42 	p = pwskip(p); /* passwd */
43 	passwd.pw_uid = atoi(p);
44 	p = pwskip(p);
45 	passwd.pw_gid = atoi(p);
46 	p = pwskip(p); /* comment */
47 	p = pwskip(p); /* gecos */
48 	passwd.pw_dir = p;
49 	p = pwskip(p);
50 	passwd.pw_shell = p;
51 	p = pwskip(p);
52 	return(&passwd);
53 }
54 
55 struct passwd *
56 getpwent()
57 {
58 	register char *p;
59 
60 	if (pwf == NULL) {
61 		if( (pwf = fopen( PASSWD, "r" )) == NULL )
62 			return(0);
63 	}
64 	p = fgets(line, BUFSIZ, pwf);
65 	if (p==NULL)
66 		return(0);
67 	return pwdecode (p);
68 }
69