--- iputils/ping_common.c.old	Thu Mar 14 16:58:47 2002
+++ iputils/ping_common.c	Thu Mar 14 17:10:54 2002
@@ -775,10 +775,10 @@
 		tmdev = llsqrt(tsum2 - tsum * tsum);
 
 		printf("rtt min/avg/max/mdev = %ld.%03ld/%lu.%03ld/%ld.%03ld/%ld.%03ld ms",
-		       tmin/1000, tmin%1000,
+		       (long)tmin/1000, (long)tmin%1000,
 		       (unsigned long)(tsum/1000), (long)(tsum%1000),
-		       tmax/1000, tmax%1000,
-		       tmdev/1000, tmdev%1000
+		       (long)tmax/1000, (long)tmax%1000,
+		       (long)tmdev/1000, (long)tmdev%1000
 		       );
 	}
 	if (pipesize > 1)
@@ -809,10 +809,10 @@
 		tavg = tsum / (nreceived + nrepeats);
 
 		fprintf(stderr, ", min/avg/ewma/max = %ld.%03ld/%lu.%03ld/%d.%03d/%ld.%03ld ms",
-		       tmin/1000, tmin%1000,
+		       (long)tmin/1000, (long)tmin%1000,
 		       tavg/1000, tavg%1000,
 		       rtt/8000, (rtt/8)%1000,
-		       tmax/1000, tmax%1000
+		       (long)tmax/1000, (long)tmax%1000
 		       );
 	}
 	fprintf(stderr, "\n");
--- iputils/rdisc.c-org	Wed May  1 00:27:34 2002
+++ iputils/rdisc.c	Wed May  1 00:32:40 2002
@@ -63,6 +63,8 @@
 
 #include "SNAPSHOT.h"
 
+#define RDISC_SERVER
+
 struct interface
 {
 	struct in_addr 	address;	/* Used to identify the interface */
@@ -163,11 +165,8 @@
 int debugfile;
 
 char usage[] =
-"Usage:	rdisc [-b] [-d] [-s] [-v] [-f] [-a] [-V] [send_address] [receive_address]\n"
-#ifdef RDISC_SERVER
-"       rdisc -r [-b] [-d] [-s] [-v] [-f] [-a] [-V] [-p <preference>] [-T <secs>] \n"
-"		 [send_address] [receive_address]\n"
-#endif
+"Usage:	rdisc -r [-b] [-d] [-s] [-v] [-f] [-a] [-V] [-p <preference>] [-T <secs>] \n"
+"                 [send_address] [receive_address]\n"
 ;
 
 
@@ -875,7 +874,9 @@
 				((max_adv_int - min_adv_int) 
 				 * (random() % 1000)/1000);
 		} else {
-			if (!is_directly_connected(ip->saddr)) {
+			struct in_addr tmp;
+			tmp.s_addr = ip->saddr;
+			if (!is_directly_connected(tmp)) {
 				if (verbose)
 					logtrace("ICMP %s from %s: source not directly connected\n",
 						      pr_type((int)icp->type),
@@ -945,7 +946,6 @@
 {
 #ifdef RDISC_SERVER
 	if (responder) {
-		int i;
 
 		/* Send out a packet with a preference so that all
 		 * hosts will know that we are dead.
--- iputils/ping_common.c.countermeasures	Tue May 21 10:06:05 2002
+++ iputils/ping_common.c	Tue May 21 10:12:42 2002
@@ -628,7 +628,8 @@
 		tvsub(tv, &tmp_tv);
 		triptime = tv->tv_sec * 1000000 + tv->tv_usec;
 		if (triptime < 0) {
-			fprintf(stderr, "Warning: time of day goes back (%ldus), taking countermeasures.\n", triptime);
+			if (options & F_VERBOSE)
+				fprintf(stderr, "Warning: time of day goes back (%ldus), taking countermeasures.\n", triptime);
 			triptime = 0;
 			if (!(options & F_LATENCY)) {
 				gettimeofday(tv, NULL);
--- iputils/ping.c.addrcache	2002-09-20 17:08:11.000000000 +0200
+++ iputils/ping.c	2003-05-15 16:41:19.000000000 +0200
@@ -1124,6 +1124,12 @@
 {
 	struct hostent *hp;
 	static char buf[4096];
+	static __u32 addr_cache = 0;
+
+	if ( addr == addr_cache )
+		return buf;
+
+	addr_cache = addr;
 
 	if ((options & F_NUMERIC) ||
 	    !(hp = gethostbyaddr((char *)&addr, 4, AF_INET)))
--- iputils/ping6.c.addrcache	2002-09-20 17:08:11.000000000 +0200
+++ iputils/ping6.c	2003-05-15 16:41:19.000000000 +0200
@@ -893,7 +893,14 @@
  */
 char * pr_addr(struct in6_addr *addr)
 {
-	struct hostent *hp = NULL;
+	static struct hostent *hp = NULL;
+	static struct in6_addr addr_cache = {{{0,0,0,0}}};
+
+	if ( addr->s6_addr32[0] == addr_cache.s6_addr32[0] &&
+	     addr->s6_addr32[1] == addr_cache.s6_addr32[1] &&
+	     addr->s6_addr32[2] == addr_cache.s6_addr32[2] &&
+	     addr->s6_addr32[3] == addr_cache.s6_addr32[3] )
+		return hp ? hp->h_name : pr_addr_n(addr);
 
 	if (!(options&F_NUMERIC))
 		hp = gethostbyaddr((__u8*)addr, sizeof(struct in6_addr), AF_INET6);
--- iputils-ss021109-vanilla/ping.c	Thu Nov  7 23:53:21 2002
+++ iputils/ping.c	Sun Jan 12 03:39:24 2003
@@ -285,6 +285,9 @@
 						perror("ping: IP_MULTICAST_IF");
 						exit(2);
 					}
+				} else if (icmp_sock >= 0) {
+					/* We possible tried to SO_BINDTODEVICE() a subinterface like 'eth0:1' */
+					perror("Warning: cannot bind to specified iface, falling back");
 				}
 			}
 		}
--- iputils/ping.c.icmp_seq	2003-09-03 16:45:07.000000000 +0200
+++ iputils/ping.c	2003-09-03 16:45:41.000000000 +0200
@@ -610,7 +610,7 @@
 	icp->type = ICMP_ECHO;
 	icp->code = 0;
 	icp->checksum = 0;
-	icp->un.echo.sequence = htons(ntransmitted+1);
+	icp->un.echo.sequence = htons(ntransmitted);
 	icp->un.echo.id = ident;			/* ID */
 
 	CLR((ntransmitted+1) % mx_dup_ck);
--- iputils/ping6.c.icmp_seq	2003-09-03 16:45:20.000000000 +0200
+++ iputils/ping6.c	2003-09-03 16:45:34.000000000 +0200
@@ -647,7 +647,7 @@
 	icmph->icmp6_type = ICMPV6_ECHO_REQUEST;
 	icmph->icmp6_code = 0;
 	icmph->icmp6_cksum = 0;
-	icmph->icmp6_sequence = htons(ntransmitted+1);
+	icmph->icmp6_sequence = htons(ntransmitted);
 	icmph->icmp6_identifier = ident;
 
 	CLR((ntransmitted+1) % mx_dup_ck);
diff -ru iputils/include-glibc/netinet/in.h iputils-clean/include-glibc/netinet/in.h
--- iputils/include-glibc/netinet/in.h	2000-06-18 14:57:25.000000000 -0400
+++ iputils-clean/include-glibc/netinet/in.h	2003-09-03 11:21:55.000000000 -0400
@@ -8,4 +8,45 @@
 
 #define SOL_IP	0
 
-#endif	/* netinet/in.h */
+/* Functions to convert between host and network byte order.
+
+   Please note that these functions normally take `unsigned long int' or
+   `unsigned short int' values as arguments and also return them.  But
+   this was a short-sighted decision since on different systems the types
+   may have different representations but the values are always the same.  */
+
+extern u_int32_t ntohl (u_int32_t __netlong) __THROW __attribute__ ((__const__));
+extern u_int16_t ntohs (u_int16_t __netshort)
+     __THROW __attribute__ ((__const__));
+extern u_int32_t htonl (u_int32_t __hostlong)
+     __THROW __attribute__ ((__const__));
+extern u_int16_t htons (u_int16_t __hostshort)
+     __THROW __attribute__ ((__const__));
+
+#include <endian.h>
+
+/* Get machine dependent optimized versions of byte swapping functions.  */
+#include <bits/byteswap.h>
+
+#ifdef __OPTIMIZE__
+/* We can optimize calls to the conversion functions.  Either nothing has
+   to be done or we are using directly the byte-swapping functions which
+   often can be inlined.  */
+# if __BYTE_ORDER == __BIG_ENDIAN
+/* The host byte order is the same as network byte order,
+   so these functions are all just identity.  */
+# define ntohl(x)	(x)
+# define ntohs(x)	(x)
+# define htonl(x)	(x)
+# define htons(x)	(x)
+# else
+#  if __BYTE_ORDER == __LITTLE_ENDIAN
+#   define ntohl(x)	__bswap_32 (x)
+#   define ntohs(x)	__bswap_16 (x)
+#   define htonl(x)	__bswap_32 (x)
+#   define htons(x)	__bswap_16 (x)
+#  endif
+# endif
+#endif
+
+#endif /* netinet/in.h */
diff -ru iputils/ping6.c iputils-clean/ping6.c
--- iputils/ping6.c	2003-09-03 11:22:46.000000000 -0400
+++ iputils-clean/ping6.c	2003-09-03 11:15:42.000000000 -0400
@@ -879,7 +879,7 @@
 	once = 1;
 
 	/* Patch bpflet for current identifier. */
-	insns[1] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __constant_htons(ident), 0, 1);
+	insns[1] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(ident), 0, 1);
 
 	if (setsockopt(icmp_sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)))
 		perror("WARNING: failed to install socket filter\n");
