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