From owner-freebsd-bugs Tue Jun 2 06:50:35 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id GAA26990 for freebsd-bugs-outgoing; Tue, 2 Jun 1998 06:50:35 -0700 (PDT) (envelope-from owner-freebsd-bugs@FreeBSD.ORG) Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id GAA26983 for ; Tue, 2 Jun 1998 06:50:33 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.8.8/8.8.5) id GAA14456; Tue, 2 Jun 1998 06:50:01 -0700 (PDT) Received: from relay.ucb.crimea.ua (relay.ucb.crimea.ua [194.93.177.113]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id GAA26358 for ; Tue, 2 Jun 1998 06:46:10 -0700 (PDT) (envelope-from ru@ucb.crimea.ua) Received: (from ru@localhost) by relay.ucb.crimea.ua (8.8.8/8.8.8) id QAA10870; Tue, 2 Jun 1998 16:45:31 +0300 (EEST) (envelope-from ru) Message-Id: <199806021345.QAA10870@relay.ucb.crimea.ua> Date: Tue, 2 Jun 1998 16:45:31 +0300 (EEST) From: Ruslan Ermilov Reply-To: ru@ucb.crimea.ua To: FreeBSD-gnats-submit@FreeBSD.ORG X-Send-Pr-Version: 3.2 Subject: bin/6832: [PATCH] Allows PINGing from any address on multihomed hosts Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 6832 >Category: bin >Synopsis: [PATCH] Allows PINGing from any address on multihomed hosts >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Tue Jun 2 06:50:00 PDT 1998 >Last-Modified: >Originator: Ruslan Ermilov >Organization: United Commercial Bank >Release: FreeBSD 2.2.6-STABLE i386 >Environment: Fresh -stable >Description: The patch below allows to ping from any address on the multihomed host. The man page is also updated, the text was cutted from traceroute(8). >How-To-Repeat: >Fix: Index: ping.8 =================================================================== RCS file: /usr/FreeBSD-CVS/src/sbin/ping/ping.8,v retrieving revision 1.3.2.6 diff -u -r1.3.2.6 ping.8 --- ping.8 1997/09/14 19:40:03 1.3.2.6 +++ ping.8 1998/06/02 13:15:12 @@ -48,6 +48,7 @@ .Op Fl l Ar preload .Op Fl p Ar pattern .Op Fl s Ar packetsize +.Op Fl S Ar src_addr .Bo .Ar host | .Op Fl L @@ -194,6 +195,13 @@ with the 8 bytes of .Tn ICMP header data. +.It Fl S Ar src_addr +Use the following IP address as the source address in outgoing packets. +On hosts with more than one IP address, this option can be used to +force the source address to be something other than the IP address +of the interface the probe packet is sent on. If the IP address +is not one of this machine's interface addresses, an error is +returned and nothing is sent. .It Fl T Ar ttl Set the IP Time To Live for multicasted packets. This flag only applies if the ping destination is a multicast address. Index: ping.c =================================================================== RCS file: /usr/FreeBSD-CVS/src/sbin/ping/ping.c,v retrieving revision 1.8.2.16 diff -u -r1.8.2.16 ping.c --- ping.c 1998/05/25 20:21:34 1.8.2.16 +++ ping.c 1998/06/02 12:25:05 @@ -184,14 +184,14 @@ { struct timeval last, intvl; struct hostent *hp; - struct sockaddr_in *to; + struct sockaddr_in *to, sin; struct termios ts; register int i; int ch, hold, packlen, preload, sockerrno, almost_done = 0; struct in_addr ifaddr; unsigned char ttl, loop; u_char *datap, *packet; - char *target, hnamebuf[MAXHOSTNAMELEN]; + char *source = NULL, *target, hnamebuf[MAXHOSTNAMELEN]; char *ep; u_long ultmp; #ifdef IP_OPTIONS @@ -217,7 +217,7 @@ preload = 0; datap = &outpack[8 + sizeof(struct timeval)]; - while ((ch = getopt(argc, argv, "I:LQRT:c:adfi:l:np:qrs:v")) != -1) { + while ((ch = getopt(argc, argv, "I:LQRS:T:c:adfi:l:np:qrs:v")) != -1) { switch(ch) { case 'a': options |= F_AUDIBLE; @@ -301,6 +301,9 @@ optarg); datalen = ultmp; break; + case 'S': + source = optarg; + break; case 'T': /* multicast TTL */ ultmp = strtoul(optarg, &ep, 0); if (*ep || ep == optarg || ultmp > 255) @@ -322,6 +325,24 @@ usage(argv[0]); target = argv[optind]; + if (source) { + bzero((char *)&sin, sizeof(sin)); + sin.sin_family = AF_INET; + if (inet_aton(source, &sin.sin_addr) == 0) { + hp = gethostbyname2(source, AF_INET); + if (!hp) + errx(EX_NOHOST, "cannot resolve %s: %s", + source, hstrerror(h_errno)); + + sin.sin_len = sizeof sin; + if (hp->h_length > sizeof(sin.sin_addr)) + errx(1,"gethostbyname2 returned an illegal address"); + memcpy(&sin.sin_addr, hp->h_addr_list[0], sizeof sin.sin_addr); + } + if (bind(s, (struct sockaddr *)&sin, sizeof sin) == -1) + err(1, "bind"); + } + bzero((char *)&whereto, sizeof(struct sockaddr)); to = (struct sockaddr_in *)&whereto; to->sin_family = AF_INET; @@ -1251,6 +1272,7 @@ fprintf(stderr, "usage: %s [-QRadfnqrv] [-c count] [-i wait] [-l preload] " "[-p pattern]\n [-s packetsize] " + "[-S src_addr]\n " "[host | [-L] [-I iface] [-T ttl] mcast-group]\n", argv0); exit(EX_USAGE); >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message