diff -ru iputils/ping.c iputils-clean/ping.c
--- iputils/ping.c	2003-09-03 11:22:46.000000000 -0400
+++ iputils-clean/ping.c	2003-09-03 11:15:26.000000000 -0400
@@ -1196,7 +1196,7 @@
 	once = 1;
 
 	/* Patch bpflet for current identifier. */
-	insns[2] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __constant_htons(ident), 0, 1);
+	insns[2] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(ident), 0, 1);
 
 	if (setsockopt(icmp_sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)))
 		perror("WARNING: failed to install socket filter\n");
diff -urN iputils/clockdiff.c iputils.new/clockdiff.c
--- iputils/clockdiff.c	2002-02-22 19:10:59.000000000 -0500
+++ iputils.new/clockdiff.c	2003-09-10 09:20:28.000000000 -0400
@@ -2,6 +2,7 @@
 #include <sys/types.h>
 #include <sys/param.h>
 #include <stdio.h>
+#include <linux/types.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <math.h>
diff -urN iputils/ping6.c iputils.new/ping6.c
--- iputils/ping6.c	2003-09-10 17:27:48.000000000 -0400
+++ iputils.new/ping6.c	2003-09-10 17:22:43.000000000 -0400
@@ -68,8 +68,44 @@
  */
 #include "ping_common.h"
 
-#include <linux/in6.h>
-#include <linux/ipv6.h>
+struct ipv6_rt_hdr {
+        __u8            nexthdr;
+        __u8            hdrlen;
+        __u8            type;
+        __u8            segments_left;
+
+        /*
+         *      type specific data
+         *      variable length field
+         */
+};
+
+struct rt0_hdr {
+        struct ipv6_rt_hdr      rt_hdr;
+        __u32                   bitmap;         /* strict/loose bit map */
+        struct in6_addr         addr[0];
+
+#define rt0_type                rt_hdr.type;
+};
+#define IPV6_SRCRT_TYPE_0     0       /* IPv6 type 0 Routing Header   */
+struct ipv6hdr {
+#if defined(__LITTLE_ENDIAN)
+        __u8                    priority:4,
+                                version:4;
+#elif defined(__BIG_ENDIAN)
+        __u8                    version:4,
+                                priority:4;
+#endif
+        __u8                    flow_lbl[3];
+
+        __u16                   payload_len;
+        __u8                    nexthdr;
+        __u8                    hop_limit;
+
+        struct  in6_addr        saddr;
+        struct  in6_addr        daddr;
+};
+
 #include <linux/icmpv6.h>
 
 #define BIT_CLEAR(nr, addr) do { ((__u32 *)(addr))[(nr) >> 5] &= ~(1U << ((nr) & 31)); } while(0)
