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