xref: /csrg-svn/usr.sbin/amd/fsinfo/fsi_util.c (revision 61793)
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