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