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