17214Ssam #ifndef lint 2*15760Skarels static char sccsid[] = "@(#)trace.c 4.3 12/21/83"; 37214Ssam #endif 47214Ssam 57214Ssam #include <sys/param.h> 67214Ssam #include <sys/protosw.h> 77214Ssam #include <sys/socket.h> 8*15760Skarels #include <netinet/in.h> 97214Ssam #include <errno.h> 107214Ssam #include <stdio.h> 118340Ssam #include <netdb.h> 12*15760Skarels #include "../protocol.h" 137214Ssam 147214Ssam struct sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 }; 15*15760Skarels char packet[MAXPACKETSIZE]; 167214Ssam 177214Ssam main(argc, argv) 187214Ssam int argc; 197214Ssam char *argv[]; 207214Ssam { 217214Ssam int size, s; 227214Ssam struct sockaddr from; 237214Ssam struct sockaddr_in router; 247214Ssam register struct rip *msg = (struct rip *)packet; 258340Ssam struct hostent *hp; 268340Ssam struct servent *sp; 277214Ssam 287214Ssam if (argc < 3) { 297214Ssam usage: 307214Ssam printf("usage: trace cmd machines,\n"); 317214Ssam printf("cmd either \"on filename\", or \"off\"\n"); 327214Ssam exit(1); 337214Ssam } 34*15760Skarels s = socket(AF_INET, SOCK_DGRAM, 0); 35*15760Skarels if (s < 0) { 36*15760Skarels perror("socket"); 37*15760Skarels exit(2); 38*15760Skarels } 397214Ssam #ifdef vax || pdp11 407214Ssam myaddr.sin_port = htons(myaddr.sin_port); 417214Ssam #endif 42*15760Skarels if (bind(s, &myaddr, sizeof(myaddr)) < 0) { 43*15760Skarels perror("bind"); 447214Ssam exit(2); 457214Ssam } 46*15760Skarels 477214Ssam argv++, argc--; 487214Ssam msg->rip_cmd = strcmp(*argv, "on") == 0 ? 497214Ssam RIPCMD_TRACEON : RIPCMD_TRACEOFF; 50*15760Skarels msg->rip_vers = RIPVERSION; 517214Ssam argv++, argc--; 527214Ssam size = sizeof (int); 537214Ssam if (msg->rip_cmd == RIPCMD_TRACEON) { 547214Ssam strcpy(msg->rip_tracefile, *argv); 557214Ssam size += strlen(*argv); 567214Ssam argv++, argc--; 577214Ssam } 587214Ssam if (argc == 0) 597214Ssam goto usage; 607214Ssam bzero((char *)&router, sizeof (router)); 617214Ssam router.sin_family = AF_INET; 628340Ssam sp = getservbyname("router", "udp"); 638340Ssam if (sp == 0) { 648340Ssam printf("udp/router: service unknown\n"); 658340Ssam exit(1); 668340Ssam } 67*15760Skarels router.sin_port = sp->s_port; 687214Ssam while (argc > 0) { 698340Ssam hp = gethostbyname(*argv); 708340Ssam if (hp == 0) { 717214Ssam printf("%s: unknown\n", *argv); 727214Ssam continue; 737214Ssam } 748340Ssam bcopy(hp->h_addr, &router.sin_addr, hp->h_length); 75*15760Skarels if (sendto(s, packet, size, 0, &router, sizeof(router)) < 0) 767214Ssam perror(*argv); 777214Ssam argv++, argc--; 787214Ssam } 797214Ssam } 80