X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/f9519a1591353e4c27dc1675cf04e797af3de5b3..5494cf94b597e3e6cece6e0676057701d5ef2eb8:/usr/src/old/htable/htable.c diff --git a/usr/src/old/htable/htable.c b/usr/src/old/htable/htable.c index 0d150db003..e0313bce92 100644 --- a/usr/src/old/htable/htable.c +++ b/usr/src/old/htable/htable.c @@ -1,5 +1,5 @@ #ifndef lint -static char sccsid[] = "@(#)htable.c 4.1 (Berkeley) %G%"; +static char sccsid[] = "@(#)htable.c 4.2 (Berkeley) %G%"; #endif /* @@ -8,10 +8,14 @@ static char sccsid[] = "@(#)htable.c 4.1 (Berkeley) %G%"; */ #include #include -#include "htable.h" +#include +#include "htable.h" /* includes */ -FILE *hf; -FILE *gf; +#include + +FILE *hf; /* hosts file */ +FILE *gf; /* gateways file */ +FILE *nf; /* networks file */ main(argc, argv) int argc; @@ -35,14 +39,19 @@ main(argc, argv) perror("hosts"); exit(1); } - copylocal(); -#ifdef GATEWAYS - hf = fopen("gateways", "w"); - if (hf == NULL) { + copylocal(hf, "localhosts"); + gf = fopen("gateways", "w"); + if (gf == NULL) { perror("gateways"); exit(1); } -#endif + copylocal(gf, "localgateways"); + nf = fopen("networks", "w"); + if (nf == NULL) { + perror("networks"); + exit(1); + } + copylocal(nf, "localnetworks"); exit(yyparse()); } @@ -55,7 +64,7 @@ newname(str) p = malloc(strlen(str) + 1); strcpy(p, str); - nm = alloc_name(); + nm = (struct name *)malloc(sizeof (struct name)); nm->name_val = p; nm->name_link = NONAME; return (nm); @@ -81,58 +90,176 @@ do_entry(keyword, addrlist, namelist, cputype, opsys, protos) struct name *namelist, *cputype, *opsys, *protos; { register struct addr *al, *al2; - register struct name *nl, *nl2; - register flag; + register struct name *nl; switch (keyword) { case KW_NET: - break; + nl = namelist; + if (nl == NONAME) { + fprintf(stderr, "htable: net"); + putnet(stderr, addrlist->addr_val); + fprintf(stderr, " missing names.\n"); + break; + } + fprintf(nf, "%-16.16s", lower(nl->name_val)); + al2 = addrlist; + while (al = al2) { + char *cp; + + putnet(nf, al->addr_val); + cp = "\t%s"; + while (nl = nl->name_link) { + fprintf(nf, cp, lower(nl->name_val)); + cp = " %s"; + } + putc('\n', nf); + al2 = al->addr_link; + free((char *)al); + } + goto alreadyfree; case KW_GATEWAY: + for (al = addrlist; al; al = al->addr_link) { + register int net = inet_netof(al->addr_val); + + /* suppress duplicates -- not optimal */ + if (checkgateway(net)) + break; + fprintf(gf, "net "); + putnet(gf, net); + /* this is a kludge */ + fprintf(gf, " destination %s metric 1 passive\n", + lower(namelist->name_val)); + putaddr(hf, al->addr_val); + fprintf(hf, "%s\t# gateway\n", + lower(namelist->name_val)); + savegateway(net); + } break; case KW_HOST: - for (al = addrlist; al; al = al2) { - if (net(al->addr_val) != LOCALNET) { - fprintf(hf, "%d.%d.%d.%d\t", - net(al->addr_val), host(al->addr_val), - lhost(al->addr_val), imp(al->addr_val)); - for (nl = namelist; nl; nl = nl->name_link) - fprintf(hf, " %s", lower(nl->name_val)); + al2 = addrlist; + while (al = al2) { + if (inet_netof(al->addr_val) != LOCALNET) { + char *cp; + + putaddr(hf, al->addr_val); + cp = "%s"; + for (nl = namelist; nl; nl = nl->name_link) { + fprintf(hf, cp, lower(nl->name_val)); + cp = " %s"; + } putc('\n', hf); } al2 = al->addr_link; - free_addr(al); + free((char *)al); } - break; + goto alreadyfree; default: fprintf(stderr, "Unknown keyword: %d.\n", keyword); } - for (nl = namelist; nl; nl = nl2) { - nl2 = nl->name_link; - free_name(nl); - } - for (nl = protos; nl; nl = nl2) { - nl2 = nl->name_link; - free_name(nl); - } + al2 = addrlist; + while (al = al2) + al2 = al->addr_link, free((char *)al); +alreadyfree: + freenames(namelist); + freenames(protos); } -copylocal() +copylocal(f, filename) + FILE *f; + char *filename; { register FILE *lhf; register cc; char buf[BUFSIZ]; + extern int errno; - lhf = fopen("localhosts", "r"); + lhf = fopen(filename, "r"); if (lhf == NULL) { - perror("localhosts"); - fprintf(stderr, "(continuing)\n"); + if (errno != ENOENT) { + perror(filename); + exit(1); + } + fprintf(stderr, "Warning, no %s file.\n", filename); return; } while (cc = fread(buf, 1, sizeof(buf), lhf)) - fwrite(buf, 1, cc, hf); + fwrite(buf, 1, cc, f); fclose(lhf); } + +#define UC(b) (((int)(b))&0xff) + +putnet(f, v) + FILE *f; + u_long v; +{ + register char *a = (char *)&v; + + if (UC(a[0]&0x80) == 0) + fprintf(f, "%d", UC(a[0])); + else if ((UC(a[0])&0x40) == 0) + fprintf(f, "%d.%d", UC(a[0]), UC(a[1])); + else + fprintf(f, "%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2])); +} + +putaddr(f, v) + FILE *f; + u_long v; +{ + register char *a = (char *)&v; + char buf[32]; + + sprintf(buf,"%d.%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3])); + fprintf(f, "%-16.16s", buf); +} + +freenames(list) + struct name *list; +{ + register struct name *nl, *nl2; + + nl2 = list; + while (nl = nl2) { + nl2 = nl->name_link; + free(nl->name_val); + free((char *)nl); + } +} +struct gateway { + struct gateway *g_link; + int g_net; +}; + +struct gateway *gateways = 0; + +checkgateway(net) + register int net; +{ + register struct gateway *gp; + + for (gp = gateways; gp; gp = gp->g_link) + if (gp->g_net == net) + return (1); + return (0); +} + +savegateway(net) + int net; +{ + register struct gateway *gp; + + gp = (struct gateway *)malloc(sizeof (struct gateway)); + if (gp == 0) { + fprintf(stderr, "htable: out of memory\n"); + exit(1); + } + gp->g_link = gateways; + gp->g_net = net; + gateways = gp; +} +