ports/111549: ports/net/fping patch to add -S source_addr option
Philip Kizer
pckizer at nostrum.com
Sat Apr 14 01:20:03 UTC 2007
>Number: 111549
>Category: ports
>Synopsis: ports/net/fping patch to add -S source_addr option
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sat Apr 14 01:20:02 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Philip Kizer
>Release: FreeBSD 6.2-STABLE i386
>Organization:
>Environment:
System: FreeBSD shaman.nostrum.com 6.2-STABLE FreeBSD 6.2-STABLE #1: Tue Mar 20 23:33:38 CDT 2007 root at shaman:/usr/obj/usr/src/sys/CUSTOM i386
>Description:
Several people have produced some patches for fping that adds an
option to select the IP source_address for queries and some have
said they submitted them to the sourceforge fping maintainer.
Since I did not see any official fping distributions that include
any of those patches, I recently Cc-ed the sourceforge fping
maintainer's address in a question to the smokeping mailing-list
asking about that patch but so far I have heard back only from
that list with a pointer to a debian patch. Per request from
Jason Harris, I include here a copy of the patch that is usable
in ports/net/fping/files that adds that option.
>How-To-Repeat:
n/a
>Fix:
The patch from:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=198486
was adapted to apply to the ports system.
Put the following patch into
ports/net/fping/files/patch-fping.c-dash-S and re-install fping.
It will then take a <-S source_address> command-line option for
selecting the out-going source IP:
diff -ru ../fping-2.4b2_to-ipv6-orig/fping.c ./fping.c
--- ../fping-2.4b2_to-ipv6-orig/fping.c Sun Jan 20 19:06:30 2002
+++ ./fping.c Fri Apr 13 14:36:02 2007
@@ -283,6 +283,12 @@
u_int count = 1;
u_int trials;
u_int report_interval = 0;
+int src_addr_present = 0;
+#ifndef IPV6
+struct in_addr src_addr;
+#else
+struct in6_addr src_addr;
+#endif
/* global stats */
long max_reply = 0;
@@ -408,6 +414,11 @@
struct protoent *proto;
char *buf;
uid_t uid;
+#ifndef IPV6
+ struct sockaddr_in sa;
+#else
+ struct sockaddr_in6 sa;
+#endif
/* check if we are root */
if( geteuid() )
@@ -491,7 +502,7 @@
/* get command line options */
- while( ( c = getopt( argc, argv, "gedhlmnqusaAvz:t:i:p:f:r:c:b:C:Q:B:" ) ) != EOF )
+ while( ( c = getopt( argc, argv, "gedhlmnqusaAvz:t:i:p:f:r:c:b:C:Q:B:S:" ) ) != EOF )
{
switch( c )
{
@@ -639,6 +650,16 @@
generate_flag = 1;
break;
+ case 'S':
+#ifndef IPV6
+ if( ! inet_pton( AF_INET, optarg, &src_addr ) )
+#else
+ if( ! inet_pton( AF_INET6, optarg, &src_addr ) )
+#endif
+ usage();
+ src_addr_present = 1;
+ break;
+
default:
usage();
break;
@@ -962,6 +983,22 @@
if( !num_hosts )
exit( 2 );
+ /* set the source address */
+
+ if( src_addr_present )
+ {
+ memset( &sa, 0, sizeof( sa ) );
+#ifndef IPV6
+ sa.sin_family = AF_INET;
+ sa.sin_addr = src_addr;
+#else
+ sa.sin6_family = AF_INET6;
+ sa.sin6_addr = src_addr;
+#endif
+ if ( bind( s, (struct sockaddr *)&sa, sizeof( sa ) ) < 0 )
+ errno_crash_and_burn( "cannot bind source address" );
+ }
+
/* allocate array to hold outstanding ping requests */
table = ( HOST_ENTRY** )malloc( sizeof( HOST_ENTRY* ) * num_hosts );
@@ -2732,6 +2769,7 @@
fprintf( stderr, " -Q n same as -q, but show summary every n seconds\n" );
fprintf( stderr, " -r n number of retries (default %d)\n", retry );
fprintf( stderr, " -s print final stats\n" );
+ fprintf( stderr, " -S addr set source address\n" );
fprintf( stderr, " -t n individual target initial timeout (in millisec) (default %d)\n", timeout / 100 );
fprintf( stderr, " -u show targets that are unreachable\n" );
fprintf( stderr, " -v show version\n" );
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list