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