xref: /plan9/sys/src/ape/lib/ap/posix/getgrent.c (revision 027288c8a8763d34db13dc89d8bcd6514dbc2163)
13e12c5d1SDavid du Colombier #include <stdio.h>
23e12c5d1SDavid du Colombier #include <grp.h>
39a747e4fSDavid du Colombier #include <stdlib.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier #define	CL	':'
63e12c5d1SDavid du Colombier #define	CM	','
73e12c5d1SDavid du Colombier #define	NL	'\n'
83e12c5d1SDavid du Colombier #define	MAXGRP	100
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier static char GROUP[] = "/etc/group";
113e12c5d1SDavid du Colombier static FILE *grf = NULL;
123e12c5d1SDavid du Colombier static char line[BUFSIZ+1];
133e12c5d1SDavid du Colombier static struct group group;
143e12c5d1SDavid du Colombier static char *gr_mem[MAXGRP];
153e12c5d1SDavid du Colombier 
16*027288c8SDavid du Colombier void
setgrent(void)17*027288c8SDavid du Colombier setgrent(void)
183e12c5d1SDavid du Colombier {
193e12c5d1SDavid du Colombier 	if( !grf )
203e12c5d1SDavid du Colombier 		grf = fopen( GROUP, "r" );
213e12c5d1SDavid du Colombier 	else
223e12c5d1SDavid du Colombier 		rewind( grf );
233e12c5d1SDavid du Colombier }
243e12c5d1SDavid du Colombier 
25*027288c8SDavid du Colombier void
endgrent(void)26*027288c8SDavid du Colombier endgrent(void)
273e12c5d1SDavid du Colombier {
283e12c5d1SDavid du Colombier 	if( grf ){
293e12c5d1SDavid du Colombier 		fclose( grf );
303e12c5d1SDavid du Colombier 		grf = NULL;
313e12c5d1SDavid du Colombier 	}
323e12c5d1SDavid du Colombier }
333e12c5d1SDavid du Colombier 
343e12c5d1SDavid du Colombier static char *
grskip(register char * p,register c)353e12c5d1SDavid du Colombier grskip(register char *p, register c)
363e12c5d1SDavid du Colombier {
373e12c5d1SDavid du Colombier 	while( *p && *p != c ) ++p;
383e12c5d1SDavid du Colombier 	if( *p ) *p++ = 0;
393e12c5d1SDavid du Colombier 	return( p );
403e12c5d1SDavid du Colombier }
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier struct group *
getgrent()433e12c5d1SDavid du Colombier getgrent()
443e12c5d1SDavid du Colombier {
453e12c5d1SDavid du Colombier 	register char *p, **q;
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier 	if( !grf && !(grf = fopen( GROUP, "r" )) )
483e12c5d1SDavid du Colombier 		return(NULL);
493e12c5d1SDavid du Colombier 	if( !(p = fgets( line, BUFSIZ, grf )) )
503e12c5d1SDavid du Colombier 		return(NULL);
513e12c5d1SDavid du Colombier 	group.gr_name = p;
523e12c5d1SDavid du Colombier 	p = grskip(p,CL); /* passwd */
533e12c5d1SDavid du Colombier 	group.gr_gid = atoi(p = grskip(p,CL));
543e12c5d1SDavid du Colombier 	group.gr_mem = gr_mem;
553e12c5d1SDavid du Colombier 	p = grskip(p,CL);
563e12c5d1SDavid du Colombier 	grskip(p,NL);
573e12c5d1SDavid du Colombier 	q = gr_mem;
583e12c5d1SDavid du Colombier 	while( *p ){
593e12c5d1SDavid du Colombier 		*q++ = p;
603e12c5d1SDavid du Colombier 		p = grskip(p,CM);
613e12c5d1SDavid du Colombier 	}
623e12c5d1SDavid du Colombier 	*q = NULL;
633e12c5d1SDavid du Colombier 	return( &group );
643e12c5d1SDavid du Colombier }
65