595605c5fe
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. PR: ports/111549 Submitted by: Philip Kizer <pckizer@nostrum.com> Approved by: maintainer timeout
88 lines
2.2 KiB
Text
88 lines
2.2 KiB
Text
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" );
|
|
|
|
|
|
|