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