major reorganization; still doesn't make /etc/gateways correctly
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 15 Nov 1982 17:27:03 +0000 (09:27 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 15 Nov 1982 17:27:03 +0000 (09:27 -0800)
SCCS-vsn: old/htable/htable.c 4.2

usr/src/old/htable/htable.c

index 0d150db..e0313bc 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)htable.c   4.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)htable.c   4.2 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -8,10 +8,14 @@ static char sccsid[] = "@(#)htable.c  4.1 (Berkeley) %G%";
  */
 #include <stdio.h>
 #include <ctype.h>
  */
 #include <stdio.h>
 #include <ctype.h>
-#include "htable.h"
+#include <errno.h>
+#include "htable.h"            /* includes <sys/types.h> */
 
 
-FILE *hf;
-FILE *gf;
+#include <netinet/in.h>
+
+FILE   *hf;                    /* hosts file */
+FILE   *gf;                    /* gateways file */
+FILE   *nf;                    /* networks file */
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -35,14 +39,19 @@ main(argc, argv)
                perror("hosts");
                exit(1);
        }
                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);
        }
                perror("gateways");
                exit(1);
        }
-#endif
+       copylocal(gf, "localgateways");
+       nf = fopen("networks", "w");
+       if (nf == NULL) {
+               perror("networks");
+               exit(1);
+       }
+       copylocal(nf, "localnetworks");
        exit(yyparse());
 }
 
        exit(yyparse());
 }
 
@@ -55,7 +64,7 @@ newname(str)
 
        p = malloc(strlen(str) + 1);
        strcpy(p, 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);
        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;
        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:
 
        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:
 
        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:
                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;
                                putc('\n', hf);
                        }
                        al2 = al->addr_link;
-                       free_addr(al);
+                       free((char *)al);
                }
                }
-               break;
+               goto alreadyfree;
 
        default:
                fprintf(stderr, "Unknown keyword: %d.\n", keyword);
        }
 
        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];
 {
        register FILE *lhf;
        register cc;
        char buf[BUFSIZ];
+       extern int errno;
 
 
-       lhf = fopen("localhosts", "r");
+       lhf = fopen(filename, "r");
        if (lhf == NULL) {
        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))
                return;
        }
        while (cc = fread(buf, 1, sizeof(buf), lhf))
-               fwrite(buf, 1, cc, hf);
+               fwrite(buf, 1, cc, f);
        fclose(lhf);
 }
        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;
+}
+