1*22009Sdist /* 2*22009Sdist * Copyright (c) 1983 Regents of the University of California. 3*22009Sdist * All rights reserved. The Berkeley software License Agreement 4*22009Sdist * specifies the terms and conditions for redistribution. 5*22009Sdist */ 6*22009Sdist 77214Ssam #ifndef lint 8*22009Sdist char copyright[] = 9*22009Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 10*22009Sdist All rights reserved.\n"; 11*22009Sdist #endif not lint 127214Ssam 13*22009Sdist #ifndef lint 14*22009Sdist static char sccsid[] = "@(#)trace.c 5.1 (Berkeley) 06/04/85"; 15*22009Sdist #endif not lint 16*22009Sdist 177214Ssam #include <sys/param.h> 187214Ssam #include <sys/protosw.h> 197214Ssam #include <sys/socket.h> 2015760Skarels #include <netinet/in.h> 217214Ssam #include <errno.h> 227214Ssam #include <stdio.h> 238340Ssam #include <netdb.h> 2415760Skarels #include "../protocol.h" 257214Ssam 267214Ssam struct sockaddr_in myaddr = { AF_INET, IPPORT_RESERVED-1 }; 2715760Skarels char packet[MAXPACKETSIZE]; 287214Ssam 297214Ssam main(argc, argv) 307214Ssam int argc; 317214Ssam char *argv[]; 327214Ssam { 337214Ssam int size, s; 347214Ssam struct sockaddr from; 357214Ssam struct sockaddr_in router; 367214Ssam register struct rip *msg = (struct rip *)packet; 378340Ssam struct hostent *hp; 388340Ssam struct servent *sp; 397214Ssam 407214Ssam if (argc < 3) { 417214Ssam usage: 427214Ssam printf("usage: trace cmd machines,\n"); 437214Ssam printf("cmd either \"on filename\", or \"off\"\n"); 447214Ssam exit(1); 457214Ssam } 4615760Skarels s = socket(AF_INET, SOCK_DGRAM, 0); 4715760Skarels if (s < 0) { 4815760Skarels perror("socket"); 4915760Skarels exit(2); 5015760Skarels } 517214Ssam #ifdef vax || pdp11 527214Ssam myaddr.sin_port = htons(myaddr.sin_port); 537214Ssam #endif 5415760Skarels if (bind(s, &myaddr, sizeof(myaddr)) < 0) { 5515760Skarels perror("bind"); 567214Ssam exit(2); 577214Ssam } 5815760Skarels 597214Ssam argv++, argc--; 607214Ssam msg->rip_cmd = strcmp(*argv, "on") == 0 ? 617214Ssam RIPCMD_TRACEON : RIPCMD_TRACEOFF; 6215760Skarels msg->rip_vers = RIPVERSION; 637214Ssam argv++, argc--; 647214Ssam size = sizeof (int); 657214Ssam if (msg->rip_cmd == RIPCMD_TRACEON) { 667214Ssam strcpy(msg->rip_tracefile, *argv); 677214Ssam size += strlen(*argv); 687214Ssam argv++, argc--; 697214Ssam } 707214Ssam if (argc == 0) 717214Ssam goto usage; 727214Ssam bzero((char *)&router, sizeof (router)); 737214Ssam router.sin_family = AF_INET; 748340Ssam sp = getservbyname("router", "udp"); 758340Ssam if (sp == 0) { 768340Ssam printf("udp/router: service unknown\n"); 778340Ssam exit(1); 788340Ssam } 7915760Skarels router.sin_port = sp->s_port; 807214Ssam while (argc > 0) { 818340Ssam hp = gethostbyname(*argv); 828340Ssam if (hp == 0) { 837214Ssam printf("%s: unknown\n", *argv); 847214Ssam continue; 857214Ssam } 868340Ssam bcopy(hp->h_addr, &router.sin_addr, hp->h_length); 8715760Skarels if (sendto(s, packet, size, 0, &router, sizeof(router)) < 0) 887214Ssam perror(*argv); 897214Ssam argv++, argc--; 907214Ssam } 917214Ssam } 92