147484Spendry /*
247484Spendry * Copyright (c) 1989 Jan-Simon Pendry
347484Spendry * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
4*61793Sbostic * Copyright (c) 1989, 1993
5*61793Sbostic * The Regents of the University of California. All rights reserved.
647484Spendry *
747530Spendry * %sccs.include.redist.c%
847484Spendry *
9*61793Sbostic * @(#)fsi_util.c 8.1 (Berkeley) 06/06/93
1049686Spendry *
1152455Spendry * $Id: fsi_util.c,v 5.2.2.1 1992/02/09 15:09:39 jsp beta $
1249686Spendry *
1347484Spendry */
1447484Spendry
1547484Spendry #include "../fsinfo/fsinfo.h"
1647484Spendry
1747484Spendry /*
1847484Spendry * Lots of ways of reporting errors...
1947484Spendry */
error(s,s1,s2,s3,s4)2047484Spendry void error(s, s1, s2, s3, s4)
2147484Spendry char *s, *s1, *s2, *s3, *s4;
2247484Spendry {
2347484Spendry col_cleanup(0);
2447484Spendry fprintf(stderr, "%s: Error, ", progname);
2547484Spendry fprintf(stderr, s, s1, s2, s3, s4);
2647484Spendry fputc('\n', stderr);
2747484Spendry errors++;
2847484Spendry }
2947484Spendry
lerror(l,s,s1,s2,s3,s4)3047484Spendry void lerror(l, s, s1, s2, s3, s4)
3147484Spendry ioloc *l;
3247484Spendry char *s, *s1, *s2, *s3, *s4;
3347484Spendry {
3447484Spendry col_cleanup(0);
3547484Spendry fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
3647484Spendry fprintf(stderr, s, s1, s2, s3, s4);
3747484Spendry fputc('\n', stderr);
3847484Spendry errors++;
3947484Spendry }
4047484Spendry
lwarning(l,s,s1,s2,s3,s4)4147484Spendry void lwarning(l, s, s1, s2, s3, s4)
4247484Spendry ioloc *l;
4347484Spendry char *s, *s1, *s2, *s3, *s4;
4447484Spendry {
4547484Spendry col_cleanup(0);
4647484Spendry fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
4747484Spendry fprintf(stderr, s, s1, s2, s3, s4);
4847484Spendry fputc('\n', stderr);
4947484Spendry
5047484Spendry }
5147484Spendry
fatal(s,s1,s2,s3,s4)5247484Spendry void fatal(s, s1, s2, s3, s4)
5347484Spendry char *s, *s1, *s2, *s3, *s4;
5447484Spendry {
5547484Spendry col_cleanup(1);
5647484Spendry fprintf(stderr, "%s: Fatal, ", progname);
5747484Spendry fprintf(stderr, s, s1, s2, s3, s4);
5847484Spendry fputc('\n', stderr);
5947484Spendry exit(1);
6047484Spendry }
6147484Spendry
6247484Spendry /*
6347484Spendry * Dup a string
6447484Spendry */
strdup(s)6547484Spendry char *strdup(s)
6647484Spendry char *s;
6747484Spendry {
6847484Spendry int len = strlen(s);
6947484Spendry char *sp = (char *) xmalloc(len+1);
7047484Spendry
7147484Spendry bcopy(s, sp, len);
7247484Spendry sp[len] = 0;
7347484Spendry
7447484Spendry return sp;
7547484Spendry }
7647484Spendry
7747484Spendry /*
7847484Spendry * Debug log
7947484Spendry */
log(s,s1,s2,s3,s4)8047484Spendry void log(s, s1, s2, s3, s4)
8147484Spendry char *s, *s1, *s2, *s3, *s4;
8247484Spendry {
8347484Spendry if (verbose > 0) {
8447484Spendry fputc('#', stdout);
8547484Spendry fprintf(stdout, "%s: ", progname);
8647484Spendry fprintf(stdout, s, s1, s2, s3, s4);
8747484Spendry putc('\n', stdout);
8847484Spendry }
8947484Spendry }
9047484Spendry
info_hdr(ef,info)9147484Spendry void info_hdr(ef, info)
9247484Spendry FILE *ef;
9347484Spendry char *info;
9447484Spendry {
9547484Spendry fprintf(ef, "# *** NOTE: This file contains %s info\n", info);
9647484Spendry }
9747484Spendry
gen_hdr(ef,hn)9847484Spendry void gen_hdr(ef, hn)
9947484Spendry FILE *ef;
10047484Spendry char *hn;
10147484Spendry {
10247484Spendry fprintf(ef, "# *** NOTE: Only for use on %s\n", hn);
10347484Spendry }
10447484Spendry
make_banner(fp)10547484Spendry static void make_banner(fp)
10647484Spendry FILE *fp;
10747484Spendry {
10847484Spendry time_t t = time((time_t*) 0);
10947484Spendry char *ctime(), *cp = ctime(&t);
11047484Spendry
11147484Spendry fprintf(fp,
11247484Spendry "\
11347484Spendry # *** This file was automatically generated -- DO NOT EDIT HERE ***\n\
11447484Spendry # \"%s\" run by %s@%s on %s\
11547484Spendry #\n\
11647484Spendry ",
11747484Spendry progname, username, hostname, cp);
11847484Spendry }
11947484Spendry
12047484Spendry static int show_range = 10;
12147484Spendry static int col = 0;
12247484Spendry static int total_shown = 0;
12347484Spendry static int total_mmm = 8;
12447484Spendry
col_output(len)12547484Spendry static int col_output(len)
12647484Spendry int len;
12747484Spendry {
12847484Spendry int wrapped = 0;
12947484Spendry col += len;
13047484Spendry if (col > 77) {
13147484Spendry fputc('\n', stdout);
13247484Spendry col = len;
13347484Spendry wrapped = 1;
13447484Spendry }
13547484Spendry return wrapped;
13647484Spendry }
13747484Spendry
show_total()13847484Spendry static void show_total()
13947484Spendry {
14047484Spendry if (total_mmm != -show_range+1) {
14147484Spendry char n[8];
14247484Spendry int len;
14347484Spendry if (total_mmm < 0)
14447484Spendry fputc('*', stdout);
14547484Spendry sprintf(n, "%d", total_shown);
14647484Spendry len = strlen(n);
14747484Spendry if (col_output(len))
14847484Spendry fputc(' ', stdout);
14947484Spendry fputs(n, stdout); fflush(stdout);
15047484Spendry total_mmm = -show_range;
15147484Spendry }
15247484Spendry }
15347484Spendry
col_cleanup(eoj)15447484Spendry col_cleanup(eoj)
15547484Spendry int eoj;
15647484Spendry {
15747484Spendry if (verbose < 0) return;
15847484Spendry if (eoj) {
15947484Spendry show_total();
16047484Spendry fputs(")]", stdout);
16147484Spendry }
16247484Spendry if (col) {
16347484Spendry fputc('\n', stdout);
16447484Spendry col = 0;
16547484Spendry }
16647484Spendry }
16747484Spendry
show_new(msg)16847484Spendry void show_new(msg)
16947484Spendry char *msg;
17047484Spendry {
17147484Spendry if (verbose < 0) return;
17247484Spendry total_shown++;
17347484Spendry if (total_mmm > show_range) {
17447484Spendry show_total();
17547484Spendry } else if (total_mmm == 0) {
17647484Spendry fputc('*', stdout); fflush(stdout);
17747484Spendry col += 1;
17847484Spendry }
17947484Spendry total_mmm++;
18047484Spendry }
18147484Spendry
show_area_being_processed(area,n)18247484Spendry void show_area_being_processed(area, n)
18347484Spendry char *area;
18447484Spendry int n;
18547484Spendry {
18647484Spendry static char *last_area = 0;
18747484Spendry if (verbose < 0) return;
18847484Spendry if (last_area) {
18947484Spendry if (total_shown)
19047484Spendry show_total();
19147484Spendry fputs(")", stdout);
19247484Spendry col += 1;
19347484Spendry }
19447484Spendry if (!last_area || strcmp(area, last_area) != 0) {
19547484Spendry if (last_area) {
19647484Spendry col_cleanup(0);
19747484Spendry total_shown = 0;
19847484Spendry total_mmm = show_range+1;
19947484Spendry }
20047484Spendry (void) col_output(strlen(area)+2);
20147484Spendry fprintf(stdout, "[%s", area);
20247484Spendry last_area = area;
20347484Spendry }
20447484Spendry
20547484Spendry fputs(" (", stdout);
20647484Spendry col += 2;
20747484Spendry show_range = n;
20847484Spendry total_mmm = n + 1;
20947484Spendry
21047484Spendry fflush(stdout);
21147484Spendry }
21247484Spendry
21347484Spendry /*
21447484Spendry * Open a file with the given prefix and name
21547484Spendry */
pref_open(pref,hn,hdr,arg)21647484Spendry FILE *pref_open(pref, hn, hdr, arg)
21747484Spendry char *pref;
21847484Spendry char *hn;
21947484Spendry void (*hdr)();
22047484Spendry char *arg;
22147484Spendry {
22247484Spendry char p[MAXPATHLEN];
22347484Spendry FILE *ef;
22447484Spendry sprintf(p, "%s%s", pref, hn);
22547484Spendry log("Writing %s info for %s to %s", pref, hn, p);
22647484Spendry ef = fopen(p, "w");
22747484Spendry if (ef) {
22847484Spendry (*hdr)(ef, arg);
22947484Spendry make_banner(ef, hn);
23047484Spendry } else {
23147484Spendry error("can't open %s for writing", p);
23247484Spendry }
23347484Spendry
23447484Spendry return ef;
23547484Spendry }
23647484Spendry
pref_close(fp)23747484Spendry int pref_close(fp)
23847484Spendry FILE *fp;
23947484Spendry {
24047484Spendry return fclose(fp) == 0;
24147484Spendry }
24247484Spendry
24347484Spendry /*
24447484Spendry * Determine where Amd would automount the host/volname pair
24547484Spendry */
compute_automount_point(buf,hp,vn)24647484Spendry void compute_automount_point(buf, hp, vn)
24747484Spendry char *buf;
24847484Spendry host *hp;
24947484Spendry char *vn;
25047484Spendry {
25147484Spendry #ifdef AMD_USES_HOSTPATH
25247484Spendry sprintf(buf, "%s/%s%s", autodir, hp->h_hostpath, vn);
25347484Spendry #else
25447484Spendry sprintf(buf, "%s/%s%s", autodir, hp->h_lochost, vn);
25547484Spendry #endif
25647484Spendry }
25747484Spendry
xcalloc(i,s)25847484Spendry char *xcalloc(i, s)
25947484Spendry int i;
26047484Spendry int s;
26147484Spendry {
26247484Spendry char *p = (char *) calloc(i, (unsigned) s);
26347484Spendry if (!p)
26447484Spendry fatal("Out of memory");
26547484Spendry return p;
26647484Spendry }
26747484Spendry
xmalloc(i)26847484Spendry char *xmalloc(i)
26947484Spendry int i;
27047484Spendry {
27147484Spendry char *p = (char *) malloc(i);
27247484Spendry if (!p)
27347484Spendry fatal("Out of memory");
27447484Spendry return p;
27547484Spendry }
27647484Spendry
27747484Spendry /*
27847484Spendry * Data constructors..
27947484Spendry */
28047484Spendry
new_automount(name)28147484Spendry automount *new_automount(name)
28247484Spendry char *name;
28347484Spendry {
28447484Spendry automount *ap = ALLOC(automount);
28547484Spendry ap->a_ioloc = current_location();
28647484Spendry ap->a_name = name;
28747484Spendry ap->a_volname = 0;
28847484Spendry ap->a_mount = 0;
28947484Spendry show_new("automount");
29047484Spendry return ap;
29147484Spendry }
29247484Spendry
new_auto_tree(def,ap)29347484Spendry auto_tree *new_auto_tree(def, ap)
29447484Spendry char *def;
29547484Spendry qelem *ap;
29647484Spendry {
29747484Spendry auto_tree *tp = ALLOC(auto_tree);
29847484Spendry tp->t_ioloc = current_location();
29947484Spendry tp->t_defaults = def;
30047484Spendry tp->t_mount = ap;
30147484Spendry show_new("auto_tree");
30247484Spendry return tp;
30347484Spendry }
30447484Spendry
new_host()30547484Spendry host *new_host()
30647484Spendry {
30747484Spendry host *hp = ALLOC(host);
30847484Spendry hp->h_ioloc = current_location();
30947484Spendry hp->h_mask = 0;
31047484Spendry show_new("host");
31147484Spendry return hp;
31247484Spendry }
31347484Spendry
set_host(hp,k,v)31447484Spendry void set_host(hp, k, v)
31547484Spendry host *hp;
31647484Spendry int k;
31747484Spendry char *v;
31847484Spendry {
31947484Spendry int m = 1 << k;
32047484Spendry if (hp->h_mask & m) {
32147484Spendry yyerror("host field \"%s\" already set", host_strings[k]);
32247484Spendry return;
32347484Spendry }
32447484Spendry
32547484Spendry hp->h_mask |= m;
32647484Spendry
32747484Spendry switch (k) {
32847484Spendry case HF_HOST: {
32947484Spendry char *p = strdup(v);
33047484Spendry dict_ent *de = dict_locate(dict_of_hosts, v);
33147484Spendry if (de)
33247484Spendry yyerror("duplicate host %s!", v);
33347484Spendry else
33447484Spendry dict_add(dict_of_hosts, v, (char *) hp);
33547484Spendry hp->h_hostname = v;
33647484Spendry domain_strip(p, hostname);
33747484Spendry if (strchr(p, '.') != 0)
33847484Spendry free(p);
33947484Spendry else
34047484Spendry hp->h_lochost = p;
34147484Spendry } break;
34247484Spendry case HF_CONFIG: {
34347484Spendry qelem *q;
34447484Spendry qelem *vq = (qelem *) v;
34547484Spendry hp->h_mask &= ~m;
34647484Spendry if (hp->h_config)
34747484Spendry q = hp->h_config;
34847484Spendry else
34947484Spendry q = hp->h_config = new_que();
35047484Spendry ins_que(vq, q->q_back);
35147484Spendry } break;
35247484Spendry case HF_ETHER: {
35347484Spendry qelem *q;
35447484Spendry qelem *vq = (qelem *) v;
35547484Spendry hp->h_mask &= ~m;
35647484Spendry if (hp->h_ether)
35747484Spendry q = hp->h_ether;
35847484Spendry else
35947484Spendry q = hp->h_ether = new_que();
36047484Spendry ins_que(vq, q->q_back);
36147484Spendry } break;
36247484Spendry case HF_ARCH: hp->h_arch = v; break;
36347484Spendry case HF_OS: hp->h_os = v; break;
36447484Spendry case HF_CLUSTER: hp->h_cluster = v; break;
36547484Spendry default: abort(); break;
36647484Spendry }
36747484Spendry }
36847484Spendry
new_ether_if()36947484Spendry ether_if *new_ether_if()
37047484Spendry {
37147484Spendry ether_if *ep = ALLOC(ether_if);
37247484Spendry ep->e_mask = 0;
37347484Spendry ep->e_ioloc = current_location();
37447484Spendry show_new("ether_if");
37547484Spendry return ep;
37647484Spendry }
37747484Spendry
set_ether_if(ep,k,v)37847484Spendry void set_ether_if(ep,k, v)
37947484Spendry ether_if *ep;
38047484Spendry int k;
38147484Spendry char *v;
38247484Spendry {
38347484Spendry int m = 1 << k;
38447484Spendry if (ep->e_mask & m) {
38547484Spendry yyerror("netif field \"%s\" already set", ether_if_strings[k]);
38647484Spendry return;
38747484Spendry }
38847484Spendry
38947484Spendry ep->e_mask |= m;
39047484Spendry
39147484Spendry switch (k) {
39247484Spendry case EF_INADDR: {
39347484Spendry extern u_long inet_addr();
39447484Spendry ep->e_inaddr.s_addr = inet_addr(v);
39547484Spendry if (ep->e_inaddr.s_addr == (u_long) -1)
39647484Spendry yyerror("malformed IP dotted quad: %s", v);
39747484Spendry free(v);
39847484Spendry } break;
39947484Spendry case EF_NETMASK: {
40047484Spendry u_long nm = 0;
40147484Spendry if ((sscanf(v, "0x%lx", &nm) == 1 || sscanf(v, "%lx", &nm) == 1) && nm != 0)
40247484Spendry ep->e_netmask = htonl(nm);
40347484Spendry else
40447484Spendry yyerror("malformed netmask: %s", v);
40547484Spendry free(v);
40647484Spendry } break;
40747484Spendry case EF_HWADDR:
40847484Spendry ep->e_hwaddr = v;
40947484Spendry break;
41047484Spendry default: abort(); break;
41147484Spendry }
41247484Spendry }
41347484Spendry
set_disk_fs(dp,k,v)41447484Spendry void set_disk_fs(dp, k, v)
41547484Spendry disk_fs *dp;
41647484Spendry int k;
41747484Spendry char *v;
41847484Spendry {
41947484Spendry int m = 1 << k;
42047484Spendry if (dp->d_mask & m) {
42147484Spendry yyerror("fs field \"%s\" already set", disk_fs_strings[k]);
42247484Spendry return;
42347484Spendry }
42447484Spendry
42547484Spendry dp->d_mask |= m;
42647484Spendry
42747484Spendry switch (k) {
42847484Spendry case DF_FSTYPE: dp->d_fstype = v; break;
42947484Spendry case DF_OPTS: dp->d_opts = v; break;
43047484Spendry case DF_DUMPSET: dp->d_dumpset = v; break;
43147484Spendry case DF_LOG: dp->d_log = v; break;
43247484Spendry case DF_PASSNO: dp->d_passno = atoi(v); free(v); break;
43347484Spendry case DF_FREQ: dp->d_freq = atoi(v); free(v); break;
43447484Spendry case DF_MOUNT: dp->d_mount = &((mount *) v)->m_q; break;
43547484Spendry default: abort(); break;
43647484Spendry }
43747484Spendry }
43847484Spendry
new_disk_fs()43947484Spendry disk_fs *new_disk_fs()
44047484Spendry {
44147484Spendry disk_fs *dp = ALLOC(disk_fs);
44247484Spendry dp->d_ioloc = current_location();
44347484Spendry show_new("disk_fs");
44447484Spendry return dp;
44547484Spendry }
44647484Spendry
set_mount(mp,k,v)44747484Spendry void set_mount(mp, k, v)
44847484Spendry mount *mp;
44947484Spendry int k;
45047484Spendry char *v;
45147484Spendry {
45247484Spendry int m = 1 << k;
45347484Spendry if (mp->m_mask & m) {
45447484Spendry yyerror("mount tree field \"%s\" already set", mount_strings[k]);
45547484Spendry return;
45647484Spendry }
45747484Spendry
45847484Spendry mp->m_mask |= m;
45947484Spendry
46047484Spendry switch (k) {
46147484Spendry case DM_VOLNAME:
46247484Spendry dict_add(dict_of_volnames, v, (char *) mp);
46347484Spendry mp->m_volname = v;
46447484Spendry break;
46547484Spendry case DM_EXPORTFS:
46647484Spendry mp->m_exportfs = v;
46747484Spendry break;
46847484Spendry case DM_SEL:
46947484Spendry mp->m_sel = v;
47047484Spendry break;
47147484Spendry default: abort(); break;
47247484Spendry }
47347484Spendry }
47447484Spendry
new_mount()47547484Spendry mount *new_mount()
47647484Spendry {
47747484Spendry mount *fp = ALLOC(mount);
47847484Spendry fp->m_ioloc = current_location();
47947484Spendry show_new("mount");
48047484Spendry return fp;
48147484Spendry }
48247484Spendry
set_fsmount(fp,k,v)48347484Spendry void set_fsmount(fp, k, v)
48447484Spendry fsmount *fp;
48547484Spendry int k;
48647484Spendry char *v;
48747484Spendry {
48847484Spendry int m = 1 << k;
48947484Spendry if (fp->f_mask & m) {
49047484Spendry yyerror("mount field \"%s\" already set", fsmount_strings[k]);
49147484Spendry return;
49247484Spendry }
49347484Spendry
49447484Spendry fp->f_mask |= m;
49547484Spendry
49647484Spendry switch (k) {
49747484Spendry case FM_LOCALNAME: fp->f_localname = v; break;
49847484Spendry case FM_VOLNAME: fp->f_volname = v; break;
49947484Spendry case FM_FSTYPE: fp->f_fstype = v; break;
50047484Spendry case FM_OPTS: fp->f_opts = v; break;
50147484Spendry case FM_FROM: fp->f_from = v; break;
50247484Spendry default: abort(); break;
50347484Spendry }
50447484Spendry }
50547484Spendry
new_fsmount()50647484Spendry fsmount *new_fsmount()
50747484Spendry {
50847484Spendry fsmount *fp = ALLOC(fsmount);
50947484Spendry fp->f_ioloc = current_location();
51047484Spendry show_new("fsmount");
51147484Spendry return fp;
51247484Spendry }
51347484Spendry
init_que(q)51447484Spendry void init_que(q)
51547484Spendry qelem *q;
51647484Spendry {
51747484Spendry q->q_forw = q->q_back = q;
51847484Spendry }
51947484Spendry
new_que()52047484Spendry qelem *new_que()
52147484Spendry {
52247484Spendry qelem *q = ALLOC(qelem);
52347484Spendry init_que(q);
52447484Spendry return q;
52547484Spendry }
52647484Spendry
ins_que(elem,pred)52747484Spendry void ins_que(elem, pred)
52847484Spendry qelem *elem, *pred;
52947484Spendry {
53047484Spendry qelem *p;
53147484Spendry p = pred->q_forw;
53247484Spendry elem->q_back = pred;
53347484Spendry elem->q_forw = p;
53447484Spendry pred->q_forw = elem;
53547484Spendry p->q_back = elem;
53647484Spendry }
53747484Spendry
rem_que(elem)53847484Spendry void rem_que(elem)
53947484Spendry qelem *elem;
54047484Spendry {
54147484Spendry qelem *p, *p2;
54247484Spendry p = elem->q_forw;
54347484Spendry p2 = elem->q_back;
54447484Spendry
54547484Spendry p2->q_forw = p;
54647484Spendry p->q_back = p2;
54747484Spendry }
548