Annotation of cci/usr/src/etc/htable/htable.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)htable.c   4.5 (Berkeley) 6/18/83";
                      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 <netdb.h>
                     13: 
                     14: #include "htable.h"            /* includes <sys/types.h> */
                     15: 
                     16: #include <sys/socket.h>
                     17: #include <netinet/in.h>
                     18: 
                     19: #define        INTERNET        10      /* gag */
                     20: 
                     21: #define        DATELINES       3       /* these lines usually contain the date */
                     22: 
                     23: FILE   *hf;                    /* hosts file */
                     24: FILE   *gf;                    /* gateways file */
                     25: FILE   *nf;                    /* networks file */
                     26: 
                     27: main(argc, argv)
                     28:        int argc;
                     29:        char *argv[];
                     30: {
                     31:        if (argc > 2) {
                     32:                fprintf(stderr, "usage: %s [ input-file ]\n",
                     33:                        argv[0]);
                     34:                exit(1);
                     35:        }
                     36:        infile = "(stdin)";
                     37:        if (argc == 2) {
                     38:                infile = argv[1];
                     39:                if (freopen(infile, "r", stdin) == NULL) {
                     40:                        perror(infile);
                     41:                        exit(1);
                     42:                }
                     43:        }
                     44:        hf = fopen("hosts", "w");
                     45:        if (hf == NULL) {
                     46:                perror("hosts");
                     47:                exit(1);
                     48:        }
                     49:        copylocal(hf, "localhosts");
                     50:        gf = fopen("gateways", "w");
                     51:        if (gf == NULL) {
                     52:                perror("gateways");
                     53:                exit(1);
                     54:        }
                     55:        copylocal(gf, "localgateways");
                     56:        nf = fopen("networks", "w");
                     57:        if (nf == NULL) {
                     58:                perror("networks");
                     59:                exit(1);
                     60:        }
                     61:        copylocal(nf, "localnetworks");
                     62:        copycomments(stdin, hf, DATELINES);
                     63:        exit(yyparse());
                     64: }
                     65: 
                     66: struct name *
                     67: newname(str)
                     68:        char *str;
                     69: {
                     70:        char *p;
                     71:        struct name *nm;
                     72: 
                     73:        p = malloc(strlen(str) + 1);
                     74:        strcpy(p, str);
                     75:        nm = (struct name *)malloc(sizeof (struct name));
                     76:        nm->name_val = p;
                     77:        nm->name_link = NONAME;
                     78:        return (nm);
                     79: }
                     80: 
                     81: char *
                     82: lower(str)
                     83:        char *str;
                     84: {
                     85:        register char *cp = str;
                     86: 
                     87:        while (*cp) {
                     88:                if (isupper(*cp))
                     89:                        *cp = tolower(*cp);
                     90:                cp++;
                     91:        }
                     92:        return (str);
                     93: }
                     94: 
                     95: do_entry(keyword, addrlist, namelist, cputype, opsys, protos)
                     96:        int keyword;
                     97:        struct addr *addrlist;
                     98:        struct name *namelist, *cputype, *opsys, *protos;
                     99: {
                    100:        register struct addr *al, *al2;
                    101:        register struct name *nl;
                    102:        struct addr *inetal;
                    103:        int count;
                    104: 
                    105:        switch (keyword) {
                    106: 
                    107:        case KW_NET:
                    108:                nl = namelist;
                    109:                if (nl == NONAME) {
                    110:                        fprintf(stderr, "htable: net");
                    111:                        putnet(stderr, addrlist->addr_val);
                    112:                        fprintf(stderr, " missing names.\n");
                    113:                        break;
                    114:                }
                    115:                fprintf(nf, "%-16.16s", lower(nl->name_val));
                    116:                al2 = addrlist;
                    117:                while (al = al2) {
                    118:                        char *cp;
                    119: 
                    120:                        putnet(nf, al->addr_val);
                    121:                        cp = "\t%s";
                    122:                        while (nl = nl->name_link) {
                    123:                                fprintf(nf, cp, lower(nl->name_val));
                    124:                                cp = " %s";
                    125:                        }
                    126:                        putc('\n', nf);
                    127:                        al2 = al->addr_link;
                    128:                        free((char *)al);
                    129:                }
                    130:                goto alreadyfree;
                    131: 
                    132:        case KW_GATEWAY:
                    133:                /*
                    134:                 * Kludge here: take only gateways directly connected to
                    135:                 * the Internet.  Should really calculate closure on
                    136:                 * connectivity matrix to identify gateways to all networks
                    137:                 * described in data base, but that's real work.
                    138:                 */
                    139:                /* locate Internet address, if one */
                    140:                for (al = addrlist; al; al = al->addr_link)
                    141:                        if (inet_netof(al->addr_val) == INTERNET)
                    142:                                break;
                    143:                if (al == NULL)
                    144:                        break;
                    145:                inetal = al;
                    146:                for (count = 0, al = al->addr_link; al; al = al->addr_link) {
                    147:                        register int net;
                    148:                        register struct netent *np;
                    149: 
                    150:                        if (al == inetal)
                    151:                                continue;
                    152:                        /* suppress duplicates -- not optimal */
                    153:                        net = inet_netof(al->addr_val);
                    154:                        if (checkgateway(net))
                    155:                                break;
                    156:                        count++;
                    157:                        fprintf(gf, "net ");
                    158:                        np = getnetbyaddr(net, AF_INET);
                    159:                        if (np)
                    160:                                fprintf(gf, "%s", np->n_name);
                    161:                        else
                    162:                                putnet(gf, net);
                    163:                        /* this is a kludge */
                    164:                        fprintf(gf, " gateway %s metric 1 passive\n",
                    165:                                lower(namelist->name_val));
                    166:                        savegateway(net);
                    167:                }
                    168:                if (count > 0) {
                    169:                        putaddr(hf, inetal->addr_val);
                    170:                        fprintf(hf, "%s\t# gateway\n",
                    171:                                lower(namelist->name_val));
                    172:                }
                    173:                break;
                    174: 
                    175:        case KW_HOST:
                    176:                al2 = addrlist;
                    177:                while (al = al2) {
                    178:                        if (inet_netof(al->addr_val) != LOCALNET) {
                    179:                                char *cp;
                    180: 
                    181:                                putaddr(hf, al->addr_val);
                    182:                                cp = "%s";
                    183:                                for (nl = namelist; nl; nl = nl->name_link) {
                    184:                                        fprintf(hf, cp, lower(nl->name_val));
                    185:                                        cp = " %s";
                    186:                                }
                    187:                                putc('\n', hf);
                    188:                        }
                    189:                        al2 = al->addr_link;
                    190:                        free((char *)al);
                    191:                }
                    192:                goto alreadyfree;
                    193: 
                    194:        default:
                    195:                fprintf(stderr, "Unknown keyword: %d.\n", keyword);
                    196:        }
                    197:        al2 = addrlist;
                    198:        while (al = al2)
                    199:                al2 = al->addr_link, free((char *)al);
                    200: alreadyfree:
                    201:        freenames(namelist);
                    202:        freenames(protos);
                    203: }
                    204: 
                    205: copylocal(f, filename)
                    206:        FILE *f;
                    207:        char *filename;
                    208: {
                    209:        register FILE *lhf;
                    210:        register cc;
                    211:        char buf[BUFSIZ];
                    212:        extern int errno;
                    213: 
                    214:        lhf = fopen(filename, "r");
                    215:        if (lhf == NULL) {
                    216:                if (errno != ENOENT) {
                    217:                        perror(filename);
                    218:                        exit(1);
                    219:                }
                    220:                fprintf(stderr, "Warning, no %s file.\n", filename);
                    221:                return;
                    222:        }
                    223:        while (cc = fread(buf, 1, sizeof(buf), lhf))
                    224:                fwrite(buf, 1, cc, f);
                    225:        fclose(lhf);
                    226: }
                    227: 
                    228: copycomments(in, out, ccount)
                    229:        FILE *in, *out;
                    230:        int ccount;
                    231: {
                    232:        char buf[BUFSIZ];
                    233:        int length;
                    234:        int count;
                    235:        char *fgets();
                    236: 
                    237:        for (count=0; count < ccount; count++) {
                    238:                if ((fgets(buf, sizeof(buf), in) == NULL) || (buf[0] != ';'))
                    239:                        return;
                    240:                buf[0] = '#';
                    241:                fputs(buf, out);
                    242:        }
                    243:        return;
                    244: }
                    245: #define        UC(b)   (((int)(b))&0xff)
                    246: 
                    247: putnet(f, v)
                    248:        FILE *f;
                    249:        u_long v;
                    250: {
                    251:        register char *a = (char *)&v;
                    252: 
                    253:        if (UC(a[0]&0x80) == 0)
                    254:                fprintf(f, "%d", UC(a[0]));
                    255:        else if ((UC(a[0])&0x40) == 0)
                    256:                fprintf(f, "%d.%d", UC(a[0]), UC(a[1]));
                    257:        else
                    258:                fprintf(f, "%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]));
                    259: }
                    260: 
                    261: putaddr(f, v)
                    262:        FILE *f;
                    263:        u_long v;
                    264: {
                    265:        register char *a = (char *)&v;
                    266:        char buf[32];
                    267: 
                    268:        sprintf(buf,"%d.%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]));
                    269:        fprintf(f, "%-16.16s", buf);
                    270: }
                    271: 
                    272: freenames(list)
                    273:        struct name *list;
                    274: {
                    275:        register struct name *nl, *nl2;
                    276: 
                    277:        nl2 = list;
                    278:        while (nl = nl2) {
                    279:                nl2 = nl->name_link;
                    280:                free(nl->name_val);
                    281:                free((char *)nl);
                    282:        }
                    283: }
                    284: struct gateway {
                    285:        struct  gateway *g_link;
                    286:        int     g_net;
                    287: };
                    288: 
                    289: struct gateway *gateways = 0;
                    290: 
                    291: checkgateway(net)
                    292:        register int net;
                    293: {
                    294:        register struct gateway *gp;
                    295: 
                    296:        for (gp = gateways; gp; gp = gp->g_link)
                    297:                if (gp->g_net == net)
                    298:                        return (1);
                    299:        return (0);
                    300: }
                    301: 
                    302: savegateway(net)
                    303:        int net;
                    304: {
                    305:        register struct gateway *gp;
                    306: 
                    307:        gp = (struct gateway *)malloc(sizeof (struct gateway));
                    308:        if (gp == 0) {
                    309:                fprintf(stderr, "htable: out of memory\n");
                    310:                exit(1);
                    311:        }
                    312:        gp->g_link = gateways;
                    313:        gp->g_net = net;
                    314:        gateways = gp;
                    315: }
                    316:        

unix.superglobalmegacorp.com

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