BSD 4_1c_2 release
[unix-history] / usr / src / ucb / netser / htable / htable.c
CommitLineData
dd020e70 1#ifndef lint
e804469b 2static char sccsid[] = "@(#)htable.c 4.2 (Berkeley) 11/15/82";
dd020e70
SL
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>
5494cf94
SL
11#include <errno.h>
12#include "htable.h" /* includes <sys/types.h> */
dd020e70 13
5494cf94
SL
14#include <netinet/in.h>
15
16FILE *hf; /* hosts file */
17FILE *gf; /* gateways file */
18FILE *nf; /* networks file */
dd020e70
SL
19
20main(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 }
5494cf94
SL
42 copylocal(hf, "localhosts");
43 gf = fopen("gateways", "w");
44 if (gf == NULL) {
dd020e70
SL
45 perror("gateways");
46 exit(1);
47 }
5494cf94
SL
48 copylocal(gf, "localgateways");
49 nf = fopen("networks", "w");
50 if (nf == NULL) {
51 perror("networks");
52 exit(1);
53 }
54 copylocal(nf, "localnetworks");
dd020e70
SL
55 exit(yyparse());
56}
57
58struct name *
59newname(str)
60 char *str;
61{
62 char *p;
63 struct name *nm;
64
65 p = malloc(strlen(str) + 1);
66 strcpy(p, str);
5494cf94 67 nm = (struct name *)malloc(sizeof (struct name));
dd020e70
SL
68 nm->name_val = p;
69 nm->name_link = NONAME;
70 return (nm);
71}
72
73char *
74lower(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
87do_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;
5494cf94 93 register struct name *nl;
dd020e70
SL
94
95 switch (keyword) {
96
97 case KW_NET:
5494cf94
SL
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;
dd020e70
SL
121
122 case KW_GATEWAY:
5494cf94
SL
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 }
dd020e70
SL
139 break;
140
141 case KW_HOST:
5494cf94
SL
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 }
dd020e70
SL
153 putc('\n', hf);
154 }
155 al2 = al->addr_link;
5494cf94 156 free((char *)al);
dd020e70 157 }
5494cf94 158 goto alreadyfree;
dd020e70
SL
159
160 default:
161 fprintf(stderr, "Unknown keyword: %d.\n", keyword);
162 }
5494cf94
SL
163 al2 = addrlist;
164 while (al = al2)
165 al2 = al->addr_link, free((char *)al);
166alreadyfree:
167 freenames(namelist);
168 freenames(protos);
dd020e70
SL
169}
170
5494cf94
SL
171copylocal(f, filename)
172 FILE *f;
173 char *filename;
dd020e70
SL
174{
175 register FILE *lhf;
176 register cc;
177 char buf[BUFSIZ];
5494cf94 178 extern int errno;
dd020e70 179
5494cf94 180 lhf = fopen(filename, "r");
dd020e70 181 if (lhf == NULL) {
5494cf94
SL
182 if (errno != ENOENT) {
183 perror(filename);
184 exit(1);
185 }
186 fprintf(stderr, "Warning, no %s file.\n", filename);
dd020e70
SL
187 return;
188 }
189 while (cc = fread(buf, 1, sizeof(buf), lhf))
5494cf94 190 fwrite(buf, 1, cc, f);
dd020e70
SL
191 fclose(lhf);
192}
5494cf94
SL
193
194#define UC(b) (((int)(b))&0xff)
195
196putnet(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
210putaddr(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
221freenames(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}
233struct gateway {
234 struct gateway *g_link;
235 int g_net;
236};
237
238struct gateway *gateways = 0;
239
240checkgateway(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
251savegateway(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