Blob Blame History Raw
--- 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,35 @@
 		    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
+#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
 
 	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() */