Commit | Line | Data |
---|---|---|
1662dc67 | 1 | /* @(#)getgrent.c 4.3 (Berkeley) %G% */ |
bb22887e | 2 | |
41746c4f BJ |
3 | #include <stdio.h> |
4 | #include <grp.h> | |
5 | ||
1662dc67 | 6 | #define MAXGRP 200 |
41746c4f BJ |
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; | |
bb22887e BJ |
50 | group.gr_passwd = p = grskip(p,':'); |
51 | group.gr_gid = atoi( p = grskip(p,':') ); | |
41746c4f | 52 | group.gr_mem = gr_mem; |
bb22887e BJ |
53 | p = grskip(p,':'); |
54 | grskip(p,'\n'); | |
41746c4f BJ |
55 | q = gr_mem; |
56 | while( *p ){ | |
bb22887e BJ |
57 | if (q < &gr_mem[MAXGRP-1]) |
58 | *q++ = p; | |
59 | p = grskip(p,','); | |
41746c4f BJ |
60 | } |
61 | *q = NULL; | |
62 | return( &group ); | |
63 | } |