xref: /csrg-svn/old/htable/htable.c (revision 9246)
18732Ssam #ifndef lint
2*9246Ssam static char sccsid[] = "@(#)htable.c	4.2 (Berkeley) 11/15/82";
38732Ssam #endif
48732Ssam 
58732Ssam /*
68732Ssam  * htable - convert NIC host table into a UNIX format.
78732Ssam  * NIC format is described in RFC 810, 1 March 1982.
88732Ssam  */
98732Ssam #include <stdio.h>
108732Ssam #include <ctype.h>
11*9246Ssam #include <errno.h>
12*9246Ssam #include "htable.h"		/* includes <sys/types.h> */
138732Ssam 
14*9246Ssam #include <netinet/in.h>
158732Ssam 
16*9246Ssam FILE	*hf;			/* hosts file */
17*9246Ssam FILE	*gf;			/* gateways file */
18*9246Ssam FILE	*nf;			/* networks file */
19*9246Ssam 
208732Ssam main(argc, argv)
218732Ssam 	int argc;
228732Ssam 	char *argv[];
238732Ssam {
248732Ssam 	if (argc > 2) {
258732Ssam 		fprintf(stderr, "usage: %s [ input-file ]\n",
268732Ssam 			argv[0]);
278732Ssam 		exit(1);
288732Ssam 	}
298732Ssam 	infile = "(stdin)";
308732Ssam 	if (argc == 2) {
318732Ssam 		infile = argv[1];
328732Ssam 		if (freopen(infile, "r", stdin) == NULL) {
338732Ssam 			perror(infile);
348732Ssam 			exit(1);
358732Ssam 		}
368732Ssam 	}
378732Ssam 	hf = fopen("hosts", "w");
388732Ssam 	if (hf == NULL) {
398732Ssam 		perror("hosts");
408732Ssam 		exit(1);
418732Ssam 	}
42*9246Ssam 	copylocal(hf, "localhosts");
43*9246Ssam 	gf = fopen("gateways", "w");
44*9246Ssam 	if (gf == NULL) {
458732Ssam 		perror("gateways");
468732Ssam 		exit(1);
478732Ssam 	}
48*9246Ssam 	copylocal(gf, "localgateways");
49*9246Ssam 	nf = fopen("networks", "w");
50*9246Ssam 	if (nf == NULL) {
51*9246Ssam 		perror("networks");
52*9246Ssam 		exit(1);
53*9246Ssam 	}
54*9246Ssam 	copylocal(nf, "localnetworks");
558732Ssam 	exit(yyparse());
568732Ssam }
578732Ssam 
588732Ssam struct name *
598732Ssam newname(str)
608732Ssam 	char *str;
618732Ssam {
628732Ssam 	char *p;
638732Ssam 	struct name *nm;
648732Ssam 
658732Ssam 	p = malloc(strlen(str) + 1);
668732Ssam 	strcpy(p, str);
67*9246Ssam 	nm = (struct name *)malloc(sizeof (struct name));
688732Ssam 	nm->name_val = p;
698732Ssam 	nm->name_link = NONAME;
708732Ssam 	return (nm);
718732Ssam }
728732Ssam 
738732Ssam char *
748732Ssam lower(str)
758732Ssam 	char *str;
768732Ssam {
778732Ssam 	register char *cp = str;
788732Ssam 
798732Ssam 	while (*cp) {
808732Ssam 		if (isupper(*cp))
818732Ssam 			*cp = tolower(*cp);
828732Ssam 		cp++;
838732Ssam 	}
848732Ssam 	return (str);
858732Ssam }
868732Ssam 
878732Ssam do_entry(keyword, addrlist, namelist, cputype, opsys, protos)
888732Ssam 	int keyword;
898732Ssam 	struct addr *addrlist;
908732Ssam 	struct name *namelist, *cputype, *opsys, *protos;
918732Ssam {
928732Ssam 	register struct addr *al, *al2;
93*9246Ssam 	register struct name *nl;
948732Ssam 
958732Ssam 	switch (keyword) {
968732Ssam 
978732Ssam 	case KW_NET:
98*9246Ssam 		nl = namelist;
99*9246Ssam 		if (nl == NONAME) {
100*9246Ssam 			fprintf(stderr, "htable: net");
101*9246Ssam 			putnet(stderr, addrlist->addr_val);
102*9246Ssam 			fprintf(stderr, " missing names.\n");
103*9246Ssam 			break;
104*9246Ssam 		}
105*9246Ssam 		fprintf(nf, "%-16.16s", lower(nl->name_val));
106*9246Ssam 		al2 = addrlist;
107*9246Ssam 		while (al = al2) {
108*9246Ssam 			char *cp;
1098732Ssam 
110*9246Ssam 			putnet(nf, al->addr_val);
111*9246Ssam 			cp = "\t%s";
112*9246Ssam 			while (nl = nl->name_link) {
113*9246Ssam 				fprintf(nf, cp, lower(nl->name_val));
114*9246Ssam 				cp = " %s";
115*9246Ssam 			}
116*9246Ssam 			putc('\n', nf);
117*9246Ssam 			al2 = al->addr_link;
118*9246Ssam 			free((char *)al);
119*9246Ssam 		}
120*9246Ssam 		goto alreadyfree;
121*9246Ssam 
1228732Ssam 	case KW_GATEWAY:
123*9246Ssam 		for (al = addrlist; al; al = al->addr_link) {
124*9246Ssam 			register int net = inet_netof(al->addr_val);
125*9246Ssam 
126*9246Ssam 			/* suppress duplicates -- not optimal */
127*9246Ssam 			if (checkgateway(net))
128*9246Ssam 				break;
129*9246Ssam 			fprintf(gf, "net ");
130*9246Ssam 			putnet(gf, net);
131*9246Ssam 			/* this is a kludge */
132*9246Ssam 			fprintf(gf, " destination %s metric 1 passive\n",
133*9246Ssam 				lower(namelist->name_val));
134*9246Ssam 			putaddr(hf, al->addr_val);
135*9246Ssam 			fprintf(hf, "%s\t# gateway\n",
136*9246Ssam 				lower(namelist->name_val));
137*9246Ssam 			savegateway(net);
138*9246Ssam 		}
1398732Ssam 		break;
1408732Ssam 
1418732Ssam 	case KW_HOST:
142*9246Ssam 		al2 = addrlist;
143*9246Ssam 		while (al = al2) {
144*9246Ssam 			if (inet_netof(al->addr_val) != LOCALNET) {
145*9246Ssam 				char *cp;
146*9246Ssam 
147*9246Ssam 				putaddr(hf, al->addr_val);
148*9246Ssam 				cp = "%s";
149*9246Ssam 				for (nl = namelist; nl; nl = nl->name_link) {
150*9246Ssam 					fprintf(hf, cp, lower(nl->name_val));
151*9246Ssam 					cp = " %s";
152*9246Ssam 				}
1538732Ssam 				putc('\n', hf);
1548732Ssam 			}
1558732Ssam 			al2 = al->addr_link;
156*9246Ssam 			free((char *)al);
1578732Ssam 		}
158*9246Ssam 		goto alreadyfree;
1598732Ssam 
1608732Ssam 	default:
1618732Ssam 		fprintf(stderr, "Unknown keyword: %d.\n", keyword);
1628732Ssam 	}
163*9246Ssam 	al2 = addrlist;
164*9246Ssam 	while (al = al2)
165*9246Ssam 		al2 = al->addr_link, free((char *)al);
166*9246Ssam alreadyfree:
167*9246Ssam 	freenames(namelist);
168*9246Ssam 	freenames(protos);
1698732Ssam }
1708732Ssam 
171*9246Ssam copylocal(f, filename)
172*9246Ssam 	FILE *f;
173*9246Ssam 	char *filename;
1748732Ssam {
1758732Ssam 	register FILE *lhf;
1768732Ssam 	register cc;
1778732Ssam 	char buf[BUFSIZ];
178*9246Ssam 	extern int errno;
1798732Ssam 
180*9246Ssam 	lhf = fopen(filename, "r");
1818732Ssam 	if (lhf == NULL) {
182*9246Ssam 		if (errno != ENOENT) {
183*9246Ssam 			perror(filename);
184*9246Ssam 			exit(1);
185*9246Ssam 		}
186*9246Ssam 		fprintf(stderr, "Warning, no %s file.\n", filename);
1878732Ssam 		return;
1888732Ssam 	}
1898732Ssam 	while (cc = fread(buf, 1, sizeof(buf), lhf))
190*9246Ssam 		fwrite(buf, 1, cc, f);
1918732Ssam 	fclose(lhf);
1928732Ssam }
193*9246Ssam 
194*9246Ssam #define	UC(b)	(((int)(b))&0xff)
195*9246Ssam 
196*9246Ssam putnet(f, v)
197*9246Ssam 	FILE *f;
198*9246Ssam 	u_long v;
199*9246Ssam {
200*9246Ssam 	register char *a = (char *)&v;
201*9246Ssam 
202*9246Ssam 	if (UC(a[0]&0x80) == 0)
203*9246Ssam 		fprintf(f, "%d", UC(a[0]));
204*9246Ssam 	else if ((UC(a[0])&0x40) == 0)
205*9246Ssam 		fprintf(f, "%d.%d", UC(a[0]), UC(a[1]));
206*9246Ssam 	else
207*9246Ssam 		fprintf(f, "%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]));
208*9246Ssam }
209*9246Ssam 
210*9246Ssam putaddr(f, v)
211*9246Ssam 	FILE *f;
212*9246Ssam 	u_long v;
213*9246Ssam {
214*9246Ssam 	register char *a = (char *)&v;
215*9246Ssam 	char buf[32];
216*9246Ssam 
217*9246Ssam 	sprintf(buf,"%d.%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]));
218*9246Ssam 	fprintf(f, "%-16.16s", buf);
219*9246Ssam }
220*9246Ssam 
221*9246Ssam freenames(list)
222*9246Ssam 	struct name *list;
223*9246Ssam {
224*9246Ssam 	register struct name *nl, *nl2;
225*9246Ssam 
226*9246Ssam 	nl2 = list;
227*9246Ssam 	while (nl = nl2) {
228*9246Ssam 		nl2 = nl->name_link;
229*9246Ssam 		free(nl->name_val);
230*9246Ssam 		free((char *)nl);
231*9246Ssam 	}
232*9246Ssam }
233*9246Ssam struct gateway {
234*9246Ssam 	struct	gateway *g_link;
235*9246Ssam 	int	g_net;
236*9246Ssam };
237*9246Ssam 
238*9246Ssam struct gateway *gateways = 0;
239*9246Ssam 
240*9246Ssam checkgateway(net)
241*9246Ssam 	register int net;
242*9246Ssam {
243*9246Ssam 	register struct gateway *gp;
244*9246Ssam 
245*9246Ssam 	for (gp = gateways; gp; gp = gp->g_link)
246*9246Ssam 		if (gp->g_net == net)
247*9246Ssam 			return (1);
248*9246Ssam 	return (0);
249*9246Ssam }
250*9246Ssam 
251*9246Ssam savegateway(net)
252*9246Ssam 	int net;
253*9246Ssam {
254*9246Ssam 	register struct gateway *gp;
255*9246Ssam 
256*9246Ssam 	gp = (struct gateway *)malloc(sizeof (struct gateway));
257*9246Ssam 	if (gp == 0) {
258*9246Ssam 		fprintf(stderr, "htable: out of memory\n");
259*9246Ssam 		exit(1);
260*9246Ssam 	}
261*9246Ssam 	gp->g_link = gateways;
262*9246Ssam 	gp->g_net = net;
263*9246Ssam 	gateways = gp;
264*9246Ssam }
265*9246Ssam 
266