diff -urN iputils/ping_common.h iputils.new/ping_common.h
--- iputils/ping_common.h	2002-09-20 11:08:11.000000000 -0400
+++ iputils.new/ping_common.h	2003-09-10 17:16:16.000000000 -0400
@@ -19,6 +19,7 @@
 
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <linux/types.h>
 #include <linux/errqueue.h>
 
 #include "SNAPSHOT.h"
diff -urN iputils/tftpd.c iputils.new/tftpd.c
--- iputils/tftpd.c	2002-01-23 19:31:41.000000000 -0500
+++ iputils.new/tftpd.c	2003-09-10 09:39:45.000000000 -0400
@@ -57,7 +57,6 @@
 
 #include <sys/socket.h>
 #include <netinet/in.h>
-#include <linux/in6.h>
 #include <netdb.h>
 
 #include <setjmp.h>
diff -urN iputils/tracepath6.c iputils.new/tracepath6.c
--- iputils/tracepath6.c	2001-09-01 22:03:46.000000000 -0400
+++ iputils.new/tracepath6.c	2003-09-10 09:40:18.000000000 -0400
@@ -14,8 +14,7 @@
 #include <unistd.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
-
-#include <linux/in6.h>
+#include <linux/types.h>
 #include <linux/errqueue.h>
 #include <errno.h>
 #include <string.h>
diff -urN iputils/tracepath.c iputils.new/tracepath.c
--- iputils/tracepath.c	2002-02-22 19:10:59.000000000 -0500
+++ iputils.new/tracepath.c	2003-09-10 06:14:35.000000000 -0400
@@ -13,6 +13,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/socket.h>
+#include <linux/types.h>
 #include <linux/errqueue.h>
 #include <errno.h>
 #include <string.h>
diff -urN iputils/traceroute6.c iputils.new/traceroute6.c
--- iputils/traceroute6.c	2002-09-20 11:44:22.000000000 -0400
+++ iputils.new/traceroute6.c	2003-09-10 10:12:47.000000000 -0400
@@ -246,9 +246,24 @@
 #include <netinet/ip_icmp.h>
 #include <netinet/udp.h>
 
-#include <linux/ipv6.h>
-#include <linux/in6.h>
+#include <linux/types.h>
+struct ipv6hdr {
+#if defined(__LITTLE_ENDIAN)
+        __u8                    priority:4,
+                                version:4;
+#elif defined(__BIG_ENDIAN)
+        __u8                    version:4,
+                                priority:4;
+#endif
+        __u8                    flow_lbl[3];
+
+        __u16                   payload_len;
+        __u8                    nexthdr;
+        __u8                    hop_limit;
 
+        struct  in6_addr        saddr;
+        struct  in6_addr        daddr;
+};
 #include <linux/icmpv6.h>
 
 #include <arpa/inet.h>
--- iputils/arping.c.unaligned	2001-10-06 00:42:47.000000000 +0200
+++ iputils/arping.c	2003-10-02 15:14:42.000000000 +0200
@@ -332,7 +332,7 @@
 			timeout = atoi(optarg);
 			break;
 		case 'I':
- 			device = optarg;
+ 			device = strdup(optarg);
  			break;
  		case 'f':
  			quit_on_reply=1;
