xref: /original-bsd/old/htable/htable.c (revision 8ac030d2)
1 #ifndef lint
2 static char sccsid[] = "@(#)htable.c	4.2 (Berkeley) 11/15/82";
3 #endif
4 
5 /*
6  * htable - convert NIC host table into a UNIX format.
7  * NIC format is described in RFC 810, 1 March 1982.
8  */
9 #include <stdio.h>
10 #include <ctype.h>
11 #include <errno.h>
12 #include "htable.h"		/* includes <sys/types.h> */
13 
14 #include <netinet/in.h>
15 
16 FILE	*hf;			/* hosts file */
17 FILE	*gf;			/* gateways file */
18 FILE	*nf;			/* networks file */
19 
20 main(argc, argv)
21 	int argc;
22 	char *argv[];
23 {
24 	if (argc > 2) {
25 		fprintf(stderr, "usage: %s [ input-file ]\n",
26 			argv[0]);
27 		exit(1);
28 	}
29 	infile = "(stdin)";
30 	if (argc == 2) {
31 		infile = argv[1];
32 		if (freopen(infile, "r", stdin) == NULL) {
33 			perror(infile);
34 			exit(1);
35 		}
36 	}
37 	hf = fopen("hosts", "w");
38 	if (hf == NULL) {
39 		perror("hosts");
40 		exit(1);
41 	}
42 	copylocal(hf, "localhosts");
43 	gf = fopen("gateways", "w");
44 	if (gf == NULL) {
45 		perror("gateways");
46 		exit(1);
47 	}
48 	copylocal(gf, "localgateways");
49 	nf = fopen("networks", "w");
50 	if (nf == NULL) {
51 		perror("networks");
52 		exit(1);
53 	}
54 	copylocal(nf, "localnetworks");
55 	exit(yyparse());
56 }
57 
58 struct name *
59 newname(str)
60 	char *str;
61 {
62 	char *p;
63 	struct name *nm;
64 
65 	p = malloc(strlen(str) + 1);
66 	strcpy(p, str);
67 	nm = (struct name *)malloc(sizeof (struct name));
68 	nm->name_val = p;
69 	nm->name_link = NONAME;
70 	return (nm);
71 }
72 
73 char *
74 lower(str)
75 	char *str;
76 {
77 	register char *cp = str;
78 
79 	while (*cp) {
80 		if (isupper(*cp))
81 			*cp = tolower(*cp);
82 		cp++;
83 	}
84 	return (str);
85 }
86 
87 do_entry(keyword, addrlist, namelist, cputype, opsys, protos)
88 	int keyword;
89 	struct addr *addrlist;
90 	struct name *namelist, *cputype, *opsys, *protos;
91 {
92 	register struct addr *al, *al2;
93 	register struct name *nl;
94 
95 	switch (keyword) {
96 
97 	case KW_NET:
98 		nl = namelist;
99 		if (nl == NONAME) {
100 			fprintf(stderr, "htable: net");
101 			putnet(stderr, addrlist->addr_val);
102 			fprintf(stderr, " missing names.\n");
103 			break;
104 		}
105 		fprintf(nf, "%-16.16s", lower(nl->name_val));
106 		al2 = addrlist;
107 		while (al = al2) {
108 			char *cp;
109 
110 			putnet(nf, al->addr_val);
111 			cp = "\t%s";
112 			while (nl = nl->name_link) {
113 				fprintf(nf, cp, lower(nl->name_val));
114 				cp = " %s";
115 			}
116 			putc('\n', nf);
117 			al2 = al->addr_link;
118 			free((char *)al);
119 		}
120 		goto alreadyfree;
121 
122 	case KW_GATEWAY:
123 		for (al = addrlist; al; al = al->addr_link) {
124 			register int net = inet_netof(al->addr_val);
125 
126 			/* suppress duplicates -- not optimal */
127 			if (checkgateway(net))
128 				break;
129 			fprintf(gf, "net ");
130 			putnet(gf, net);
131 			/* this is a kludge */
132 			fprintf(gf, " destination %s metric 1 passive\n",
133 				lower(namelist->name_val));
134 			putaddr(hf, al->addr_val);
135 			fprintf(hf, "%s\t# gateway\n",
136 				lower(namelist->name_val));
137 			savegateway(net);
138 		}
139 		break;
140 
141 	case KW_HOST:
142 		al2 = addrlist;
143 		while (al = al2) {
144 			if (inet_netof(al->addr_val) != LOCALNET) {
145 				char *cp;
146 
147 				putaddr(hf, al->addr_val);
148 				cp = "%s";
149 				for (nl = namelist; nl; nl = nl->name_link) {
150 					fprintf(hf, cp, lower(nl->name_val));
151 					cp = " %s";
152 				}
153 				putc('\n', hf);
154 			}
155 			al2 = al->addr_link;
156 			free((char *)al);
157 		}
158 		goto alreadyfree;
159 
160 	default:
161 		fprintf(stderr, "Unknown keyword: %d.\n", keyword);
162 	}
163 	al2 = addrlist;
164 	while (al = al2)
165 		al2 = al->addr_link, free((char *)al);
166 alreadyfree:
167 	freenames(namelist);
168 	freenames(protos);
169 }
170 
171 copylocal(f, filename)
172 	FILE *f;
173 	char *filename;
174 {
175 	register FILE *lhf;
176 	register cc;
177 	char buf[BUFSIZ];
178 	extern int errno;
179 
180 	lhf = fopen(filename, "r");
181 	if (lhf == NULL) {
182 		if (errno != ENOENT) {
183 			perror(filename);
184 			exit(1);
185 		}
186 		fprintf(stderr, "Warning, no %s file.\n", filename);
187 		return;
188 	}
189 	while (cc = fread(buf, 1, sizeof(buf), lhf))
190 		fwrite(buf, 1, cc, f);
191 	fclose(lhf);
192 }
193 
194 #define	UC(b)	(((int)(b))&0xff)
195 
196 putnet(f, v)
197 	FILE *f;
198 	u_long v;
199 {
200 	register char *a = (char *)&v;
201 
202 	if (UC(a[0]&0x80) == 0)
203 		fprintf(f, "%d", UC(a[0]));
204 	else if ((UC(a[0])&0x40) == 0)
205 		fprintf(f, "%d.%d", UC(a[0]), UC(a[1]));
206 	else
207 		fprintf(f, "%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]));
208 }
209 
210 putaddr(f, v)
211 	FILE *f;
212 	u_long v;
213 {
214 	register char *a = (char *)&v;
215 	char buf[32];
216 
217 	sprintf(buf,"%d.%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]));
218 	fprintf(f, "%-16.16s", buf);
219 }
220 
221 freenames(list)
222 	struct name *list;
223 {
224 	register struct name *nl, *nl2;
225 
226 	nl2 = list;
227 	while (nl = nl2) {
228 		nl2 = nl->name_link;
229 		free(nl->name_val);
230 		free((char *)nl);
231 	}
232 }
233 struct gateway {
234 	struct	gateway *g_link;
235 	int	g_net;
236 };
237 
238 struct gateway *gateways = 0;
239 
240 checkgateway(net)
241 	register int net;
242 {
243 	register struct gateway *gp;
244 
245 	for (gp = gateways; gp; gp = gp->g_link)
246 		if (gp->g_net == net)
247 			return (1);
248 	return (0);
249 }
250 
251 savegateway(net)
252 	int net;
253 {
254 	register struct gateway *gp;
255 
256 	gp = (struct gateway *)malloc(sizeof (struct gateway));
257 	if (gp == 0) {
258 		fprintf(stderr, "htable: out of memory\n");
259 		exit(1);
260 	}
261 	gp->g_link = gateways;
262 	gp->g_net = net;
263 	gateways = gp;
264 }
265 
266