xref: /original-bsd/sbin/routed/trace/trace.c (revision 62734ea8)
1 #ifndef lint
2 static char sccsid[] = "@(#)trace.c	4.2 10/06/82";
3 #endif
4 
5 #include <sys/param.h>
6 #include <sys/protosw.h>
7 #include <sys/socket.h>
8 #include <net/in.h>
9 #include <errno.h>
10 #include <stdio.h>
11 #include <netdb.h>
12 #include "rip.h"
13 
14 struct	sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 };
15 
16 main(argc, argv)
17 	int argc;
18 	char *argv[];
19 {
20 	int size, s;
21 	struct sockaddr from;
22 	struct sockaddr_in router;
23 	char packet[MAXPACKETSIZE];
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 #ifdef vax || pdp11
35 	myaddr.sin_port = htons(myaddr.sin_port);
36 #endif
37 	s = socket(SOCK_DGRAM, 0, &myaddr, 0);
38 	if (s < 0) {
39 		perror("socket");
40 		exit(2);
41 	}
42 	argv++, argc--;
43 	msg->rip_cmd = strcmp(*argv, "on") == 0 ?
44 		RIPCMD_TRACEON : RIPCMD_TRACEOFF;
45 	argv++, argc--;
46 	size = sizeof (int);
47 	if (msg->rip_cmd == RIPCMD_TRACEON) {
48 		strcpy(msg->rip_tracefile, *argv);
49 		size += strlen(*argv);
50 		argv++, argc--;
51 	}
52 	if (argc == 0)
53 		goto usage;
54 	bzero((char *)&router, sizeof (router));
55 	router.sin_family = AF_INET;
56 	sp = getservbyname("router", "udp");
57 	if (sp == 0) {
58 		printf("udp/router: service unknown\n");
59 		exit(1);
60 	}
61 	router.sin_port = htons(sp->s_port);
62 	while (argc > 0) {
63 		hp = gethostbyname(*argv);
64 		if (hp == 0) {
65 			printf("%s: unknown\n", *argv);
66 			continue;
67 		}
68 		bcopy(hp->h_addr, &router.sin_addr, hp->h_length);
69 		if (send(s, &router, packet, size) < 0)
70 			perror(*argv);
71 		argv++, argc--;
72 	}
73 }
74