tags #198486 patch
thanks
On Mon, Jun 23, 2003 at 12:23:19PM +0200, Norman Rasmussen wrote:
> on a multi-homed machine it would be usefull to be able to check latency
> to hosts via multiple interfaces. (or even if the host randomly chooses
> an interface to fix the ping requests to an specified source address)
The attached patch implements this behavior as a -S option. Docs need
to be adapted as well.
I am going to submit the same patch upstream.
Greetings
Marc
--
-----------------------------------------------------------------------------
Marc Haber | "I don't trust Computers. They | Mailadresse im Header
Mannheim, Germany | lose things." Winona Ryder | Fon: *49 621 72739834
Nordisch by Nature | How to make an American Quilt | Fax: *49 621 72739835
diff -u fping-2.4b2-to-ipv6/fping.c fping-2.4b2-to-ipv6/fping.c
--- fping-2.4b2-to-ipv6/fping.c
+++ fping-2.4b2-to-ipv6/fping.c
@@ -281,6 +281,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;
@@ -406,6 +412,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() )
@@ -518,7 +529,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 )
{
@@ -666,6 +677,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;
@@ -989,6 +1010,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 );
@@ -2772,6 +2809,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" );