ref: e1cd22504e26d0a732a4219d38d6e5fe3e03aa21
dir: /sys/src/ape/lib/ap/posix/getgrent.c/
#include <stdio.h> #include <grp.h> #include <stdlib.h> #define CL ':' #define CM ',' #define NL '\n' #define MAXGRP 100 static char GROUP[] = "/etc/group"; static FILE *grf = NULL; static char line[BUFSIZ+1]; static struct group group; static char *gr_mem[MAXGRP]; void setgrent() { if( !grf ) grf = fopen( GROUP, "r" ); else rewind( grf ); } void endgrent() { if( grf ){ fclose( grf ); grf = NULL; } } static char * grskip(register char *p, register c) { while( *p && *p != c ) ++p; if( *p ) *p++ = 0; return( p ); } struct group * getgrent() { register char *p, **q; if( !grf && !(grf = fopen( GROUP, "r" )) ) return(NULL); if( !(p = fgets( line, BUFSIZ, grf )) ) return(NULL); group.gr_name = p; p = grskip(p,CL); /* passwd */ group.gr_gid = atoi(p = grskip(p,CL)); group.gr_mem = gr_mem; p = grskip(p,CL); grskip(p,NL); q = gr_mem; while( *p ){ *q++ = p; p = grskip(p,CM); } *q = NULL; return( &group ); }