xref: /csrg-svn/sbin/routed/trace/trace.c (revision 15760)
17214Ssam #ifndef lint
2*15760Skarels static char sccsid[] = "@(#)trace.c	4.3 12/21/83";
37214Ssam #endif
47214Ssam 
57214Ssam #include <sys/param.h>
67214Ssam #include <sys/protosw.h>
77214Ssam #include <sys/socket.h>
8*15760Skarels #include <netinet/in.h>
97214Ssam #include <errno.h>
107214Ssam #include <stdio.h>
118340Ssam #include <netdb.h>
12*15760Skarels #include "../protocol.h"
137214Ssam 
147214Ssam struct	sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 };
15*15760Skarels char	packet[MAXPACKETSIZE];
167214Ssam 
177214Ssam main(argc, argv)
187214Ssam 	int argc;
197214Ssam 	char *argv[];
207214Ssam {
217214Ssam 	int size, s;
227214Ssam 	struct sockaddr from;
237214Ssam 	struct sockaddr_in router;
247214Ssam 	register struct rip *msg = (struct rip *)packet;
258340Ssam 	struct hostent *hp;
268340Ssam 	struct servent *sp;
277214Ssam 
287214Ssam 	if (argc < 3) {
297214Ssam usage:
307214Ssam 		printf("usage: trace cmd machines,\n");
317214Ssam 		printf("cmd either \"on filename\", or \"off\"\n");
327214Ssam 		exit(1);
337214Ssam 	}
34*15760Skarels 	s = socket(AF_INET, SOCK_DGRAM, 0);
35*15760Skarels 	if (s < 0) {
36*15760Skarels 		perror("socket");
37*15760Skarels 		exit(2);
38*15760Skarels 	}
397214Ssam #ifdef vax || pdp11
407214Ssam 	myaddr.sin_port = htons(myaddr.sin_port);
417214Ssam #endif
42*15760Skarels 	if (bind(s, &myaddr, sizeof(myaddr)) < 0) {
43*15760Skarels 		perror("bind");
447214Ssam 		exit(2);
457214Ssam 	}
46*15760Skarels 
477214Ssam 	argv++, argc--;
487214Ssam 	msg->rip_cmd = strcmp(*argv, "on") == 0 ?
497214Ssam 		RIPCMD_TRACEON : RIPCMD_TRACEOFF;
50*15760Skarels 	msg->rip_vers = RIPVERSION;
517214Ssam 	argv++, argc--;
527214Ssam 	size = sizeof (int);
537214Ssam 	if (msg->rip_cmd == RIPCMD_TRACEON) {
547214Ssam 		strcpy(msg->rip_tracefile, *argv);
557214Ssam 		size += strlen(*argv);
567214Ssam 		argv++, argc--;
577214Ssam 	}
587214Ssam 	if (argc == 0)
597214Ssam 		goto usage;
607214Ssam 	bzero((char *)&router, sizeof (router));
617214Ssam 	router.sin_family = AF_INET;
628340Ssam 	sp = getservbyname("router", "udp");
638340Ssam 	if (sp == 0) {
648340Ssam 		printf("udp/router: service unknown\n");
658340Ssam 		exit(1);
668340Ssam 	}
67*15760Skarels 	router.sin_port = sp->s_port;
687214Ssam 	while (argc > 0) {
698340Ssam 		hp = gethostbyname(*argv);
708340Ssam 		if (hp == 0) {
717214Ssam 			printf("%s: unknown\n", *argv);
727214Ssam 			continue;
737214Ssam 		}
748340Ssam 		bcopy(hp->h_addr, &router.sin_addr, hp->h_length);
75*15760Skarels 		if (sendto(s, packet, size, 0, &router, sizeof(router)) < 0)
767214Ssam 			perror(*argv);
777214Ssam 		argv++, argc--;
787214Ssam 	}
797214Ssam }
80