--- fping-2.4b2-to-ipv6.orig/fping.c +++ fping-2.4b2-to-ipv6/fping.c @@ -42,7 +42,6 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#define IPV6 1 /* This should be a compiler option, or even better be done from the Makefile... ;) */ #ifndef _NO_PROTO #if !__STDC__ && !defined( __cplusplus ) && !defined( FUNCPROTO ) \ @@ -150,7 +149,11 @@ #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 */ +#else +#define SIZE_ICMP_HDR sizeof(FPING_ICMPHDR) +#endif #define MAX_PING_DATA ( MAX_IP_PACKET - SIZE_IP_HDR - SIZE_ICMP_HDR ) /* sized so as to be like traditional ping */ @@ -474,6 +477,37 @@ 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)"); +#else /* old adv. API */ + 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)"); +#else /* old adv. API */ + if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &opton, + sizeof(opton))) + err(1, "setsockopt(IPV6_HOPLIMIT)"); +#endif +#ifndef _AIX +#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)"); +#endif +#endif #endif if( ( uid = getuid() ) ) @@ -1382,8 +1414,8 @@ 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 - h->num_recv_i ) * 100 ) / h->num_sent_i ); + 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 @@ -2165,6 +2197,7 @@ struct addrinfo *res, hints; int ret_ga; char *hostname; + size_t len; /* getaddrinfo */ bzero(&hints, sizeof(struct addrinfo)); @@ -2178,7 +2211,9 @@ if (res->ai_canonname) hostname = res->ai_canonname; else hostname = name; if (!res->ai_addr) errx(1, "getaddrinfo failed"); - (void)memcpy(&dst, res->ai_addr, sizeof(FPING_SOCKADDR)); /*res->ai_addrlen);*/ + 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() */