--- iputils/traceroute6.c.inet_pton	2004-04-22 15:06:28.268797480 +0200
+++ iputils/traceroute6.c	2004-04-22 15:06:35.727877941 +0200
@@ -538,7 +538,7 @@
 	} else {
 		(void) bzero((char *)&saddr, sizeof(saddr));
 		saddr.sin6_family = AF_INET6;
-		if (inet_pton(AF_INET6, source, &saddr.sin6_addr) < 0)
+		if (inet_pton(AF_INET6, source, &saddr.sin6_addr) <= 0)
 		{
 			Printf("traceroute: unknown addr %s\n", source);
 			exit(1);
--- iputils/traceroute6.c.old	2004-12-07 11:08:57.000000000 +0100
+++ iputils/traceroute6.c	2004-12-07 11:14:09.397575536 +0100
@@ -352,8 +352,11 @@
 	icmp_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
 	socket_errno = errno;
 
-	setuid(getuid());
-
+	if(setuid(getuid()) != 0)
+	{
+		perror("traceroute: setuid()");
+		exit(-1);
+	}
 	on = 1;
 	seq = tos = 0;
 	to = (struct sockaddr_in6 *)&whereto;
--- iputils/ping6.c.old	2004-12-07 11:08:57.000000000 +0100
+++ iputils/ping6.c	2004-12-07 11:13:40.707937024 +0100
@@ -223,7 +223,11 @@
 	socket_errno = errno;
 
 	uid = getuid();
-	setuid(uid);
+	if(setuid(uid) != 0)
+	{
+		perror("ping: setuid()");
+		exit(-1);
+	}
 
 	source.sin6_family = AF_INET6;
 	memset(&firsthop, 0, sizeof(firsthop));
--- iputils/ping.c.old	2004-12-07 11:08:57.000000000 +0100
+++ iputils/ping.c	2004-12-07 11:13:27.523941296 +0100
@@ -119,7 +119,11 @@
 	socket_errno = errno;
 
 	uid = getuid();
-	setuid(uid);
+	if(setuid(uid) != 0)
+	{
+		perror("ping: setuid()");
+		exit(-1);
+	}
 
 	source.sin_family = AF_INET;
 
--- iputils/doc/ping.8.old	2002-09-27 19:12:47.000000000 +0200
+++ iputils/doc/ping.8	2004-12-07 11:09:42.434160144 +0100
@@ -112,7 +112,7 @@
 when finished.
 .TP
 \fB-R\fR
-Record route.
+Record route. (IPv4 only)
 Includes the RECORD_ROUTE option in the ECHO_REQUEST
 packet and displays the route buffer on returned packets.
 Note that the IP header is only large enough for nine such routes.
--- iputils/doc/ping.sgml.old	2002-09-20 14:55:50.000000000 +0200
+++ iputils/doc/ping.sgml	2004-12-07 11:09:42.435159992 +0100
@@ -190,7 +190,7 @@
  <varlistentry>
   <term><option/-R/</term>
   <listitem><para>
-Record route.
+Record route. (IPv4 only)
 Includes the RECORD_ROUTE option in the ECHO_REQUEST
 packet and displays the route buffer on returned packets.
 Note that the IP header is only large enough for nine such routes.
--- iputils/ping.c	2005-05-18 01:37:05.621810488 -0400
+++ iputils/ping.c.new	2005-05-18 01:41:27.113018222 -0400
@@ -101,7 +101,7 @@ static struct {
 int cmsg_len;
 
 struct sockaddr_in source;
-char *device;
+char *device=NULL;
 int pmtudisc = -1;
 
 
@@ -177,7 +177,7 @@ main(int argc, char **argv)
 				ptr[3] = i4;
 				options |= F_STRICTSOURCE;
 			} else {
-				device = optarg;
+				device = strdup(optarg);
 			}
 			break;
 		}
--- iputils/ping6.c	2005-05-18 01:37:05.620833925 -0400
+++ iputils/ping6.c.new	2005-05-18 01:41:23.599346390 -0400
@@ -155,7 +155,7 @@ static int pr_icmph(__u8 type, __u8 code
 static void usage(void) __attribute((noreturn));
 
 struct sockaddr_in6 source;
-char *device;
+char *device=NULL;
 int pmtudisc=-1;
 
 static int icmp_sock;
@@ -248,7 +248,7 @@ int main(int argc, char *argv[])
 				}
 				options |= F_STRICTSOURCE;
 			} else {
-				device = optarg;
+				device = strdup(optarg);
 			}
 			break;
 		case 'M':
diff -ur iputils/arping.c iputils.tom/arping.c
--- iputils/arping.c	2005-07-15 13:51:15.533632784 -0700
+++ iputils.tom/arping.c	2005-07-15 13:50:47.967823000 -0700
@@ -59,6 +59,8 @@
 #define MS_TDIFF(tv1,tv2) ( ((tv1).tv_sec-(tv2).tv_sec)*1000 + \
 			   ((tv1).tv_usec-(tv2).tv_usec)/1000 )
 
