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