Commit | Line | Data |
---|---|---|
dd020e70 | 1 | #ifndef lint |
e804469b | 2 | static 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 | ||
16 | FILE *hf; /* hosts file */ | |
17 | FILE *gf; /* gateways file */ | |
18 | FILE *nf; /* networks file */ | |
dd020e70 SL |
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 | } | |
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 | ||
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); | |
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 | ||
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; | |
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); | |
166 | alreadyfree: | |
167 | freenames(namelist); | |
168 | freenames(protos); | |
dd020e70 SL |
169 | } |
170 | ||
5494cf94 SL |
171 | copylocal(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 | ||
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 |