xref: /csrg-svn/lib/libc/gen/getgrent.c (revision 2014)
1*2014Swnj /* @(#)getgrent.c	4.1 (Berkeley) 12/21/80 */
2*2014Swnj #include <stdio.h>
3*2014Swnj #include <grp.h>
4*2014Swnj 
5*2014Swnj #define	CL	':'
6*2014Swnj #define	CM	','
7*2014Swnj #define	NL	'\n'
8*2014Swnj #define	MAXGRP	100
9*2014Swnj 
10*2014Swnj static char GROUP[] = "/etc/group";
11*2014Swnj static FILE *grf = NULL;
12*2014Swnj static char line[BUFSIZ+1];
13*2014Swnj static struct group group;
14*2014Swnj static char *gr_mem[MAXGRP];
15*2014Swnj 
16*2014Swnj setgrent()
17*2014Swnj {
18*2014Swnj 	if( !grf )
19*2014Swnj 		grf = fopen( GROUP, "r" );
20*2014Swnj 	else
21*2014Swnj 		rewind( grf );
22*2014Swnj }
23*2014Swnj 
24*2014Swnj endgrent()
25*2014Swnj {
26*2014Swnj 	if( grf ){
27*2014Swnj 		fclose( grf );
28*2014Swnj 		grf = NULL;
29*2014Swnj 	}
30*2014Swnj }
31*2014Swnj 
32*2014Swnj static char *
33*2014Swnj grskip(p,c)
34*2014Swnj register char *p;
35*2014Swnj register c;
36*2014Swnj {
37*2014Swnj 	while( *p && *p != c ) ++p;
38*2014Swnj 	if( *p ) *p++ = 0;
39*2014Swnj 	return( p );
40*2014Swnj }
41*2014Swnj 
42*2014Swnj struct group *
43*2014Swnj getgrent()
44*2014Swnj {
45*2014Swnj 	register char *p, **q;
46*2014Swnj 
47*2014Swnj 	if( !grf && !(grf = fopen( GROUP, "r" )) )
48*2014Swnj 		return(NULL);
49*2014Swnj 	if( !(p = fgets( line, BUFSIZ, grf )) )
50*2014Swnj 		return(NULL);
51*2014Swnj 	group.gr_name = p;
52*2014Swnj 	group.gr_passwd = p = grskip(p,CL);
53*2014Swnj 	group.gr_gid = atoi( p = grskip(p,CL) );
54*2014Swnj 	group.gr_mem = gr_mem;
55*2014Swnj 	p = grskip(p,CL);
56*2014Swnj 	grskip(p,NL);
57*2014Swnj 	q = gr_mem;
58*2014Swnj 	while( *p ){
59*2014Swnj 		*q++ = p;
60*2014Swnj 		p = grskip(p,CM);
61*2014Swnj 	}
62*2014Swnj 	*q = NULL;
63*2014Swnj 	return( &group );
64*2014Swnj }
65