xref: /csrg-svn/lib/libc/gen/getgrent.c (revision 6349)
1*6349Swnj /* @(#)getgrent.c	4.2 (Berkeley) 03/29/82 */
2*6349Swnj 
32014Swnj #include <stdio.h>
42014Swnj #include <grp.h>
52014Swnj 
62014Swnj #define	MAXGRP	100
72014Swnj 
82014Swnj static char GROUP[] = "/etc/group";
92014Swnj static FILE *grf = NULL;
102014Swnj static char line[BUFSIZ+1];
112014Swnj static struct group group;
122014Swnj static char *gr_mem[MAXGRP];
132014Swnj 
142014Swnj setgrent()
152014Swnj {
162014Swnj 	if( !grf )
172014Swnj 		grf = fopen( GROUP, "r" );
182014Swnj 	else
192014Swnj 		rewind( grf );
202014Swnj }
212014Swnj 
222014Swnj endgrent()
232014Swnj {
242014Swnj 	if( grf ){
252014Swnj 		fclose( grf );
262014Swnj 		grf = NULL;
272014Swnj 	}
282014Swnj }
292014Swnj 
302014Swnj static char *
312014Swnj grskip(p,c)
322014Swnj register char *p;
332014Swnj register c;
342014Swnj {
352014Swnj 	while( *p && *p != c ) ++p;
362014Swnj 	if( *p ) *p++ = 0;
372014Swnj 	return( p );
382014Swnj }
392014Swnj 
402014Swnj struct group *
412014Swnj getgrent()
422014Swnj {
432014Swnj 	register char *p, **q;
442014Swnj 
452014Swnj 	if( !grf && !(grf = fopen( GROUP, "r" )) )
462014Swnj 		return(NULL);
472014Swnj 	if( !(p = fgets( line, BUFSIZ, grf )) )
482014Swnj 		return(NULL);
492014Swnj 	group.gr_name = p;
50*6349Swnj 	group.gr_passwd = p = grskip(p,':');
51*6349Swnj 	group.gr_gid = atoi( p = grskip(p,':') );
522014Swnj 	group.gr_mem = gr_mem;
53*6349Swnj 	p = grskip(p,':');
54*6349Swnj 	grskip(p,'\n');
552014Swnj 	q = gr_mem;
562014Swnj 	while( *p ){
57*6349Swnj 		if (q < &gr_mem[MAXGRP-1])
58*6349Swnj 			*q++ = p;
59*6349Swnj 		p = grskip(p,',');
602014Swnj 	}
612014Swnj 	*q = NULL;
622014Swnj 	return( &group );
632014Swnj }
64