+#define min(x,y) ((x)<(y) ? (x) : (y))
+
 void usage(void)
 {
 	fprintf(stderr,
@@ -476,7 +478,7 @@
 	}
 
 	he = me;
-	memset(he.sll_addr, -1, he.sll_halen);
+	memset(he.sll_addr, -1, min(he.sll_halen, sizeof he.sll_addr));
 
 	if (!quiet) {
 		printf("ARPING %s ", inet_ntoa(dst));
--- iputils/arping.c.orig	2001-10-05 18:42:47.000000000 -0400
+++ iputils/arping.c	2005-07-13 13:07:45.406217716 -0400
@@ -166,10 +166,12 @@ void catcher(void)
 	if (start.tv_sec==0)
 		start = tv;
 
-	if (count-- == 0 || (timeout && MS_TDIFF(tv,start) > timeout*1000 + 500))
+	if ((timeout && MS_TDIFF(tv,start) > timeout*1000 + 500) ||
+		((count == 0) && (!timeout)))
 		finish();
 
 	if (last.tv_sec==0 || MS_TDIFF(tv,last) > 500) {
+		count--;
 		send_pack(s, src, dst, &me, &he);
 		if (count == 0 && unsolicited)
 			finish();
@@ -510,6 +512,8 @@ main(int argc, char **argv)
 		sigaddset(&sset, SIGINT);
 		sigprocmask(SIG_BLOCK, &sset, &osset);
 		recv_pack(packet, cc, &from);
+		if(received == count)
+			exit(0);
 		sigprocmask(SIG_SETMASK, &osset, NULL);
 	}
 }
--- iputils/tracepath6.c.getaddrinfo	2005-09-08 10:31:47.000000000 +0200
+++ iputils/tracepath6.c	2005-09-08 10:31:47.000000000 +0200
@@ -280,7 +280,7 @@
 	struct sockaddr_in6 sin;
 	int ttl;
 	char *p;
-	struct hostent *he;
+	struct addrinfo hints, *res;
 	int ch;
 
 	while ((ch = getopt(argc, argv, "nbh?")) != EOF) {
@@ -308,20 +308,26 @@
 		perror("socket");
 		exit(1);
 	}
-	sin.sin6_family = AF_INET6;
 
 	p = strchr(argv[0], '/');
 	if (p) {
 		*p = 0;
+	}
+
+	memset(&hints, '\0', sizeof(hints));
+	hints.ai_family = AF_INET6;
+	if (getaddrinfo(argv[0], NULL, &hints, &res)) {
+		herror("getaddrinfo");
+		exit(1);
+	}
+
+	memcpy(&sin, res->ai_addr, sizeof(struct sockaddr_in6));
+	freeaddrinfo(res);
+
+	if (p) {
 		sin.sin6_port = htons(atoi(p+1));
 	} else
 		sin.sin6_port = htons(0x8000 | getpid());
-	he = gethostbyname2(argv[0], AF_INET6);
-	if (he == NULL) {
-		herror("gethostbyname2");
-		exit(1);
-	}
-	memcpy(&sin.sin6_addr, he->h_addr, 16);
 
 	if (connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) {
 		perror("connect");
--- iputils/tracepath.c.getaddrinfo	2005-09-08 10:31:47.000000000 +0200
+++ iputils/tracepath.c	2005-09-08 11:03:39.000000000 +0200
@@ -272,12 +272,12 @@
 int
 main(int argc, char **argv)
 {
-	struct hostent *he;
 	int fd;
 	int on;
 	int ttl;
 	char *p;
 	int ch;
+	struct addrinfo hints, *res;
 
 	while ((ch = getopt(argc, argv, "nh?")) != EOF) {
 		switch(ch) {
@@ -300,20 +300,26 @@
 		perror("socket");
 		exit(1);
 	}
-	target.sin_family = AF_INET;
 
 	p = strchr(argv[0], '/');
 	if (p) {
 		*p = 0;
+	}
+	
+	memset(&hints, '\0', sizeof(hints));
+	hints.ai_family = AF_INET;
+	if (getaddrinfo(argv[0], NULL, &hints, &res)) {
+	    herror("getaddrinfo");
+	    exit(1);
+	}
+	
+	memcpy(&target, res->ai_addr, sizeof(struct sockaddr_in));
+	freeaddrinfo(res);
+	
+	if (p) 
 		base_port = atoi(p+1);
-	} else
+	else
 		base_port = 44444;
-	he = gethostbyname(argv[0]);
-	if (he == NULL) {
-		herror("gethostbyname");
-		exit(1);
-	}
-	memcpy(&target.sin_addr, he->h_addr, 4);
 
 	on = IP_PMTUDISC_DO;
 	if (setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &on, sizeof(on))) {
--- iputils/ping.c.flood	2005-09-26 09:26:49.000000000 +0200
+++ iputils/ping.c	2005-09-26 13:07:39.000000000 +0200
@@ -614,7 +608,7 @@
 	icp->type = ICMP_ECHO;
 	icp->code = 0;
 	icp->checksum = 0;
-	icp->un.echo.sequence = htons(ntransmitted);
+	icp->un.echo.sequence = htons(ntransmitted+1);
 	icp->un.echo.id = ident;			/* ID */
 
 	CLR((ntransmitted+1) % mx_dup_ck);
diff -ru iputils/ping_common.c iputils-foo/ping_common.c
--- iputils/ping_common.c	2005-09-22 15:22:57.000000000 -0400
+++ iputils-foo/ping_common.c	2005-09-22 15:24:42.000000000 -0400
@@ -584,6 +584,7 @@
 					   * destined to other running pings. */
 
 			iov.iov_len = packlen;
+			memset(&msg,'\0',sizeof(msg));
 			msg.msg_name = addrbuf;
 			msg.msg_namelen = sizeof(addrbuf);
 			msg.msg_iov = &iov;
--- iputils/tracepath6.c.hoplimit	2005-12-13 13:32:56.000000000 +0100
+++ iputils/tracepath6.c	2005-12-13 13:35:01.000000000 +0100
@@ -359,8 +359,8 @@
 		perror("IP_RECVERR");
 		exit(1);
 	}
-	if (setsockopt(fd, SOL_IPV6, IPV6_HOPLIMIT, &on, sizeof(on))) {
-		perror("IPV6_HOPLIMIT");
+	if (setsockopt(fd, SOL_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof(on))) {
+		perror("IPV6_RECVHOPLIMIT");
 		exit(1);
 	}
 	if (mapped && setsockopt(fd, SOL_IP, IP_RECVTTL, &on, sizeof(on))) {
--- iputils/ping6.c.hoplimit	2005-12-13 13:32:56.000000000 +0100
+++ iputils/ping6.c	2005-12-13 13:34:04.000000000 +0100
@@ -521,13 +521,10 @@
 		}
 	}
 
-	if (1) {
-		int on = 1;
-		if (setsockopt(icmp_sock, IPPROTO_IPV6, IPV6_HOPLIMIT,
-			       &on, sizeof(on)) == -1) {
-			perror ("can't receive hop limit");
-			exit(2);
-		}
+	int on = 1;
+	if (setsockopt(icmp_sock, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof(on))) {
+		perror("setsockopt(IPV6_RECVHOPLIMIT)");
+		exit(2);
 	}
 
 	if (options&F_FLOWINFO) {
--- iputils/ping6.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/ping6.c	2006-01-25 16:21:47.000000000 +0100
@@ -383,7 +383,7 @@
 			exit(2);
 		}
 		alen = sizeof(source);
-		if (getsockname(probe_fd, (struct sockaddr*)&source, &alen) == -1) {
+		if (getsockname(probe_fd, (struct sockaddr*)&source, (socklen_t*)&alen) == -1) {
 			perror("getsockname");
 			exit(2);
 		}
@@ -599,6 +599,7 @@
 	int net_errors = 0;
 	int local_errors = 0;
 	int saved_errno = errno;
+	ssize_t wr_ret;
 
 	iov.iov_base = &icmph;
 	iov.iov_len = sizeof(icmph);
@@ -629,7 +630,7 @@
 		if (options & F_QUIET)
 			goto out;
 		if (options & F_FLOOD)
-			write(STDOUT_FILENO, "E", 1);
+			wr_ret = write(STDOUT_FILENO, "E", 1);
 		else if (e->ee_errno != EMSGSIZE)
 			fprintf(stderr, "ping: local error: %s\n", strerror(e->ee_errno));
 		else
@@ -652,7 +653,7 @@
 		if (options & F_QUIET)
 			goto out;
 		if (options & F_FLOOD) {
-			write(STDOUT_FILENO, "\bE", 2);
+			wr_ret = write(STDOUT_FILENO, "\bE", 2);
 		} else {
 			printf("From %s icmp_seq=%u ", pr_addr(&sin6->sin6_addr), ntohs(icmph.icmp6_sequence));
 			pr_icmph(e->ee_type, e->ee_code, e->ee_info);
@@ -795,7 +796,8 @@
 				return 0;
 			nerrors++;
 			if (options & F_FLOOD) {
-				write(STDOUT_FILENO, "\bE", 2);
+				ssize_t wr_ret;
+				wr_ret = write(STDOUT_FILENO, "\bE", 2);
 				return 0;
 			}
 			printf("From %s: icmp_seq=%u ", pr_addr(&from->sin6_addr), ntohs(icmph1->icmp6_sequence));
--- iputils/arping.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/arping.c	2006-01-25 16:21:47.000000000 +0100
@@ -449,7 +449,7 @@
 				perror("connect");
 				exit(2);
 			}
-			if (getsockname(probe_fd, (struct sockaddr*)&saddr, &alen) == -1) {
+			if (getsockname(probe_fd, (struct sockaddr*)&saddr, (socklen_t*)&alen) == -1) {
 				perror("getsockname");
 				exit(2);
 			}
@@ -468,7 +468,7 @@
 
 	if (1) {
 		int alen = sizeof(me);
-		if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) {
+		if (getsockname(s, (struct sockaddr*)&me, (socklen_t*)&alen) == -1) {
 			perror("getsockname");
 			exit(2);
 		}
@@ -499,13 +499,13 @@
 
 	while(1) {
 		sigset_t sset, osset;
-		char packet[4096];
+		unsigned char packet[4096];
 		struct sockaddr_ll from;
 		int alen = sizeof(from);
 		int cc;
 
 		if ((cc = recvfrom(s, packet, sizeof(packet), 0,
-				   (struct sockaddr *)&from, &alen)) < 0) {
+				   (struct sockaddr *)&from, (socklen_t*)&alen)) < 0) {
 			perror("arping: recvfrom");
 			continue;
 		}
--- iputils/traceroute6.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/traceroute6.c	2006-01-25 16:21:47.000000000 +0100
@@ -529,7 +529,7 @@
 			exit(1);
 		}
 		alen = sizeof(saddr);
-		if (getsockname(probe_fd, (struct sockaddr*)&saddr, &alen) == -1) {
+		if (getsockname(probe_fd, (struct sockaddr*)&saddr, (socklen_t*)&alen) == -1) {
 			perror("getsockname");
 			exit(1);
 		}
@@ -656,7 +656,7 @@
 
 	if (select(sock+1, &fds, (fd_set *)0, (fd_set *)0, &wait) > 0) {
 		cc=recvfrom(icmp_sock, (char *)packet, sizeof(packet), 0,
-			    (struct sockaddr *)from, &fromlen);
+			    (struct sockaddr *)from, (socklen_t*)&fromlen);
 	}
 
 	return(cc);
--- iputils/tftpd.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/tftpd.c	2006-01-25 16:21:47.000000000 +0100
@@ -126,7 +126,7 @@
 	}
 	fromlen = sizeof (from);
 	n = recvfrom(0, buf, sizeof (buf), 0,
-	    (struct sockaddr *)&from, &fromlen);
+	    (struct sockaddr *)&from, (socklen_t*)&fromlen);
 	if (n < 0) {
 		if (errno != EAGAIN)
 			syslog(LOG_ERR, "recvfrom: %m\n");
@@ -164,9 +164,9 @@
 				 * than one tftpd being started up to service
 				 * a single request from a single client.
 				 */
-				j = sizeof from;
+				j = sizeof (from);
 				i = recvfrom(0, buf, sizeof (buf), 0,
-				    (struct sockaddr *)&from, &j);
+				    (struct sockaddr *)&from, (socklen_t*)&j);
 				if (i > 0) {
 					n = i;
 					fromlen = j;
--- iputils/clockdiff.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/clockdiff.c	2006-01-25 16:21:47.000000000 +0100
@@ -148,7 +148,7 @@
 	if (select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout)) {
 		length = sizeof(struct sockaddr_in);
 		cc = recvfrom(sock_raw, (char *)packet, PACKET_IN, 0, 
-		    (struct sockaddr *)NULL, &length);
+		    (struct sockaddr *)NULL, (socklen_t*)&length);
 		if (cc < 0)
 			return -1;
 		goto empty;
@@ -214,7 +214,7 @@
 
 			(void)gettimeofday(&tv1, (struct timezone *)0);
 			cc = recvfrom(sock_raw, (char *)packet, PACKET_IN, 0, 
-			    (struct sockaddr *)NULL, &length);
+			    (struct sockaddr *)NULL, (socklen_t*)&length);
 
 			if (cc < 0)
 				return(-1);
@@ -326,7 +326,7 @@
 	if (select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout)) {
 		length = sizeof(struct sockaddr_in);
 		cc = recvfrom(sock_raw, (char *)packet, PACKET_IN, 0, 
-		    (struct sockaddr *)NULL, &length);
+		    (struct sockaddr *)NULL, (socklen_t*)&length);
 		if (cc < 0)
 			return -1;
 		goto empty;
