Annotation of 42BSD/etc/routed/tools/query.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)query.c    4.5 10/7/82";
                      3: #endif
                      4: 
                      5: #include <sys/param.h>
                      6: #include <sys/protosw.h>
                      7: #include <sys/socket.h>
                      8: #include <net/in.h>
                      9: #include <errno.h>
                     10: #include <stdio.h>
                     11: #include <netdb.h>
                     12: #include "rip.h"
                     13: 
                     14: int    s;
                     15: char   packet[MAXPACKETSIZE];
                     16: 
                     17: main(argc, argv)
                     18:        int argc;
                     19:        char *argv[];
                     20: {
                     21:        int cc, count;
                     22:        struct sockaddr from;
                     23:        
                     24:        if (argc < 2) {
                     25:                printf("usage: query hosts...\n");
                     26:                exit(1);
                     27:        }
                     28:        s = socket(SOCK_DGRAM, 0, 0, 0);
                     29:        if (s < 0) {
                     30:                perror("socket");
                     31:                exit(2);
                     32:        }
                     33:        argv++, argc--;
                     34:        count = argc;
                     35:        while (argc > 0) {
                     36:                query(*argv);
                     37:                argv++, argc--;
                     38:        }
                     39: 
                     40:        /*
                     41:         * Listen for returning packets
                     42:         */
                     43:        while (count > 0) {
                     44:                cc = receive(s, &from, packet, sizeof (packet));
                     45:                if (cc <= 0) {
                     46:                        if (cc < 0) {
                     47:                                perror("receive");
                     48:                                (void) close(s);
                     49:                                exit(1);
                     50:                        }
                     51:                        continue;
                     52:                }
                     53:                rip_input(&from, cc);
                     54:                count--;
                     55:        }
                     56: }
                     57: 
                     58: query(host)
                     59:        char *host;
                     60: {
                     61:        struct sockaddr_in router;
                     62:        register struct rip *msg = (struct rip *)packet;
                     63:        struct hostent *hp;
                     64:        struct servent *sp;
                     65: 
                     66:        bzero((char *)&router, sizeof (router));
                     67:        hp = gethostbyname(host);
                     68:        if (hp == 0) {
                     69:                printf("%s: unknown\n", host);
                     70:                exit(1);
                     71:        }
                     72:        bcopy(hp->h_addr, &router.sin_addr, hp->h_length);
                     73:        router.sin_family = AF_INET;
                     74:        sp = getservbyname("router", "udp");
                     75:        if (sp == 0) {
                     76:                printf("udp/router: service unknown\n");
                     77:                exit(1);
                     78:        }
                     79:        router.sin_port = htons(sp->s_port);
                     80:        msg->rip_cmd = RIPCMD_REQUEST;
                     81:        msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
                     82:        msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
                     83:        if (send(s, &router, packet, sizeof (struct rip)) < 0)
                     84:                perror(host);
                     85: }
                     86: 
                     87: /*
                     88:  * Handle an incoming routing packet.
                     89:  */
                     90: rip_input(from, size)
                     91:        struct sockaddr_in *from;
                     92:        int size;
                     93: {
                     94:        register struct rip *msg = (struct rip *)packet;
                     95:        struct netinfo *n;
                     96:        char *name;
                     97:        struct hostent *hp;
                     98:        struct netent *np;
                     99: 
                    100:        if (msg->rip_cmd != RIPCMD_RESPONSE)
                    101:                return;
                    102:        hp = gethostbyaddr(&from->sin_addr, sizeof (struct in_addr), AF_INET);
                    103:        name = hp == 0 ? "???" : hp->h_name;
                    104:        printf("from %s(%x):\n", name, from->sin_addr);
                    105:        size -= sizeof (int);
                    106:        n = msg->rip_nets;
                    107:        while (size > 0) {
                    108:                register struct sockaddr_in *sin;
                    109: 
                    110:                if (size < sizeof (struct netinfo))
                    111:                        break;
                    112:                sin = (struct sockaddr_in *)&n->rip_dst;
                    113:                if (inet_lnaof(sin->sin_addr) == INADDR_ANY) {
                    114:                        np = getnetbyaddr(inet_netof(sin->sin_addr), AF_INET);
                    115:                        name = np ? np->n_name : "???";
                    116:                } else {
                    117:                        hp = gethostbyaddr(&sin->sin_addr,
                    118:                                sizeof (struct in_addr), AF_INET);
                    119:                        name = hp ? hp->h_name : "???";
                    120:                }
                    121:                printf("\t%s(%x), metric %d\n", name,
                    122:                        sin->sin_addr, n->rip_metric);
                    123:                size -= sizeof (struct netinfo), n++;
                    124:        }
                    125: }

unix.superglobalmegacorp.com

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