Annotation of 43BSDReno/sbin/XNSrouted/tools/query.c, revision 1.1

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

unix.superglobalmegacorp.com

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