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