xref: /csrg-svn/sbin/routed/trace/trace.c (revision 25382)
122009Sdist /*
222009Sdist  * Copyright (c) 1983 Regents of the University of California.
322009Sdist  * All rights reserved.  The Berkeley software License Agreement
422009Sdist  * specifies the terms and conditions for redistribution.
522009Sdist  */
622009Sdist 
77214Ssam #ifndef lint
822009Sdist char copyright[] =
922009Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\
1022009Sdist  All rights reserved.\n";
1122009Sdist #endif not lint
127214Ssam 
1322009Sdist #ifndef lint
14*25382Skarels static char sccsid[] = "@(#)trace.c	5.2 (Berkeley) 11/04/85";
1522009Sdist #endif not lint
1622009Sdist 
177214Ssam #include <sys/param.h>
187214Ssam #include <sys/protosw.h>
197214Ssam #include <sys/socket.h>
2015760Skarels #include <netinet/in.h>
217214Ssam #include <errno.h>
227214Ssam #include <stdio.h>
238340Ssam #include <netdb.h>
24*25382Skarels #include <protocols/routed.h>
257214Ssam 
267214Ssam struct	sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 };
2715760Skarels char	packet[MAXPACKETSIZE];
287214Ssam 
297214Ssam main(argc, argv)
307214Ssam 	int argc;
317214Ssam 	char *argv[];
327214Ssam {
337214Ssam 	int size, s;
347214Ssam 	struct sockaddr from;
357214Ssam 	struct sockaddr_in router;
367214Ssam 	register struct rip *msg = (struct rip *)packet;
378340Ssam 	struct hostent *hp;
388340Ssam 	struct servent *sp;
397214Ssam 
407214Ssam 	if (argc < 3) {
417214Ssam usage:
427214Ssam 		printf("usage: trace cmd machines,\n");
437214Ssam 		printf("cmd either \"on filename\", or \"off\"\n");
447214Ssam 		exit(1);
457214Ssam 	}
4615760Skarels 	s = socket(AF_INET, SOCK_DGRAM, 0);
4715760Skarels 	if (s < 0) {
4815760Skarels 		perror("socket");
4915760Skarels 		exit(2);
5015760Skarels 	}
517214Ssam #ifdef vax || pdp11
527214Ssam 	myaddr.sin_port = htons(myaddr.sin_port);
537214Ssam #endif
5415760Skarels 	if (bind(s, &myaddr, sizeof(myaddr)) < 0) {
5515760Skarels 		perror("bind");
567214Ssam 		exit(2);
577214Ssam 	}
5815760Skarels 
597214Ssam 	argv++, argc--;
607214Ssam 	msg->rip_cmd = strcmp(*argv, "on") == 0 ?
617214Ssam 		RIPCMD_TRACEON : RIPCMD_TRACEOFF;
6215760Skarels 	msg->rip_vers = RIPVERSION;
637214Ssam 	argv++, argc--;
647214Ssam 	size = sizeof (int);
657214Ssam 	if (msg->rip_cmd == RIPCMD_TRACEON) {
667214Ssam 		strcpy(msg->rip_tracefile, *argv);
677214Ssam 		size += strlen(*argv);
687214Ssam 		argv++, argc--;
697214Ssam 	}
707214Ssam 	if (argc == 0)
717214Ssam 		goto usage;
727214Ssam 	bzero((char *)&router, sizeof (router));
737214Ssam 	router.sin_family = AF_INET;
748340Ssam 	sp = getservbyname("router", "udp");
758340Ssam 	if (sp == 0) {
768340Ssam 		printf("udp/router: service unknown\n");
778340Ssam 		exit(1);
788340Ssam 	}
7915760Skarels 	router.sin_port = sp->s_port;
807214Ssam 	while (argc > 0) {
818340Ssam 		hp = gethostbyname(*argv);
828340Ssam 		if (hp == 0) {
837214Ssam 			printf("%s: unknown\n", *argv);
847214Ssam 			continue;
857214Ssam 		}
868340Ssam 		bcopy(hp->h_addr, &router.sin_addr, hp->h_length);
8715760Skarels 		if (sendto(s, packet, size, 0, &router, sizeof(router)) < 0)
887214Ssam 			perror(*argv);
897214Ssam 		argv++, argc--;
907214Ssam 	}
917214Ssam }
92