@@ -396,7 +396,7 @@
 
 			(void)gettimeofday(&tv1, (struct timezone *)0);
 			cc = recvfrom(sock_raw, (char *)packet, PACKET_IN, 0, 
-				      (struct sockaddr *)NULL, &length);
+				      (struct sockaddr *)NULL, (socklen_t*)&length);
 
 			if (cc < 0)
 				return(-1);
@@ -539,6 +539,7 @@
 	struct hostent * hp;
 	char hostname[MAXHOSTNAMELEN];
 	int s_errno = 0;
+	int nice_ret;
 
 	if (argc < 2) {
 		setuid(getuid());
@@ -606,7 +607,7 @@
 		rspace[1] = ip_opt_len;
 		rspace[2] = 5;
 		rspace[3] = IPOPT_TS_PRESPEC;
-		if (getsockname(sock_raw, (struct sockaddr*)&myaddr, &addrlen) == -1) {
+		if (getsockname(sock_raw, (struct sockaddr*)&myaddr, (socklen_t*)&addrlen) == -1) {
 			perror("getsockname");
 			exit(1);
 		}
@@ -623,8 +624,13 @@
 			ip_opt_len = 0;
 		}
 	}
-
-	nice(-16);
+	nice_ret = nice(-16);
+	if (nice_ret < 0) {
+		if (errno)
+			perror("nice");
+		else
+			fprintf(stderr, "nice: unknown failure\n");
+	}
 
 	if ((measure_status = (ip_opt_len ? measure_opt : measure)(&server)) < 0) {
 		if (errno)
--- iputils/rdisc.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/rdisc.c	2006-01-25 16:21:47.000000000 +0100
@@ -454,7 +454,7 @@
 		int cc;
 
 		cc=recvfrom(s, (char *)packet, len, 0, 
-			    (struct sockaddr *)&from, &fromlen);
+			    (struct sockaddr *)&from, (socklen_t*)&fromlen);
 		if (cc<0) {
 			if (errno == EINTR)
 				continue;
--- iputils/rarpd.c.gcc41	2001-12-02 19:45:06.000000000 +0100
+++ iputils/rarpd.c	2006-01-25 16:21:47.000000000 +0100
@@ -154,8 +154,8 @@
 			ifl->index = index;
 			ifl->hatype = ifrp->ifr_hwaddr.sa_family;
 			memcpy(ifl->lladdr, ifrp->ifr_hwaddr.sa_data, 14);
-			strncpy(ifl->name, ifrp->ifr_name, IFNAMSIZ);
-			p = strchr(ifl->name, ':');
+			strncpy((char*)ifl->name, ifrp->ifr_name, IFNAMSIZ);
+			p = strchr((char*)ifl->name, ':');
 			if (p)
 				*p = 0;
 			if (verbose)
@@ -423,7 +423,7 @@
 	unsigned char *ptr;
 	int n;
 
-	n = recvfrom(fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*)&sll, &sll_len);
+	n = recvfrom(fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*)&sll, (socklen_t*)&sll_len);
 	if (n<0) {
 		if (errno != EINTR && errno != EAGAIN)
 			syslog(LOG_ERR, "recvfrom: %m");
@@ -531,7 +531,7 @@
 	/* Update our ARP cache. Probably, this guy
 	   will not able to make ARP (if it is broken)
 	 */
-	arp_advise(sll.sll_ifindex, rmap->lladdr, rmap->lladdr_len, rmap->ipaddr);
+	arp_advise(sll.sll_ifindex,(unsigned char *)rmap->lladdr, rmap->lladdr_len, rmap->ipaddr);
 
 	/* Sendto is blocking, but with 5sec timeout */
 	alarm(5);
@@ -673,8 +673,15 @@
 			perror("rarpd: fork");
 			exit(1);
 		}
