|
|
1.1 root 1: /*
2: * Copyright (c) 1989 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #if defined(LIBC_SCCS) && !defined(lint)
21: static char sccsid[] = "@(#)getgrent.c 5.7 (Berkeley) 6/24/90";
22: #endif /* LIBC_SCCS and not lint */
23:
24: #include <sys/types.h>
25: #include <stdio.h>
26: #include <grp.h>
27:
28: static FILE *_gr_fp;
29: static struct group _gr_group;
30: static int _gr_stayopen;
31: static char *_gr_file = _PATH_GROUP;
32:
33: #define MAXGRP 200
34: static char *members[MAXGRP];
35: #define MAXLINELENGTH 1024
36: static char line[MAXLINELENGTH];
37:
38: struct group *
39: getgrent()
40: {
41: if (!_gr_fp && !start_gr() || !grscan(0, 0, (char *)NULL))
42: return((struct group *)NULL);
43: return(&_gr_group);
44: }
45:
46: struct group *
47: getgrnam(name)
48: char *name;
49: {
50: int rval;
51:
52: if (!start_gr())
53: return((struct group *)NULL);
54: rval = grscan(1, 0, name);
55: if (!_gr_stayopen)
56: endgrent();
57: return(rval ? &_gr_group : (struct group *)NULL);
58: }
59:
60: struct group *
61: getgrgid(gid)
62: int gid;
63: {
64: int rval;
65:
66: if (!start_gr())
67: return((struct group *)NULL);
68: rval = grscan(1, gid, (char *)NULL);
69: if (!_gr_stayopen)
70: endgrent();
71: return(rval ? &_gr_group : (struct group *)NULL);
72: }
73:
74: static
75: start_gr()
76: {
77: if (_gr_fp) {
78: rewind(_gr_fp);
79: return(1);
80: }
81: return((_gr_fp = fopen(_gr_file, "r")) ? 1 : 0);
82: }
83:
84: setgrent()
85: {
86: return(setgroupent(0));
87: }
88:
89: setgroupent(stayopen)
90: int stayopen;
91: {
92: if (!start_gr())
93: return(0);
94: _gr_stayopen = stayopen;
95: return(1);
96: }
97:
98: void
99: endgrent()
100: {
101: if (_gr_fp) {
102: (void)fclose(_gr_fp);
103: _gr_fp = (FILE *)NULL;
104: }
105: }
106:
107: void
108: setgrfile(file)
109: char *file;
110: {
111: _gr_file = file;
112: }
113:
114: static
115: grscan(search, gid, name)
116: register int search, gid;
117: register char *name;
118: {
119: register char *cp, **m;
120: char *bp;
121: char *fgets(), *strsep(), *index();
122:
123: for (;;) {
124: if (!fgets(line, sizeof(line), _gr_fp))
125: return(0);
126: bp = line;
127: /* skip lines that are too big */
128: if (!index(line, '\n')) {
129: int ch;
130:
131: while ((ch = getc(_gr_fp)) != '\n' && ch != EOF)
132: ;
133: continue;
134: }
135: _gr_group.gr_name = strsep(&bp, ":\n");
136: if (search && name && strcmp(_gr_group.gr_name, name))
137: continue;
138: _gr_group.gr_passwd = strsep(&bp, ":\n");
139: if (!(cp = strsep(&bp, ":\n")))
140: continue;
141: _gr_group.gr_gid = atoi(cp);
142: if (search && name == NULL && _gr_group.gr_gid != gid)
143: continue;
144: for (m = _gr_group.gr_mem = members;; ++m) {
145: if (m == &members[MAXGRP - 1]) {
146: *m = NULL;
147: break;
148: }
149: if ((*m = strsep(&bp, ", \n")) == NULL)
150: break;
151: }
152: return(1);
153: }
154: /* NOTREACHED */
155: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.