at 23.11-beta 455 lines 8.6 kB view raw
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