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() */