fsinfo.c revision 38495
1193323Sed/* 2193323Sed * Copyright (c) 1997-1998 Erez Zadok 3193323Sed * Copyright (c) 1989 Jan-Simon Pendry 4193323Sed * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 5193323Sed * Copyright (c) 1989 The Regents of the University of California. 6193323Sed * All rights reserved. 7193323Sed * 8193323Sed * This code is derived from software contributed to Berkeley by 9193323Sed * Jan-Simon Pendry at Imperial College, London. 10193323Sed * 11193323Sed * Redistribution and use in source and binary forms, with or without 12193323Sed * modification, are permitted provided that the following conditions 13193323Sed * are met: 14193323Sed * 1. Redistributions of source code must retain the above copyright 15193323Sed * notice, this list of conditions and the following disclaimer. 16210299Sed * 2. Redistributions in binary form must reproduce the above copyright 17210299Sed * notice, this list of conditions and the following disclaimer in the 18193323Sed * documentation and/or other materials provided with the distribution. 19210299Sed * 3. All advertising materials mentioning features or use of this software 20218893Sdim * must display the following acknowledgement: 21203954Srdivacky * This product includes software developed by the University of 22203954Srdivacky * California, Berkeley and its contributors. 23193323Sed * 4. Neither the name of the University nor the names of its contributors 24243830Sdim * may be used to endorse or promote products derived from this software 25199481Srdivacky * without specific prior written permission. 26193323Sed * 27203954Srdivacky * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28203954Srdivacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29206083Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30202375Srdivacky * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31193323Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32198090Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33193323Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34193323Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35193323Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36193323Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37198892Srdivacky * SUCH DAMAGE. 38198892Srdivacky * 39193323Sed * %W% (Berkeley) %G% 40193323Sed * 41193323Sed * $Id: fsinfo.c,v 5.2.2.1 1992/02/09 15:09:33 jsp beta $ 42193323Sed * 43193323Sed */ 44193323Sed 45193323Sed/* 46203954Srdivacky * fsinfo 47203954Srdivacky */ 48205218Srdivacky 49203954Srdivacky#ifdef HAVE_CONFIG_H 50205218Srdivacky# include <config.h> 51205218Srdivacky#endif /* HAVE_CONFIG_H */ 52206083Srdivacky#include <am_defs.h> 53206083Srdivacky#include <fsi_data.h> 54206083Srdivacky#include <fsinfo.h> 55203954Srdivacky#include <fsi_gram.h> 56203954Srdivacky 57203954Srdivacky/* globals */ 58198090Srdivackychar **g_argv; 59193323Sedchar *autodir = "/a"; 60193323Sedchar *progname; 61193323Sedchar *username; 62193323Sedchar hostname[MAXHOSTNAMELEN + 1]; 63224145Sdimchar idvbuf[1024]; 64193323Seddict *dict_of_hosts; 65193323Seddict *dict_of_volnames; 66193323Sedint errors; 67193323Sedint file_io_errors; 68193323Sedint parse_errors; 69193323Sedint verbose; 70198090Srdivackyqelem *list_of_automounts; 71193323Sedqelem *list_of_hosts; 72193323Sed 73193323Sed/* 74193323Sed * Output file prefixes 75193323Sed */ 76234353Sdimchar *bootparams_pref; 77234353Sdimchar *dumpset_pref; 78193323Sedchar *exportfs_pref; 79193323Sedchar *fstab_pref; 80193323Sedchar *mount_pref; 81193323Sed 82193323Sed/* dummy variables */ 83198090Srdivackyint orig_umask, foreground, debug_flags; 84193323Sedpid_t mypid; 85193323Sedserv_state amd_state; 86193323Sed 87193323Sed 88193323Sed/* 89193323Sed * Argument cracking... 90193323Sed */ 91193323Sedstatic void 92193323Sedfsi_get_args(int c, char *v[]) 93198090Srdivacky{ 94193323Sed int ch; 95193323Sed int usage = 0; 96224145Sdim char *iptr = idvbuf; 97193323Sed 98193323Sed /* 99193323Sed * Determine program name 100193323Sed */ 101193323Sed if (v[0]) { 102193323Sed progname = strrchr(v[0], '/'); 103193323Sed if (progname && progname[1]) 104193323Sed progname++; 105193323Sed else 106193323Sed progname = v[0]; 107193323Sed } 108198090Srdivacky 109193323Sed if (!progname) 110193323Sed progname = "fsinfo"; 111193323Sed 112239462Sdim while ((ch = getopt(c, v, "a:b:d:e:f:h:m:D:U:I:qv")) != EOF) 113239462Sdim 114224145Sdim switch (ch) { 115193323Sed 116193323Sed case 'a': 117193323Sed autodir = optarg; 118193323Sed break; 119193323Sed 120193323Sed case 'b': 121193323Sed if (bootparams_pref) 122193323Sed fatal("-b option specified twice"); 123198090Srdivacky bootparams_pref = optarg; 124198090Srdivacky break; 125234353Sdim 126234353Sdim case 'd': 127193323Sed if (dumpset_pref) 128193323Sed fatal("-d option specified twice"); 129193323Sed dumpset_pref = optarg; 130193323Sed break; 131193323Sed 132193323Sed case 'h': 133193323Sed strncpy(hostname, optarg, sizeof(hostname) - 1); 134193323Sed break; 135193323Sed 136193323Sed case 'e': 137193323Sed if (exportfs_pref) 138193323Sed fatal("-e option specified twice"); 139193323Sed exportfs_pref = optarg; 140193323Sed break; 141193323Sed 142193323Sed case 'f': 143193323Sed if (fstab_pref) 144210299Sed fatal("-f option specified twice"); 145234353Sdim fstab_pref = optarg; 146234353Sdim break; 147210299Sed 148243830Sdim case 'm': 149243830Sdim if (mount_pref) 150210299Sed fatal("-m option specified twice"); 151210299Sed mount_pref = optarg; 152210299Sed break; 153218893Sdim 154218893Sdim case 'q': 155234353Sdim verbose = -1; 156234353Sdim break; 157218893Sdim 158234353Sdim case 'v': 159234353Sdim verbose = 1; 160243830Sdim break; 161234353Sdim 162218893Sdim case 'I': 163218893Sdim case 'D': 164218893Sdim case 'U': 165193323Sed sprintf(iptr, "-%c%s ", ch, optarg); 166234353Sdim iptr += strlen(iptr); 167234353Sdim break; 168193323Sed 169234353Sdim default: 170218893Sdim usage++; 171193323Sed break; 172193323Sed } 173193323Sed 174234353Sdim if (c != optind) { 175234353Sdim g_argv = v + optind - 1; 176234353Sdim if (yywrap()) 177234353Sdim fatal("Cannot read any input files"); 178234353Sdim } else { 179234353Sdim usage++; 180234353Sdim } 181234353Sdim 182234353Sdim if (usage) { 183234353Sdim fprintf(stderr, 184234353Sdim "\ 185234353SdimUsage: %s [-v] [-a autodir] [-h hostname] [-b bootparams] [-d dumpsets]\n\ 186234353Sdim\t[-e exports] [-f fstabs] [-m automounts]\n\ 187234353Sdim\t[-I dir] [-D|-U string[=string]] config ...\n", progname); 188234353Sdim exit(1); 189234353Sdim } 190234353Sdim 191234353Sdim if (g_argv[0]) 192234353Sdim log("g_argv[0] = %s", g_argv[0]); 193218893Sdim else 194234353Sdim log("g_argv[0] = (nil)"); 195234353Sdim} 196218893Sdim 197218893Sdim 198234353Sdim/* 199234353Sdim * Determine username of caller 200218893Sdim */ 201218893Sdimstatic char * 202218893Sdimfind_username(void) 203218893Sdim{ 204218893Sdim char *u = getlogin(); 205218893Sdim 206218893Sdim if (!u) { 207234353Sdim struct passwd *pw = getpwuid(getuid()); 208234353Sdim if (pw) 209234353Sdim u = pw->pw_name; 210234353Sdim } 211234353Sdim 212234353Sdim if (!u) 213234353Sdim u = getenv("USER"); 214234353Sdim if (!u) 215234353Sdim u = getenv("LOGNAME"); 216234353Sdim if (!u) 217234353Sdim u = "root"; 218234353Sdim 219234353Sdim return strdup(u); 220234353Sdim} 221234353Sdim 222218893Sdim 223218893Sdim/* 224218893Sdim * MAIN 225218893Sdim */ 226218893Sdimint 227218893Sdimmain(int argc, char *argv[]) 228218893Sdim{ 229218893Sdim /* 230218893Sdim * Process arguments 231218893Sdim */ 232243830Sdim fsi_get_args(argc, argv); 233193323Sed 234202375Srdivacky /* 235193323Sed * If no hostname given then use the local name 236243830Sdim */ 237193323Sed if (!*hostname && gethostname(hostname, sizeof(hostname)) < 0) { 238199989Srdivacky perror("gethostname"); 239199989Srdivacky exit(1); 240199989Srdivacky } 241199989Srdivacky 242199989Srdivacky /* 243199989Srdivacky * Get the username 244199989Srdivacky */ 245234353Sdim username = find_username(); 246234353Sdim 247234353Sdim /* 248234353Sdim * New hosts and automounts 249243830Sdim */ 250234353Sdim list_of_hosts = new_que(); 251234353Sdim list_of_automounts = new_que(); 252234353Sdim 253234353Sdim /* 254234353Sdim * New dictionaries 255234353Sdim */ 256234353Sdim dict_of_volnames = new_dict(); 257218893Sdim dict_of_hosts = new_dict(); 258193323Sed 259198090Srdivacky /* 260193323Sed * Parse input 261193323Sed */ 262193323Sed show_area_being_processed("read config", 11); 263193323Sed if (yyparse()) 264193323Sed errors = 1; 265218893Sdim errors += file_io_errors + parse_errors; 266218893Sdim 267218893Sdim if (errors == 0) { 268198892Srdivacky /* 269198892Srdivacky * Do semantic analysis of input 270198892Srdivacky */ 271198892Srdivacky analyze_hosts(list_of_hosts); 272198892Srdivacky analyze_automounts(list_of_automounts); 273198892Srdivacky } 274198892Srdivacky 275198892Srdivacky /* 276198892Srdivacky * Give up if errors 277198892Srdivacky */ 278239462Sdim if (errors == 0) { 279234353Sdim /* 280234353Sdim * Output data files 281234353Sdim */ 282198090Srdivacky 283193323Sed write_atab(list_of_automounts); 284218893Sdim write_bootparams(list_of_hosts); 285193323Sed write_dumpset(list_of_hosts); 286218893Sdim write_exportfs(list_of_hosts); 287198892Srdivacky write_fstab(list_of_hosts); 288207618Srdivacky } 289218893Sdim col_cleanup(1); 290198090Srdivacky 291193323Sed exit(errors); 292193323Sed return errors; /* should never reach here */ 293193323Sed} 294218893Sdim