diff -urN fping-2.4b2_to.orig/fping.c fping-2.4b2_to/fping.c --- fping-2.4b2_to.orig/fping.c 2001-07-20 19:10:26.000000000 +0200 +++ fping-2.4b2_to/fping.c 2004-03-06 07:32:08.000000000 +0100 @@ -387,6 +387,9 @@ struct protoent *proto; char *buf; uid_t uid; + struct sockaddr_in src_addr; + char *src_ip; + int bind_to_local_ip = 0; /* check if we are root */ @@ -409,6 +412,7 @@ if( s < 0 ) errno_crash_and_burn( "can't create raw socket" ); + if( ( uid = getuid() ) ) { seteuid( getuid() ); @@ -424,7 +428,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:I:" ) ) != EOF ) { switch( c ) { @@ -433,6 +437,13 @@ usage(); break; + + case 'I': + if ( !(src_ip = optarg) ) + usage(); + bind_to_local_ip = 1; + + break; case 'r': if( !( retry = ( u_int )atoi( optarg ) ) ) @@ -655,6 +666,17 @@ trials = ( count > retry + 1 ) ? count : retry + 1; + if( bind_to_local_ip ) + { + /* bind to the socket */ + src_addr.sin_family = AF_INET; + src_addr.sin_addr.s_addr = inet_addr(src_ip); + src_addr.sin_port = htons(0); + + if (bind(s, (struct sockaddr *) &src_addr, sizeof(src_addr)) < 0) + errno_crash_and_burn( "can't bind source to address" ); + } + #if defined( DEBUG ) || defined( _DEBUG ) if( debugging & DBG_TRACE ) trace_flag = 1;