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" );

Reply via email to