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