Annotation of 43BSD/etc/XNSrouted/tools/query.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983, 1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  * This file include significant work done at Cornell University
                      7:  * by Bill Nesheim.  That work included by permission.
                      8:  */
                      9: 
                     10: #ifndef lint
                     11: char copyright[] =
                     12: "@(#) Copyright (c) 1983, 1986 Regents of the University of California.\n\
                     13:  All rights reserved.\n";
                     14: #endif not lint
                     15: 
                     16: #ifndef lint
                     17: static char sccsid[] = "@(#)query.c    1.4 (Berkeley) 2/14/86";
                     18: #endif not lint
                     19: 
                     20: #include <sys/param.h>
                     21: #include <sys/protosw.h>
                     22: #include <sys/socket.h>
                     23: #include <sys/time.h>
                     24: #include <netinet/in.h>
                     25: #include <netns/ns.h>
                     26: #include <netns/idp.h>
                     27: #include <errno.h>
                     28: #include <stdio.h>
                     29: #include <netdb.h>
                     30: #include "../protocol.h"
                     31: #define IDPPORT_RIF 1
                     32: 
                     33: #define        WTIME   5               /* Time to wait for responses */
                     34: 
                     35: int    s;
                     36: int    timedout, timeout();
                     37: char   packet[MAXPACKETSIZE];
                     38: extern int errno;
                     39: struct sockaddr_ns     myaddr = {AF_NS};
                     40: char ns_ntoa();
                     41: struct ns_addr ns_addr();
                     42: main(argc, argv)
                     43: int argc;
                     44: char *argv[];
                     45: {
                     46:        int cc, count, bits;
                     47:        struct sockaddr from;
                     48:        int fromlen = sizeof(from);
                     49:        struct timeval notime;
                     50:        
                     51:        if (argc < 2) {
                     52:                printf("usage: query hosts...\n");
                     53:                exit(1);
                     54:        }
                     55:        s = getsocket(SOCK_DGRAM, 0);
                     56:        if (s < 0) {
                     57:                perror("socket");
                     58:                exit(2);
                     59:        }
                     60: 
                     61:        argv++, argc--;
                     62:        query(argv,argc);
                     63: 
                     64:        /*
                     65:         * Listen for returning packets;
                     66:         * may be more than one packet per host.
                     67:         */
                     68:        bits = 1 << s;
                     69:        bzero(&notime, sizeof(notime));
                     70:        signal(SIGALRM, timeout);
                     71:        alarm(WTIME);
                     72:        while (!timedout || 
                     73:            select(20, &bits, 0, 0, &notime) > 0) {
                     74:                struct nspacket {
                     75:                        struct idp hdr;
                     76:                        char    data[512];
                     77:                } response;
                     78:                cc = recvfrom(s, &response, sizeof (response), 0,
                     79:                  &from, &fromlen);
                     80:                if (cc <= 0) {
                     81:                        if (cc < 0) {
                     82:                                if (errno == EINTR)
                     83:                                        continue;
                     84:                                perror("recvfrom");
                     85:                                (void) close(s);
                     86:                                exit(1);
                     87:                        }
                     88:                        continue;
                     89:                }
                     90:                rip_input(&from, response.data, cc);
                     91:                count--;
                     92:        }
                     93: }
                     94: static struct sockaddr_ns router = {AF_NS};
                     95: static struct ns_addr zero_addr;
                     96: static short allones[] = {-1, -1, -1};
                     97: 
                     98: query(argv,argc)
                     99: char **argv;
                    100: {
                    101:        register struct rip *msg = (struct rip *)packet;
                    102:        char *host = *argv;
                    103:        struct ns_addr specific;
                    104: 
                    105:        argv++; argc--;
                    106:        router.sns_addr = ns_addr(host);
                    107:        router.sns_addr.x_port = htons(IDPPORT_RIF);
                    108:        if (ns_hosteq(zero_addr, router.sns_addr)) {
                    109:                router.sns_addr.x_host = *(union ns_host *) allones;
                    110:        }
                    111:        msg->rip_cmd = htons(RIPCMD_REQUEST);
                    112:        msg->rip_nets[0].rip_dst = *(union ns_net *) allones;
                    113:        msg->rip_nets[0].rip_metric = htons(HOPCNT_INFINITY);
                    114:        if (argc > 0) {
                    115:                specific = ns_addr(*argv);
                    116:                msg->rip_nets[0].rip_dst = specific.x_net;
                    117:                specific.x_host = zero_addr.x_host;
                    118:                specific.x_port = zero_addr.x_port;
                    119:                printf("Net asked for was %s\n", ns_ntoa(specific));
                    120:        }
                    121:        if (sendto(s, packet, sizeof (struct rip), 0,
                    122:          &router, sizeof(router)) < 0)
                    123:                perror(host);
                    124: }
                    125: 
                    126: /*
                    127:  * Handle an incoming routing packet.
                    128:  */
                    129: rip_input(from, msg,  size)
                    130:        struct sockaddr_ns *from;
                    131:        register struct rip *msg;
                    132:        int size;
                    133: {
                    134:        struct netinfo *n;
                    135:        char *name;
                    136:        int lna, net, subnet;
                    137:        struct hostent *hp;
                    138:        struct netent *np;
                    139:        static struct ns_addr work;
                    140: 
                    141:        if (htons(msg->rip_cmd) != RIPCMD_RESPONSE)
                    142:                return;
                    143:        printf("from %s\n", ns_ntoa(from->sns_addr));
                    144:        size -= sizeof (struct idp);
                    145:        size -= sizeof (short);
                    146:        n = msg->rip_nets;
                    147:        while (size > 0) {
                    148:                union ns_net_u net;
                    149:                if (size < sizeof (struct netinfo))
                    150:                        break;
                    151:                net.net_e = n->rip_dst;
                    152:                printf("\t%d, metric %d\n", ntohl(net.long_e),
                    153:                        ntohs(n->rip_metric));
                    154:                size -= sizeof (struct netinfo), n++;
                    155:        }
                    156: }
                    157: 
                    158: timeout()
                    159: {
                    160:        timedout = 1;
                    161: }
                    162: getsocket(type, proto)
                    163:        int type, proto; 
                    164: {
                    165:        struct sockaddr_ns *sns = &myaddr;
                    166:        int domain = sns->sns_family;
                    167:        int retry, s, on = 1;
                    168: 
                    169:        retry = 1;
                    170:        while ((s = socket(domain, type, proto)) < 0 && retry) {
                    171:                perror("socket");
                    172:                sleep(5 * retry);
                    173:                retry <<= 1;
                    174:        }
                    175:        if (retry == 0)
                    176:                return (-1);
                    177:        while (bind(s, sns, sizeof (*sns), 0) < 0 && retry) {
                    178:                perror("bind");
                    179:                sleep(5 * retry);
                    180:                retry <<= 1;
                    181:        }
                    182:        if (retry == 0)
                    183:                return (-1);
                    184:        if (domain==AF_NS) {
                    185:                struct idp idp;
                    186:                if (setsockopt(s, 0, SO_HEADERS_ON_INPUT, &on, sizeof(on))) {
                    187:                        perror("setsockopt SEE HEADERS");
                    188:                        exit(1);
                    189:                }
                    190:                idp.idp_pt = NSPROTO_RI;
                    191:                if (setsockopt(s, 0, SO_DEFAULT_HEADERS, &idp, sizeof(idp))) {
                    192:                        perror("setsockopt SET HEADERS");
                    193:                        exit(1);
                    194:                }
                    195:        }
                    196:        if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on)) < 0) {
                    197:                perror("setsockopt SO_BROADCAST");
                    198:                exit(1);
                    199:        }
                    200:        return (s);
                    201: }

unix.superglobalmegacorp.com

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