From: David Schweikert Date: Thu, 15 Dec 2011 14:15:05 +0000 (+0100) Subject: use spaces for indenting X-Git-Url: https://git.gsnw.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=daefc3e85211dafe512a0c2f38e90b6013d619a9;p=fping.git use spaces for indenting --- diff --git a/fping.c b/fping.c index ac3484b..d1c2db6 100644 --- a/fping.c +++ b/fping.c @@ -4,14 +4,6 @@ * Ping a list of target hosts in a round robin fashion. * A better ping overall. * - * VIEWING NOTES: - * - * This file was formatted with tab indents at a tab stop of 4. - * - * It is highly recommended that your editor is set to this - * tab stop setting for viewing and editing. - * - * * fping website: http://www.fping.org * * Current maintainer of fping: David Schweikert @@ -122,7 +114,7 @@ extern int h_errno; /*** Constants ***/ -#define EMAIL "david@schweikert.ch" +#define EMAIL "david@schweikert.ch" /*** Ping packet defines ***/ @@ -135,91 +127,91 @@ typedef struct ping_data } PING_DATA; -#define MIN_PING_DATA sizeof( PING_DATA ) -#define MAX_IP_PACKET 65536 /* (theoretical) max IP packet size */ -#define SIZE_IP_HDR 20 +#define MIN_PING_DATA sizeof( PING_DATA ) +#define MAX_IP_PACKET 65536 /* (theoretical) max IP packet size */ +#define SIZE_IP_HDR 20 #ifndef IPV6 -#define SIZE_ICMP_HDR ICMP_MINLEN /* from ip_icmp.h */ +#define SIZE_ICMP_HDR ICMP_MINLEN /* from ip_icmp.h */ #else -#define SIZE_ICMP_HDR sizeof(FPING_ICMPHDR) +#define SIZE_ICMP_HDR sizeof(FPING_ICMPHDR) #endif -#define MAX_PING_DATA ( MAX_IP_PACKET - SIZE_IP_HDR - SIZE_ICMP_HDR ) +#define MAX_PING_DATA ( MAX_IP_PACKET - SIZE_IP_HDR - SIZE_ICMP_HDR ) /* sized so as to be like traditional ping */ -#define DEFAULT_PING_DATA_SIZE ( MIN_PING_DATA + 44 ) +#define DEFAULT_PING_DATA_SIZE ( MIN_PING_DATA + 44 ) /* maxima and minima */ -#define MAX_COUNT 10000 -#define MIN_INTERVAL 10 /* in millisec */ -#define MIN_PERHOST_INTERVAL 20 /* in millisec */ -#define MIN_TIMEOUT 50 /* in millisec */ -#define MAX_RETRY 20 +#define MAX_COUNT 10000 +#define MIN_INTERVAL 10 /* in millisec */ +#define MIN_PERHOST_INTERVAL 20 /* in millisec */ +#define MIN_TIMEOUT 50 /* in millisec */ +#define MAX_RETRY 20 /* response time array flags */ -#define RESP_WAITING -1 -#define RESP_UNUSED -2 +#define RESP_WAITING -1 +#define RESP_UNUSED -2 /* debugging flags */ #if defined( DEBUG ) || defined( _DEBUG ) -#define DBG_TRACE 1 -#define DBG_SENT_TIMES 2 -#define DBG_RANDOM_LOSE_FEW 4 -#define DBG_RANDOM_LOSE_MANY 8 -#define DBG_PRINT_PER_SYSTEM 16 -#define DBG_REPORT_ALL_RTTS 32 +#define DBG_TRACE 1 +#define DBG_SENT_TIMES 2 +#define DBG_RANDOM_LOSE_FEW 4 +#define DBG_RANDOM_LOSE_MANY 8 +#define DBG_PRINT_PER_SYSTEM 16 +#define DBG_REPORT_ALL_RTTS 32 #endif /* DEBUG || _DEBUG */ /* Long names for ICMP packet types */ char *icmp_type_str[19] = { - "ICMP Echo Reply", /* 0 */ - "", - "", - "ICMP Unreachable", /* 3 */ - "ICMP Source Quench", /* 4 */ - "ICMP Redirect", /* 5 */ - "", - "", - "ICMP Echo", /* 8 */ - "", - "", - "ICMP Time Exceeded", /* 11 */ - "ICMP Paramter Problem", /* 12 */ - "ICMP Timestamp Request", /* 13 */ - "ICMP Timestamp Reply", /* 14 */ - "ICMP Information Request", /* 15 */ - "ICMP Information Reply", /* 16 */ - "ICMP Mask Request", /* 17 */ - "ICMP Mask Reply" /* 18 */ + "ICMP Echo Reply", /* 0 */ + "", + "", + "ICMP Unreachable", /* 3 */ + "ICMP Source Quench", /* 4 */ + "ICMP Redirect", /* 5 */ + "", + "", + "ICMP Echo", /* 8 */ + "", + "", + "ICMP Time Exceeded", /* 11 */ + "ICMP Paramter Problem", /* 12 */ + "ICMP Timestamp Request", /* 13 */ + "ICMP Timestamp Reply", /* 14 */ + "ICMP Information Request", /* 15 */ + "ICMP Information Reply", /* 16 */ + "ICMP Mask Request", /* 17 */ + "ICMP Mask Reply" /* 18 */ }; char *icmp_unreach_str[16] = { - "ICMP Network Unreachable", /* 0 */ - "ICMP Host Unreachable", /* 1 */ - "ICMP Protocol Unreachable", /* 2 */ - "ICMP Port Unreachable", /* 3 */ - "ICMP Unreachable (Fragmentation Needed)", /* 4 */ - "ICMP Unreachable (Source Route Failed)", /* 5 */ - "ICMP Unreachable (Destination Network Unknown)", /* 6 */ - "ICMP Unreachable (Destination Host Unknown)", /* 7 */ - "ICMP Unreachable (Source Host Isolated)", /* 8 */ - "ICMP Unreachable (Communication with Network Prohibited)", /* 9 */ - "ICMP Unreachable (Communication with Host Prohibited)", /* 10 */ - "ICMP Unreachable (Network Unreachable For Type Of Service)", /* 11 */ - "ICMP Unreachable (Host Unreachable For Type Of Service)", /* 12 */ - "ICMP Unreachable (Communication Administratively Prohibited)", /* 13 */ - "ICMP Unreachable (Host Precedence Violation)", /* 14 */ - "ICMP Unreachable (Precedence cutoff in effect)" /* 15 */ + "ICMP Network Unreachable", /* 0 */ + "ICMP Host Unreachable", /* 1 */ + "ICMP Protocol Unreachable", /* 2 */ + "ICMP Port Unreachable", /* 3 */ + "ICMP Unreachable (Fragmentation Needed)", /* 4 */ + "ICMP Unreachable (Source Route Failed)", /* 5 */ + "ICMP Unreachable (Destination Network Unknown)", /* 6 */ + "ICMP Unreachable (Destination Host Unknown)", /* 7 */ + "ICMP Unreachable (Source Host Isolated)", /* 8 */ + "ICMP Unreachable (Communication with Network Prohibited)", /* 9 */ + "ICMP Unreachable (Communication with Host Prohibited)", /* 10 */ + "ICMP Unreachable (Network Unreachable For Type Of Service)", /* 11 */ + "ICMP Unreachable (Host Unreachable For Type Of Service)", /* 12 */ + "ICMP Unreachable (Communication Administratively Prohibited)", /* 13 */ + "ICMP Unreachable (Host Precedence Violation)", /* 14 */ + "ICMP Unreachable (Precedence cutoff in effect)" /* 15 */ }; -#define ICMP_UNREACH_MAXTYPE 15 +#define ICMP_UNREACH_MAXTYPE 15 #ifndef IPV6 -#define FPING_SOCKADDR struct sockaddr_in -#define FPING_ICMPHDR struct icmp +#define FPING_SOCKADDR struct sockaddr_in +#define FPING_ICMPHDR struct icmp #else -#define FPING_SOCKADDR struct sockaddr_in6 -#define FPING_ICMPHDR struct icmp6_hdr +#define FPING_SOCKADDR struct sockaddr_in6 +#define FPING_ICMPHDR struct icmp6_hdr #endif /* entry used to keep track of each host we are pinging */ @@ -229,12 +221,12 @@ char *icmp_unreach_str[16] = typedef struct host_entry { - /* Each host can have an event attached: either the next time that a ping needs - * to be sent, or the timeout, if the last ping was sent */ - struct host_entry *ev_prev; /* double linked list for the event-queue */ - struct host_entry *ev_next; /* double linked list for the event-queue */ - struct timeval ev_time; /* time, after which this event should happen */ - int ev_type; /* event type */ + /* Each host can have an event attached: either the next time that a ping needs + * to be sent, or the timeout, if the last ping was sent */ + struct host_entry *ev_prev; /* double linked list for the event-queue */ + struct host_entry *ev_next; /* double linked list for the event-queue */ + struct timeval ev_time; /* time, after which this event should happen */ + int ev_type; /* event type */ int i; /* index into array */ char *name; /* name as given by user */ @@ -263,8 +255,8 @@ typedef struct host_entry /*** globals ***/ -HOST_ENTRY *rrlist = NULL; /* linked list of hosts be pinged */ -HOST_ENTRY **table = NULL; /* array of pointers to items in the list */ +HOST_ENTRY *rrlist = NULL; /* linked list of hosts be pinged */ +HOST_ENTRY **table = NULL; /* array of pointers to items in the list */ /* event queue (ev): This, together with the ev_next / ev_prev elements are used * to track the next event happening for each host. This can be either a new ping @@ -273,8 +265,8 @@ HOST_ENTRY *ev_first; HOST_ENTRY *ev_last; char *prog; -int ident; /* our pid */ -int s; /* socket */ +int ident; /* our pid */ +int s; /* socket */ u_int debugging = 0; /* times get *100 because all times are calculated in 10 usec units, not ms */ @@ -302,26 +294,26 @@ long min_reply = 1000000; int total_replies = 0; double sum_replies = 0; int max_hostname_len = 0; -int num_jobs = 0; /* number of hosts still to do */ -int num_hosts; /* total number of hosts */ -int max_seq_sent = 0; /* maximum sequence number sent so far */ -int num_alive = 0, /* total number alive */ - num_unreachable = 0, /* total number unreachable */ - num_noaddress = 0; /* total number of addresses not found */ -int num_timeout = 0, /* number of times select timed out */ - num_pingsent = 0, /* total pings sent */ - num_pingreceived = 0, /* total pings received */ - num_othericmprcvd = 0; /* total non-echo-reply ICMP received */ - -struct timeval current_time; /* current time (pseudo) */ +int num_jobs = 0; /* number of hosts still to do */ +int num_hosts; /* total number of hosts */ +int max_seq_sent = 0; /* maximum sequence number sent so far */ +int num_alive = 0, /* total number alive */ + num_unreachable = 0, /* total number unreachable */ + num_noaddress = 0; /* total number of addresses not found */ +int num_timeout = 0, /* number of times select timed out */ + num_pingsent = 0, /* total pings sent */ + num_pingreceived = 0, /* total pings received */ + num_othericmprcvd = 0; /* total non-echo-reply ICMP received */ + +struct timeval current_time; /* current time (pseudo) */ struct timeval start_time; struct timeval end_time; -struct timeval last_send_time; /* time last ping was sent */ -struct timeval last_report_time; /* time last report was printed */ +struct timeval last_send_time; /* time last ping was sent */ +struct timeval last_report_time; /* time last report was printed */ struct timezone tz; /* switches */ -int generate_flag = 0; /* flag for IP list generation */ +int generate_flag = 0; /* flag for IP list generation */ int verbose_flag, quiet_flag, stats_flag, unreachable_flag, alive_flag; int elapsed_flag, version_flag, count_flag, loop_flag; int per_recv_flag, report_all_rtts_flag, name_flag, addr_flag, backoff_flag; @@ -331,7 +323,7 @@ int randomly_lose_flag, sent_times_flag, trace_flag, print_per_system_flag; int lose_factor; #endif /* DEBUG || _DEBUG */ -char *filename = NULL; /* file containing hosts to ping */ +char *filename = NULL; /* file containing hosts to ping */ /*** forward declarations ***/ @@ -418,307 +410,307 @@ int argc; char **argv; int main( int argc, char **argv ) #endif /* _NO_PROTO */ { - int c, i, n; + int c, i, n; #ifdef IPV6 - int opton = 1; + int opton = 1; #endif - struct protoent *proto; - char *buf; - uid_t uid; + struct protoent *proto; + char *buf; + uid_t uid; int tos = 0; #ifndef IPV6 - struct sockaddr_in sa; + struct sockaddr_in sa; #else - struct sockaddr_in6 sa; + struct sockaddr_in6 sa; #endif - HOST_ENTRY *cursor; + HOST_ENTRY *cursor; - /* check if we are root */ + /* check if we are root */ - if( geteuid() ) - { - fprintf( stderr, - "This program can only be run by root, or it must be setuid root.\n" ); + if( geteuid() ) + { + fprintf( stderr, + "This program can only be run by root, or it must be setuid root.\n" ); - exit( 3 ); + exit( 3 ); - }/* IF */ + }/* IF */ - /* confirm that ICMP is available on this machine */ + /* confirm that ICMP is available on this machine */ #ifndef IPV6 - if( ( proto = getprotobyname( "icmp" ) ) == NULL ) + if( ( proto = getprotobyname( "icmp" ) ) == NULL ) #else - if( ( proto = getprotobyname( "ipv6-icmp" ) ) == NULL ) + if( ( proto = getprotobyname( "ipv6-icmp" ) ) == NULL ) #endif - crash_and_burn( "icmp: unknown protocol" ); + crash_and_burn( "icmp: unknown protocol" ); - /* create raw socket for ICMP calls (ping) */ + /* create raw socket for ICMP calls (ping) */ #ifndef IPV6 - s = socket( AF_INET, SOCK_RAW, proto->p_proto ); + s = socket( AF_INET, SOCK_RAW, proto->p_proto ); #else - s = socket( AF_INET6, SOCK_RAW, proto->p_proto ); + s = socket( AF_INET6, SOCK_RAW, proto->p_proto ); #endif - if( s < 0 ) - errno_crash_and_burn( "can't create raw socket" ); + if( s < 0 ) + errno_crash_and_burn( "can't create raw socket" ); #ifdef IPV6 - /* - * let the kernel pass extension headers of incoming packets, - * for privileged socket options - */ + /* + * let the kernel pass extension headers of incoming packets, + * for privileged socket options + */ #ifdef IPV6_RECVHOPOPTS - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPOPTS, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RECVHOPOPTS)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPOPTS, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RECVHOPOPTS)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPOPTS, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_HOPOPTS)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPOPTS, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_HOPOPTS)"); #endif #ifdef IPV6_RECVDSTOPTS - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVDSTOPTS, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RECVDSTOPTS)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVDSTOPTS, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RECVDSTOPTS)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_DSTOPTS, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_DSTOPTS)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_DSTOPTS, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_DSTOPTS)"); #endif #ifdef IPV6_RECVRTHDRDSTOPTS - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDRDSTOPTS, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RECVRTHDRDSTOPTS)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDRDSTOPTS, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RECVRTHDRDSTOPTS)"); #endif #ifdef IPV6_RECVRTHDR - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDR, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RECVRTHDR)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDR, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RECVRTHDR)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_RTHDR, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RTHDR)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RTHDR, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RTHDR)"); #endif #ifndef USE_SIN6_SCOPE_ID #ifdef IPV6_RECVPKTINFO - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RECVPKTINFO)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RECVPKTINFO)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_PKTINFO)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_PKTINFO)"); #endif #endif /* USE_SIN6_SCOPE_ID */ #ifdef IPV6_RECVHOPLIMIT - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_RECVHOPLIMIT)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_RECVHOPLIMIT)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &opton, - sizeof(opton))) - err(1, "setsockopt(IPV6_HOPLIMIT)"); + if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_HOPLIMIT)"); #endif #ifdef IPV6_CHECKSUM #ifndef SOL_RAW #define SOL_RAW IPPROTO_IPV6 #endif - opton = 2; - if (setsockopt(s, SOL_RAW, IPV6_CHECKSUM, &opton, - sizeof(opton))) - err(1, "setsockopt(SOL_RAW,IPV6_CHECKSUM)"); + opton = 2; + if (setsockopt(s, SOL_RAW, IPV6_CHECKSUM, &opton, + sizeof(opton))) + err(1, "setsockopt(SOL_RAW,IPV6_CHECKSUM)"); #endif #endif - if( ( uid = getuid() ) ) - { - seteuid( getuid() ); - - }/* IF */ - - prog = argv[0]; - ident = getpid() & 0xFFFF; - - verbose_flag = 1; - backoff_flag = 1; - opterr = 1; - - /* 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 ) - { - switch( c ) - { - case 't': - if( !( timeout = ( u_int )atoi( optarg ) * 100 ) ) - usage(); - - break; - - case 'r': - if( ( retry = ( u_int )atoi( optarg ) ) < 0 ) - usage(); - - break; - - case 'i': - if( !( interval = ( u_int )atoi( optarg ) * 100 ) ) - usage(); - - break; - - case 'p': - if( !( perhost_interval = ( u_int )atoi( optarg ) * 100 ) ) - usage(); - - break; - - case 'c': - if( !( count = ( u_int )atoi( optarg ) ) ) - usage(); - - count_flag = 1; - break; - - case 'C': - if( !( count = ( u_int )atoi( optarg ) ) ) - usage(); - - count_flag = 1; - report_all_rtts_flag = 1; - break; - - case 'b': - if( !( ping_data_size = ( u_int )atoi( optarg ) ) ) - usage(); - - break; - - case 'h': - usage(); - break; - - case 'q': - verbose_flag = 0; - quiet_flag = 1; - break; - - case 'Q': - verbose_flag = 0; - quiet_flag = 1; - if( !( report_interval = ( u_int )atoi( optarg ) * 100000 ) ) - usage(); - - break; - - case 'e': - elapsed_flag = 1; - break; - - case 'm': - multif_flag = 1; - break; - - case 'd': - case 'n': - name_flag = 1; - break; - - case 'A': - addr_flag = 1; - break; - - case 'B': - if( !( backoff = atof( optarg ) ) ) - usage(); - - break; - - case 's': - stats_flag = 1; - break; - - case 'l': - loop_flag = 1; - backoff_flag = 0; - break; - - case 'u': - unreachable_flag = 1; - break; - - case 'a': - alive_flag = 1; - break; + if( ( uid = getuid() ) ) + { + seteuid( getuid() ); + + }/* IF */ + + prog = argv[0]; + ident = getpid() & 0xFFFF; + + verbose_flag = 1; + backoff_flag = 1; + opterr = 1; + + /* 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 ) + { + switch( c ) + { + case 't': + if( !( timeout = ( u_int )atoi( optarg ) * 100 ) ) + usage(); + + break; + + case 'r': + if( ( retry = ( u_int )atoi( optarg ) ) < 0 ) + usage(); + + break; + + case 'i': + if( !( interval = ( u_int )atoi( optarg ) * 100 ) ) + usage(); + + break; + + case 'p': + if( !( perhost_interval = ( u_int )atoi( optarg ) * 100 ) ) + usage(); + + break; + + case 'c': + if( !( count = ( u_int )atoi( optarg ) ) ) + usage(); + + count_flag = 1; + break; + + case 'C': + if( !( count = ( u_int )atoi( optarg ) ) ) + usage(); + + count_flag = 1; + report_all_rtts_flag = 1; + break; + + case 'b': + if( !( ping_data_size = ( u_int )atoi( optarg ) ) ) + usage(); + + break; + + case 'h': + usage(); + break; + + case 'q': + verbose_flag = 0; + quiet_flag = 1; + break; + + case 'Q': + verbose_flag = 0; + quiet_flag = 1; + if( !( report_interval = ( u_int )atoi( optarg ) * 100000 ) ) + usage(); + + break; + + case 'e': + elapsed_flag = 1; + break; + + case 'm': + multif_flag = 1; + break; + + case 'd': + case 'n': + name_flag = 1; + break; + + case 'A': + addr_flag = 1; + break; + + case 'B': + if( !( backoff = atof( optarg ) ) ) + usage(); + + break; + + case 's': + stats_flag = 1; + break; + + case 'l': + loop_flag = 1; + backoff_flag = 0; + break; + + case 'u': + unreachable_flag = 1; + break; + + case 'a': + alive_flag = 1; + break; #if defined( DEBUG ) || defined( _DEBUG ) - case 'z': - if( ! ( debugging = ( u_int )atoi( optarg ) ) ) - usage(); - - break; + case 'z': + if( ! ( debugging = ( u_int )atoi( optarg ) ) ) + usage(); + + break; #endif /* DEBUG || _DEBUG */ - case 'v': - printf( "%s: Version %s\n", argv[0], VERSION); - printf( "%s: comments to %s\n", argv[0], EMAIL ); - exit( 0 ); + case 'v': + printf( "%s: Version %s\n", argv[0], VERSION); + printf( "%s: comments to %s\n", argv[0], EMAIL ); + exit( 0 ); - case 'f': + case 'f': #ifdef ENABLE_F_OPTION - filename = optarg; - generate_flag = 0; - break; + filename = optarg; + generate_flag = 0; + break; #else - if( getuid() ) - { - printf( "%s: this option can only be used by root.\n", argv[0] ); - printf( "%s: fping will read from stdin by default.\n", argv[0] ); - exit( 3 ); + if( getuid() ) + { + printf( "%s: this option can only be used by root.\n", argv[0] ); + printf( "%s: fping will read from stdin by default.\n", argv[0] ); + exit( 3 ); - }/* IF */ - else - { - filename = optarg; - generate_flag = 0; + }/* IF */ + else + { + filename = optarg; + generate_flag = 0; - }/* ELSE */ + }/* ELSE */ - break; + break; #endif /* ENABLE_F_OPTION */ - case 'g': - /* use IP list generation */ - /* mutually exclusive with using file input or command line targets */ - generate_flag = 1; - break; + case 'g': + /* use IP list generation */ + /* mutually exclusive with using file input or command line targets */ + generate_flag = 1; + break; - case 'S': + case 'S': #ifndef IPV6 - if( ! inet_pton( AF_INET, optarg, &src_addr ) ) + if( ! inet_pton( AF_INET, optarg, &src_addr ) ) #else - if( ! inet_pton( AF_INET6, optarg, &src_addr ) ) + if( ! inet_pton( AF_INET6, optarg, &src_addr ) ) #endif - usage(); - src_addr_present = 1; - break; + usage(); + src_addr_present = 1; + break; - case 'I': + case 'I': #ifdef SO_BINDTODEVICE - if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, optarg, - strlen(optarg))) - perror("binding to specific interface (SO_BINTODEVICE)"); + if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, optarg, + strlen(optarg))) + perror("binding to specific interface (SO_BINTODEVICE)"); #else printf( "%s: cant bind to a particular net interface since SO_BINDTODEVICE is not supported on your os.\n", argv[0] ); exit(3);; #endif - break; + break; - case 'T': - if ( ! ( select_time = ( u_int )atoi( optarg ) * 100 ) ) - usage(); - break; + case 'T': + if ( ! ( select_time = ( u_int )atoi( optarg ) * 100 ) ) + usage(); + break; case 'O': if (sscanf(optarg,"%i",&tos)){ if ( setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos))) { @@ -726,514 +718,514 @@ int main( int argc, char **argv ) } } break; - default: - usage(); - break; - - }/* SWITCH */ - }/* WHILE */ - - /* validate various option settings */ - - if( unreachable_flag && alive_flag ) - { - fprintf( stderr, "%s: specify only one of a, u\n", argv[0] ); - usage(); - - }/* IF */ - - if( count_flag && loop_flag ) - { - fprintf( stderr, "%s: specify only one of c, l\n", argv[0] ); - usage(); - - }/* IF */ - - if( ( interval < MIN_INTERVAL * 100 || - perhost_interval < MIN_PERHOST_INTERVAL * 100 || - retry > MAX_RETRY || - timeout < MIN_TIMEOUT * 100 ) - && getuid() ) - { - fprintf( stderr, "%s: these options are too risky for mere mortals.\n", prog ); - fprintf( stderr, "%s: You need i >= %u, p >= %u, r < %u, and t >= %u\n", - prog, MIN_INTERVAL, MIN_PERHOST_INTERVAL, MAX_RETRY, MIN_TIMEOUT ); - usage(); - - }/* IF */ - - if( ( ping_data_size > MAX_PING_DATA ) || ( ping_data_size < MIN_PING_DATA ) ) - { - fprintf( stderr, "%s: data size %u not valid, must be between %lu and %u\n", - prog, ping_data_size, MIN_PING_DATA, MAX_PING_DATA ); - usage(); - - }/* IF */ - - if( ( backoff > MAX_BACKOFF_FACTOR ) || ( backoff < MIN_BACKOFF_FACTOR ) ) - { - fprintf( stderr, "%s: backoff factor %.1f not valid, must be between %.1f and %.1f\n", - prog, backoff, MIN_BACKOFF_FACTOR, MAX_BACKOFF_FACTOR ); - usage(); - - }/* IF */ - - if( count > MAX_COUNT ) - { - fprintf( stderr, "%s: count %u not valid, must be less than %u\n", - prog, count, MAX_COUNT ); - usage(); - - }/* IF */ - - if( alive_flag || unreachable_flag ) - verbose_flag = 0; - - if( count_flag ) - { - if( verbose_flag ) - per_recv_flag = 1; + default: + usage(); + break; + + }/* SWITCH */ + }/* WHILE */ + + /* validate various option settings */ + + if( unreachable_flag && alive_flag ) + { + fprintf( stderr, "%s: specify only one of a, u\n", argv[0] ); + usage(); + + }/* IF */ + + if( count_flag && loop_flag ) + { + fprintf( stderr, "%s: specify only one of c, l\n", argv[0] ); + usage(); + + }/* IF */ + + if( ( interval < MIN_INTERVAL * 100 || + perhost_interval < MIN_PERHOST_INTERVAL * 100 || + retry > MAX_RETRY || + timeout < MIN_TIMEOUT * 100 ) + && getuid() ) + { + fprintf( stderr, "%s: these options are too risky for mere mortals.\n", prog ); + fprintf( stderr, "%s: You need i >= %u, p >= %u, r < %u, and t >= %u\n", + prog, MIN_INTERVAL, MIN_PERHOST_INTERVAL, MAX_RETRY, MIN_TIMEOUT ); + usage(); + + }/* IF */ + + if( ( ping_data_size > MAX_PING_DATA ) || ( ping_data_size < MIN_PING_DATA ) ) + { + fprintf( stderr, "%s: data size %u not valid, must be between %lu and %u\n", + prog, ping_data_size, MIN_PING_DATA, MAX_PING_DATA ); + usage(); - alive_flag = unreachable_flag = verbose_flag = 0; + }/* IF */ + + if( ( backoff > MAX_BACKOFF_FACTOR ) || ( backoff < MIN_BACKOFF_FACTOR ) ) + { + fprintf( stderr, "%s: backoff factor %.1f not valid, must be between %.1f and %.1f\n", + prog, backoff, MIN_BACKOFF_FACTOR, MAX_BACKOFF_FACTOR ); + usage(); + + }/* IF */ - }/* IF */ - - if( loop_flag ) - { - if( !report_interval ) - per_recv_flag = 1; - - alive_flag = unreachable_flag = verbose_flag = 0; + if( count > MAX_COUNT ) + { + fprintf( stderr, "%s: count %u not valid, must be less than %u\n", + prog, count, MAX_COUNT ); + usage(); + + }/* IF */ + + if( alive_flag || unreachable_flag ) + verbose_flag = 0; + + if( count_flag ) + { + if( verbose_flag ) + per_recv_flag = 1; + + alive_flag = unreachable_flag = verbose_flag = 0; - }/* IF */ - + }/* IF */ + + if( loop_flag ) + { + if( !report_interval ) + per_recv_flag = 1; + + alive_flag = unreachable_flag = verbose_flag = 0; - trials = ( count > retry + 1 ) ? count : retry + 1; + }/* IF */ + + + trials = ( count > retry + 1 ) ? count : retry + 1; #if defined( DEBUG ) || defined( _DEBUG ) - if( debugging & DBG_TRACE ) - trace_flag = 1; - - if( ( debugging & DBG_SENT_TIMES ) && !loop_flag ) - sent_times_flag = 1; - - if( debugging & DBG_RANDOM_LOSE_FEW ) - { - randomly_lose_flag = 1; - lose_factor = 1; /* ie, 1/4 */ - - }/* IF */ - - if( debugging & DBG_RANDOM_LOSE_MANY ) - { - randomly_lose_flag = 1; - lose_factor = 5; /* ie, 3/4 */ - - }/* IF */ + if( debugging & DBG_TRACE ) + trace_flag = 1; + + if( ( debugging & DBG_SENT_TIMES ) && !loop_flag ) + sent_times_flag = 1; + + if( debugging & DBG_RANDOM_LOSE_FEW ) + { + randomly_lose_flag = 1; + lose_factor = 1; /* ie, 1/4 */ + + }/* IF */ + + if( debugging & DBG_RANDOM_LOSE_MANY ) + { + randomly_lose_flag = 1; + lose_factor = 5; /* ie, 3/4 */ + + }/* IF */ - if( debugging & DBG_PRINT_PER_SYSTEM ) - print_per_system_flag = 1; - - if( ( debugging & DBG_REPORT_ALL_RTTS ) && !loop_flag ) - report_all_rtts_flag = 1; - - if( trace_flag ) - { - fprintf( stderr, "%s:\n count: %u, retry: %u, interval: %u\n", - prog, count, retry, interval / 10 ); - fprintf( stderr, " perhost_interval: %u, timeout: %u\n", - perhost_interval / 10, timeout / 10 ); - fprintf( stderr, " ping_data_size = %u, trials = %u\n", - ping_data_size, trials ); - - if( verbose_flag ) fprintf( stderr, " verbose_flag set\n" ); - if( multif_flag ) fprintf( stderr, " multif_flag set\n" ); - if( name_flag ) fprintf( stderr, " name_flag set\n" ); - if( addr_flag ) fprintf( stderr, " addr_flag set\n" ); - if( stats_flag ) fprintf( stderr, " stats_flag set\n" ); - if( unreachable_flag ) fprintf( stderr, " unreachable_flag set\n" ); - if( alive_flag ) fprintf( stderr, " alive_flag set\n" ); - if( elapsed_flag ) fprintf( stderr, " elapsed_flag set\n" ); - if( version_flag ) fprintf( stderr, " version_flag set\n" ); - if( count_flag ) fprintf( stderr, " count_flag set\n" ); - 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( 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" ); - if( print_per_system_flag ) fprintf( stderr, " print_per_system_flag set\n" ); - - }/* IF */ + if( debugging & DBG_PRINT_PER_SYSTEM ) + print_per_system_flag = 1; + + if( ( debugging & DBG_REPORT_ALL_RTTS ) && !loop_flag ) + report_all_rtts_flag = 1; + + if( trace_flag ) + { + fprintf( stderr, "%s:\n count: %u, retry: %u, interval: %u\n", + prog, count, retry, interval / 10 ); + fprintf( stderr, " perhost_interval: %u, timeout: %u\n", + perhost_interval / 10, timeout / 10 ); + fprintf( stderr, " ping_data_size = %u, trials = %u\n", + ping_data_size, trials ); + + if( verbose_flag ) fprintf( stderr, " verbose_flag set\n" ); + if( multif_flag ) fprintf( stderr, " multif_flag set\n" ); + if( name_flag ) fprintf( stderr, " name_flag set\n" ); + if( addr_flag ) fprintf( stderr, " addr_flag set\n" ); + if( stats_flag ) fprintf( stderr, " stats_flag set\n" ); + if( unreachable_flag ) fprintf( stderr, " unreachable_flag set\n" ); + if( alive_flag ) fprintf( stderr, " alive_flag set\n" ); + if( elapsed_flag ) fprintf( stderr, " elapsed_flag set\n" ); + if( version_flag ) fprintf( stderr, " version_flag set\n" ); + if( count_flag ) fprintf( stderr, " count_flag set\n" ); + 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( 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" ); + if( print_per_system_flag ) fprintf( stderr, " print_per_system_flag set\n" ); + + }/* IF */ #endif /* DEBUG || _DEBUG */ - /* handle host names supplied on command line or in a file */ - /* if the generate_flag is on, then generate the IP list */ - - argv = &argv[optind]; - - /* cover allowable conditions */ - - /* file and generate are mutually exclusive */ - /* file and command line are mutually exclusive */ - /* generate requires command line parameters beyond the switches */ - if( ( *argv && filename ) || ( filename && generate_flag ) || ( generate_flag && !*argv ) ) - usage(); - - /* if no conditions are specified, then assume input from stdin */ - if( !*argv && !filename && !generate_flag ) - filename = "-"; - - if( *argv && !generate_flag ) - { - while( *argv ) - { - add_name( *argv ); - ++argv; - - }/* WHILE */ - }/* IF */ - else if( filename ) - { - FILE *ping_file; - char line[132]; - char host[132]; - char *p; - - if( strcmp( filename, "-" ) == 0 ) - ping_file = fdopen( 0, "r" ); - else - ping_file = fopen( filename, "r" ); - - if( !ping_file ) - errno_crash_and_burn( "fopen" ); - - - while( fgets( line, sizeof(line), ping_file ) ) - { - if( sscanf( line, "%s", host ) != 1 ) - continue; - - if( ( !*host ) || ( host[0] == '#' ) ) /* magic to avoid comments */ - continue; - - p = cpystr( host ); - add_name( p ); - - }/* WHILE */ - - fclose( ping_file ); - - }/* ELSE IF */ - else if( *argv && generate_flag ) - { - char* pStart; - char* pEnd; - char* pCopy; - char* pTemp; - - struct in_addr sStart; - struct in_addr sEnd; - int iBits; - int iBitpos; - int iMask = 1; - int failed = 0; - - /* two possible forms are allowed here */ - - pStart = *argv; - argv++; - - /* IP mask is specified */ - if( !*argv ) - { - pCopy = ( char* )malloc( sizeof( char ) * strlen( pStart ) + 1 ); - if( pCopy ) - { - /* make a copy of the arg, so we don't damage the original */ - strcpy( pCopy, pStart ); - - /* look for token '/' */ - if( strtok( pCopy, "/" ) != NULL ) - { - /* if no token was found, the string should be unaltered */ - if( strcmp( pCopy, pStart ) != 0 ) - { - /* convert it to the starting address */ - if( inet_addr( pCopy ) != INADDR_NONE ) - { - sStart.s_addr = inet_addr( pCopy ); - - /* now find the bitmask */ - pTemp = ( char* )pStart + strlen( pCopy ) + 1; - - /* get the bits */ - iBits = 32 - atoi( pTemp ); - - if( ( iBits < 32 ) && ( iBits >= 0 ) ) - { - /* now make the end address */ - for( iBitpos = 0; iBitpos < iBits; iBitpos++ ) - iMask = iMask | 1 << iBitpos; - - sEnd.s_addr = sStart.s_addr | ntohl( iMask ); - - }/* IF */ - else - failed = 1; - - }/* IF */ - else - failed = 1; - - }/* IF */ - else - failed = 1; - - }/* IF */ - else - failed = 1; - - free( pCopy ); - - if( failed == 1 ) - usage(); - - }/* IF */ - else - crash_and_burn( "Cannot malloc copy of input string" ); - - }/* IF */ - else - { - /* IP start and end points are specified */ - pEnd = *argv; - - /* parameters should be start and end ranges */ - if( ( inet_addr( pStart ) != INADDR_NONE ) && ( inet_addr( pEnd ) != INADDR_NONE ) ) - { - sStart.s_addr = inet_addr( pStart ); - sEnd.s_addr = inet_addr( pEnd ); - - }/* IF */ - else - usage(); - - }/* ELSE */ - - /* ensure that the end point is greater or equal to the start */ - if( htonl( sEnd.s_addr ) >= htonl( sStart.s_addr ) ) - { - /* start and end points should be determined, so generate list */ - unsigned int uiDiff; - struct in_addr sTemp; - int iCount; - - uiDiff = htonl( sEnd.s_addr ) - htonl( sStart.s_addr ) + 1; - - for( iCount = 0; iCount < uiDiff; iCount++ ) - { - sTemp.s_addr = sStart.s_addr + ntohl( iCount ); - pTemp = cpystr( inet_ntoa( sTemp ) ); - add_name( pTemp ); - - }/* FOR */ - }/* IF */ - else - usage(); - - }/* ELSE IF */ - else - usage(); - - if( !num_hosts ) - exit( 2 ); - - /* set the source address */ - - if( src_addr_present ) - { - memset( &sa, 0, sizeof( sa ) ); + /* handle host names supplied on command line or in a file */ + /* if the generate_flag is on, then generate the IP list */ + + argv = &argv[optind]; + + /* cover allowable conditions */ + + /* file and generate are mutually exclusive */ + /* file and command line are mutually exclusive */ + /* generate requires command line parameters beyond the switches */ + if( ( *argv && filename ) || ( filename && generate_flag ) || ( generate_flag && !*argv ) ) + usage(); + + /* if no conditions are specified, then assume input from stdin */ + if( !*argv && !filename && !generate_flag ) + filename = "-"; + + if( *argv && !generate_flag ) + { + while( *argv ) + { + add_name( *argv ); + ++argv; + + }/* WHILE */ + }/* IF */ + else if( filename ) + { + FILE *ping_file; + char line[132]; + char host[132]; + char *p; + + if( strcmp( filename, "-" ) == 0 ) + ping_file = fdopen( 0, "r" ); + else + ping_file = fopen( filename, "r" ); + + if( !ping_file ) + errno_crash_and_burn( "fopen" ); + + + while( fgets( line, sizeof(line), ping_file ) ) + { + if( sscanf( line, "%s", host ) != 1 ) + continue; + + if( ( !*host ) || ( host[0] == '#' ) ) /* magic to avoid comments */ + continue; + + p = cpystr( host ); + add_name( p ); + + }/* WHILE */ + + fclose( ping_file ); + + }/* ELSE IF */ + else if( *argv && generate_flag ) + { + char* pStart; + char* pEnd; + char* pCopy; + char* pTemp; + + struct in_addr sStart; + struct in_addr sEnd; + int iBits; + int iBitpos; + int iMask = 1; + int failed = 0; + + /* two possible forms are allowed here */ + + pStart = *argv; + argv++; + + /* IP mask is specified */ + if( !*argv ) + { + pCopy = ( char* )malloc( sizeof( char ) * strlen( pStart ) + 1 ); + if( pCopy ) + { + /* make a copy of the arg, so we don't damage the original */ + strcpy( pCopy, pStart ); + + /* look for token '/' */ + if( strtok( pCopy, "/" ) != NULL ) + { + /* if no token was found, the string should be unaltered */ + if( strcmp( pCopy, pStart ) != 0 ) + { + /* convert it to the starting address */ + if( inet_addr( pCopy ) != INADDR_NONE ) + { + sStart.s_addr = inet_addr( pCopy ); + + /* now find the bitmask */ + pTemp = ( char* )pStart + strlen( pCopy ) + 1; + + /* get the bits */ + iBits = 32 - atoi( pTemp ); + + if( ( iBits < 32 ) && ( iBits >= 0 ) ) + { + /* now make the end address */ + for( iBitpos = 0; iBitpos < iBits; iBitpos++ ) + iMask = iMask | 1 << iBitpos; + + sEnd.s_addr = sStart.s_addr | ntohl( iMask ); + + }/* IF */ + else + failed = 1; + + }/* IF */ + else + failed = 1; + + }/* IF */ + else + failed = 1; + + }/* IF */ + else + failed = 1; + + free( pCopy ); + + if( failed == 1 ) + usage(); + + }/* IF */ + else + crash_and_burn( "Cannot malloc copy of input string" ); + + }/* IF */ + else + { + /* IP start and end points are specified */ + pEnd = *argv; + + /* parameters should be start and end ranges */ + if( ( inet_addr( pStart ) != INADDR_NONE ) && ( inet_addr( pEnd ) != INADDR_NONE ) ) + { + sStart.s_addr = inet_addr( pStart ); + sEnd.s_addr = inet_addr( pEnd ); + + }/* IF */ + else + usage(); + + }/* ELSE */ + + /* ensure that the end point is greater or equal to the start */ + if( htonl( sEnd.s_addr ) >= htonl( sStart.s_addr ) ) + { + /* start and end points should be determined, so generate list */ + unsigned int uiDiff; + struct in_addr sTemp; + int iCount; + + uiDiff = htonl( sEnd.s_addr ) - htonl( sStart.s_addr ) + 1; + + for( iCount = 0; iCount < uiDiff; iCount++ ) + { + sTemp.s_addr = sStart.s_addr + ntohl( iCount ); + pTemp = cpystr( inet_ntoa( sTemp ) ); + add_name( pTemp ); + + }/* FOR */ + }/* IF */ + else + usage(); + + }/* ELSE IF */ + else + usage(); + + 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; + sa.sin_family = AF_INET; + sa.sin_addr = src_addr; #else - sa.sin6_family = AF_INET6; - sa.sin6_addr = src_addr; + 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 ); - if( !table ) - crash_and_burn( "Can't malloc array of hosts" ); - - cursor = ev_first; - - for( num_jobs = 0; num_jobs < num_hosts; num_jobs++ ) - { - table[num_jobs] = cursor; - cursor->i = num_jobs; - - /* as long as we're here, put this in so names print out nicely */ - if( count_flag || loop_flag ) - { - n = max_hostname_len - strlen( cursor->host ); - buf = ( char* ) malloc( n + 1 ); - if( !buf ) - crash_and_burn( "can't malloc host pad" ); - - for ( i = 0; i < n; i++ ) - buf[i] = ' '; - - buf[n] = '\0'; - cursor->pad = buf; - - }/* IF */ - - cursor=cursor->ev_next; - - }/* FOR */ - - ping_pkt_size = ping_data_size + SIZE_ICMP_HDR; - - signal( SIGINT, finish ); - - gettimeofday( &start_time, &tz ); - current_time = start_time; - - if( report_interval ) - last_report_time = start_time; - - last_send_time.tv_sec = current_time.tv_sec - 10000; + 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 ); + if( !table ) + crash_and_burn( "Can't malloc array of hosts" ); + + cursor = ev_first; + + for( num_jobs = 0; num_jobs < num_hosts; num_jobs++ ) + { + table[num_jobs] = cursor; + cursor->i = num_jobs; + + /* as long as we're here, put this in so names print out nicely */ + if( count_flag || loop_flag ) + { + n = max_hostname_len - strlen( cursor->host ); + buf = ( char* ) malloc( n + 1 ); + if( !buf ) + crash_and_burn( "can't malloc host pad" ); + + for ( i = 0; i < n; i++ ) + buf[i] = ' '; + + buf[n] = '\0'; + cursor->pad = buf; + + }/* IF */ + + cursor=cursor->ev_next; + + }/* FOR */ + + ping_pkt_size = ping_data_size + SIZE_ICMP_HDR; + + signal( SIGINT, finish ); + + gettimeofday( &start_time, &tz ); + current_time = start_time; + + if( report_interval ) + last_report_time = start_time; + + last_send_time.tv_sec = current_time.tv_sec - 10000; #if defined( DEBUG ) || defined( _DEBUG ) - if( randomly_lose_flag ) - srandom( start_time.tv_usec ); + if( randomly_lose_flag ) + srandom( start_time.tv_usec ); #endif /* DEBUG || _DEBUG */ - /* main loop */ - main_loop(); - - finish(); + /* main loop */ + main_loop(); + + finish(); - return 0; + return 0; } /* main() */ void main_loop() { - u_int lt; - long wait_time; - HOST_ENTRY *h; - - while(ev_first) { - /* Any event that can be processed now ? */ - if(ev_first->ev_time.tv_sec < current_time.tv_sec || - (ev_first->ev_time.tv_sec == current_time.tv_sec && - ev_first->ev_time.tv_usec < current_time.tv_usec)) - { - /* Event type: ping */ - if(ev_first->ev_type == EV_TYPE_PING) { - /* Make sure that we don't ping more than once every "interval" */ - lt = timeval_diff( ¤t_time, &last_send_time ); - if(lt < interval) goto wait_for_reply; - - /* Dequeue the event */ - h = ev_dequeue(); - - /* Send the ping */ - if(!send_ping(s, h)) goto wait_for_reply; - - /* Check what needs to be done next */ - if(!loop_flag && !count_flag) { - /* Normal mode: schedule retry */ - if(h->waiting < retry + 1) { - h->ev_type = EV_TYPE_PING; - h->ev_time.tv_sec = current_time.tv_sec; - h->ev_time.tv_usec = current_time.tv_usec; - timeval_add(&h->ev_time, h->timeout); - ev_enqueue(h); - - if(backoff_flag) { - h->timeout *= backoff; - } - } - /* Normal mode: schedule timeout for last retry */ - else { - h->ev_type = EV_TYPE_TIMEOUT; - h->ev_time.tv_sec = current_time.tv_sec; - h->ev_time.tv_usec = current_time.tv_usec; - timeval_add(&h->ev_time, h->timeout); - ev_enqueue(h); - } - } - /* Loop and count mode: schedule next ping */ - else if(loop_flag || (count_flag && h->num_sent < count)) - { - h->ev_type = EV_TYPE_PING; - h->ev_time.tv_sec = current_time.tv_sec; - h->ev_time.tv_usec = current_time.tv_usec; - timeval_add(&h->ev_time, perhost_interval); - ev_enqueue(h); - } - /* Count mode: schedule timeout after last ping */ - else if(count_flag && count_flag && h->num_sent >= count) { - h->ev_type = EV_TYPE_TIMEOUT; - h->ev_time.tv_sec = current_time.tv_sec; - h->ev_time.tv_usec = current_time.tv_usec; - timeval_add(&h->ev_time, h->timeout); - ev_enqueue(h); - } - } - else if(ev_first->ev_type == EV_TYPE_TIMEOUT) { - num_timeout++; - remove_job(ev_first); - } - } - - wait_for_reply: - - /* When can we expect the next event? */ - if(ev_first) { - if(ev_first->ev_time.tv_sec == 0) { - wait_time = interval; - } - else { - wait_time = timeval_diff(&ev_first->ev_time, ¤t_time); - if(wait_time < (long) interval) { - wait_time = interval; - } - } + u_int lt; + long wait_time; + HOST_ENTRY *h; + + while(ev_first) { + /* Any event that can be processed now ? */ + if(ev_first->ev_time.tv_sec < current_time.tv_sec || + (ev_first->ev_time.tv_sec == current_time.tv_sec && + ev_first->ev_time.tv_usec < current_time.tv_usec)) + { + /* Event type: ping */ + if(ev_first->ev_type == EV_TYPE_PING) { + /* Make sure that we don't ping more than once every "interval" */ + lt = timeval_diff( ¤t_time, &last_send_time ); + if(lt < interval) goto wait_for_reply; + + /* Dequeue the event */ + h = ev_dequeue(); + + /* Send the ping */ + if(!send_ping(s, h)) goto wait_for_reply; + + /* Check what needs to be done next */ + if(!loop_flag && !count_flag) { + /* Normal mode: schedule retry */ + if(h->waiting < retry + 1) { + h->ev_type = EV_TYPE_PING; + h->ev_time.tv_sec = current_time.tv_sec; + h->ev_time.tv_usec = current_time.tv_usec; + timeval_add(&h->ev_time, h->timeout); + ev_enqueue(h); + + if(backoff_flag) { + h->timeout *= backoff; + } + } + /* Normal mode: schedule timeout for last retry */ + else { + h->ev_type = EV_TYPE_TIMEOUT; + h->ev_time.tv_sec = current_time.tv_sec; + h->ev_time.tv_usec = current_time.tv_usec; + timeval_add(&h->ev_time, h->timeout); + ev_enqueue(h); + } + } + /* Loop and count mode: schedule next ping */ + else if(loop_flag || (count_flag && h->num_sent < count)) + { + h->ev_type = EV_TYPE_PING; + h->ev_time.tv_sec = current_time.tv_sec; + h->ev_time.tv_usec = current_time.tv_usec; + timeval_add(&h->ev_time, perhost_interval); + ev_enqueue(h); + } + /* Count mode: schedule timeout after last ping */ + else if(count_flag && count_flag && h->num_sent >= count) { + h->ev_type = EV_TYPE_TIMEOUT; + h->ev_time.tv_sec = current_time.tv_sec; + h->ev_time.tv_usec = current_time.tv_usec; + timeval_add(&h->ev_time, h->timeout); + ev_enqueue(h); + } + } + else if(ev_first->ev_type == EV_TYPE_TIMEOUT) { + num_timeout++; + remove_job(ev_first); + } + } + + wait_for_reply: + + /* When can we expect the next event? */ + if(ev_first) { + if(ev_first->ev_time.tv_sec == 0) { + wait_time = interval; + } + else { + wait_time = timeval_diff(&ev_first->ev_time, ¤t_time); + if(wait_time < (long) interval) { + wait_time = interval; + } + } #if defined( DEBUG ) || defined( _DEBUG ) - if( trace_flag ) { - fprintf(stderr, "next event in %d ms (%s)\n", wait_time / 100, ev_first->host); - } + if( trace_flag ) { + fprintf(stderr, "next event in %d ms (%s)\n", wait_time / 100, ev_first->host); + } #endif - } - else { - wait_time = interval; - } - - /* Receive replies */ - /* (this is what sleeps during each loop iteration) */ - if(wait_for_reply(wait_time)) { - while(wait_for_reply(0)); /* process other replies in the queue */ - } - - gettimeofday( ¤t_time, &tz ); - - /* Print report */ - if( report_interval && ( loop_flag || count_flag ) && - ( timeval_diff ( ¤t_time, &last_report_time ) > report_interval ) ) - { - print_per_system_splits(); - last_report_time = current_time; - } - } + } + else { + wait_time = interval; + } + + /* Receive replies */ + /* (this is what sleeps during each loop iteration) */ + if(wait_for_reply(wait_time)) { + while(wait_for_reply(0)); /* process other replies in the queue */ + } + + gettimeofday( ¤t_time, &tz ); + + /* Print report */ + if( report_interval && ( loop_flag || count_flag ) && + ( timeval_diff ( ¤t_time, &last_report_time ) > report_interval ) ) + { + print_per_system_splits(); + last_report_time = current_time; + } + } } /************************************************************ @@ -1256,49 +1248,49 @@ void finish() void finish() #endif /* _NO_PROTO */ { - int i; - HOST_ENTRY *h; - - gettimeofday( &end_time, &tz ); - - /* tot up unreachables */ - for( i = 0; i < num_hosts; i++ ) - { - h = table[i]; - - if( !h->num_recv ) - { - num_unreachable++; - - if( verbose_flag || unreachable_flag ) - { - printf( "%s", h->host ); - - if( verbose_flag ) - printf( " is unreachable" ); - - printf( "\n" ); - - }/* IF */ - }/* IF */ - }/* FOR */ - - if( count_flag || loop_flag ) - print_per_system_stats(); + int i; + HOST_ENTRY *h; + + gettimeofday( &end_time, &tz ); + + /* tot up unreachables */ + for( i = 0; i < num_hosts; i++ ) + { + h = table[i]; + + if( !h->num_recv ) + { + num_unreachable++; + + if( verbose_flag || unreachable_flag ) + { + printf( "%s", h->host ); + + if( verbose_flag ) + printf( " is unreachable" ); + + printf( "\n" ); + + }/* IF */ + }/* IF */ + }/* FOR */ + + if( count_flag || loop_flag ) + print_per_system_stats(); #if defined( DEBUG ) || defined( _DEBUG ) - else if( print_per_system_flag ) - print_per_system_stats(); + else if( print_per_system_flag ) + print_per_system_stats(); #endif /* DEBUG || _DEBUG */ - if( stats_flag ) - print_global_stats(); + if( stats_flag ) + print_global_stats(); - if( num_noaddress ) - exit( 2 ); - else if( num_alive != num_hosts ) - exit( 1 ); - - exit(0); + if( num_noaddress ) + exit( 2 ); + else if( num_alive != num_hosts ) + exit( 1 ); + + exit(0); } /* finish() */ @@ -1322,92 +1314,92 @@ void print_per_system_stats() void print_per_system_stats( void ) #endif /* _NO_PROTO */ { - int i, j, avg; - HOST_ENTRY *h; - char *buf; - int bufsize; - int resp; - - bufsize = max_hostname_len + 1; - buf = ( char* )malloc( bufsize ); - - if( !buf ) - crash_and_burn( "can't malloc print buf" ); - - memset( buf, 0, bufsize ); - - fflush( stdout ); - - if( verbose_flag || per_recv_flag ) - fprintf( stderr, "\n" ); - - for( i = 0; i < num_hosts; i++ ) - { - h = table[i]; - fprintf( stderr, "%s%s :", h->host, h->pad ); - - if( report_all_rtts_flag ) - { - for( j = 0; j < h->num_sent; j++ ) - { - if( ( resp = h->resp_times[j] ) >= 0 ) - fprintf( stderr, " %d.%02d", resp / 100, resp % 100 ); - else - fprintf( stderr, " -" ); - - }/* FOR */ - - fprintf( stderr, "\n" ); - - }/* IF */ - else - { - if( h->num_recv <= h->num_sent ) - { - fprintf( stderr, " xmt/rcv/%%loss = %d/%d/%d%%", - h->num_sent, h->num_recv, h->num_sent > 0 ? - ( ( h->num_sent - h->num_recv ) * 100 ) / h->num_sent : 0 ); - - }/* IF */ - else - { - fprintf( stderr, " xmt/rcv/%%return = %d/%d/%d%%", - h->num_sent, h->num_recv, - ( ( h->num_recv * 100 ) / h->num_sent ) ); - - }/* ELSE */ - - if( h->num_recv ) - { - avg = h->total_time / h->num_recv; - fprintf( stderr, ", min/avg/max = %s", sprint_tm( h->min_reply ) ); - fprintf( stderr, "/%s", sprint_tm( avg ) ); - fprintf( stderr, "/%s", sprint_tm( h->max_reply ) ); - - }/* IF */ - - fprintf(stderr, "\n"); - - }/* ELSE */ + int i, j, avg; + HOST_ENTRY *h; + char *buf; + int bufsize; + int resp; + + bufsize = max_hostname_len + 1; + buf = ( char* )malloc( bufsize ); + + if( !buf ) + crash_and_burn( "can't malloc print buf" ); + + memset( buf, 0, bufsize ); + + fflush( stdout ); + + if( verbose_flag || per_recv_flag ) + fprintf( stderr, "\n" ); + + for( i = 0; i < num_hosts; i++ ) + { + h = table[i]; + fprintf( stderr, "%s%s :", h->host, h->pad ); + + if( report_all_rtts_flag ) + { + for( j = 0; j < h->num_sent; j++ ) + { + if( ( resp = h->resp_times[j] ) >= 0 ) + fprintf( stderr, " %d.%02d", resp / 100, resp % 100 ); + else + fprintf( stderr, " -" ); + + }/* FOR */ + + fprintf( stderr, "\n" ); + + }/* IF */ + else + { + if( h->num_recv <= h->num_sent ) + { + fprintf( stderr, " xmt/rcv/%%loss = %d/%d/%d%%", + h->num_sent, h->num_recv, h->num_sent > 0 ? + ( ( h->num_sent - h->num_recv ) * 100 ) / h->num_sent : 0 ); + + }/* IF */ + else + { + fprintf( stderr, " xmt/rcv/%%return = %d/%d/%d%%", + h->num_sent, h->num_recv, + ( ( h->num_recv * 100 ) / h->num_sent ) ); + + }/* ELSE */ + + if( h->num_recv ) + { + avg = h->total_time / h->num_recv; + fprintf( stderr, ", min/avg/max = %s", sprint_tm( h->min_reply ) ); + fprintf( stderr, "/%s", sprint_tm( avg ) ); + fprintf( stderr, "/%s", sprint_tm( h->max_reply ) ); + + }/* IF */ + + fprintf(stderr, "\n"); + + }/* ELSE */ #if defined( DEBUG ) || defined( _DEBUG ) - if( sent_times_flag ) - { - for( j = 0; j < h->num_sent; j++ ) - { - if( ( resp = h->sent_times[j] ) >= 0 ) - fprintf( stderr, " %s", sprint_tm( resp ) ); - else - fprintf( stderr, " -" ); - - fprintf( stderr, "\n" ); - - }/* FOR */ - }/* IF */ + if( sent_times_flag ) + { + for( j = 0; j < h->num_sent; j++ ) + { + if( ( resp = h->sent_times[j] ) >= 0 ) + fprintf( stderr, " %s", sprint_tm( resp ) ); + else + fprintf( stderr, " -" ); + + fprintf( stderr, "\n" ); + + }/* FOR */ + }/* IF */ #endif /* DEBUG || _DEBUG */ - }/* FOR */ + }/* FOR */ - free( buf ); + free( buf ); } /* print_per_system_stats() */ @@ -1431,64 +1423,64 @@ void print_per_system_splits() void print_per_system_splits( void ) #endif /* _NO_PROTO */ { - int i, avg; - HOST_ENTRY *h; - char *buf; - int bufsize; - struct tm *curr_tm; - - bufsize = max_hostname_len + 1; - buf = ( char* )malloc( bufsize ); - if( !buf ) - crash_and_burn( "can't malloc print buf" ); - - memset( buf, 0, bufsize ); - - fflush( stdout ); - - if( verbose_flag || per_recv_flag ) - fprintf( stderr, "\n" ); - - curr_tm = localtime( ( time_t* )¤t_time.tv_sec ); - fprintf( stderr, "[%2.2d:%2.2d:%2.2d]\n", curr_tm->tm_hour, - curr_tm->tm_min, curr_tm->tm_sec ); - - for( i = 0; i < num_hosts; i++ ) - { - h = table[i]; - fprintf( stderr, "%s%s :", h->host, h->pad ); - - if( h->num_recv_i <= h->num_sent_i ) - { - fprintf( stderr, " xmt/rcv/%%loss = %d/%d/%d%%", - h->num_sent_i, h->num_recv_i, h->num_sent_i > 0 ? - ( ( h->num_sent_i - h->num_recv_i ) * 100 ) / h->num_sent_i : 0 ); - - }/* IF */ - else - { - fprintf( stderr, " xmt/rcv/%%return = %d/%d/%d%%", - h->num_sent_i, h->num_recv_i, h->num_sent_i > 0 ? - ( ( h->num_recv_i * 100 ) / h->num_sent_i ) : 0 ); - - }/* ELSE */ - - if( h->num_recv_i ) - { - avg = h->total_time_i / h->num_recv_i; - fprintf( stderr, ", min/avg/max = %s", sprint_tm( h->min_reply_i ) ); - fprintf( stderr, "/%s", sprint_tm( avg ) ); - fprintf( stderr, "/%s", sprint_tm( h->max_reply_i ) ); - - }/* IF */ - - fprintf( stderr, "\n" ); - h->num_sent_i = h->num_recv_i = h->max_reply_i = - h->min_reply_i = h->total_time_i = 0; - - }/* FOR */ - - free( buf ); + int i, avg; + HOST_ENTRY *h; + char *buf; + int bufsize; + struct tm *curr_tm; + + bufsize = max_hostname_len + 1; + buf = ( char* )malloc( bufsize ); + if( !buf ) + crash_and_burn( "can't malloc print buf" ); + + memset( buf, 0, bufsize ); + + fflush( stdout ); + + if( verbose_flag || per_recv_flag ) + fprintf( stderr, "\n" ); + + curr_tm = localtime( ( time_t* )¤t_time.tv_sec ); + fprintf( stderr, "[%2.2d:%2.2d:%2.2d]\n", curr_tm->tm_hour, + curr_tm->tm_min, curr_tm->tm_sec ); + + for( i = 0; i < num_hosts; i++ ) + { + h = table[i]; + fprintf( stderr, "%s%s :", h->host, h->pad ); + + if( h->num_recv_i <= h->num_sent_i ) + { + fprintf( stderr, " xmt/rcv/%%loss = %d/%d/%d%%", + h->num_sent_i, h->num_recv_i, h->num_sent_i > 0 ? + ( ( h->num_sent_i - h->num_recv_i ) * 100 ) / h->num_sent_i : 0 ); + + }/* IF */ + else + { + fprintf( stderr, " xmt/rcv/%%return = %d/%d/%d%%", + h->num_sent_i, h->num_recv_i, h->num_sent_i > 0 ? + ( ( h->num_recv_i * 100 ) / h->num_sent_i ) : 0 ); + + }/* ELSE */ + + if( h->num_recv_i ) + { + avg = h->total_time_i / h->num_recv_i; + fprintf( stderr, ", min/avg/max = %s", sprint_tm( h->min_reply_i ) ); + fprintf( stderr, "/%s", sprint_tm( avg ) ); + fprintf( stderr, "/%s", sprint_tm( h->max_reply_i ) ); + + }/* IF */ + + fprintf( stderr, "\n" ); + h->num_sent_i = h->num_recv_i = h->max_reply_i = + h->min_reply_i = h->total_time_i = 0; + + }/* FOR */ + + free( buf ); } /* print_per_system_splits() */ @@ -1512,35 +1504,35 @@ void print_global_stats() void print_global_stats( void ) #endif /* _NO_PROTO */ { - fflush( stdout ); - fprintf( stderr, "\n" ); - fprintf( stderr, " %7d targets\n", num_hosts ); - fprintf( stderr, " %7d alive\n", num_alive ); - fprintf( stderr, " %7d unreachable\n" ,num_unreachable ); - fprintf( stderr, " %7d unknown addresses\n", num_noaddress ); - fprintf( stderr, "\n" ); - fprintf( stderr, " %7d timeouts (waiting for response)\n", num_timeout ); - fprintf( stderr, " %7d ICMP Echos sent\n", num_pingsent ); - fprintf( stderr, " %7d ICMP Echo Replies received\n", num_pingreceived ); - fprintf( stderr, " %7d other ICMP received\n", num_othericmprcvd ); - fprintf( stderr, "\n" ); - - if( total_replies == 0 ) - { - min_reply = 0; - max_reply = 0; - total_replies = 1; - sum_replies = 0; - - }/* IF */ - - fprintf( stderr, " %s ms (min round trip time)\n", sprint_tm( min_reply ) ); - fprintf( stderr, " %s ms (avg round trip time)\n", - sprint_tm( ( int )( sum_replies / total_replies ) ) ); - fprintf( stderr, " %s ms (max round trip time)\n", sprint_tm( max_reply ) ); - fprintf( stderr, " %12.3f sec (elapsed real time)\n", - timeval_diff( &end_time, &start_time ) / 100000.0 ); - fprintf( stderr, "\n" ); + fflush( stdout ); + fprintf( stderr, "\n" ); + fprintf( stderr, " %7d targets\n", num_hosts ); + fprintf( stderr, " %7d alive\n", num_alive ); + fprintf( stderr, " %7d unreachable\n" ,num_unreachable ); + fprintf( stderr, " %7d unknown addresses\n", num_noaddress ); + fprintf( stderr, "\n" ); + fprintf( stderr, " %7d timeouts (waiting for response)\n", num_timeout ); + fprintf( stderr, " %7d ICMP Echos sent\n", num_pingsent ); + fprintf( stderr, " %7d ICMP Echo Replies received\n", num_pingreceived ); + fprintf( stderr, " %7d other ICMP received\n", num_othericmprcvd ); + fprintf( stderr, "\n" ); + + if( total_replies == 0 ) + { + min_reply = 0; + max_reply = 0; + total_replies = 1; + sum_replies = 0; + + }/* IF */ + + fprintf( stderr, " %s ms (min round trip time)\n", sprint_tm( min_reply ) ); + fprintf( stderr, " %s ms (avg round trip time)\n", + sprint_tm( ( int )( sum_replies / total_replies ) ) ); + fprintf( stderr, " %s ms (max round trip time)\n", sprint_tm( max_reply ) ); + fprintf( stderr, " %12.3f sec (elapsed real time)\n", + timeval_diff( &end_time, &start_time ) / 100000.0 ); + fprintf( stderr, "\n" ); } /* print_global_stats() */ @@ -1570,90 +1562,90 @@ int s; HOST_ENTRY *h; int send_ping( int s, HOST_ENTRY *h ) #endif /* _NO_PROTO */ { - char *buffer; - FPING_ICMPHDR *icp; - PING_DATA *pdp; - int n; + char *buffer; + FPING_ICMPHDR *icp; + PING_DATA *pdp; + int n; int myseq; - buffer = ( char* )malloc( ( size_t )ping_pkt_size ); - if( !buffer ) - crash_and_burn( "can't malloc ping packet" ); - - memset( buffer, 0, ping_pkt_size * sizeof( char ) ); - icp = ( FPING_ICMPHDR* )buffer; + buffer = ( char* )malloc( ( size_t )ping_pkt_size ); + if( !buffer ) + crash_and_burn( "can't malloc ping packet" ); + + 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; + 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; #ifndef IPV6 - icp->icmp_type = ICMP_ECHO; - icp->icmp_code = 0; - icp->icmp_cksum = 0; - icp->icmp_seq = htons(myseq); - icp->icmp_id = htons(ident); + icp->icmp_type = ICMP_ECHO; + icp->icmp_code = 0; + icp->icmp_cksum = 0; + icp->icmp_seq = htons(myseq); + icp->icmp_id = htons(ident); - pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR ); - pdp->ping_ts = h->last_send_time; - pdp->ping_count = h->num_sent; + pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR ); + pdp->ping_ts = h->last_send_time; + pdp->ping_count = h->num_sent; - icp->icmp_cksum = in_cksum( ( u_short* )icp, ping_pkt_size ); + icp->icmp_cksum = in_cksum( ( u_short* )icp, ping_pkt_size ); #else - icp->icmp6_type = ICMP6_ECHO_REQUEST; - icp->icmp6_code = 0; - icp->icmp6_seq = htons(myseq); - icp->icmp6_id = htons(ident); + icp->icmp6_type = ICMP6_ECHO_REQUEST; + icp->icmp6_code = 0; + icp->icmp6_seq = htons(myseq); + icp->icmp6_id = htons(ident); - pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR ); - pdp->ping_ts = h->last_send_time; - pdp->ping_count = h->num_sent; + pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR ); + pdp->ping_ts = h->last_send_time; + pdp->ping_count = h->num_sent; - icp->icmp6_cksum = 0; // The IPv6 stack calculates the checksum for us... + icp->icmp6_cksum = 0; // The IPv6 stack calculates the checksum for us... #endif #if defined(DEBUG) || defined(_DEBUG) - if( trace_flag ) - printf( "sending [%d] to %s\n", h->num_sent, h->host ); + if( trace_flag ) + printf( "sending [%d] to %s\n", h->num_sent, h->host ); #endif /* DEBUG || _DEBUG */ - n = sendto( s, buffer, ping_pkt_size, 0, - ( struct sockaddr* )&h->saddr, sizeof( FPING_SOCKADDR ) ); - - if( n < 0 || n != ping_pkt_size ) - { - if( verbose_flag || unreachable_flag ) - { - printf( "%s", h->host ); - if( verbose_flag ) - printf( " error while sending ping: %s\n", strerror( errno ) ); - - printf( "\n" ); - - }/* IF */ - - num_unreachable++; - remove_job( h ); - free( buffer ); - return(0); - } - - /* mark this trial as outstanding */ - if( !loop_flag ) - h->resp_times[h->num_sent] = RESP_WAITING; + n = sendto( s, buffer, ping_pkt_size, 0, + ( struct sockaddr* )&h->saddr, sizeof( FPING_SOCKADDR ) ); + + if( n < 0 || n != ping_pkt_size ) + { + if( verbose_flag || unreachable_flag ) + { + printf( "%s", h->host ); + if( verbose_flag ) + printf( " error while sending ping: %s\n", strerror( errno ) ); + + printf( "\n" ); + + }/* IF */ + + num_unreachable++; + remove_job( h ); + free( buffer ); + return(0); + } + + /* mark this trial as outstanding */ + if( !loop_flag ) + h->resp_times[h->num_sent] = RESP_WAITING; #if defined( DEBUG ) || defined( _DEBUG ) - if( sent_times_flag ) - h->sent_times[h->num_sent] = timeval_diff( &h->last_send_time, &start_time ); + if( sent_times_flag ) + h->sent_times[h->num_sent] = timeval_diff( &h->last_send_time, &start_time ); #endif /* DEBUG || _DEBUG */ - h->num_sent++; - h->num_sent_i++; - h->waiting++; - num_pingsent++; - last_send_time = h->last_send_time; - - free( buffer ); - return(1); + h->num_sent++; + h->num_sent_i++; + h->waiting++; + num_pingsent++; + last_send_time = h->last_send_time; + + free( buffer ); + return(1); } @@ -1678,242 +1670,242 @@ int wait_for_reply() int wait_for_reply(u_int wait_time) #endif { - int result; - static char buffer[4096]; - FPING_SOCKADDR response_addr; - struct ip *ip; - int hlen = 0; - FPING_ICMPHDR *icp; - int n, avg; - HOST_ENTRY *h; - long this_reply; - int this_count; - struct timeval sent_time; - - result = recvfrom_wto( s, buffer, sizeof(buffer), &response_addr, wait_time ); - - if( result < 0 ) - return 0; /* timeout */ + int result; + static char buffer[4096]; + FPING_SOCKADDR response_addr; + struct ip *ip; + int hlen = 0; + FPING_ICMPHDR *icp; + int n, avg; + HOST_ENTRY *h; + long this_reply; + int this_count; + struct timeval sent_time; + + result = recvfrom_wto( s, buffer, sizeof(buffer), &response_addr, wait_time ); + + if( result < 0 ) + return 0; /* timeout */ #if defined( DEBUG ) || defined( _DEBUG ) - if( randomly_lose_flag ) - { - if( ( random() & 0x07 ) <= lose_factor ) - return 0; + if( randomly_lose_flag ) + { + if( ( random() & 0x07 ) <= lose_factor ) + return 0; - }/* IF */ + }/* IF */ #endif /* DEBUG || _DEBUG */ - ip = ( struct ip* )buffer; + ip = ( struct ip* )buffer; #ifndef IPV6 #if defined( __alpha__ ) && __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. - */ - hlen = ( ip->ip_vhl & 0x0F ) << 2; + /* 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. + */ + hlen = ( ip->ip_vhl & 0x0F ) << 2; #else - hlen = ip->ip_hl << 2; + hlen = ip->ip_hl << 2; #endif /* defined(__alpha__) && __STDC__ */ - if( result < hlen + ICMP_MINLEN ) + if( result < hlen + ICMP_MINLEN ) #else - if( result < sizeof(FPING_ICMPHDR) ) + if( result < sizeof(FPING_ICMPHDR) ) #endif - { - if( verbose_flag ) - { + { + if( verbose_flag ) + { #ifndef IPV6 - printf( "received packet too short for ICMP (%d bytes from %s)\n", result, - inet_ntoa( response_addr.sin_addr ) ); -#else - char buf[INET6_ADDRSTRLEN]; - inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); - printf( "received packet too short for ICMP (%d bytes from %s)\n", result, buf); + printf( "received packet too short for ICMP (%d bytes from %s)\n", result, + inet_ntoa( response_addr.sin_addr ) ); +#else + char buf[INET6_ADDRSTRLEN]; + inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); + printf( "received packet too short for ICMP (%d bytes from %s)\n", result, buf); #endif - } - return( 1 ); /* too short */ - }/* IF */ + } + return( 1 ); /* too short */ + }/* IF */ - icp = ( FPING_ICMPHDR* )( buffer + hlen ); + icp = ( FPING_ICMPHDR* )( buffer + hlen ); #ifndef IPV6 - if( icp->icmp_type != ICMP_ECHOREPLY ) + if( icp->icmp_type != ICMP_ECHOREPLY ) #else - if( icp->icmp6_type != ICMP6_ECHO_REPLY ) + if( icp->icmp6_type != ICMP6_ECHO_REPLY ) #endif - { - /* handle some problem */ - if( handle_random_icmp( icp, result, &response_addr ) ) - num_othericmprcvd++; - return 1; - }/* IF */ + { + /* handle some problem */ + if( handle_random_icmp( icp, result, &response_addr ) ) + num_othericmprcvd++; + return 1; + }/* IF */ #ifndef IPV6 - if( ntohs(icp->icmp_id) != ident ) + if( ntohs(icp->icmp_id) != ident ) #else - if( ntohs(icp->icmp6_id) != ident ) + if( ntohs(icp->icmp6_id) != ident ) #endif - return 1; /* packet received, but not the one we are looking for! */ + return 1; /* packet received, but not the one we are looking for! */ - num_pingreceived++; + num_pingreceived++; #ifndef IPV6 - if( ntohs(icp->icmp_seq) > max_seq_sent ) + if( ntohs(icp->icmp_seq) > max_seq_sent ) #else - if( ntohs(icp->icmp6_seq) > max_seq_sent ) + if( ntohs(icp->icmp6_seq) > max_seq_sent ) #endif - return( 1 ); /* packet received, don't worry about it anymore */ + return( 1 ); /* packet received, don't worry about it anymore */ #ifndef IPV6 - n = ntohs(icp->icmp_seq) % num_hosts; + n = ntohs(icp->icmp_seq) % num_hosts; #else - n = ntohs(icp->icmp6_seq) % num_hosts; + n = ntohs(icp->icmp6_seq) % num_hosts; #endif - h = table[n]; + h = table[n]; - /* received ping is cool, so process it */ - gettimeofday( ¤t_time, &tz ); - h->waiting = 0; - h->timeout = timeout; - h->num_recv++; - h->num_recv_i++; + /* received ping is cool, so process it */ + gettimeofday( ¤t_time, &tz ); + h->waiting = 0; + h->timeout = timeout; + h->num_recv++; + h->num_recv_i++; #ifndef IPV6 - memcpy( &sent_time, icp->icmp_data + offsetof( PING_DATA, ping_ts ), sizeof( sent_time ) ); - memcpy( &this_count, icp->icmp_data, sizeof( this_count ) ); + memcpy( &sent_time, icp->icmp_data + offsetof( PING_DATA, ping_ts ), sizeof( sent_time ) ); + memcpy( &this_count, icp->icmp_data, sizeof( this_count ) ); #else - memcpy( &sent_time, ((char *)icp->icmp6_data32)+4+offsetof(PING_DATA, ping_ts), sizeof( sent_time ) ); - memcpy( &this_count, ((char *)icp->icmp6_data32)+4, sizeof( this_count ) ); + memcpy( &sent_time, ((char *)icp->icmp6_data32)+4+offsetof(PING_DATA, ping_ts), sizeof( sent_time ) ); + memcpy( &this_count, ((char *)icp->icmp6_data32)+4, sizeof( this_count ) ); #endif #if defined( DEBUG ) || defined( _DEBUG ) - if( trace_flag ) - printf( "received [%d] from %s\n", this_count, h->host ); + if( trace_flag ) + printf( "received [%d] from %s\n", this_count, h->host ); #endif /* DEBUG || _DEBUG */ - this_reply = timeval_diff( ¤t_time, &sent_time ); - if( this_reply > max_reply ) max_reply = this_reply; - if( this_reply < min_reply ) min_reply = this_reply; - if( this_reply > h->max_reply ) h->max_reply = this_reply; - if( this_reply < h->min_reply ) h->min_reply = this_reply; - if( this_reply > h->max_reply_i ) h->max_reply_i = this_reply; - if( this_reply < h->min_reply_i ) h->min_reply_i = this_reply; - sum_replies += this_reply; - h->total_time += this_reply; - h->total_time_i += this_reply; - total_replies++; - - /* note reply time in array, probably */ - if( !loop_flag ) - { - if( ( this_count >= 0 ) && ( this_count < trials ) ) - { - if( h->resp_times[this_count] != RESP_WAITING ) - { - if( !per_recv_flag ) - { - fprintf( stderr, "%s : duplicate for [%d], %d bytes, %s ms", - h->host, this_count, result, sprint_tm( this_reply ) ); + this_reply = timeval_diff( ¤t_time, &sent_time ); + if( this_reply > max_reply ) max_reply = this_reply; + if( this_reply < min_reply ) min_reply = this_reply; + if( this_reply > h->max_reply ) h->max_reply = this_reply; + if( this_reply < h->min_reply ) h->min_reply = this_reply; + if( this_reply > h->max_reply_i ) h->max_reply_i = this_reply; + if( this_reply < h->min_reply_i ) h->min_reply_i = this_reply; + sum_replies += this_reply; + h->total_time += this_reply; + h->total_time_i += this_reply; + total_replies++; + + /* note reply time in array, probably */ + if( !loop_flag ) + { + if( ( this_count >= 0 ) && ( this_count < trials ) ) + { + if( h->resp_times[this_count] != RESP_WAITING ) + { + if( !per_recv_flag ) + { + fprintf( stderr, "%s : duplicate for [%d], %d bytes, %s ms", + h->host, this_count, result, sprint_tm( this_reply ) ); #ifndef IPV6 - if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr ) - fprintf( stderr, " [<- %s]", inet_ntoa( response_addr.sin_addr ) ); + if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr ) + fprintf( stderr, " [<- %s]", inet_ntoa( response_addr.sin_addr ) ); #else - if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr))) - { - char buf[INET6_ADDRSTRLEN]; - inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); - - fprintf( stderr, " [<- %s]", buf); - } -#endif - fprintf( stderr, "\n" ); - - }/* IF */ - }/* IF */ - else - h->resp_times[this_count] = this_reply; - - }/* IF */ - else - { - /* count is out of bounds?? */ - fprintf( stderr, "%s : duplicate for [%d], %d bytes, %s ms\n", - h->host, this_count, result, sprint_tm( this_reply ) ); - - }/* ELSE */ - }/* IF */ - - if( h->num_recv == 1 ) - { - num_alive++; - if( verbose_flag || alive_flag ) - { - printf( "%s", h->host ); - - if( verbose_flag ) - printf( " is alive" ); - - if( elapsed_flag ) - printf( " (%s ms)", sprint_tm( this_reply ) ); + if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr))) + { + char buf[INET6_ADDRSTRLEN]; + inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); + + fprintf( stderr, " [<- %s]", buf); + } +#endif + fprintf( stderr, "\n" ); + + }/* IF */ + }/* IF */ + else + h->resp_times[this_count] = this_reply; + + }/* IF */ + else + { + /* count is out of bounds?? */ + fprintf( stderr, "%s : duplicate for [%d], %d bytes, %s ms\n", + h->host, this_count, result, sprint_tm( this_reply ) ); + + }/* ELSE */ + }/* IF */ + + if( h->num_recv == 1 ) + { + num_alive++; + if( verbose_flag || alive_flag ) + { + printf( "%s", h->host ); + + if( verbose_flag ) + printf( " is alive" ); + + if( elapsed_flag ) + printf( " (%s ms)", sprint_tm( this_reply ) ); #ifndef IPV6 - if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr ) - printf( " [<- %s]", inet_ntoa( response_addr.sin_addr ) ); + if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr ) + printf( " [<- %s]", inet_ntoa( response_addr.sin_addr ) ); #else - if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr))) - { - char buf[INET6_ADDRSTRLEN]; - inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); - fprintf( stderr, " [<- %s]", buf); - } + if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr))) + { + char buf[INET6_ADDRSTRLEN]; + inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); + fprintf( stderr, " [<- %s]", buf); + } #endif - printf( "\n" ); - - }/* IF */ - }/* IF */ - - if( per_recv_flag ) - { - 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 ) ); - printf( " (%s avg, ", sprint_tm( avg ) ); + printf( "\n" ); + + }/* IF */ + }/* IF */ + + if( per_recv_flag ) + { + 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 ) ); + printf( " (%s avg, ", sprint_tm( avg ) ); - if( h->num_recv <= h->num_sent ) - { - printf( "%d%% loss)", - ( ( h->num_sent - h->num_recv ) * 100 ) / h->num_sent ); - - }/* IF */ - else - { - printf( "%d%% return)", - ( h->num_recv * 100 ) / h->num_sent ); - - }/* ELSE */ + if( h->num_recv <= h->num_sent ) + { + printf( "%d%% loss)", + ( ( h->num_sent - h->num_recv ) * 100 ) / h->num_sent ); + + }/* IF */ + else + { + printf( "%d%% return)", + ( h->num_recv * 100 ) / h->num_sent ); + + }/* ELSE */ #ifndef IPV6 - if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr ) - printf( " [<- %s]", inet_ntoa( response_addr.sin_addr ) ); + if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr ) + printf( " [<- %s]", inet_ntoa( response_addr.sin_addr ) ); #else - if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr))) - { - char buf[INET6_ADDRSTRLEN]; - inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); - fprintf( stderr, " [<- %s]", buf); - } + if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr))) + { + char buf[INET6_ADDRSTRLEN]; + inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN); + fprintf( stderr, " [<- %s]", buf); + } #endif - - printf( "\n" ); - - }/* IF */ - - /* remove this job, if we are done */ - if((count_flag && h->num_recv >= count) || - (!loop_flag && !count_flag && h->num_recv)) - { - remove_job(h); - } - - fflush( stdout ); - return num_jobs; + + printf( "\n" ); + + }/* IF */ + + /* remove this job, if we are done */ + if((count_flag && h->num_recv >= count) || + (!loop_flag && !count_flag && h->num_recv)) + { + remove_job(h); + } + + fflush( stdout ); + return num_jobs; } /* wait_for_reply() */ @@ -1941,126 +1933,126 @@ int handle_random_icmp( p, psize, addr ) int handle_random_icmp( FPING_ICMPHDR *p, int psize, FPING_SOCKADDR *addr ) #endif /* _NO_PROTO */ { - FPING_ICMPHDR *sent_icmp; - u_char *c; - HOST_ENTRY *h; + FPING_ICMPHDR *sent_icmp; + u_char *c; + HOST_ENTRY *h; #ifdef IPV6 - char addr_ascii[INET6_ADDRSTRLEN]; - inet_ntop(addr->sin6_family, &addr->sin6_addr, addr_ascii, INET6_ADDRSTRLEN); + char addr_ascii[INET6_ADDRSTRLEN]; + inet_ntop(addr->sin6_family, &addr->sin6_addr, addr_ascii, INET6_ADDRSTRLEN); #endif - c = ( u_char* )p; + c = ( u_char* )p; #ifndef IPV6 - switch( p->icmp_type ) + switch( p->icmp_type ) #else - switch( p->icmp6_type ) + switch( p->icmp6_type ) #endif - { - case ICMP_UNREACH: - sent_icmp = ( FPING_ICMPHDR* )( c + 28 ); - + { + case ICMP_UNREACH: + sent_icmp = ( FPING_ICMPHDR* )( c + 28 ); + #ifndef IPV6 - sent_icmp = ( struct icmp* )( c + 28 ); - - if( ( sent_icmp->icmp_type == ICMP_ECHO ) && - ( ntohs(sent_icmp->icmp_id) == ident ) && - ( ntohs(sent_icmp->icmp_seq) <= ( n_short )max_seq_sent ) ) - { - /* this is a response to a ping we sent */ - h = table[ntohs(sent_icmp->icmp_seq) % num_hosts]; - - if( p->icmp_code > ICMP_UNREACH_MAXTYPE ) - { - fprintf( stderr, "ICMP Unreachable (Invalid Code) from %s for ICMP Echo sent to %s", - inet_ntoa( addr->sin_addr ), h->host ); + sent_icmp = ( struct icmp* )( c + 28 ); + + if( ( sent_icmp->icmp_type == ICMP_ECHO ) && + ( ntohs(sent_icmp->icmp_id) == ident ) && + ( ntohs(sent_icmp->icmp_seq) <= ( n_short )max_seq_sent ) ) + { + /* this is a response to a ping we sent */ + h = table[ntohs(sent_icmp->icmp_seq) % num_hosts]; + + if( p->icmp_code > ICMP_UNREACH_MAXTYPE ) + { + fprintf( stderr, "ICMP Unreachable (Invalid Code) from %s for ICMP Echo sent to %s", + inet_ntoa( addr->sin_addr ), h->host ); #else - if( ( sent_icmp->icmp6_type == ICMP_ECHO ) && - ( ntohs(sent_icmp->icmp6_id) == ident ) && - ( ntohs(sent_icmp->icmp6_seq) <= ( n_short )max_seq_sent ) ) - { - /* this is a response to a ping we sent */ - h = table[ntohs(sent_icmp->icmp6_seq) % num_hosts]; - - if( p->icmp6_code > ICMP_UNREACH_MAXTYPE ) - { - fprintf( stderr, "ICMP Unreachable (Invalid Code) from %s for ICMP Echo sent to %s", - addr_ascii, h->host ); + if( ( sent_icmp->icmp6_type == ICMP_ECHO ) && + ( ntohs(sent_icmp->icmp6_id) == ident ) && + ( ntohs(sent_icmp->icmp6_seq) <= ( n_short )max_seq_sent ) ) + { + /* this is a response to a ping we sent */ + h = table[ntohs(sent_icmp->icmp6_seq) % num_hosts]; + + if( p->icmp6_code > ICMP_UNREACH_MAXTYPE ) + { + fprintf( stderr, "ICMP Unreachable (Invalid Code) from %s for ICMP Echo sent to %s", + addr_ascii, h->host ); #endif - }/* IF */ - else - { - fprintf( stderr, "%s from %s for ICMP Echo sent to %s", + }/* IF */ + else + { + fprintf( stderr, "%s from %s for ICMP Echo sent to %s", #ifndef IPV6 - icmp_unreach_str[p->icmp_code], inet_ntoa( addr->sin_addr ), h->host ); + icmp_unreach_str[p->icmp_code], inet_ntoa( addr->sin_addr ), h->host ); #else - icmp_unreach_str[p->icmp6_code], addr_ascii, h->host ); + icmp_unreach_str[p->icmp6_code], addr_ascii, h->host ); #endif - - }/* ELSE */ + + }/* ELSE */ - if( inet_addr( h->host ) == -1 ) + if( inet_addr( h->host ) == -1 ) #ifndef IPV6 - fprintf( stderr, " (%s)", inet_ntoa( h->saddr.sin_addr ) ); + fprintf( stderr, " (%s)", inet_ntoa( h->saddr.sin_addr ) ); #else - fprintf( stderr, " (%s)", addr_ascii); + fprintf( stderr, " (%s)", addr_ascii); #endif - - fprintf( stderr, "\n" ); - - }/* IF */ - - return 1; - - case ICMP_SOURCEQUENCH: - case ICMP_REDIRECT: - case ICMP_TIMXCEED: - case ICMP_PARAMPROB: - sent_icmp = ( FPING_ICMPHDR* )( c + 28 ); + + fprintf( stderr, "\n" ); + + }/* IF */ + + return 1; + + case ICMP_SOURCEQUENCH: + case ICMP_REDIRECT: + case ICMP_TIMXCEED: + case ICMP_PARAMPROB: + sent_icmp = ( FPING_ICMPHDR* )( c + 28 ); #ifndef IPV6 - if( ( sent_icmp->icmp_type == ICMP_ECHO ) && - ( ntohs(sent_icmp->icmp_id) == ident ) && - ( ntohs(sent_icmp->icmp_seq) <= ( n_short )max_seq_sent ) ) - { - /* this is a response to a ping we sent */ - h = table[ntohs(sent_icmp->icmp_seq) % num_hosts]; - fprintf( stderr, "%s from %s for ICMP Echo sent to %s", - icmp_type_str[p->icmp_type], inet_ntoa( addr->sin_addr ), h->host ); + if( ( sent_icmp->icmp_type == ICMP_ECHO ) && + ( ntohs(sent_icmp->icmp_id) == ident ) && + ( ntohs(sent_icmp->icmp_seq) <= ( n_short )max_seq_sent ) ) + { + /* this is a response to a ping we sent */ + h = table[ntohs(sent_icmp->icmp_seq) % num_hosts]; + fprintf( stderr, "%s from %s for ICMP Echo sent to %s", + icmp_type_str[p->icmp_type], inet_ntoa( addr->sin_addr ), h->host ); - if( inet_addr( h->host ) == -1 ) - fprintf( stderr, " (%s)", inet_ntoa( h->saddr.sin_addr ) ); + if( inet_addr( h->host ) == -1 ) + fprintf( stderr, " (%s)", inet_ntoa( h->saddr.sin_addr ) ); #else - if( ( sent_icmp->icmp6_type == ICMP_ECHO ) && - ( ntohs(sent_icmp->icmp6_id) == ident ) && - ( ntohs(sent_icmp->icmp6_seq) <= ( n_short )max_seq_sent ) ) - { - /* this is a response to a ping we sent */ - h = table[ntohs(sent_icmp->icmp6_seq) % num_hosts]; - fprintf( stderr, "%s from %s for ICMP Echo sent to %s", - icmp_type_str[p->icmp6_type], addr_ascii, h->host ); + if( ( sent_icmp->icmp6_type == ICMP_ECHO ) && + ( ntohs(sent_icmp->icmp6_id) == ident ) && + ( ntohs(sent_icmp->icmp6_seq) <= ( n_short )max_seq_sent ) ) + { + /* this is a response to a ping we sent */ + h = table[ntohs(sent_icmp->icmp6_seq) % num_hosts]; + fprintf( stderr, "%s from %s for ICMP Echo sent to %s", + icmp_type_str[p->icmp6_type], addr_ascii, h->host ); - if( inet_addr( h->host ) == -1 ) - fprintf( stderr, " (%s)", addr_ascii ); + if( inet_addr( h->host ) == -1 ) + fprintf( stderr, " (%s)", addr_ascii ); #endif - fprintf( stderr, "\n" ); - - }/* IF */ - - return 2; - - /* no way to tell whether any of these are sent due to our ping */ - /* or not (shouldn't be, of course), so just discard */ - case ICMP_TSTAMP: - case ICMP_TSTAMPREPLY: - case ICMP_IREQ: - case ICMP_IREQREPLY: - case ICMP_MASKREQ: - case ICMP_MASKREPLY: - default: - return 0; - - }/* SWITCH */ + fprintf( stderr, "\n" ); + + }/* IF */ + + return 2; + + /* no way to tell whether any of these are sent due to our ping */ + /* or not (shouldn't be, of course), so just discard */ + case ICMP_TSTAMP: + case ICMP_TSTAMPREPLY: + case ICMP_IREQ: + case ICMP_IREQREPLY: + case ICMP_MASKREQ: + case ICMP_MASKREPLY: + default: + return 0; + + }/* SWITCH */ } /* handle_random_icmp() */ @@ -2089,31 +2081,31 @@ u_short *p; int n; int in_cksum( u_short *p, int n ) #endif /* _NO_PROTO */ { - register u_short answer; - register long sum = 0; - u_short odd_byte = 0; - - while( n > 1 ) - { - sum += *p++; - n -= 2; - - }/* WHILE */ - - - /* mop up an odd byte, if necessary */ - if( n == 1 ) - { - *( u_char* )( &odd_byte ) = *( u_char* )p; - sum += odd_byte; - - }/* IF */ - - sum = ( sum >> 16 ) + ( sum & 0xffff ); /* add hi 16 to low 16 */ - sum += ( sum >> 16 ); /* add carry */ - answer = ~sum; /* ones-complement, truncate*/ - - return ( answer ); + register u_short answer; + register long sum = 0; + u_short odd_byte = 0; + + while( n > 1 ) + { + sum += *p++; + n -= 2; + + }/* WHILE */ + + + /* mop up an odd byte, if necessary */ + if( n == 1 ) + { + *( u_char* )( &odd_byte ) = *( u_char* )p; + sum += odd_byte; + + }/* IF */ + + sum = ( sum >> 16 ) + ( sum & 0xffff ); /* add hi 16 to low 16 */ + sum += ( sum >> 16 ); /* add carry */ + answer = ~sum; /* ones-complement, truncate*/ + + return ( answer ); } /* in_cksum() */ @@ -2142,145 +2134,145 @@ void add_name( char *name ) #endif /* _NO_PROTO */ { #ifndef IPV6 - struct hostent *host_ent; - u_int ipaddress; - struct in_addr *ipa = ( struct in_addr* )&ipaddress; - struct in_addr *host_add; - char *nm; - int i = 0; - - if( ( ipaddress = inet_addr( name ) ) != -1 ) - { - /* input name is an IP addr, go with it */ - if( name_flag ) - { - if( addr_flag ) - add_addr( name, na_cat( get_host_by_address( *ipa ), *ipa ), *ipa ); - else - { - nm = cpystr( get_host_by_address( *ipa ) ); - add_addr( name, nm, *ipa ); - - }/* ELSE */ - }/* IF */ - else - add_addr( name, name, *ipa ); - - return; - - }/* IF */ - - /* input name is not an IP addr, maybe it's a host name */ - host_ent = gethostbyname( name ); - if( host_ent == NULL ) - { - if( h_errno == TRY_AGAIN ) - { - u_sleep( DNS_TIMEOUT ); - host_ent = gethostbyname( name ); - - }/* IF */ - - if( host_ent == NULL ) - { + struct hostent *host_ent; + u_int ipaddress; + struct in_addr *ipa = ( struct in_addr* )&ipaddress; + struct in_addr *host_add; + char *nm; + int i = 0; + + if( ( ipaddress = inet_addr( name ) ) != -1 ) + { + /* input name is an IP addr, go with it */ + if( name_flag ) + { + if( addr_flag ) + add_addr( name, na_cat( get_host_by_address( *ipa ), *ipa ), *ipa ); + else + { + nm = cpystr( get_host_by_address( *ipa ) ); + add_addr( name, nm, *ipa ); + + }/* ELSE */ + }/* IF */ + else + add_addr( name, name, *ipa ); + + return; + + }/* IF */ + + /* input name is not an IP addr, maybe it's a host name */ + host_ent = gethostbyname( name ); + if( host_ent == NULL ) + { + if( h_errno == TRY_AGAIN ) + { + u_sleep( DNS_TIMEOUT ); + host_ent = gethostbyname( name ); + + }/* IF */ + + if( host_ent == NULL ) + { #ifdef NIS_GROUPS - /* maybe it's the name of a NIS netgroup */ - char *machine, *user_ignored, *domain_ignored; - setnetgrent( name ); - if( getnetgrent( &machine, &user_ignored, &domain_ignored ) == 0 ) - { - endnetgrent(); - if( !quiet_flag ) - fprintf( stderr, "%s address not found\n", name ); - - num_noaddress++; - return; - - }/* IF */ - else - add_name( cpystr( machine ) ); - - while( getnetgrent( &machine, &user_ignored, &domain_ignored ) ) - add_name( cpystr( machine ) ); + /* maybe it's the name of a NIS netgroup */ + char *machine, *user_ignored, *domain_ignored; + setnetgrent( name ); + if( getnetgrent( &machine, &user_ignored, &domain_ignored ) == 0 ) + { + endnetgrent(); + if( !quiet_flag ) + fprintf( stderr, "%s address not found\n", name ); + + num_noaddress++; + return; + + }/* IF */ + else + add_name( cpystr( machine ) ); + + while( getnetgrent( &machine, &user_ignored, &domain_ignored ) ) + add_name( cpystr( machine ) ); - endnetgrent(); - return; + endnetgrent(); + return; #else - if( !quiet_flag ) - fprintf( stderr, "%s address not found\n", name ); - - num_noaddress++; - return ; + if( !quiet_flag ) + fprintf( stderr, "%s address not found\n", name ); + + num_noaddress++; + return ; #endif /* NIS_GROUPS */ - }/* IF */ - }/* IF */ + }/* IF */ + }/* IF */ - host_add = ( struct in_addr* )*( host_ent->h_addr_list ); - if( host_add == NULL ) - { - if( !quiet_flag ) - fprintf( stderr, "%s has no address data\n", name ); - - num_noaddress++; - return; - - }/* IF */ - else - { - /* it is indeed a hostname with a real address */ - while( host_add ) - { - if( name_flag && addr_flag ) - add_addr( name, na_cat( name, *host_add ), *host_add ); - else if( addr_flag ) - { - nm = cpystr( inet_ntoa( *host_add ) ); - add_addr( name, nm, *host_add ); - }/* ELSE IF */ - else - add_addr( name, name, *host_add ); - - if( !multif_flag ) - break; - - host_add = ( struct in_addr* )( host_ent->h_addr_list[++i] ); - - }/* WHILE */ - }/* ELSE */ + host_add = ( struct in_addr* )*( host_ent->h_addr_list ); + if( host_add == NULL ) + { + if( !quiet_flag ) + fprintf( stderr, "%s has no address data\n", name ); + + num_noaddress++; + return; + + }/* IF */ + else + { + /* it is indeed a hostname with a real address */ + while( host_add ) + { + if( name_flag && addr_flag ) + add_addr( name, na_cat( name, *host_add ), *host_add ); + else if( addr_flag ) + { + nm = cpystr( inet_ntoa( *host_add ) ); + add_addr( name, nm, *host_add ); + }/* ELSE IF */ + else + add_addr( name, name, *host_add ); + + if( !multif_flag ) + break; + + host_add = ( struct in_addr* )( host_ent->h_addr_list[++i] ); + + }/* WHILE */ + }/* ELSE */ #else - FPING_SOCKADDR dst; - struct addrinfo *res, hints; - int ret_ga; - char *hostname; - size_t len; - - /* getaddrinfo */ - bzero(&hints, sizeof(struct addrinfo)); - hints.ai_flags = name_flag ? AI_CANONNAME : 0; - hints.ai_family = AF_INET6; - hints.ai_socktype = SOCK_RAW; - hints.ai_protocol = IPPROTO_ICMPV6; - - ret_ga = getaddrinfo(name, NULL, &hints, &res); - if (ret_ga) { - if(!quiet_flag) - warnx("%s", gai_strerror(ret_ga)); - num_noaddress++; - return; - } - if (res->ai_canonname) hostname = res->ai_canonname; - else hostname = name; - if (!res->ai_addr) { - if(!quiet_flag) - warnx("getaddrinfo failed"); - num_noaddress++; - return; - } - len = res->ai_addrlen; - if (len > sizeof(FPING_SOCKADDR)) len = sizeof(FPING_SOCKADDR); - (void)memcpy(&dst, res->ai_addr, len); - add_addr(name, name, &dst); + FPING_SOCKADDR dst; + struct addrinfo *res, hints; + int ret_ga; + char *hostname; + size_t len; + + /* getaddrinfo */ + bzero(&hints, sizeof(struct addrinfo)); + hints.ai_flags = name_flag ? AI_CANONNAME : 0; + hints.ai_family = AF_INET6; + hints.ai_socktype = SOCK_RAW; + hints.ai_protocol = IPPROTO_ICMPV6; + + ret_ga = getaddrinfo(name, NULL, &hints, &res); + if (ret_ga) { + if(!quiet_flag) + warnx("%s", gai_strerror(ret_ga)); + num_noaddress++; + return; + } + if (res->ai_canonname) hostname = res->ai_canonname; + else hostname = name; + if (!res->ai_addr) { + if(!quiet_flag) + warnx("getaddrinfo failed"); + num_noaddress++; + return; + } + len = res->ai_addrlen; + if (len > sizeof(FPING_SOCKADDR)) len = sizeof(FPING_SOCKADDR); + (void)memcpy(&dst, res->ai_addr, len); + add_addr(name, name, &dst); #endif } /* add_name() */ @@ -2307,20 +2299,20 @@ struct in_addr ipaddr; char *na_cat( char *name, struct in_addr ipaddr ) #endif /* _NO_PROTO */ { - char *nm, *as; + char *nm, *as; - as = inet_ntoa( ipaddr ); - nm = ( char* )malloc( strlen( name ) + strlen( as ) + 4 ); + as = inet_ntoa( ipaddr ); + nm = ( char* )malloc( strlen( name ) + strlen( as ) + 4 ); - if( !nm ) - crash_and_burn( "can't allocate some space for a string" ); - - strcpy( nm, name ); - strcat( nm, " (" ); - strcat( nm, as ); - strcat( nm, ")" ); + if( !nm ) + crash_and_burn( "can't allocate some space for a string" ); + + strcpy( nm, name ); + strcat( nm, " (" ); + strcat( nm, as ); + strcat( nm, ")" ); - return( nm ); + return( nm ); } /* na_cat() */ @@ -2357,68 +2349,68 @@ void add_addr( char *name, char *host, FPING_SOCKADDR *ipaddr ) #endif #endif /* _NO_PROTO */ { - HOST_ENTRY *p; - int n, *i; + HOST_ENTRY *p; + int n, *i; - p = ( HOST_ENTRY* )malloc( sizeof( HOST_ENTRY ) ); - if( !p ) - crash_and_burn( "can't allocate HOST_ENTRY" ); + p = ( HOST_ENTRY* )malloc( sizeof( HOST_ENTRY ) ); + if( !p ) + crash_and_burn( "can't allocate HOST_ENTRY" ); - memset( ( char* ) p, 0, sizeof( HOST_ENTRY ) ); + memset( ( char* ) p, 0, sizeof( HOST_ENTRY ) ); - p->name = name; - p->host = host; + p->name = name; + p->host = host; #ifndef IPV6 - p->saddr.sin_family = AF_INET; - p->saddr.sin_addr = ipaddr; + p->saddr.sin_family = AF_INET; + p->saddr.sin_addr = ipaddr; #else - p->saddr.sin6_family = AF_INET6; - (void)memcpy(&p->saddr, ipaddr, sizeof(FPING_SOCKADDR)); + p->saddr.sin6_family = AF_INET6; + (void)memcpy(&p->saddr, ipaddr, sizeof(FPING_SOCKADDR)); #endif - p->timeout = timeout; - p->running = 1; - p->min_reply = 10000000; - - if( strlen( p->host ) > max_hostname_len ) - max_hostname_len = strlen( p->host ); - - /* array for response time results */ - if( !loop_flag ) - { - i = ( int* )malloc( trials * sizeof( int ) ); - if( !i ) - crash_and_burn( "can't allocate resp_times array" ); - - for( n = 1; n < trials; n++ ) - i[n] = RESP_UNUSED; - - p->resp_times = i; - - }/* IF */ + p->timeout = timeout; + p->running = 1; + p->min_reply = 10000000; + + if( strlen( p->host ) > max_hostname_len ) + max_hostname_len = strlen( p->host ); + + /* array for response time results */ + if( !loop_flag ) + { + i = ( int* )malloc( trials * sizeof( int ) ); + if( !i ) + crash_and_burn( "can't allocate resp_times array" ); + + for( n = 1; n < trials; n++ ) + i[n] = RESP_UNUSED; + + p->resp_times = i; + + }/* IF */ #if defined( DEBUG ) || defined( _DEBUG ) - /* likewise for sent times */ - if( sent_times_flag ) - { - i = ( int* )malloc( trials * sizeof( int ) ); - if( !i ) - crash_and_burn( "can't allocate sent_times array" ); + /* likewise for sent times */ + if( sent_times_flag ) + { + i = ( int* )malloc( trials * sizeof( int ) ); + if( !i ) + crash_and_burn( "can't allocate sent_times array" ); + + for( n = 1; n < trials; n++ ) + i[n] = RESP_UNUSED; + + p->sent_times = i; - for( n = 1; n < trials; n++ ) - i[n] = RESP_UNUSED; - - p->sent_times = i; - - }/* IF */ + }/* IF */ #endif /* DEBUG || _DEBUG */ - /* schedule first ping */ - p->ev_type = EV_TYPE_PING; - p->ev_time.tv_sec = 0; - p->ev_time.tv_usec = 0; - ev_enqueue(p); + /* schedule first ping */ + p->ev_type = EV_TYPE_PING; + p->ev_time.tv_sec = 0; + p->ev_time.tv_usec = 0; + ev_enqueue(p); - num_hosts++; + num_hosts++; } /* add_addr() */ @@ -2443,15 +2435,15 @@ void remove_job( HOST_ENTRY *h ) #endif /* _NO_PROTO */ { #if defined( DEBUG ) || defined( _DEBUG ) - if( trace_flag ) - printf( "removing job for %s\n", h->host ); + if( trace_flag ) + printf( "removing job for %s\n", h->host ); #endif /* DEBUG || _DEBUG */ - h->running = 0; - h->waiting = 0; - --num_jobs; + h->running = 0; + h->waiting = 0; + --num_jobs; - ev_remove(h); + ev_remove(h); } /* remove_job() */ @@ -2477,17 +2469,17 @@ struct in_addr in; char *get_host_by_address( struct in_addr in ) #endif /* _NO_PROTO */ { - struct hostent *h; + struct hostent *h; #ifndef IPV6 - h = gethostbyaddr( ( char* )&in, sizeof( struct in_addr ),AF_INET ); + h = gethostbyaddr( ( char* )&in, sizeof( struct in_addr ),AF_INET ); #else - h = gethostbyaddr( ( char* )&in, sizeof( FPING_SOCKADDR ),AF_INET6 ); + h = gethostbyaddr( ( char* )&in, sizeof( FPING_SOCKADDR ),AF_INET6 ); #endif - - if( h == NULL || h->h_name == NULL ) - return inet_ntoa( in ); - else - return ( char* )h->h_name; + + if( h == NULL || h->h_name == NULL ) + return inet_ntoa( in ); + else + return ( char* )h->h_name; } /* get_host_by_address() */ @@ -2513,20 +2505,20 @@ char *string; char *cpystr( char *string ) #endif /* _NO_PROTO */ { - char *dst; - - if( string ) - { - dst = ( char* )malloc( 1 + strlen( string ) ); - if( !dst ) - crash_and_burn( "can't allocate some space for a string" ); - - strcpy( dst, string ); - return dst; - - }/* IF */ - else - return NULL; + char *dst; + + if( string ) + { + dst = ( char* )malloc( 1 + strlen( string ) ); + if( !dst ) + crash_and_burn( "can't allocate some space for a string" ); + + strcpy( dst, string ); + return dst; + + }/* IF */ + else + return NULL; } /* cpystr() */ @@ -2550,10 +2542,10 @@ char *message; void crash_and_burn( char *message ) #endif /* _NO_PROTO */ { - if( verbose_flag ) - fprintf( stderr, "%s: %s\n", prog, message ); - - exit( 4 ); + if( verbose_flag ) + fprintf( stderr, "%s: %s\n", prog, message ); + + exit( 4 ); } /* crash_and_burn() */ @@ -2577,10 +2569,10 @@ char *message; void errno_crash_and_burn( char *message ) #endif /* _NO_PROTO */ { - if( verbose_flag ) - fprintf( stderr, "%s: %s : %s\n", prog, message, strerror( errno ) ); + if( verbose_flag ) + fprintf( stderr, "%s: %s : %s\n", prog, message, strerror( errno ) ); - exit( 4 ); + exit( 4 ); } /* errno_crash_and_burn() */ @@ -2609,14 +2601,14 @@ struct timeval *a, *b; long timeval_diff( struct timeval *a, struct timeval *b ) #endif /* _NO_PROTO */ { - long sec_diff = a->tv_sec - b->tv_sec; - if(sec_diff > 100) { - /* For such large differences, we don't really care about the microseconds... */ - return sec_diff * 100000; - } - else { - return (sec_diff * 1000000 + a->tv_usec - b->tv_usec) / 10; - } + long sec_diff = a->tv_sec - b->tv_sec; + if(sec_diff > 100) { + /* For such large differences, we don't really care about the microseconds... */ + return sec_diff * 100000; + } + else { + return (sec_diff * 1000000 + a->tv_usec - b->tv_usec) / 10; + } } /* timeval_diff() */ /************************************************************ @@ -2626,9 +2618,9 @@ long timeval_diff( struct timeval *a, struct timeval *b ) *************************************************************/ void timeval_add(struct timeval *a, long t_10u) { - t_10u *= 10; - a->tv_sec += (t_10u + a->tv_usec) / 1000000; - a->tv_usec = (t_10u + a->tv_usec) % 1000000; + t_10u *= 10; + a->tv_sec += (t_10u + a->tv_usec) / 1000000; + a->tv_usec = (t_10u + a->tv_usec) % 1000000; } /************************************************************ @@ -2655,35 +2647,35 @@ int t; char * sprint_tm( int t ) #endif /* _NO_PROTO */ { - static char buf[10]; - - /* <= 0.99 ms */ - if( t < 100 ) - { - sprintf( buf, "0.%02d", t ); - return( buf ); - - }/* IF */ - - /* 1.00 - 9.99 ms */ - if( t < 1000 ) - { - sprintf( buf, "%d.%02d", t / 100, t % 100 ); - return( buf ); - - }/* IF */ - - /* 10.0 - 99.9 ms */ - if( t < 10000 ) - { - sprintf( buf, "%d.%d", t / 100, ( t % 100 ) / 10 ); - return( buf ); - - }/* IF */ + static char buf[10]; + + /* <= 0.99 ms */ + if( t < 100 ) + { + sprintf( buf, "0.%02d", t ); + return( buf ); + + }/* IF */ + + /* 1.00 - 9.99 ms */ + if( t < 1000 ) + { + sprintf( buf, "%d.%02d", t / 100, t % 100 ); + return( buf ); + + }/* IF */ + + /* 10.0 - 99.9 ms */ + if( t < 10000 ) + { + sprintf( buf, "%d.%d", t / 100, ( t % 100 ) / 10 ); + return( buf ); + + }/* IF */ - /* >= 100 ms */ - sprintf( buf, "%d", t / 100 ); - return( buf ); + /* >= 100 ms */ + sprintf( buf, "%d", t / 100 ); + return( buf ); } /* sprint_tm() */ @@ -2707,20 +2699,20 @@ int u_sec; void u_sleep( int u_sec ) #endif /* _NO_PROTO */ { - int nfound; - struct timeval to; - fd_set readset, writeset; + int nfound; + struct timeval to; + fd_set readset, writeset; - to.tv_sec = u_sec / 1000000; - to.tv_usec = u_sec - ( to.tv_sec * 1000000 ); + to.tv_sec = u_sec / 1000000; + to.tv_usec = u_sec - ( to.tv_sec * 1000000 ); - FD_ZERO( &readset ); - FD_ZERO( &writeset ); - nfound = select( 0, &readset, &writeset, NULL, &to ); - if( nfound < 0 ) - errno_crash_and_burn( "select" ); + FD_ZERO( &readset ); + FD_ZERO( &writeset ); + nfound = select( 0, &readset, &writeset, NULL, &to ); + if( nfound < 0 ) + errno_crash_and_burn( "select" ); - return; + return; } /* u_sleep() */ @@ -2751,33 +2743,33 @@ int recvfrom_wto( int s, char *buf, int len, FPING_SOCKADDR *saddr, int timo ) #endif /* _NO_PROTO */ { unsigned int slen; - int nfound, n; - struct timeval to; - fd_set readset, writeset; + int nfound, n; + struct timeval to; + fd_set readset, writeset; - to.tv_sec = 0; - to.tv_usec = timo * 10; + to.tv_sec = 0; + to.tv_usec = timo * 10; - FD_ZERO( &readset ); - FD_ZERO( &writeset ); - FD_SET( s, &readset ); - nfound = select( s + 1, &readset, &writeset, NULL, &to ); - if( nfound < 0 ) - errno_crash_and_burn( "select" ); + FD_ZERO( &readset ); + FD_ZERO( &writeset ); + FD_SET( s, &readset ); + nfound = select( s + 1, &readset, &writeset, NULL, &to ); + if( nfound < 0 ) + errno_crash_and_burn( "select" ); - if( nfound == 0 ) - return -1; /* timeout */ + if( nfound == 0 ) + return -1; /* timeout */ #ifndef IPV6 - slen = sizeof( struct sockaddr ); + slen = sizeof( struct sockaddr ); #else - slen = sizeof( FPING_SOCKADDR ); + slen = sizeof( FPING_SOCKADDR ); #endif - n = recvfrom( s, buf, len, 0, (struct sockaddr *)saddr, &slen ); - if( n < 0 ) - errno_crash_and_burn( "recvfrom" ); - - return n; + n = recvfrom( s, buf, len, 0, (struct sockaddr *)saddr, &slen ); + if( n < 0 ) + errno_crash_and_burn( "recvfrom" ); + + return n; } /* recvfrom_wto() */ @@ -2798,59 +2790,59 @@ int recvfrom_wto( int s, char *buf, int len, FPING_SOCKADDR *saddr, int timo ) *************************************************************/ void ev_enqueue(HOST_ENTRY *h) { - HOST_ENTRY *i; - HOST_ENTRY *i_prev; + HOST_ENTRY *i; + HOST_ENTRY *i_prev; #if defined( DEBUG ) || defined( _DEBUG ) - if( trace_flag ) { - long st = timeval_diff(&h->ev_time, ¤t_time); - fprintf(stderr, "Enqueue: host=%s, when=%d ms (%d, %d)\n", h->host, st/100, h->ev_time.tv_sec, h->ev_time.tv_usec); - } + if( trace_flag ) { + long st = timeval_diff(&h->ev_time, ¤t_time); + fprintf(stderr, "Enqueue: host=%s, when=%d ms (%d, %d)\n", h->host, st/100, h->ev_time.tv_sec, h->ev_time.tv_usec); + } #endif /* Empty list */ - if(ev_last == NULL) { - h->ev_next = NULL; - h->ev_prev = NULL; - ev_first = h; - ev_last = h; - return; - } - - /* Insert on tail? */ - if(h->ev_time.tv_sec > ev_last->ev_time.tv_sec || + if(ev_last == NULL) { + h->ev_next = NULL; + h->ev_prev = NULL; + ev_first = h; + ev_last = h; + return; + } + + /* Insert on tail? */ + if(h->ev_time.tv_sec > ev_last->ev_time.tv_sec || (h->ev_time.tv_sec == ev_last->ev_time.tv_sec && - h->ev_time.tv_usec >= ev_last->ev_time.tv_usec)) - { - h->ev_next = NULL; - h->ev_prev = ev_last; - ev_last->ev_next = h; - ev_last = h; - return; - } - - /* Find insertion point */ - i = ev_last; - while(1) { - i_prev = i->ev_prev; - if(i_prev == NULL || - h->ev_time.tv_sec > i_prev->ev_time.tv_sec || + h->ev_time.tv_usec >= ev_last->ev_time.tv_usec)) + { + h->ev_next = NULL; + h->ev_prev = ev_last; + ev_last->ev_next = h; + ev_last = h; + return; + } + + /* Find insertion point */ + i = ev_last; + while(1) { + i_prev = i->ev_prev; + if(i_prev == NULL || + h->ev_time.tv_sec > i_prev->ev_time.tv_sec || (h->ev_time.tv_sec == i_prev->ev_time.tv_sec && - h->ev_time.tv_usec >= i_prev->ev_time.tv_usec)) - { - h->ev_prev = i_prev; - h->ev_next = i; - i->ev_prev = h; - if(i_prev != NULL) { - i_prev->ev_next = h; - } - else { - ev_first = h; - } - return; - } - i = i_prev; - } + h->ev_time.tv_usec >= i_prev->ev_time.tv_usec)) + { + h->ev_prev = i_prev; + h->ev_next = i; + i->ev_prev = h; + if(i_prev != NULL) { + i_prev->ev_next = h; + } + else { + ev_first = h; + } + return; + } + i = i_prev; + } } /************************************************************ @@ -2860,15 +2852,15 @@ void ev_enqueue(HOST_ENTRY *h) *************************************************************/ HOST_ENTRY *ev_dequeue() { - HOST_ENTRY *dequeued; + HOST_ENTRY *dequeued; - if(ev_first == NULL) { - return NULL; - } - dequeued = ev_first; - ev_remove(dequeued); + if(ev_first == NULL) { + return NULL; + } + dequeued = ev_first; + ev_remove(dequeued); - return dequeued; + return dequeued; } /************************************************************ @@ -2878,18 +2870,18 @@ HOST_ENTRY *ev_dequeue() *************************************************************/ void ev_remove(HOST_ENTRY *h) { - if(ev_first == h) { - ev_first = h->ev_next; - } - if(ev_last == h) { - ev_last = h->ev_prev; - } - if(h->ev_prev) { - h->ev_prev->ev_next = h->ev_next; - } - if(h->ev_next) { - h->ev_next->ev_prev = h->ev_prev; - } + if(ev_first == h) { + ev_first = h->ev_next; + } + if(ev_last == h) { + ev_last = h->ev_prev; + } + if(h->ev_prev) { + h->ev_prev->ev_next = h->ev_next; + } + if(h->ev_next) { + h->ev_next->ev_prev = h->ev_prev; + } } @@ -2911,41 +2903,41 @@ void usage() void usage( void ) #endif /* _NO_PROTO */ { - fprintf( stderr, "\n" ); - fprintf( stderr, "Usage: %s [options] [targets...]\n", prog ); - fprintf( stderr, " -a show targets that are alive\n" ); - fprintf( stderr, " -A show targets by address\n" ); - fprintf( stderr, " -b n amount of ping data to send, in bytes (default %d)\n", ping_data_size ); - 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, " -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" ); - fprintf( stderr, " (specify the start and end IP in the target list, or supply a IP netmask)\n" ); + fprintf( stderr, "\n" ); + fprintf( stderr, "Usage: %s [options] [targets...]\n", prog ); + fprintf( stderr, " -a show targets that are alive\n" ); + fprintf( stderr, " -A show targets by address\n" ); + fprintf( stderr, " -b n amount of ping data to send, in bytes (default %d)\n", ping_data_size ); + 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, " -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" ); + fprintf( stderr, " (specify the start and end IP in the target list, or supply a IP netmask)\n" ); fprintf( stderr, " (ex. %s -g 192.168.1.0 192.168.1.255 or %s -g 192.168.1.0/24)\n", prog, prog ); - fprintf( stderr, " -i n interval between sending ping packets (in millisec) (default %d)\n", interval / 100 ); - fprintf( stderr, " -l loop sending pings forever\n" ); - fprintf( stderr, " -m ping multiple interfaces on target host\n" ); - fprintf( stderr, " -n show targets by name (-d is equivalent)\n" ); - fprintf( stderr, " -p n interval between ping packets to one target (in millisec)\n" ); - fprintf( stderr, " (in looping and counting modes, default %d)\n", perhost_interval / 100 ); - fprintf( stderr, " -q quiet (don't show per-target/per-ping results)\n" ); - fprintf( stderr, " -Q n same as -q, but show summary every n seconds\n" ); - fprintf( stderr, " -r n number of retries (default %d)\n", DEFAULT_RETRY ); - fprintf( stderr, " -s print final stats\n" ); + fprintf( stderr, " -i n interval between sending ping packets (in millisec) (default %d)\n", interval / 100 ); + fprintf( stderr, " -l loop sending pings forever\n" ); + fprintf( stderr, " -m ping multiple interfaces on target host\n" ); + fprintf( stderr, " -n show targets by name (-d is equivalent)\n" ); + fprintf( stderr, " -p n interval between ping packets to one target (in millisec)\n" ); + fprintf( stderr, " (in looping and counting modes, default %d)\n", perhost_interval / 100 ); + fprintf( stderr, " -q quiet (don't show per-target/per-ping results)\n" ); + fprintf( stderr, " -Q n same as -q, but show summary every n seconds\n" ); + fprintf( stderr, " -r n number of retries (default %d)\n", DEFAULT_RETRY ); + fprintf( stderr, " -s print final stats\n" ); #ifdef SO_BINDTODEVICE fprintf( stderr, " -I if bind to a particular interface\n"); #endif - 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, " -T n set select timeout (default %d)\n", select_time / 100 ); - fprintf( stderr, " -u show targets that are unreachable\n" ); - fprintf( stderr, " -O n set the type of service (tos) flag on the ICMP packets\n" ); - fprintf( stderr, " -v show version\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, " -T n set select timeout (default %d)\n", select_time / 100 ); + fprintf( stderr, " -u show targets that are unreachable\n" ); + fprintf( stderr, " -O n set the type of service (tos) flag on the ICMP packets\n" ); + fprintf( stderr, " -v show version\n" ); - fprintf( stderr, " targets list of targets to check (if no -f specified)\n" ); - fprintf( stderr, "\n"); - exit( 3 ); + fprintf( stderr, " targets list of targets to check (if no -f specified)\n" ); + fprintf( stderr, "\n"); + exit( 3 ); } /* usage() */