4.4BSD snapshot (revision 8.1)
[unix-history] / usr / src / lib / libc / gen / getgrent.c
CommitLineData
6c6c970d 1/*
74155b62
KB
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
6c6c970d 4 *
269a7923 5 * %sccs.include.redist.c%
6c6c970d
KB
6 */
7
2ce81398 8#if defined(LIBC_SCCS) && !defined(lint)
74155b62 9static char sccsid[] = "@(#)getgrent.c 8.1 (Berkeley) %G%";
6c6c970d 10#endif /* LIBC_SCCS and not lint */
bb22887e 11
6c6c970d 12#include <sys/types.h>
41746c4f 13#include <stdio.h>
c5980113 14#include <stdlib.h>
41746c4f
BJ
15#include <grp.h>
16
6c6c970d
KB
17static FILE *_gr_fp;
18static struct group _gr_group;
19static int _gr_stayopen;
eb92650d 20static int grscan(), start_gr();
41746c4f 21
6c6c970d
KB
22#define MAXGRP 200
23static char *members[MAXGRP];
24#define MAXLINELENGTH 1024
25static char line[MAXLINELENGTH];
41746c4f 26
6c6c970d
KB
27struct group *
28getgrent()
41746c4f 29{
eb92650d
KB
30 if (!_gr_fp && !start_gr() || !grscan(0, 0, NULL))
31 return(NULL);
6c6c970d 32 return(&_gr_group);
41746c4f
BJ
33}
34
6c6c970d
KB
35struct group *
36getgrnam(name)
c5980113 37 const char *name;
6c6c970d
KB
38{
39 int rval;
40
41 if (!start_gr())
eb92650d 42 return(NULL);
6c6c970d
KB
43 rval = grscan(1, 0, name);
44 if (!_gr_stayopen)
45 endgrent();
eb92650d 46 return(rval ? &_gr_group : NULL);
6c6c970d
KB
47}
48
49struct group *
c5980113
DS
50#ifdef __STDC__
51getgrgid(gid_t gid)
52#else
6c6c970d 53getgrgid(gid)
c5980113
DS
54 gid_t gid;
55#endif
6c6c970d
KB
56{
57 int rval;
58
59 if (!start_gr())
eb92650d
KB
60 return(NULL);
61 rval = grscan(1, gid, NULL);
6c6c970d
KB
62 if (!_gr_stayopen)
63 endgrent();
eb92650d 64 return(rval ? &_gr_group : NULL);
6c6c970d
KB
65}
66
67static
68start_gr()
41746c4f 69{
6c6c970d
KB
70 if (_gr_fp) {
71 rewind(_gr_fp);
72 return(1);
41746c4f 73 }
eb92650d 74 return((_gr_fp = fopen(_PATH_GROUP, "r")) ? 1 : 0);
41746c4f
BJ
75}
76
c5980113 77int
6c6c970d 78setgrent()
41746c4f 79{
6c6c970d 80 return(setgroupent(0));
41746c4f
BJ
81}
82
c5980113 83int
6c6c970d
KB
84setgroupent(stayopen)
85 int stayopen;
86{
87 if (!start_gr())
88 return(0);
89 _gr_stayopen = stayopen;
90 return(1);
91}
92
93void
94endgrent()
41746c4f 95{
6c6c970d
KB
96 if (_gr_fp) {
97 (void)fclose(_gr_fp);
eb92650d 98 _gr_fp = NULL;
41746c4f 99 }
41746c4f 100}
5a029ac1 101
6c6c970d
KB
102static
103grscan(search, gid, name)
104 register int search, gid;
105 register char *name;
106{
107 register char *cp, **m;
0f38f0b7 108 char *bp;
6c6c970d
KB
109 char *fgets(), *strsep(), *index();
110
111 for (;;) {
112 if (!fgets(line, sizeof(line), _gr_fp))
113 return(0);
0f38f0b7 114 bp = line;
6c6c970d
KB
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 }
0f38f0b7 123 _gr_group.gr_name = strsep(&bp, ":\n");
6c6c970d
KB
124 if (search && name && strcmp(_gr_group.gr_name, name))
125 continue;
0f38f0b7
MT
126 _gr_group.gr_passwd = strsep(&bp, ":\n");
127 if (!(cp = strsep(&bp, ":\n")))
6c6c970d
KB
128 continue;
129 _gr_group.gr_gid = atoi(cp);
7d9b2097 130 if (search && name == NULL && _gr_group.gr_gid != gid)
6c6c970d
KB
131 continue;
132 for (m = _gr_group.gr_mem = members;; ++m) {
133 if (m == &members[MAXGRP - 1]) {
134 *m = NULL;
135 break;
136 }
0f38f0b7 137 if ((*m = strsep(&bp, ", \n")) == NULL)
6c6c970d
KB
138 break;
139 }
140 return(1);
141 }
142 /* NOTREACHED */
5a029ac1 143}