+		int chdir_ret = chdir("/");
+		if (chdir_ret != 0) {
+		    if (errno)
+			perror("chdir");
+		    else
+			fprintf(stderr, "chdir: Uknown error\n");
+		}
 
-		chdir("/");
+		
 		fd = open("/dev/null", O_RDWR);
 		if (fd >= 0) {
 			dup2(fd, 0);
--- iputils/ping_common.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/ping_common.c	2006-01-25 16:21:47.000000000 +0100
@@ -284,6 +284,7 @@
 	static int oom_count;
 	static int tokens;
 	int i;
+	ssize_t wr_ret;
 
 	/* Have we already sent enough? If we have, return an arbitrary positive value. */ 
 	if (exiting || (npackets && ntransmitted >= npackets && !deadline))
@@ -327,7 +328,7 @@
 			 * high preload or pipe size is very confusing. */
 			if ((preload < screen_width && pipesize < screen_width) ||
 			    in_flight() < screen_width)
-				write(STDOUT_FILENO, ".", 1);
+				wr_ret = write(STDOUT_FILENO, ".", 1);
 		}
 		return interval - tokens;
 	}
@@ -380,7 +381,7 @@
 
 	if (i == 0 && !(options & F_QUIET)) {
 		if (options & F_FLOOD)
-			write(STDOUT_FILENO, "E", 1);
+			wr_ret = write(STDOUT_FILENO, "E", 1);
 		else
 			perror("ping: sendmsg");
 	}
@@ -402,8 +403,8 @@
 	rcvbuf = hold = alloc * preload;
 	if (hold < 65536)
 		hold = 65536;
