1 /* $OpenBSD: revnetgroup.c,v 1.11 2013/12/05 14:20:53 jca Exp $ */
2 /*
3 * Copyright (c) 1995
4 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Bill Paul.
17 * 4. Neither the name of the author nor the names of any co-contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * reverse netgroup map generator program
34 *
35 * Written by Bill Paul <wpaul@ctr.columbia.edu>
36 * Center for Telecommunications Research
37 * Columbia University, New York City
38 *
39 * $FreeBSD: revnetgroup.c,v 1.7 1997/03/28 15:48:15 imp Exp $
40 */
41
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #include <unistd.h>
46 #include <util.h>
47 #include <errno.h>
48 #include <err.h>
49 #include "hash.h"
50
51 /* Default location of netgroup file. */
52 char *netgroup = "/etc/netgroup";
53
54 /* Stored hash table version of 'forward' netgroup database. */
55 struct group_entry *gtable[TABLESIZE];
56
57 /*
58 * Stored hash table of 'reverse' netgroup member database
59 * which we will construct.
60 */
61 struct member_entry *mtable[TABLESIZE];
62
63 static void
usage(void)64 usage(void)
65 {
66 fprintf (stderr,"usage: revnetgroup -h | -u [-f netgroup_file]\n");
67 exit(1);
68 }
69
70 int
main(int argc,char * argv[])71 main(int argc, char *argv[])
72 {
73 FILE *fp;
74 char *readbuf;
75 struct group_entry *gcur;
76 struct member_entry *mcur;
77 char *host, *user, *domain;
78 extern char *optarg;
79 int ch;
80 char *key = NULL, *data = NULL;
81 int hosts = -1, i;
82
83 if (argc < 2)
84 usage();
85
86 while ((ch = getopt(argc, argv, "uhf:")) != -1) {
87 switch (ch) {
88 case 'u':
89 if (hosts != -1) {
90 warnx("please use only one of -h or -u");
91 usage();
92 }
93 hosts = 0;
94 break;
95 case 'h':
96 if (hosts != -1) {
97 warnx("please use only one of -u or -h");
98 usage();
99 }
100 hosts = 1;
101 break;
102 case 'f':
103 netgroup = optarg;
104 break;
105 default:
106 usage();
107 break;
108 }
109 }
110
111 if (hosts == -1)
112 usage();
113
114 if (strcmp(netgroup, "-")) {
115 if ((fp = fopen(netgroup, "r")) == NULL) {
116 err(1, "%s", netgroup);
117 }
118 } else {
119 fp = stdin;
120 }
121
122 /* Stuff all the netgroup names and members into a hash table. */
123 while ((readbuf = fparseln(fp, NULL, NULL, NULL, 0)) != NULL) {
124 data = strpbrk(readbuf, " \t");
125 if (data == NULL) {
126 free(readbuf);
127 continue;
128 }
129 *data = '\0';
130 ++data;
131 key = readbuf;
132 ngstore(gtable, key, data);
133 free(readbuf);
134 }
135
136 fclose(fp);
137
138 /*
139 * Find all members of each netgroup and keep track of which
140 * group they belong to.
141 */
142 for (i = 0; i < TABLESIZE; i++) {
143 gcur = gtable[i];
144 while (gcur) {
145 __setnetgrent(gcur->key);
146 while (__getnetgrent(&host, &user, &domain) != 0) {
147 if (hosts) {
148 if (!(host && !strcmp(host,"-"))) {
149 mstore(mtable,
150 host ? host : "*",
151 gcur->key,
152 domain ? domain : "*");
153 }
154 } else {
155 if (!(user && !strcmp(user,"-"))) {
156 mstore(mtable,
157 user ? user : "*",
158 gcur->key,
159 domain ? domain : "*");
160 }
161 }
162 }
163 gcur = gcur->next;
164 }
165 }
166
167 /* Release resources used by the netgroup parser code. */
168 __endnetgrent();
169
170 /* Spew out the results. */
171 for (i = 0; i < TABLESIZE; i++) {
172 mcur = mtable[i];
173 while (mcur) {
174 struct grouplist *tmp;
175 printf ("%s.%s\t", mcur->key, mcur->domain);
176 tmp = mcur->groups;
177 while (tmp) {
178 printf ("%s", tmp->groupname);
179 tmp = tmp->next;
180 if (tmp)
181 printf(",");
182 }
183 mcur = mcur->next;
184 printf ("\n");
185 }
186 }
187
188 /* Let the OS free all our resources. */
189 exit(0);
190 }
191