|
Chris Ricker |
6473537 |
--- fping-2.4b2-to-ipv6.orig/fping.c
|
|
Chris Ricker |
6473537 |
+++ fping-2.4b2-to-ipv6/fping.c
|
|
Chris Ricker |
6473537 |
@@ -42,7 +42,6 @@
|
|
Chris Ricker |
6473537 |
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
|
Chris Ricker |
6473537 |
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Chris Ricker |
6473537 |
*/
|
|
Chris Ricker |
6473537 |
-#define IPV6 1 /* This should be a compiler option, or even better be done from the Makefile... ;) */
|
|
Chris Ricker |
6473537 |
|
|
Chris Ricker |
6473537 |
#ifndef _NO_PROTO
|
|
Chris Ricker |
6473537 |
#if !__STDC__ && !defined( __cplusplus ) && !defined( FUNCPROTO ) \
|
|
Chris Ricker |
6473537 |
@@ -150,7 +149,11 @@
|
|
Chris Ricker |
6473537 |
#define MIN_PING_DATA sizeof( PING_DATA )
|
|
Chris Ricker |
6473537 |
#define MAX_IP_PACKET 65536 /* (theoretical) max IP packet size */
|
|
Chris Ricker |
6473537 |
#define SIZE_IP_HDR 20
|
|
Chris Ricker |
6473537 |
+#ifndef IPV6
|
|
Chris Ricker |
6473537 |
#define SIZE_ICMP_HDR ICMP_MINLEN /* from ip_icmp.h */
|
|
Chris Ricker |
6473537 |
+#else
|
|
Chris Ricker |
6473537 |
+#define SIZE_ICMP_HDR sizeof(FPING_ICMPHDR)
|
|
Chris Ricker |
6473537 |
+#endif
|
|
Chris Ricker |
6473537 |
#define MAX_PING_DATA ( MAX_IP_PACKET - SIZE_IP_HDR - SIZE_ICMP_HDR )
|
|
Chris Ricker |
6473537 |
|
|
Chris Ricker |
6473537 |
/* sized so as to be like traditional ping */
|
|
Chris Ricker |
6473537 |
@@ -474,6 +477,35 @@
|
|
Chris Ricker |
6473537 |
sizeof(opton)))
|
|
Chris Ricker |
6473537 |
err(1, "setsockopt(IPV6_RTHDR)");
|
|
Chris Ricker |
6473537 |
#endif
|
|
Chris Ricker |
6473537 |
+#ifndef USE_SIN6_SCOPE_ID
|
|
Chris Ricker |
6473537 |
+#ifdef IPV6_RECVPKTINFO
|
|
Chris Ricker |
6473537 |
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &opton,
|
|
Chris Ricker |
6473537 |
+ sizeof(opton)))
|
|
Chris Ricker |
6473537 |
+ err(1, "setsockopt(IPV6_RECVPKTINFO)");
|
|
Chris Ricker |
6473537 |
+#else /* old adv. API */
|
|
Chris Ricker |
6473537 |
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &opton,
|
|
Chris Ricker |
6473537 |
+ sizeof(opton)))
|
|
Chris Ricker |
6473537 |
+ err(1, "setsockopt(IPV6_PKTINFO)");
|
|
Chris Ricker |
6473537 |
+#endif
|
|
Chris Ricker |
6473537 |
+#endif /* USE_SIN6_SCOPE_ID */
|
|
Chris Ricker |
6473537 |
+#ifdef IPV6_RECVHOPLIMIT
|
|
Chris Ricker |
6473537 |
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &opton,
|
|
Chris Ricker |
6473537 |
+ sizeof(opton)))
|
|
Chris Ricker |
6473537 |
+ err(1, "setsockopt(IPV6_RECVHOPLIMIT)");
|
|
Chris Ricker |
6473537 |
+#else /* old adv. API */
|
|
Chris Ricker |
6473537 |
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &opton,
|
|
Chris Ricker |
6473537 |
+ sizeof(opton)))
|
|
Chris Ricker |
6473537 |
+ err(1, "setsockopt(IPV6_HOPLIMIT)");
|
|
Chris Ricker |
6473537 |
+#endif
|
|
Chris Ricker |
6473537 |
+#ifdef IPV6_CHECKSUM
|
|
Chris Ricker |
6473537 |
+#ifndef SOL_RAW
|
|
Chris Ricker |
6473537 |
+#define SOL_RAW IPPROTO_IPV6
|
|
Chris Ricker |
6473537 |
+#endif
|
|
Chris Ricker |
6473537 |
+ opton = 2;
|
|
Chris Ricker |
6473537 |
+ if (setsockopt(s, SOL_RAW, IPV6_CHECKSUM, &opton,
|
|
Chris Ricker |
6473537 |
+ sizeof(opton)))
|
|
Chris Ricker |
6473537 |
+ err(1, "setsockopt(SOL_RAW,IPV6_CHECKSUM)");
|
|
Chris Ricker |
6473537 |
+#endif
|
|
Chris Ricker |
6473537 |
#endif
|
|
Chris Ricker |
6473537 |
|
|
Chris Ricker |
6473537 |
if( ( uid = getuid() ) )
|
|
Chris Ricker |
6473537 |
@@ -1382,8 +1414,8 @@
|
|
Chris Ricker |
6473537 |
if( h->num_recv_i <= h->num_sent_i )
|
|
Chris Ricker |
6473537 |
{
|
|
Chris Ricker |
6473537 |
fprintf( stderr, " xmt/rcv/%%loss = %d/%d/%d%%",
|
|
Chris Ricker |
6473537 |
- h->num_sent_i, h->num_recv_i,
|
|
Chris Ricker |
6473537 |
- ( ( h->num_sent_i - h->num_recv_i ) * 100 ) / h->num_sent_i );
|
|
Chris Ricker |
6473537 |
+ h->num_sent_i, h->num_recv_i, h->num_sent_i > 0 ?
|
|
Chris Ricker |
6473537 |
+ ( ( h->num_sent_i - h->num_recv_i ) * 100 ) / h->num_sent_i : 0 );
|
|
Chris Ricker |
6473537 |
|
|
Chris Ricker |
6473537 |
}/* IF */
|
|
Chris Ricker |
6473537 |
else
|
|
Chris Ricker |
6473537 |
@@ -2165,6 +2197,7 @@
|
|
Chris Ricker |
6473537 |
struct addrinfo *res, hints;
|
|
Chris Ricker |
6473537 |
int ret_ga;
|
|
Chris Ricker |
6473537 |
char *hostname;
|
|
Chris Ricker |
6473537 |
+ size_t len;
|
|
Chris Ricker |
6473537 |
|
|
Chris Ricker |
6473537 |
/* getaddrinfo */
|
|
Chris Ricker |
6473537 |
bzero(&hints, sizeof(struct addrinfo));
|
|
Chris Ricker |
6473537 |
@@ -2178,7 +2211,9 @@
|
|
Chris Ricker |
6473537 |
if (res->ai_canonname) hostname = res->ai_canonname;
|
|
Chris Ricker |
6473537 |
else hostname = name;
|
|
Chris Ricker |
6473537 |
if (!res->ai_addr) errx(1, "getaddrinfo failed");
|
|
Chris Ricker |
6473537 |
- (void)memcpy(&dst, res->ai_addr, sizeof(FPING_SOCKADDR)); /*res->ai_addrlen);*/
|
|
Chris Ricker |
6473537 |
+ len = res->ai_addrlen;
|
|
Chris Ricker |
6473537 |
+ if (len > sizeof(FPING_SOCKADDR)) len = sizeof(FPING_SOCKADDR);
|
|
Chris Ricker |
6473537 |
+ (void)memcpy(&dst, res->ai_addr, len);
|
|
Chris Ricker |
6473537 |
add_addr(name, name, &dst);
|
|
Chris Ricker |
6473537 |
#endif
|
|
Chris Ricker |
6473537 |
} /* add_name() */
|