-	setsockopt(icmp_sock, SOL_SOCKET, SO_RCVBUF, (char *)&hold, sizeof(hold));
-	if (getsockopt(icmp_sock, SOL_SOCKET, SO_RCVBUF, (char *)&hold, &tmplen) == 0) {
+	setsockopt(icmp_sock, SOL_SOCKET, SO_RCVBUF, (char *)&hold, (socklen_t)sizeof(hold));
+	if (getsockopt(icmp_sock, SOL_SOCKET, SO_RCVBUF, (char *)&hold, (socklen_t*)&tmplen) == 0) {
 		if (hold < rcvbuf)
 			fprintf(stderr, "WARNING: probably, rcvbuf is not enough to hold preload.\n");
 	}
@@ -650,7 +651,8 @@
 {
 	int dupflag = 0;
 	long triptime = 0;
-
+	ssize_t wr_ret;
+	
 	++nreceived;
 	if (!csfailed)
 		acknowledge(seq);
@@ -706,9 +708,9 @@
 
 	if (options & F_FLOOD) {
 		if (!csfailed)
-			write(STDOUT_FILENO, "\b \b", 3);
+			wr_ret = write(STDOUT_FILENO, "\b \b", 3);
 		else
-			write(STDOUT_FILENO, "\bC", 1);
+			wr_ret = write(STDOUT_FILENO, "\bC", 1);
 	} else {
 		int i;
 		__u8 *cp, *dp;
--- iputils/ping.c.gcc41	2006-01-25 16:21:47.000000000 +0100
+++ iputils/ping.c	2006-01-25 16:21:47.000000000 +0100
@@ -314,7 +314,7 @@
 			}
 		}
 		alen = sizeof(source);
-		if (getsockname(probe_fd, (struct sockaddr*)&source, &alen) == -1) {
+		if (getsockname(probe_fd, (struct sockaddr*)&source, (socklen_t*)&alen) == -1) {
 			perror("getsockname");
 			exit(2);
 		}
@@ -517,6 +517,7 @@
 	int net_errors = 0;
 	int local_errors = 0;
 	int saved_errno = errno;
+	ssize_t wr_ret;
 
 	iov.iov_base = &icmph;
 	iov.iov_len = sizeof(icmph);
@@ -547,7 +548,7 @@
 		if (options & F_QUIET)
 			goto out;
 		if (options & F_FLOOD)
-			write(STDOUT_FILENO, "E", 1);
+			wr_ret = write(STDOUT_FILENO, "E", 1);
 		else if (e->ee_errno != EMSGSIZE)
 			fprintf(stderr, "ping: local error: %s\n", strerror(e->ee_errno));
 		else
@@ -583,7 +584,7 @@
 		if (options & F_QUIET)
 			goto out;
 		if (options & F_FLOOD) {
-			write(STDOUT_FILENO, "\bE", 2);
+			wr_ret = write(STDOUT_FILENO, "\bE", 2);
 		} else {
 			printf("From %s icmp_seq=%u ", pr_addr(sin->sin_addr.s_addr), ntohs(icmph.un.echo.sequence));
 			pr_icmph(e->ee_type, e->ee_code, e->ee_info, NULL);
@@ -677,6 +678,7 @@
 	struct iphdr *ip;
 	int hlen;
 	int csfailed;
+	ssize_t wr_ret;
 
 	/* Check the IP header */
 	ip = (struct iphdr *)buf;
@@ -748,7 +750,7 @@
 					return !error_pkt;
 				if (options & F_FLOOD) {
 					if (error_pkt)
-						write(STDOUT_FILENO, "\bE", 2);
+						wr_ret = write(STDOUT_FILENO, "\bE", 2);
 					return !error_pkt;
 				}
 				printf("From %s: icmp_seq=%u ",
@@ -765,9 +767,9 @@
 		}
 		if ((options & F_FLOOD) && !(options & (F_VERBOSE|F_QUIET))) {
 			if (!csfailed)
-				write(STDOUT_FILENO, "!E", 2);
+				wr_ret = write(STDOUT_FILENO, "!E", 2);
 			else
-				write(STDOUT_FILENO, "!EC", 3);
+				wr_ret = write(STDOUT_FILENO, "!EC", 3);
 			return 0;
 		}
 		if (!(options & F_VERBOSE) || uid)
--- iputils/ping6.c.OLD	2006-02-06 10:34:35.000000000 +0100
+++ iputils/ping6.c	2006-02-06 10:35:38.000000000 +0100
@@ -353,7 +353,7 @@
 	hostname = target;
 
 	if (ipv6_addr_any(&source.sin6_addr)) {
-		int alen;
+		socklen_t alen;
 		int probe_fd = socket(AF_INET6, SOCK_DGRAM, 0);
 
 		if (probe_fd < 0) {
--- iputils/ping.c.OLD	2006-02-06 10:34:35.000000000 +0100
+++ iputils/ping.c	2006-02-06 10:34:35.000000000 +0100
@@ -253,7 +253,7 @@
 	}
 
 	if (source.sin_addr.s_addr == 0) {
-		int alen;
+		socklen_t alen;
 		struct sockaddr_in dst = whereto;
 		int probe_fd = socket(AF_INET, SOCK_DGRAM, 0);
 
@@ -855,9 +855,36 @@
 		case ICMP_SR_FAILED:
 			printf("Source Route Failed\n");
 			break;
+		case ICMP_NET_UNKNOWN:
+			printf("Destination Net Unknown\n");
+			break;
+		case ICMP_HOST_UNKNOWN:
+			printf("Destination Host Unknown\n");
+			break;
+		case ICMP_HOST_ISOLATED:
+			printf("Source Host Isolated\n");
+			break;
+		case ICMP_NET_ANO:
+			printf("Destination Net Prohibited\n");
+			break;
+		case ICMP_HOST_ANO:
+			printf("Destination Host Prohibited\n");
+			break;
+		case ICMP_NET_UNR_TOS:
+			printf("Destination Net Unreachable for Type of Service\n");
+			break;
+		case ICMP_HOST_UNR_TOS:
+			printf("Destination Host Unreachable for Type of Service\n");
+			break;
 		case ICMP_PKT_FILTERED:
 			printf("Packet filtered\n");
 			break;
+		case ICMP_PREC_VIOLATION:
+			printf("Precedence Violation\n");
+			break;
+		case ICMP_PREC_CUTOFF:
+			printf("Precedence Cutoff\n");
+			break;
 		default:
 			printf("Dest Unreachable, Bad Code: %d\n", code);
 			break;
--- iputils/ping_common.c.OLD	2006-02-06 10:34:35.000000000 +0100
+++ iputils/ping_common.c	2006-02-06 10:34:35.000000000 +0100
@@ -67,7 +67,7 @@
 	int ii, jj, kk;
 	int pat[16];
 	char *cp;
-	char *bp = outpack+8;
+	unsigned char *bp = outpack+8;
 
 	for (cp = patp; *cp; cp++) {
 		if (!isxdigit(*cp)) {
@@ -393,7 +393,7 @@
 void sock_setbufs(int icmp_sock, int alloc)
 {
 	int rcvbuf, hold;
-	int tmplen = sizeof(hold);
+	socklen_t tmplen = sizeof(hold);
 
 	if (!sndbuf)
 		sndbuf = alloc;
@@ -464,7 +464,7 @@
 
 	if (!(options & F_PINGFILLED)) {
 		int i;
-		char *p = outpack+8;
+		unsigned char *p = outpack+8;
 
 		/* Do not forget about case of small datalen,
 		 * fill timestamp area too!
@@ -819,7 +819,7 @@
 	}
 	if (pipesize > 1)
 		printf(", pipe %d", pipesize);
-	if (ntransmitted > 1 && (!interval || (options&(F_FLOOD|F_ADAPTIVE)))) {
+	if (ntransmitted > 1 && nreceived && (!interval || (options&(F_FLOOD|F_ADAPTIVE)))) {
 		int ipg = (1000000*(long long)tv.tv_sec+tv.tv_usec)/(ntransmitted-1);
 		printf(", ipg/ewma %d.%03d/%d.%03d ms",
 		       ipg/1000, ipg%1000, rtt/8000, (rtt/8)%1000);