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