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