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