xref: /plan9/sys/src/ape/lib/ap/posix/getpwent.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
13e12c5d1SDavid du Colombier #include <stdio.h>
23e12c5d1SDavid du Colombier #include <pwd.h>
39a747e4fSDavid du Colombier #include <stdlib.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier static char PASSWD[]	= "/etc/passwd";
63e12c5d1SDavid du Colombier static FILE *pwf = NULL;
73e12c5d1SDavid du Colombier static char line[BUFSIZ+2];
83e12c5d1SDavid du Colombier static struct passwd passwd;
93e12c5d1SDavid du Colombier 
109a747e4fSDavid du Colombier void
setpwent(void)119a747e4fSDavid du Colombier setpwent(void)
123e12c5d1SDavid du Colombier {
133e12c5d1SDavid du Colombier 	if( pwf == NULL )
143e12c5d1SDavid du Colombier 		pwf = fopen( PASSWD, "r" );
153e12c5d1SDavid du Colombier 	else
163e12c5d1SDavid du Colombier 		rewind( pwf );
173e12c5d1SDavid du Colombier }
183e12c5d1SDavid du Colombier 
199a747e4fSDavid du Colombier void
endpwent(void)209a747e4fSDavid du Colombier endpwent(void)
213e12c5d1SDavid du Colombier {
223e12c5d1SDavid du Colombier 	if( pwf != NULL ){
233e12c5d1SDavid du Colombier 		fclose( pwf );
243e12c5d1SDavid du Colombier 		pwf = NULL;
253e12c5d1SDavid du Colombier 	}
263e12c5d1SDavid du Colombier }
273e12c5d1SDavid du Colombier 
283e12c5d1SDavid du Colombier static char *
pwskip(char * p)299a747e4fSDavid du Colombier pwskip(char *p)
303e12c5d1SDavid du Colombier {
313e12c5d1SDavid du Colombier 	while( *p && *p != ':' && *p != '\n' )
323e12c5d1SDavid du Colombier 		++p;
333e12c5d1SDavid du Colombier 	if( *p ) *p++ = 0;
343e12c5d1SDavid du Colombier 	else p[1] = 0;
353e12c5d1SDavid du Colombier 	return(p);
363e12c5d1SDavid du Colombier }
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier struct passwd *
pwdecode(char * p)399a747e4fSDavid du Colombier pwdecode(char *p)
403e12c5d1SDavid du Colombier {
413e12c5d1SDavid du Colombier 	passwd.pw_name = p;
423e12c5d1SDavid du Colombier 	p = pwskip(p);
433e12c5d1SDavid du Colombier 	p = pwskip(p); /* passwd */
443e12c5d1SDavid du Colombier 	passwd.pw_uid = atoi(p);
453e12c5d1SDavid du Colombier 	p = pwskip(p);
463e12c5d1SDavid du Colombier 	passwd.pw_gid = atoi(p);
473e12c5d1SDavid du Colombier 	p = pwskip(p); /* comment */
483e12c5d1SDavid du Colombier 	p = pwskip(p); /* gecos */
493e12c5d1SDavid du Colombier 	passwd.pw_dir = p;
503e12c5d1SDavid du Colombier 	p = pwskip(p);
513e12c5d1SDavid du Colombier 	passwd.pw_shell = p;
52*781103c4SDavid du Colombier 	pwskip(p);
533e12c5d1SDavid du Colombier 	return(&passwd);
543e12c5d1SDavid du Colombier }
553e12c5d1SDavid du Colombier 
563e12c5d1SDavid du Colombier struct passwd *
getpwent(void)579a747e4fSDavid du Colombier getpwent(void)
583e12c5d1SDavid du Colombier {
593e12c5d1SDavid du Colombier 	register char *p;
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier 	if (pwf == NULL) {
623e12c5d1SDavid du Colombier 		if( (pwf = fopen( PASSWD, "r" )) == NULL )
633e12c5d1SDavid du Colombier 			return(0);
643e12c5d1SDavid du Colombier 	}
653e12c5d1SDavid du Colombier 	p = fgets(line, BUFSIZ, pwf);
663e12c5d1SDavid du Colombier 	if (p==NULL)
673e12c5d1SDavid du Colombier 		return(0);
683e12c5d1SDavid du Colombier 	return pwdecode (p);
693e12c5d1SDavid du Colombier }
70