xref: /original-bsd/sbin/routed/trace/trace.c (revision 241757c4)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of California at Berkeley. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  */
12 
13 #ifndef lint
14 char copyright[] =
15 "@(#) Copyright (c) 1983 Regents of the University of California.\n\
16  All rights reserved.\n";
17 #endif /* not lint */
18 
19 #ifndef lint
20 static char sccsid[] = "@(#)trace.c	5.4 (Berkeley) 02/16/88";
21 #endif /* not lint */
22 
23 #include <sys/param.h>
24 #include <sys/protosw.h>
25 #include <sys/socket.h>
26 #include <netinet/in.h>
27 #include <errno.h>
28 #include <stdio.h>
29 #include <netdb.h>
30 #include <protocols/routed.h>
31 
32 struct	sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 };
33 char	packet[MAXPACKETSIZE];
34 
35 main(argc, argv)
36 	int argc;
37 	char *argv[];
38 {
39 	int size, s;
40 	struct sockaddr from;
41 	struct sockaddr_in router;
42 	register struct rip *msg = (struct rip *)packet;
43 	struct hostent *hp;
44 	struct servent *sp;
45 
46 	if (argc < 3) {
47 usage:
48 		printf("usage: trace cmd machines,\n");
49 		printf("cmd either \"on filename\", or \"off\"\n");
50 		exit(1);
51 	}
52 	s = socket(AF_INET, SOCK_DGRAM, 0);
53 	if (s < 0) {
54 		perror("socket");
55 		exit(2);
56 	}
57 #ifdef vax || pdp11
58 	myaddr.sin_port = htons(myaddr.sin_port);
59 #endif
60 	if (bind(s, &myaddr, sizeof(myaddr)) < 0) {
61 		perror("bind");
62 		exit(2);
63 	}
64 
65 	argv++, argc--;
66 	msg->rip_cmd = strcmp(*argv, "on") == 0 ?
67 		RIPCMD_TRACEON : RIPCMD_TRACEOFF;
68 	msg->rip_vers = RIPVERSION;
69 	argv++, argc--;
70 	size = sizeof (int);
71 	if (msg->rip_cmd == RIPCMD_TRACEON) {
72 		strcpy(msg->rip_tracefile, *argv);
73 		size += strlen(*argv);
74 		argv++, argc--;
75 	}
76 	if (argc == 0)
77 		goto usage;
78 	bzero((char *)&router, sizeof (router));
79 	router.sin_family = AF_INET;
80 	sp = getservbyname("router", "udp");
81 	if (sp == 0) {
82 		printf("udp/router: service unknown\n");
83 		exit(1);
84 	}
85 	router.sin_port = sp->s_port;
86 	while (argc > 0) {
87 		router.sin_family = AF_INET;
88 		router.sin_addr.s_addr = inet_addr(*argv);
89 		if (router.sin_addr.s_addr == -1) {
90 			hp = gethostbyname(*argv);
91 			if (hp == 0) {
92 				printf("%s: unknown\n", *argv);
93 				exit(1);
94 			}
95 			bcopy(hp->h_addr, &router.sin_addr, hp->h_length);
96 		}
97 		if (sendto(s, packet, size, 0, &router, sizeof(router)) < 0)
98 			perror(*argv);
99 		argv++, argc--;
100 	}
101 }
102