1 #include <stdio.h> 2 #include <grp.h> 3 #include <stdlib.h> 4 5 #define CL ':' 6 #define CM ',' 7 #define NL '\n' 8 #define MAXGRP 100 9 10 static char GROUP[] = "/etc/group"; 11 static FILE *grf = NULL; 12 static char line[BUFSIZ+1]; 13 static struct group group; 14 static char *gr_mem[MAXGRP]; 15 16 setgrent() 17 { 18 if( !grf ) 19 grf = fopen( GROUP, "r" ); 20 else 21 rewind( grf ); 22 } 23 24 endgrent() 25 { 26 if( grf ){ 27 fclose( grf ); 28 grf = NULL; 29 } 30 } 31 32 static char * 33 grskip(register char *p, 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 p = grskip(p,CL); /* passwd */ 51 group.gr_gid = atoi(p = grskip(p,CL)); 52 group.gr_mem = gr_mem; 53 p = grskip(p,CL); 54 grskip(p,NL); 55 q = gr_mem; 56 while( *p ){ 57 *q++ = p; 58 p = grskip(p,CM); 59 } 60 *q = NULL; 61 return( &group ); 62 } 63