xref: /csrg-svn/lib/libc/gen/getgrent.c (revision 26555)
1*26555Sdonn #if defined(LIBC_SCCS) && !defined(lint)
2*26555Sdonn static char sccsid[] = "@(#)getgrent.c	5.2 (Berkeley) 03/09/86";
3*26555Sdonn #endif LIBC_SCCS and not lint
46349Swnj 
52014Swnj #include <stdio.h>
62014Swnj #include <grp.h>
72014Swnj 
814703Ssam #define	MAXGRP	200
92014Swnj 
102014Swnj static char GROUP[] = "/etc/group";
112014Swnj static FILE *grf = NULL;
122014Swnj static char line[BUFSIZ+1];
132014Swnj static struct group group;
142014Swnj static char *gr_mem[MAXGRP];
152014Swnj 
162014Swnj setgrent()
172014Swnj {
182014Swnj 	if( !grf )
192014Swnj 		grf = fopen( GROUP, "r" );
202014Swnj 	else
212014Swnj 		rewind( grf );
222014Swnj }
232014Swnj 
242014Swnj endgrent()
252014Swnj {
262014Swnj 	if( grf ){
272014Swnj 		fclose( grf );
282014Swnj 		grf = NULL;
292014Swnj 	}
302014Swnj }
312014Swnj 
322014Swnj static char *
332014Swnj grskip(p,c)
342014Swnj register char *p;
352014Swnj register c;
362014Swnj {
372014Swnj 	while( *p && *p != c ) ++p;
382014Swnj 	if( *p ) *p++ = 0;
392014Swnj 	return( p );
402014Swnj }
412014Swnj 
422014Swnj struct group *
432014Swnj getgrent()
442014Swnj {
452014Swnj 	register char *p, **q;
462014Swnj 
472014Swnj 	if( !grf && !(grf = fopen( GROUP, "r" )) )
482014Swnj 		return(NULL);
492014Swnj 	if( !(p = fgets( line, BUFSIZ, grf )) )
502014Swnj 		return(NULL);
512014Swnj 	group.gr_name = p;
526349Swnj 	group.gr_passwd = p = grskip(p,':');
536349Swnj 	group.gr_gid = atoi( p = grskip(p,':') );
542014Swnj 	group.gr_mem = gr_mem;
556349Swnj 	p = grskip(p,':');
566349Swnj 	grskip(p,'\n');
572014Swnj 	q = gr_mem;
582014Swnj 	while( *p ){
596349Swnj 		if (q < &gr_mem[MAXGRP-1])
606349Swnj 			*q++ = p;
616349Swnj 		p = grskip(p,',');
622014Swnj 	}
632014Swnj 	*q = NULL;
642014Swnj 	return( &group );
652014Swnj }
66