xref: /csrg-svn/sbin/routed/trace/trace.c (revision 15760)
1 #ifndef lint
2 static char sccsid[] = "@(#)trace.c	4.3 12/21/83";
3 #endif
4 
5 #include <sys/param.h>
6 #include <sys/protosw.h>
7 #include <sys/socket.h>
8 #include <netinet/in.h>
9 #include <errno.h>
10 #include <stdio.h>
11 #include <netdb.h>
12 #include "../protocol.h"
13 
14 struct	sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 };
15 char	packet[MAXPACKETSIZE];
16 
17 main(argc, argv)
18 	int argc;
19 	char *argv[];
20 {
21 	int size, s;
22 	struct sockaddr from;
23 	struct sockaddr_in router;
24 	register struct rip *msg = (struct rip *)packet;
25 	struct hostent *hp;
26 	struct servent *sp;
27 
28 	if (argc < 3) {
29 usage:
30 		printf("usage: trace cmd machines,\n");
31 		printf("cmd either \"on filename\", or \"off\"\n");
32 		exit(1);
33 	}
34 	s = socket(AF_INET, SOCK_DGRAM, 0);
35 	if (s < 0) {
36 		perror("socket");
37 		exit(2);
38 	}
39 #ifdef vax || pdp11
40 	myaddr.sin_port = htons(myaddr.sin_port);
41 #endif
42 	if (bind(s, &myaddr, sizeof(myaddr)) < 0) {
43 		perror("bind");
44 		exit(2);
45 	}
46 
47 	argv++, argc--;
48 	msg->rip_cmd = strcmp(*argv, "on") == 0 ?
49 		RIPCMD_TRACEON : RIPCMD_TRACEOFF;
50 	msg->rip_vers = RIPVERSION;
51 	argv++, argc--;
52 	size = sizeof (int);
53 	if (msg->rip_cmd == RIPCMD_TRACEON) {
54 		strcpy(msg->rip_tracefile, *argv);
55 		size += strlen(*argv);
56 		argv++, argc--;
57 	}
58 	if (argc == 0)
59 		goto usage;
60 	bzero((char *)&router, sizeof (router));
61 	router.sin_family = AF_INET;
62 	sp = getservbyname("router", "udp");
63 	if (sp == 0) {
64 		printf("udp/router: service unknown\n");
65 		exit(1);
66 	}
67 	router.sin_port = sp->s_port;
68 	while (argc > 0) {
69 		hp = gethostbyname(*argv);
70 		if (hp == 0) {
71 			printf("%s: unknown\n", *argv);
72 			continue;
73 		}
74 		bcopy(hp->h_addr, &router.sin_addr, hp->h_length);
75 		if (sendto(s, packet, size, 0, &router, sizeof(router)) < 0)
76 			perror(*argv);
77 		argv++, argc--;
78 	}
79 }
80