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