1 /*- 2 * SPDX-License-Identifier: BSD-4-Clause 3 * 4 * Copyright (c) 1995 5 * Bill Paul <wpaul@ctr.columbia.edu>. 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 <wpaul@ctr.columbia.edu> 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