1Author: Matthew Bauer
2Description: Remove unavailable getent databases
3Version: 7.1.2
4--- a/usr.bin/getent/getent.c 2018-04-16 13:33:49.000000000 -0500
5+++ b/usr.bin/getent/getent.c 2018-04-16 13:29:30.000000000 -0500
6@@ -42,7 +42,6 @@
7 #include <grp.h>
8 #include <limits.h>
9 #include <netdb.h>
10-#include <netgroup.h>
11 #include <pwd.h>
12 #include <stdio.h>
13 #include <stdarg.h>
14@@ -57,27 +56,16 @@
15 #include <arpa/nameser.h>
16
17 #include <net/if.h>
18-#include <net/if_ether.h>
19
20 #include <netinet/in.h> /* for INET6_ADDRSTRLEN */
21
22-#include <rpc/rpcent.h>
23-
24-#include <disktab.h>
25-
26 static int usage(void) __attribute__((__noreturn__));
27 static int parsenum(const char *, unsigned long *);
28-static int disktab(int, char *[]);
29-static int gettytab(int, char *[]);
30-static int ethers(int, char *[]);
31 static int group(int, char *[]);
32 static int hosts(int, char *[]);
33-static int netgroup(int, char *[]);
34 static int networks(int, char *[]);
35 static int passwd(int, char *[]);
36-static int printcap(int, char *[]);
37 static int protocols(int, char *[]);
38-static int rpc(int, char *[]);
39 static int services(int, char *[]);
40 static int shells(int, char *[]);
41
42@@ -92,17 +80,11 @@
43 const char *name;
44 int (*callback)(int, char *[]);
45 } databases[] = {
46- { "disktab", disktab, },
47- { "ethers", ethers, },
48- { "gettytab", gettytab, },
49 { "group", group, },
50 { "hosts", hosts, },
51- { "netgroup", netgroup, },
52 { "networks", networks, },
53 { "passwd", passwd, },
54- { "printcap", printcap, },
55 { "protocols", protocols, },
56- { "rpc", rpc, },
57 { "services", services, },
58 { "shells", shells, },
59
60@@ -195,49 +177,6 @@
61 (void)printf("\n");
62 }
63
64-
65- /*
66- * ethers
67- */
68-
69-static int
70-ethers(int argc, char *argv[])
71-{
72- char hostname[MAXHOSTNAMELEN + 1], *hp;
73- struct ether_addr ea, *eap;
74- int i, rv;
75-
76- assert(argc > 1);
77- assert(argv != NULL);
78-
79-#define ETHERSPRINT (void)printf("%-17s %s\n", ether_ntoa(eap), hp)
80-
81- rv = RV_OK;
82- if (argc == 2) {
83- warnx("Enumeration not supported on ethers");
84- rv = RV_NOENUM;
85- } else {
86- for (i = 2; i < argc; i++) {
87- if ((eap = ether_aton(argv[i])) == NULL) {
88- eap = &ea;
89- hp = argv[i];
90- if (ether_hostton(hp, eap) != 0) {
91- rv = RV_NOTFOUND;
92- break;
93- }
94- } else {
95- hp = hostname;
96- if (ether_ntohost(hp, eap) != 0) {
97- rv = RV_NOTFOUND;
98- break;
99- }
100- }
101- ETHERSPRINT;
102- }
103- }
104- return rv;
105-}
106-
107 /*
108 * group
109 */
110@@ -298,7 +237,7 @@
111 hosts(int argc, char *argv[])
112 {
113 struct hostent *he;
114- char addr[IN6ADDRSZ];
115+ char addr[NS_IN6ADDRSZ];
116 int i, rv;
117
118 assert(argc > 1);
119@@ -312,9 +251,9 @@
120 } else {
121 for (i = 2; i < argc; i++) {
122 if (inet_pton(AF_INET6, argv[i], (void *)addr) > 0)
123- he = gethostbyaddr(addr, IN6ADDRSZ, AF_INET6);
124+ he = gethostbyaddr(addr, NS_IN6ADDRSZ, AF_INET6);
125 else if (inet_pton(AF_INET, argv[i], (void *)addr) > 0)
126- he = gethostbyaddr(addr, INADDRSZ, AF_INET);
127+ he = gethostbyaddr(addr, NS_INADDRSZ, AF_INET);
128 else
129 he = gethostbyname(argv[i]);
130 if (he != NULL)
131@@ -330,48 +269,6 @@
132 }
133
134 /*
135- * netgroup
136- */
137-static int
138-netgroup(int argc, char *argv[])
139-{
140- int rv, i;
141- bool first;
142- const char *host, *user, *domain;
143-
144- assert(argc > 1);
145- assert(argv != NULL);
146-
147-#define NETGROUPPRINT(s) (((s) != NULL) ? (s) : "")
148-
149- rv = RV_OK;
150- if (argc == 2) {
151- warnx("Enumeration not supported on netgroup");
152- rv = RV_NOENUM;
153- } else {
154- for (i = 2; i < argc; i++) {
155- setnetgrent(argv[i]);
156- first = true;
157- while (getnetgrent(&host, &user, &domain) != 0) {
158- if (first) {
159- first = false;
160- (void)fputs(argv[i], stdout);
161- }
162- (void)printf(" (%s,%s,%s)",
163- NETGROUPPRINT(host),
164- NETGROUPPRINT(user),
165- NETGROUPPRINT(domain));
166- }
167- if (!first)
168- (void)putchar('\n');
169- endnetgrent();
170- }
171- }
172-
173- return rv;
174-}
175-
176- /*
177 * networks
178 */
179
180@@ -464,227 +361,6 @@
181 return rv;
182 }
183
184-static char *
185-mygetent(const char * const * db_array, const char *name)
186-{
187- char *buf = NULL;
188- int error;
189-
190- switch (error = cgetent(&buf, db_array, name)) {
191- case -3:
192- warnx("tc= loop in record `%s' in `%s'", name, db_array[0]);
193- break;
194- case -2:
195- warn("system error fetching record `%s' in `%s'", name,
196- db_array[0]);
197- break;
198- case -1:
199- case 0:
200- break;
201- case 1:
202- warnx("tc= reference not found in record for `%s' in `%s'",
203- name, db_array[0]);
204- break;
205- default:
206- warnx("unknown error %d in record `%s' in `%s'", error, name,
207- db_array[0]);
208- break;
209- }
210- return buf;
211-}
212-
213-static char *
214-mygetone(const char * const * db_array, int first)
215-{
216- char *buf = NULL;
217- int error;
218-
219- switch (error = (first ? cgetfirst : cgetnext)(&buf, db_array)) {
220- case -2:
221- warnx("tc= loop in `%s'", db_array[0]);
222- break;
223- case -1:
224- warn("system error fetching record in `%s'", db_array[0]);
225- break;
226- case 0:
227- case 1:
228- break;
229- case 2:
230- warnx("tc= reference not found in `%s'", db_array[0]);
231- break;
232- default:
233- warnx("unknown error %d in `%s'", error, db_array[0]);
234- break;
235- }
236- return buf;
237-}
238-
239-static void
240-capprint(const char *cap)
241-{
242- char *c = strchr(cap, ':');
243- if (c)
244- if (c == cap)
245- (void)printf("true\n");
246- else {
247- int l = (int)(c - cap);
248- (void)printf("%*.*s\n", l, l, cap);
249- }
250- else
251- (void)printf("%s\n", cap);
252-}
253-
254-static void
255-prettyprint(char *b)
256-{
257-#define TERMWIDTH 65
258- int did = 0;
259- size_t len;
260- char *s, c;
261-
262- for (;;) {
263- len = strlen(b);
264- if (len <= TERMWIDTH) {
265-done:
266- if (did)
267- printf("\t:");
268- printf("%s\n", b);
269- return;
270- }
271- for (s = b + TERMWIDTH; s > b && *s != ':'; s--)
272- continue;
273- if (*s++ != ':')
274- goto done;
275- c = *s;
276- *s = '\0';
277- if (did)
278- printf("\t:");
279- did++;
280- printf("%s\\\n", b);
281- *s = c;
282- b = s;
283- }
284-}
285-
286-static void
287-handleone(const char * const *db_array, char *b, int recurse, int pretty,
288- int level)
289-{
290- char *tc;
291-
292- if (level && pretty)
293- printf("\n");
294- if (pretty)
295- prettyprint(b);
296- else
297- printf("%s\n", b);
298- if (!recurse || cgetstr(b, "tc", &tc) <= 0)
299- return;
300-
301- b = mygetent(db_array, tc);
302- free(tc);
303-
304- if (b == NULL)
305- return;
306-
307- handleone(db_array, b, recurse, pretty, ++level);
308- free(b);
309-}
310-
311-static int
312-handlecap(const char *db, int argc, char *argv[])
313-{
314- static const char sfx[] = "=#:";
315- const char *db_array[] = { db, NULL };
316- char *b, *cap;
317- int i, rv, c;
318- size_t j;
319- int expand = 1, recurse = 0, pretty = 0;
320-
321- assert(argc > 1);
322- assert(argv != NULL);
323-
324- argc--;
325- argv++;
326- while ((c = getopt(argc, argv, "pnr")) != -1)
327- switch (c) {
328- case 'n':
329- expand = 0;
330- break;
331- case 'r':
332- expand = 0;
333- recurse = 1;
334- break;
335- case 'p':
336- pretty = 1;
337- break;
338- default:
339- usage();
340- break;
341- }
342-
343- argc -= optind;
344- argv += optind;
345- csetexpandtc(expand);
346- rv = RV_OK;
347- if (argc == 0) {
348- for (b = mygetone(db_array, 1); b; b = mygetone(db_array, 0)) {
349- handleone(db_array, b, recurse, pretty, 0);
350- free(b);
351- }
352- } else {
353- if ((b = mygetent(db_array, argv[0])) == NULL)
354- return RV_NOTFOUND;
355- if (argc == 1)
356- handleone(db_array, b, recurse, pretty, 0);
357- else {
358- for (i = 2; i < argc; i++) {
359- for (j = 0; j < sizeof(sfx) - 1; j++) {
360- cap = cgetcap(b, argv[i], sfx[j]);
361- if (cap) {
362- capprint(cap);
363- break;
364- }
365- }
366- if (j == sizeof(sfx) - 1)
367- printf("false\n");
368- }
369- }
370- free(b);
371- }
372- return rv;
373-}
374-
375- /*
376- * gettytab
377- */
378-
379-static int
380-gettytab(int argc, char *argv[])
381-{
382- return handlecap(_PATH_GETTYTAB, argc, argv);
383-}
384-
385- /*
386- * printcap
387- */
388-
389-static int
390-printcap(int argc, char *argv[])
391-{
392- return handlecap(_PATH_PRINTCAP, argc, argv);
393-}
394-
395- /*
396- * disktab
397- */
398-
399-static int
400-disktab(int argc, char *argv[])
401-{
402- return handlecap(_PATH_DISKTAB, argc, argv);
403-}
404-
405 /*
406 * protocols
407 */
408@@ -726,47 +402,6 @@
409 }
410
411 /*
412- * rpc
413- */
414-
415-static int
416-rpc(int argc, char *argv[])
417-{
418- struct rpcent *re;
419- unsigned long id;
420- int i, rv;
421-
422- assert(argc > 1);
423- assert(argv != NULL);
424-
425-#define RPCPRINT printfmtstrings(re->r_aliases, " ", " ", \
426- "%-16s %6d", \
427- re->r_name, re->r_number)
428-
429- setrpcent(1);
430- rv = RV_OK;
431- if (argc == 2) {
432- while ((re = getrpcent()) != NULL)
433- RPCPRINT;
434- } else {
435- for (i = 2; i < argc; i++) {
436- if (parsenum(argv[i], &id))
437- re = getrpcbynumber((int)id);
438- else
439- re = getrpcbyname(argv[i]);
440- if (re != NULL)
441- RPCPRINT;
442- else {
443- rv = RV_NOTFOUND;
444- break;
445- }
446- }
447- }
448- endrpcent();
449- return rv;
450-}
451-
452- /*
453 * services
454 */
455