xref: /csrg-svn/sbin/routed/query/query.c (revision 6918)
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