1 /* 2 * Copyright (c) 1989 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #if defined(LIBC_SCCS) && !defined(lint) 9 static char sccsid[] = "@(#)getgrent.c 5.7 (Berkeley) 06/24/90"; 10 #endif /* LIBC_SCCS and not lint */ 11 12 #include <sys/types.h> 13 #include <stdio.h> 14 #include <grp.h> 15 16 static FILE *_gr_fp; 17 static struct group _gr_group; 18 static int _gr_stayopen; 19 static char *_gr_file = _PATH_GROUP; 20 21 #define MAXGRP 200 22 static char *members[MAXGRP]; 23 #define MAXLINELENGTH 1024 24 static char line[MAXLINELENGTH]; 25 26 struct group * 27 getgrent() 28 { 29 if (!_gr_fp && !start_gr() || !grscan(0, 0, (char *)NULL)) 30 return((struct group *)NULL); 31 return(&_gr_group); 32 } 33 34 struct group * 35 getgrnam(name) 36 char *name; 37 { 38 int rval; 39 40 if (!start_gr()) 41 return((struct group *)NULL); 42 rval = grscan(1, 0, name); 43 if (!_gr_stayopen) 44 endgrent(); 45 return(rval ? &_gr_group : (struct group *)NULL); 46 } 47 48 struct group * 49 getgrgid(gid) 50 int gid; 51 { 52 int rval; 53 54 if (!start_gr()) 55 return((struct group *)NULL); 56 rval = grscan(1, gid, (char *)NULL); 57 if (!_gr_stayopen) 58 endgrent(); 59 return(rval ? &_gr_group : (struct group *)NULL); 60 } 61 62 static 63 start_gr() 64 { 65 if (_gr_fp) { 66 rewind(_gr_fp); 67 return(1); 68 } 69 return((_gr_fp = fopen(_gr_file, "r")) ? 1 : 0); 70 } 71 72 setgrent() 73 { 74 return(setgroupent(0)); 75 } 76 77 setgroupent(stayopen) 78 int stayopen; 79 { 80 if (!start_gr()) 81 return(0); 82 _gr_stayopen = stayopen; 83 return(1); 84 } 85 86 void 87 endgrent() 88 { 89 if (_gr_fp) { 90 (void)fclose(_gr_fp); 91 _gr_fp = (FILE *)NULL; 92 } 93 } 94 95 void 96 setgrfile(file) 97 char *file; 98 { 99 _gr_file = file; 100 } 101 102 static 103 grscan(search, gid, name) 104 register int search, gid; 105 register char *name; 106 { 107 register char *cp, **m; 108 char *bp; 109 char *fgets(), *strsep(), *index(); 110 111 for (;;) { 112 if (!fgets(line, sizeof(line), _gr_fp)) 113 return(0); 114 bp = line; 115 /* skip lines that are too big */ 116 if (!index(line, '\n')) { 117 int ch; 118 119 while ((ch = getc(_gr_fp)) != '\n' && ch != EOF) 120 ; 121 continue; 122 } 123 _gr_group.gr_name = strsep(&bp, ":\n"); 124 if (search && name && strcmp(_gr_group.gr_name, name)) 125 continue; 126 _gr_group.gr_passwd = strsep(&bp, ":\n"); 127 if (!(cp = strsep(&bp, ":\n"))) 128 continue; 129 _gr_group.gr_gid = atoi(cp); 130 if (search && name == NULL && _gr_group.gr_gid != gid) 131 continue; 132 for (m = _gr_group.gr_mem = members;; ++m) { 133 if (m == &members[MAXGRP - 1]) { 134 *m = NULL; 135 break; 136 } 137 if ((*m = strsep(&bp, ", \n")) == NULL) 138 break; 139 } 140 return(1); 141 } 142 /* NOTREACHED */ 143 } 144