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