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