243 lines
8.0 KiB
Plaintext
243 lines
8.0 KiB
Plaintext
$OpenBSD: patch-fping_c,v 1.9 2013/04/18 18:52:50 sthen Exp $
|
|
--- fping.c.orig Thu Apr 18 19:45:15 2013
|
|
+++ fping.c Thu Apr 18 19:49:21 2013
|
|
@@ -67,7 +67,7 @@ extern "C"
|
|
|
|
/*** autoconf includes ***/
|
|
|
|
-
|
|
+#include <sys/types.h>
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include <time.h>
|
|
@@ -88,7 +88,6 @@ extern "C"
|
|
#include <string.h>
|
|
#include <stddef.h>
|
|
|
|
-#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
#include <sys/socket.h>
|
|
|
|
@@ -118,10 +117,16 @@ extern "C"
|
|
|
|
/*** externals ***/
|
|
|
|
+#ifndef __OpenBSD__
|
|
extern char *optarg;
|
|
extern int optind,opterr;
|
|
extern int h_errno;
|
|
+#endif
|
|
|
|
+#ifdef HAVE_PROGNAME
|
|
+extern char *__progname;
|
|
+#endif
|
|
+
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
@@ -245,13 +250,13 @@ typedef struct host_entry
|
|
struct timeval last_send_time; /* time of last packet sent */
|
|
int num_sent; /* number of ping packets sent */
|
|
int num_recv; /* number of pings received */
|
|
- int max_reply; /* longest response time */
|
|
- int min_reply; /* shortest response time */
|
|
+ long max_reply; /* longest response time */
|
|
+ long min_reply; /* shortest response time */
|
|
int total_time; /* sum of response times */
|
|
int num_sent_i; /* number of ping packets sent */
|
|
int num_recv_i; /* number of pings received */
|
|
- int max_reply_i; /* longest response time */
|
|
- int min_reply_i; /* shortest response time */
|
|
+ long max_reply_i; /* longest response time */
|
|
+ long min_reply_i; /* shortest response time */
|
|
int total_time_i; /* sum of response times */
|
|
int *resp_times; /* individual response times */
|
|
#if defined( DEBUG ) || defined( _DEBUG )
|
|
@@ -319,6 +324,7 @@ int verbose_flag, quiet_flag, stats_flag, unreachable_
|
|
int elapsed_flag, version_flag, count_flag, loop_flag;
|
|
int per_recv_flag, report_all_rtts_flag, name_flag, addr_flag, backoff_flag;
|
|
int multif_flag;
|
|
+int timestamp_flag = 0;
|
|
#if defined( DEBUG ) || defined( _DEBUG )
|
|
int randomly_lose_flag, sent_times_flag, trace_flag, print_per_system_flag;
|
|
int lose_factor;
|
|
@@ -524,7 +530,11 @@ int main( int argc, char **argv )
|
|
|
|
}/* IF */
|
|
|
|
- prog = argv[0];
|
|
+#ifdef HAVE_PROGNAME
|
|
+ prog = __progname;
|
|
+#else
|
|
+ prog = (prog = strrchr(argv[0], '/')) ? prog + 1 : argv[0];
|
|
+#endif
|
|
ident = getpid() & 0xFFFF;
|
|
|
|
verbose_flag = 1;
|
|
@@ -533,7 +543,7 @@ int main( int argc, char **argv )
|
|
|
|
/* get command line options */
|
|
|
|
- while( ( c = getopt( argc, argv, "gedhlmnqusaAvz:t:i:p:f:r:c:b:C:Q:B:S:I:T:O:" ) ) != EOF )
|
|
+ while( ( c = getopt( argc, argv, "gedhlmnqusaAvDz:t:i:p:f:r:c:b:C:Q:B:S:I:T:O:" ) ) != EOF )
|
|
{
|
|
switch( c )
|
|
{
|
|
@@ -622,6 +632,10 @@ int main( int argc, char **argv )
|
|
|
|
break;
|
|
|
|
+ case 'D':
|
|
+ timestamp_flag = 1;
|
|
+ break;
|
|
+
|
|
case 's':
|
|
stats_flag = 1;
|
|
break;
|
|
@@ -846,6 +860,7 @@ int main( int argc, char **argv )
|
|
if( loop_flag ) fprintf( stderr, " loop_flag set\n" );
|
|
if( backoff_flag ) fprintf( stderr, " backoff_flag set\n" );
|
|
if( per_recv_flag ) fprintf( stderr, " per_recv_flag set\n" );
|
|
+ if( timestamp_flag ) fprintf( stderr, " timestamp_flag set\n" );
|
|
if( report_all_rtts_flag ) fprintf( stderr, " report_all_rtts_flag set\n" );
|
|
if( randomly_lose_flag ) fprintf( stderr, " randomly_lose_flag set\n" );
|
|
if( sent_times_flag ) fprintf( stderr, " sent_times_flag set\n" );
|
|
@@ -883,8 +898,13 @@ int main( int argc, char **argv )
|
|
else if( filename )
|
|
{
|
|
FILE *ping_file;
|
|
+#ifdef MAXHOSTNAMELEN
|
|
+ char line[MAXHOSTNAMELEN];
|
|
+ char host[MAXHOSTNAMELEN];
|
|
+#else
|
|
char line[132];
|
|
char host[132];
|
|
+#endif
|
|
char *p;
|
|
|
|
if( strcmp( filename, "-" ) == 0 )
|
|
@@ -898,6 +918,7 @@ int main( int argc, char **argv )
|
|
|
|
while( fgets( line, sizeof(line), ping_file ) )
|
|
{
|
|
+ line[132-1] = '\0';
|
|
if( sscanf( line, "%s", host ) != 1 )
|
|
continue;
|
|
|
|
@@ -1594,7 +1615,6 @@ void send_ping( int s, HOST_ENTRY *h )
|
|
memset( buffer, 0, ping_pkt_size * sizeof( char ) );
|
|
icp = ( FPING_ICMPHDR* )buffer;
|
|
|
|
- gettimeofday( &h->last_send_time, &tz );
|
|
myseq = h->num_sent * num_hosts + h->i;
|
|
max_seq_sent = myseq > max_seq_sent ? myseq : max_seq_sent;
|
|
|
|
@@ -1606,6 +1626,8 @@ void send_ping( int s, HOST_ENTRY *h )
|
|
icp->icmp_id = htons(ident);
|
|
|
|
pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR );
|
|
+ /* set the time at the very last possible point */
|
|
+ gettimeofday(&h->last_send_time,&tz);
|
|
pdp->ping_ts = h->last_send_time;
|
|
pdp->ping_count = h->num_sent;
|
|
|
|
@@ -1617,6 +1639,8 @@ void send_ping( int s, HOST_ENTRY *h )
|
|
icp->icmp6_id = htons(ident);
|
|
|
|
pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR );
|
|
+ /* set the time at the very last possible point */
|
|
+ gettimeofday(&h->last_send_time,&tz);
|
|
pdp->ping_ts = h->last_send_time;
|
|
pdp->ping_count = h->num_sent;
|
|
|
|
@@ -1705,6 +1729,9 @@ int wait_for_reply( void )
|
|
|
|
result = recvfrom_wto( s, buffer, sizeof(buffer), &response_addr, select_time );
|
|
|
|
+ /* get time of receipt as close to the real time as possible */
|
|
+ gettimeofday(¤t_time,&tz);
|
|
+
|
|
if( result < 0 )
|
|
return 0; /* timeout */
|
|
|
|
@@ -1719,7 +1746,7 @@ int wait_for_reply( void )
|
|
|
|
ip = ( struct ip* )buffer;
|
|
#ifndef IPV6
|
|
-#if defined( __alpha__ ) && __STDC__ && !defined( __GLIBC__ )
|
|
+#if defined( __alpha__ ) && defined(__osf1__) && __STDC__ && !defined( __GLIBC__ )
|
|
/* The alpha headers are decidedly broken.
|
|
* Using an ANSI compiler, it provides ip_vhl instead of ip_hl and
|
|
* ip_v. So, to get ip_hl, we mask off the bottom four bits.
|
|
@@ -1727,7 +1754,7 @@ int wait_for_reply( void )
|
|
hlen = ( ip->ip_vhl & 0x0F ) << 2;
|
|
#else
|
|
hlen = ip->ip_hl << 2;
|
|
-#endif /* defined(__alpha__) && __STDC__ */
|
|
+#endif /* defined(__alpha__) && defined(__osf1__) && __STDC__ */
|
|
if( result < hlen + ICMP_MINLEN )
|
|
#else
|
|
if( result < sizeof(FPING_ICMPHDR) )
|
|
@@ -1784,7 +1811,6 @@ int wait_for_reply( void )
|
|
h = table[n];
|
|
|
|
/* received ping is cool, so process it */
|
|
- gettimeofday( ¤t_time, &tz );
|
|
h->waiting = 0;
|
|
h->timeout = timeout;
|
|
h->num_recv++;
|
|
@@ -1885,6 +1911,11 @@ int wait_for_reply( void )
|
|
|
|
if( per_recv_flag )
|
|
{
|
|
+ if(timestamp_flag) {
|
|
+ printf("[%lu.%06lu] ",
|
|
+ (unsigned long)current_time.tv_sec,
|
|
+ (unsigned long)current_time.tv_usec);
|
|
+ }
|
|
avg = h->total_time / h->num_recv;
|
|
printf( "%s%s : [%d], %d bytes, %s ms",
|
|
h->host, h->pad, this_count, result, sprint_tm( this_reply ) );
|
|
@@ -2677,7 +2708,7 @@ char * sprint_tm( int t )
|
|
/* <= 0.99 ms */
|
|
if( t < 100 )
|
|
{
|
|
- sprintf( buf, "0.%02d", t );
|
|
+ snprintf( buf, sizeof(buf), "0.%02d", t );
|
|
return( buf );
|
|
|
|
}/* IF */
|
|
@@ -2685,7 +2716,7 @@ char * sprint_tm( int t )
|
|
/* 1.00 - 9.99 ms */
|
|
if( t < 1000 )
|
|
{
|
|
- sprintf( buf, "%d.%02d", t / 100, t % 100 );
|
|
+ snprintf( buf, sizeof(buf), "%d.%02d", t / 100, t % 100 );
|
|
return( buf );
|
|
|
|
}/* IF */
|
|
@@ -2693,13 +2724,13 @@ char * sprint_tm( int t )
|
|
/* 10.0 - 99.9 ms */
|
|
if( t < 10000 )
|
|
{
|
|
- sprintf( buf, "%d.%d", t / 100, ( t % 100 ) / 10 );
|
|
+ snprintf( buf, sizeof(buf), "%d.%d", t / 100, ( t % 100 ) / 10 );
|
|
return( buf );
|
|
|
|
}/* IF */
|
|
|
|
/* >= 100 ms */
|
|
- sprintf( buf, "%d", t / 100 );
|
|
+ snprintf( buf, sizeof(buf), "%d", t / 100 );
|
|
return( buf );
|
|
|
|
} /* sprint_tm() */
|
|
@@ -2825,6 +2856,7 @@ void usage( void )
|
|
fprintf( stderr, " -B f set exponential backoff factor to f\n" );
|
|
fprintf( stderr, " -c n count of pings to send to each target (default %d)\n", count );
|
|
fprintf( stderr, " -C n same as -c, report results in verbose format\n" );
|
|
+ fprintf( stderr, " -D print timestamp before each output line\n" );
|
|
fprintf( stderr, " -e show elapsed time on return packets\n" );
|
|
fprintf( stderr, " -f file read list of targets from a file ( - means stdin) (only if no -g specified)\n" );
|
|
fprintf( stderr, " -g generate target list (only if no -f specified)\n" );
|