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