Annotation of researchv10dc/ipc/internet/htable/htable.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * htable - convert NIC host table into a UNIX format.
        !             3:  * NIC format is described in RFC 810, 1 March 1982.
        !             4:  */
        !             5: #include <stdio.h>
        !             6: #include <ctype.h>
        !             7: #include <errno.h>
        !             8: #include <sys/types.h>
        !             9: 
        !            10: #include "htable.h"
        !            11: 
        !            12: 
        !            13: #define        DATELINES       3       /* these lines usually contain the date */
        !            14: #define        MAXNETS         30      /* array size for local, connected nets */
        !            15: 
        !            16: FILE   *hf;                    /* hosts file */
        !            17: FILE   *gf;                    /* gateways file */
        !            18: FILE   *nf;                    /* networks file */
        !            19: struct gateway *savegateway(), *gatewayto();
        !            20: 
        !            21: int connected_nets[MAXNETS];
        !            22: int nconnected;
        !            23: int local_nets[MAXNETS];
        !            24: int nlocal;
        !            25: char *myname;
        !            26: 
        !            27: main(argc, argv)
        !            28:        int argc;
        !            29:        char *argv[];
        !            30: {
        !            31:        int errs;
        !            32: 
        !            33:        infile = "(stdin)";
        !            34:        myname = argv[0];
        !            35:        argc--;
        !            36:        argv++;
        !            37:        while (argc--) {
        !            38:                if (*argv[0] == '-') {
        !            39:                        switch (argv[0][1]) {
        !            40:                        case 'c':
        !            41:                                nconnected = addlocal(argv[1], connected_nets);
        !            42:                                argv++;
        !            43:                                argc--;
        !            44:                                break;
        !            45:                        case 'l':
        !            46:                                nlocal = addlocal(argv[1], local_nets);
        !            47:                                argv++;
        !            48:                                argc--;
        !            49:                                break;
        !            50:                        default:
        !            51:                                usage();
        !            52:                                /*NOTREACHED*/
        !            53:                        }
        !            54:                } else {
        !            55:                        infile = argv[0];
        !            56:                        if (freopen(infile, "r", stdin) == NULL) {
        !            57:                                perror(infile);
        !            58:                                exit(1);
        !            59:                        }
        !            60:                }
        !            61:                argv++;
        !            62:        }
        !            63:        hf = fopen("hosts", "w");
        !            64:        if (hf == NULL) {
        !            65:                perror("hosts");
        !            66:                exit(1);
        !            67:        }
        !            68:        copylocal(hf, "localhosts");
        !            69:        gf = fopen("gateways", "w");
        !            70:        if (gf == NULL) {
        !            71:                perror("gateways");
        !            72:                exit(1);
        !            73:        }
        !            74:        nf = fopen("networks", "w");
        !            75:        if (nf == NULL) {
        !            76:                perror("networks");
        !            77:                exit(1);
        !            78:        }
        !            79:        copylocal(nf, "localnetworks");
        !            80:        copycomments(stdin, hf, DATELINES);
        !            81:        errs = yyparse();
        !            82:        exit(errs);
        !            83: }
        !            84: 
        !            85: usage()
        !            86: {
        !            87:        fprintf(stderr,
        !            88:        "usage: %s [ -c connected-nets ] [-l local-nets ] [ input-file ]\n",
        !            89:                myname);
        !            90:        exit(1);
        !            91: }
        !            92: 
        !            93: /*
        !            94:  *  Turn a comma-separated list of network names or numbers in dot notation
        !            95:  *  (e.g.  "arpanet, 128.32") into an array of net numbers.
        !            96:  */
        !            97: addlocal(arg, nets)
        !            98:        char *arg;
        !            99:        int *nets;
        !           100: {
        !           101:        register char *p, c;
        !           102:        register int nfound = 0;
        !           103: 
        !           104:        do {
        !           105:                p = arg;
        !           106:                while (*p && *p != ',' && !isspace(*p))
        !           107:                        p++;
        !           108:                c = *p;
        !           109:                *p = 0;
        !           110:                while (*arg && isspace(*arg))
        !           111:                        arg++;
        !           112:                if (*arg == 0)
        !           113:                        continue;
        !           114:                if (nfound == MAXNETS) {
        !           115:                        fprintf(stderr, "%s: Too many networks in list\n",
        !           116:                                myname);
        !           117:                        return (nfound);
        !           118:                }
        !           119:                if (getnetaddr(arg, &nets[nfound]))
        !           120:                        nfound++;
        !           121:                else {
        !           122:                        fprintf(stderr, "%s: %s: unknown network\n",
        !           123:                                myname, arg);
        !           124:                        exit(1);
        !           125:                }
        !           126:                arg = p + 1;
        !           127:        } while (c);
        !           128:        return (nfound);
        !           129: }
        !           130: 
        !           131: struct name *
        !           132: newname(str)
        !           133:        char *str;
        !           134: {
        !           135:        char *p;
        !           136:        struct name *nm;
        !           137: 
        !           138:        p = malloc(strlen(str) + 1);
        !           139:        strcpy(p, str);
        !           140:        nm = (struct name *)malloc(sizeof (struct name));
        !           141:        nm->name_val = p;
        !           142:        nm->name_link = NONAME;
        !           143:        return (nm);
        !           144: }
        !           145: 
        !           146: char *
        !           147: lower(str)
        !           148:        char *str;
        !           149: {
        !           150:        register char *cp = str;
        !           151: 
        !           152:        while (*cp) {
        !           153:                if (isupper(*cp))
        !           154:                        *cp = tolower(*cp);
        !           155:                cp++;
        !           156:        }
        !           157:        return (str);
        !           158: }
        !           159: 
        !           160: do_entry(keyword, addrlist, namelist, cputype, opsys, protos)
        !           161:        int keyword;
        !           162:        struct addr *addrlist;
        !           163:        struct name *namelist, *cputype, *opsys, *protos;
        !           164: {
        !           165:        register struct addr *al, *al2;
        !           166:        register struct name *nl;
        !           167:        struct addr *connect_addr;
        !           168:        char *cp;
        !           169: 
        !           170:        switch (keyword) {
        !           171: 
        !           172:        case KW_NET:
        !           173:                nl = namelist;
        !           174:                if (nl == NONAME) {
        !           175:                        fprintf(stderr, "htable: net");
        !           176:                        putnet(stderr, inet_netof(addrlist->addr_val));
        !           177:                        fprintf(stderr, " missing names.\n");
        !           178:                        break;
        !           179:                }
        !           180:                fprintf(nf, "%-16.16s", lower(nl->name_val));
        !           181:                al2 = addrlist;
        !           182:                while (al = al2) {
        !           183:                        char *cp;
        !           184: 
        !           185:                        putnet(nf, inet_netof(al->addr_val));
        !           186:                        cp = "\t%s";
        !           187:                        while (nl = nl->name_link) {
        !           188:                                fprintf(nf, cp, lower(nl->name_val));
        !           189:                                cp = " %s";
        !           190:                        }
        !           191:                        putc('\n', nf);
        !           192:                        al2 = al->addr_link;
        !           193:                        free((char *)al);
        !           194:                }
        !           195:                break;
        !           196: 
        !           197:        case KW_GATEWAY:
        !           198:                /* locate locally connected address, if one */
        !           199:                for (al = addrlist; al; al = al->addr_link)
        !           200:                        if (connectedto(inet_netof(al->addr_val)))
        !           201:                                break;
        !           202:                if (al == NULL) {
        !           203:                        /*
        !           204:                         * Not connected to known networks.  Save for later.
        !           205:                         */
        !           206:                        struct gateway *gw, *firstgw = (struct gateway *) NULL;
        !           207: 
        !           208:                        for (al = addrlist; al; al = al->addr_link) {
        !           209:                                register int net;
        !           210: 
        !           211:                                net = inet_netof(al->addr_val);
        !           212:                                gw = savegateway(namelist, net,
        !           213:                                    al->addr_val, 0);
        !           214:                                if (firstgw == (struct gateway *) NULL)
        !           215:                                        firstgw = gw;
        !           216:                                gw->g_firstent = firstgw;
        !           217:                        }
        !           218:                        freeaddrs(addrlist);
        !           219:                        goto dontfree;
        !           220:                }
        !           221:                /*
        !           222:                 * Connected to a known network.
        !           223:                 * Mark this as the gateway to all other networks
        !           224:                 * that are on the addrlist (unless we already have
        !           225:                 * gateways to them).
        !           226:                 */
        !           227:                connect_addr = al;
        !           228:                for (al = addrlist; al; al = al->addr_link) {
        !           229:                        register int net;
        !           230: 
        !           231:                        /* suppress duplicates -- not optimal */
        !           232:                        net = inet_netof(al->addr_val);
        !           233:                        if (connectedto(net) || gatewayto(net))
        !           234:                                continue;
        !           235:                        printgateway(net, namelist->name_val, 1);
        !           236:                        (void) savegateway(namelist, net, al->addr_val, 1);
        !           237:                }
        !           238:                /*
        !           239:                 * Put the gateway in the hosts file.
        !           240:                 */
        !           241:                putaddr(hf, connect_addr->addr_val);
        !           242:                cp = "%s";
        !           243:                for (nl = namelist; nl; nl = nl->name_link) {
        !           244:                        fprintf(hf, cp, lower(nl->name_val));
        !           245:                        cp = " %s";
        !           246:                }
        !           247:                fprintf(hf, "\t# gateway\n");
        !           248:                freeaddrs(addrlist);
        !           249:                goto dontfree;
        !           250: 
        !           251:        case KW_HOST:
        !           252:                al2 = addrlist;
        !           253:                while (al = al2) {
        !           254:                        if (!local(inet_netof(al->addr_val))) {
        !           255:                                char *cp;
        !           256: 
        !           257:                                putaddr(hf, al->addr_val);
        !           258:                                cp = "%s";
        !           259:                                for (nl = namelist; nl; nl = nl->name_link) {
        !           260:                                        fprintf(hf, cp, lower(nl->name_val));
        !           261:                                        cp = " %s";
        !           262:                                }
        !           263:                                putc('\n', hf);
        !           264:                        }
        !           265:                        al2 = al->addr_link;
        !           266:                        free((char *)al);
        !           267:                }
        !           268:                break;
        !           269: 
        !           270:        default:
        !           271:                fprintf(stderr, "Unknown keyword: %d.\n", keyword);
        !           272:        }
        !           273:        freenames(namelist);
        !           274: dontfree:
        !           275:        freenames(protos);
        !           276: }
        !           277: 
        !           278: copylocal(f, filename)
        !           279:        FILE *f;
        !           280:        char *filename;
        !           281: {
        !           282:        register FILE *lhf;
        !           283:        register cc;
        !           284:        char buf[BUFSIZ];
        !           285:        extern int errno;
        !           286: 
        !           287:        lhf = fopen(filename, "r");
        !           288:        if (lhf == NULL) {
        !           289:                if (errno != ENOENT) {
        !           290:                        perror(filename);
        !           291:                        exit(1);
        !           292:                }
        !           293:                fprintf(stderr, "Warning, no %s file.\n", filename);
        !           294:                return;
        !           295:        }
        !           296:        while (cc = fread(buf, 1, sizeof(buf), lhf))
        !           297:                fwrite(buf, 1, cc, f);
        !           298:        fclose(lhf);
        !           299: }
        !           300: 
        !           301: copycomments(in, out, ccount)
        !           302:        FILE *in, *out;
        !           303:        int ccount;
        !           304: {
        !           305:        int count;
        !           306:        char buf[BUFSIZ], *fgets();
        !           307: 
        !           308:        for (count=0; count < ccount; count++) {
        !           309:                if ((fgets(buf, sizeof(buf), in) == NULL) || (buf[0] != ';'))
        !           310:                        return;
        !           311:                buf[0] = '#';
        !           312:                fputs(buf, out);
        !           313:        }
        !           314:        return;
        !           315: }
        !           316: #define        UC(b)   (((int)(b))&0xff)
        !           317: 
        !           318: /*
        !           319:  * Print network number in internet-standard dot notation;
        !           320:  * v is in host byte order.
        !           321:  */
        !           322: putnet(f, v)
        !           323:        FILE *f;
        !           324:        register int v;
        !           325: {
        !           326:        if (v < 128)
        !           327:                fprintf(f, "%d", v);
        !           328:        else if (v < 65536)
        !           329:                fprintf(f, "%d.%d", UC(v >> 8), UC(v));
        !           330:        else
        !           331:                fprintf(f, "%d.%d.%d", UC(v >> 16), UC(v >> 8), UC(v));
        !           332: }
        !           333: 
        !           334: putaddr(f, v)
        !           335:        FILE *f;
        !           336:        in_addr v;
        !           337: {
        !           338:        fprintf(f, "%-16.16s", inet_ntoa(v));
        !           339: }
        !           340: 
        !           341: freenames(list)
        !           342:        struct name *list;
        !           343: {
        !           344:        register struct name *nl, *nl2;
        !           345: 
        !           346:        nl2 = list;
        !           347:        while (nl = nl2) {
        !           348:                nl2 = nl->name_link;
        !           349:                free(nl->name_val);
        !           350:                free((char *)nl);
        !           351:        }
        !           352: }
        !           353: 
        !           354: freeaddrs(list)
        !           355:        struct addr *list;
        !           356: {
        !           357:        register struct addr *al, *al2;
        !           358: 
        !           359:        al2 = list;
        !           360:        while (al = al2)
        !           361:                al2 = al->addr_link, free((char *)al);
        !           362: }
        !           363: 
        !           364: struct gateway *gateways = 0;
        !           365: struct gateway *lastgateway = 0;
        !           366: 
        !           367: struct gateway *
        !           368: gatewayto(net)
        !           369:        register int net;
        !           370: {
        !           371:        register struct gateway *gp;
        !           372: 
        !           373:        for (gp = gateways; gp; gp = gp->g_link)
        !           374:                if ((gp->g_net == net) && (gp->g_metric > 0))
        !           375:                        return (gp);
        !           376:        return ((struct gateway *) NULL);
        !           377: }
        !           378: 
        !           379: struct gateway *
        !           380: savegateway(namelist, net, addr, metric)
        !           381:        struct name *namelist;
        !           382:        in_addr addr;
        !           383:        int net, metric;
        !           384: {
        !           385:        register struct gateway *gp;
        !           386: 
        !           387:        gp = (struct gateway *)malloc(sizeof (struct gateway));
        !           388:        if (gp == 0) {
        !           389:                fprintf(stderr, "htable: out of memory\n");
        !           390:                exit(1);
        !           391:        }
        !           392:        gp->g_link = (struct gateway *) NULL;
        !           393:        if (lastgateway)
        !           394:                lastgateway->g_link = gp;
        !           395:        else
        !           396:                gateways = gp;
        !           397:        lastgateway = gp;
        !           398:        gp->g_name = namelist;
        !           399:        gp->g_net = net;
        !           400:        gp->g_addr = addr;
        !           401:        gp->g_metric = metric;
        !           402:        if (metric == 1)
        !           403:                gp->g_dst = gp;
        !           404:        return (gp);
        !           405: }
        !           406: 
        !           407: connectedto(net)
        !           408:        u_long net;
        !           409: {
        !           410:        register i;
        !           411: 
        !           412:        for (i = 0; i < nconnected; i++)
        !           413:                if (connected_nets[i] == net)
        !           414:                        return(1);
        !           415:        return(0);
        !           416: }
        !           417: 
        !           418: local(net)
        !           419:        u_long net;
        !           420: {
        !           421:        register i;
        !           422: 
        !           423:        for (i = 0; i < nlocal; i++)
        !           424:                if (local_nets[i] == net)
        !           425:                        return(1);
        !           426:        return(0);
        !           427: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.