xref: /openbsd-src/usr.sbin/ypserv/revnetgroup/revnetgroup.c (revision 573fd9e7ff8b16b8dfccea461b2aa3f146ba281e)
1*573fd9e7Sjca /* $OpenBSD: revnetgroup.c,v 1.11 2013/12/05 14:20:53 jca Exp $ */
2345c9dd4Smaja /*
3345c9dd4Smaja  * Copyright (c) 1995
4345c9dd4Smaja  *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
5345c9dd4Smaja  *
6345c9dd4Smaja  * Redistribution and use in source and binary forms, with or without
7345c9dd4Smaja  * modification, are permitted provided that the following conditions
8345c9dd4Smaja  * are met:
9345c9dd4Smaja  * 1. Redistributions of source code must retain the above copyright
10345c9dd4Smaja  *    notice, this list of conditions and the following disclaimer.
11345c9dd4Smaja  * 2. Redistributions in binary form must reproduce the above copyright
12345c9dd4Smaja  *    notice, this list of conditions and the following disclaimer in the
13345c9dd4Smaja  *    documentation and/or other materials provided with the distribution.
14345c9dd4Smaja  * 3. All advertising materials mentioning features or use of this software
15345c9dd4Smaja  *    must display the following acknowledgement:
16345c9dd4Smaja  *	This product includes software developed by Bill Paul.
17345c9dd4Smaja  * 4. Neither the name of the author nor the names of any co-contributors
18345c9dd4Smaja  *    may be used to endorse or promote products derived from this software
19345c9dd4Smaja  *    without specific prior written permission.
20345c9dd4Smaja  *
21345c9dd4Smaja  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
22345c9dd4Smaja  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23345c9dd4Smaja  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24345c9dd4Smaja  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
25345c9dd4Smaja  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26345c9dd4Smaja  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27345c9dd4Smaja  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28345c9dd4Smaja  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29345c9dd4Smaja  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30345c9dd4Smaja  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31345c9dd4Smaja  * SUCH DAMAGE.
32345c9dd4Smaja  *
33345c9dd4Smaja  * reverse netgroup map generator program
34345c9dd4Smaja  *
35345c9dd4Smaja  * Written by Bill Paul <wpaul@ctr.columbia.edu>
36345c9dd4Smaja  * Center for Telecommunications Research
37345c9dd4Smaja  * Columbia University, New York City
38345c9dd4Smaja  *
39345c9dd4Smaja  *	$FreeBSD: revnetgroup.c,v 1.7 1997/03/28 15:48:15 imp Exp $
40345c9dd4Smaja  */
41345c9dd4Smaja 
42345c9dd4Smaja #include <stdio.h>
43345c9dd4Smaja #include <stdlib.h>
44345c9dd4Smaja #include <string.h>
45*573fd9e7Sjca #include <unistd.h>
46bae3e349Sray #include <util.h>
47345c9dd4Smaja #include <errno.h>
48345c9dd4Smaja #include <err.h>
49345c9dd4Smaja #include "hash.h"
50345c9dd4Smaja 
51345c9dd4Smaja /* Default location of netgroup file. */
52345c9dd4Smaja char *netgroup = "/etc/netgroup";
53345c9dd4Smaja 
54345c9dd4Smaja /* Stored hash table version of 'forward' netgroup database. */
55345c9dd4Smaja struct group_entry *gtable[TABLESIZE];
56345c9dd4Smaja 
57345c9dd4Smaja /*
58345c9dd4Smaja  * Stored hash table of 'reverse' netgroup member database
59345c9dd4Smaja  * which we will construct.
60345c9dd4Smaja  */
61345c9dd4Smaja struct member_entry *mtable[TABLESIZE];
62345c9dd4Smaja 
635325fcc5Sderaadt static void
usage(void)648ceb539dSderaadt usage(void)
65345c9dd4Smaja {
66e0e3e652Ssobrado 	fprintf (stderr,"usage: revnetgroup -h | -u [-f netgroup_file]\n");
67345c9dd4Smaja 	exit(1);
68345c9dd4Smaja }
69345c9dd4Smaja 
70345c9dd4Smaja int
main(int argc,char * argv[])7133dd5606Sderaadt main(int argc, char *argv[])
72345c9dd4Smaja {
73345c9dd4Smaja 	FILE *fp;
74bae3e349Sray 	char *readbuf;
75345c9dd4Smaja 	struct group_entry *gcur;
76345c9dd4Smaja 	struct member_entry *mcur;
77345c9dd4Smaja 	char *host, *user, *domain;
7833dd5606Sderaadt 	extern char *optarg;
79345c9dd4Smaja 	int ch;
80345c9dd4Smaja 	char *key = NULL, *data = NULL;
81345c9dd4Smaja 	int hosts = -1, i;
82345c9dd4Smaja 
83345c9dd4Smaja 	if (argc < 2)
848ceb539dSderaadt 		usage();
85345c9dd4Smaja 
86345c9dd4Smaja 	while ((ch = getopt(argc, argv, "uhf:")) != -1) {
87345c9dd4Smaja 		switch (ch) {
88345c9dd4Smaja 		case 'u':
89345c9dd4Smaja 			if (hosts != -1) {
90e0e3e652Ssobrado 				warnx("please use only one of -h or -u");
918ceb539dSderaadt 				usage();
92345c9dd4Smaja 			}
93345c9dd4Smaja 			hosts = 0;
94345c9dd4Smaja 			break;
95345c9dd4Smaja 		case 'h':
96345c9dd4Smaja 			if (hosts != -1) {
97345c9dd4Smaja 				warnx("please use only one of -u or -h");
988ceb539dSderaadt 				usage();
99345c9dd4Smaja 			}
100345c9dd4Smaja 			hosts = 1;
101345c9dd4Smaja 			break;
102345c9dd4Smaja 		case 'f':
103345c9dd4Smaja 			netgroup = optarg;
104345c9dd4Smaja 			break;
105345c9dd4Smaja 		default:
1068ceb539dSderaadt 			usage();
107345c9dd4Smaja 			break;
108345c9dd4Smaja 		}
109345c9dd4Smaja 	}
110345c9dd4Smaja 
111345c9dd4Smaja 	if (hosts == -1)
1128ceb539dSderaadt 		usage();
113345c9dd4Smaja 
114345c9dd4Smaja 	if (strcmp(netgroup, "-")) {
115345c9dd4Smaja 		if ((fp = fopen(netgroup, "r")) == NULL) {
116b638aa94Smillert 			err(1, "%s", netgroup);
117345c9dd4Smaja 		}
118345c9dd4Smaja 	} else {
119345c9dd4Smaja 		fp = stdin;
120345c9dd4Smaja 	}
121345c9dd4Smaja 
122345c9dd4Smaja 	/* Stuff all the netgroup names and members into a hash table. */
123bae3e349Sray 	while ((readbuf = fparseln(fp, NULL, NULL, NULL, 0)) != NULL) {
124bae3e349Sray 		data = strpbrk(readbuf, " \t");
125bae3e349Sray 		if (data == NULL) {
126bae3e349Sray 			free(readbuf);
127345c9dd4Smaja 			continue;
128345c9dd4Smaja 		}
129bae3e349Sray 		*data = '\0';
130bae3e349Sray 		++data;
131bae3e349Sray 		key = readbuf;
132fb92953eSderaadt 		ngstore(gtable, key, data);
133bae3e349Sray 		free(readbuf);
134345c9dd4Smaja 	}
135345c9dd4Smaja 
136345c9dd4Smaja 	fclose(fp);
137345c9dd4Smaja 
138345c9dd4Smaja 	/*
139345c9dd4Smaja 	 * Find all members of each netgroup and keep track of which
140345c9dd4Smaja 	 * group they belong to.
141345c9dd4Smaja 	 */
142345c9dd4Smaja 	for (i = 0; i < TABLESIZE; i++) {
143345c9dd4Smaja 		gcur = gtable[i];
144345c9dd4Smaja 		while (gcur) {
145345c9dd4Smaja 			__setnetgrent(gcur->key);
146691235adSmiod 			while (__getnetgrent(&host, &user, &domain) != 0) {
147345c9dd4Smaja 				if (hosts) {
148345c9dd4Smaja 					if (!(host && !strcmp(host,"-"))) {
149345c9dd4Smaja 						mstore(mtable,
150345c9dd4Smaja 						    host ? host : "*",
151345c9dd4Smaja 						    gcur->key,
152345c9dd4Smaja 						    domain ? domain : "*");
153345c9dd4Smaja 					}
154345c9dd4Smaja 				} else {
155345c9dd4Smaja 					if (!(user && !strcmp(user,"-"))) {
156345c9dd4Smaja 						mstore(mtable,
157345c9dd4Smaja 						    user ? user : "*",
158345c9dd4Smaja 						    gcur->key,
159345c9dd4Smaja 						    domain ? domain : "*");
160345c9dd4Smaja 					}
161345c9dd4Smaja 				}
162345c9dd4Smaja 			}
163345c9dd4Smaja 			gcur = gcur->next;
164345c9dd4Smaja 		}
165345c9dd4Smaja 	}
166345c9dd4Smaja 
167345c9dd4Smaja 	/* Release resources used by the netgroup parser code. */
168345c9dd4Smaja 	__endnetgrent();
169345c9dd4Smaja 
170345c9dd4Smaja 	/* Spew out the results. */
171345c9dd4Smaja 	for (i = 0; i < TABLESIZE; i++) {
172345c9dd4Smaja 		mcur = mtable[i];
173345c9dd4Smaja 		while (mcur) {
174345c9dd4Smaja 			struct grouplist *tmp;
175345c9dd4Smaja 			printf ("%s.%s\t", mcur->key, mcur->domain);
176345c9dd4Smaja 			tmp = mcur->groups;
177345c9dd4Smaja 			while (tmp) {
178345c9dd4Smaja 				printf ("%s", tmp->groupname);
179345c9dd4Smaja 				tmp = tmp->next;
180345c9dd4Smaja 				if (tmp)
181345c9dd4Smaja 					printf(",");
182345c9dd4Smaja 			}
183345c9dd4Smaja 			mcur = mcur->next;
184345c9dd4Smaja 			printf ("\n");
185345c9dd4Smaja 		}
186345c9dd4Smaja 	}
187345c9dd4Smaja 
188345c9dd4Smaja 	/* Let the OS free all our resources. */
189345c9dd4Smaja 	exit(0);
190345c9dd4Smaja }
191