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