Adjust ping6.c to compile on Android.

In addition to the .mk files and other things required for the build
system, we make add two simple #defines that NetBSD libc has but Bionic
libc lacks, and remove two features: Support for sending packets along
specific routes (largely unused, and partially deprecated from the
IETF), and sending packets to named multicast groups, where the
multicast address is generated from an ASCII string using MD5
(very obscure).

Change-Id: I5fd55ed15e73a3367a7a127a30234239f77a11f5
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..fae2721
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,12 @@
+ifneq ($(TARGET_SIMULATOR),true)
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES:= ping6.c
+LOCAL_MODULE := ping6
+LOCAL_MODULE_TAGS := eng
+LOCAL_STATIC_LIBRARIES := libcutils libc
+include $(BUILD_EXECUTABLE)
+
+endif  # TARGET_SIMULATOR != true
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..b84e1b6
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,49 @@
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..2eff114
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,57 @@
+Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the project nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+
+Copyright (c) 1989, 1993
+     The Regents of the University of California.  All rights reserved.
+
+This code is derived from software contributed to Berkeley by
+Mike Muuss.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/ThirdPartyProject.prop b/ThirdPartyProject.prop
new file mode 100644
index 0000000..e7bcccb
--- /dev/null
+++ b/ThirdPartyProject.prop
@@ -0,0 +1,9 @@
+# Copyright 2011 Google Inc. All Rights Reserved.
+# Wed, 19 Jan 2011 20:17:59 +0100
+currentVersion=1.73
+version=Unknown
+isNative=true
+name=ping6
+keywords=ping
+onDevice=true
+homepage=http\://cvsweb.netbsd.org/bsdweb.cgi/src/sbin/ping6/ping6.c
diff --git a/ping6.c b/ping6.c
index 1587119..ccf9c4c 100644
--- a/ping6.c
+++ b/ping6.c
@@ -136,7 +136,17 @@
 #include <netinet6/ipsec.h>
 #endif
 
+/*
+ * We currently don't have the libc support required for these two features in
+ * Android. Should we get enough support later, feel free to remove the #ifdefs
+ * altogether.
+ */
+#undef ANDROID_INCLUDE_MD5_SUPPORT
+#undef ANDROID_INCLUDE_RTHDR_SUPPORT
+
+#ifdef ANDROID_INCLUDE_MD5_SUPPORT
 #include <md5.h>
+#endif
 
 struct tv32 {
 	u_int32_t tv32_sec;
@@ -197,6 +207,10 @@
 
 #define SIN6(s)	((struct sockaddr_in6 *)(s))
 
+/* Android-specific hacks to get this to compile.*/
+#define INFTIM             -1
+#define MAXDNAME           1025
+
 /*
  * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum
  * number of received sequence numbers we can keep track of.  Change 128
@@ -269,14 +283,18 @@
 	char *, size_t);
 void	 pr_pack(u_char *, int, struct msghdr *);
 void	 pr_exthdrs(struct msghdr *);
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 void	 pr_ip6opt(void *);
 void	 pr_rthdr(void *);
+#endif
 int	 pr_bitrange(u_int32_t, int, int);
 void	 pr_retip(struct ip6_hdr *, u_char *);
 void	 summary(void);
 void	 tvsub(struct timeval *, struct timeval *);
 int	 setpolicy(int, char *);
+#ifdef ANDROID_INCLUDE_MD5_SUPPORT
 char	*nigroup(char *);
+#endif
 void	 usage(void);
 
 int
@@ -300,7 +318,9 @@
 #endif
 	int usepktinfo = 0;
 	struct in6_pktinfo *pktinfo = NULL;
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 	struct ip6_rthdr *rthdr = NULL;
+#endif
 #ifdef IPSEC_POLICY_IPSEC
 	char *policy_in = NULL;
 	char *policy_out = NULL;
@@ -326,8 +346,14 @@
 #define ADDOPTS	"AE"
 #endif /*IPSEC_POLICY_IPSEC*/
 #endif
+
+#ifdef ANDROID_INCLUDE_MD5_SUPPORT
+#define ANDROID_MD5_OPTS "N"
+#else
+#define ANDROID_MD5_OPTS ""
+#endif
 	while ((ch = getopt(argc, argv,
-	    "a:b:c:dfHg:h:I:i:l:mnNp:qRS:s:tvwW" ADDOPTS)) != -1) {
+	    "a:b:c:dfHg:h:I:i:l:mnp:qRS:s:tvwW" ADDOPTS ANDROID_MD5_OPTS)) != -1) {
 #undef ADDOPTS
 		switch (ch) {
 		case 'a':
@@ -465,9 +491,11 @@
 		case 'n':
 			options &= ~F_HOSTNAME;
 			break;
+#ifdef ANDROID_INCLUDE_MD5_SUPPORT
 		case 'N':
 			options |= F_NIGROUP;
 			break;
+#endif
 		case 'p':		/* fill buffer with user pattern */
 			options |= F_PINGFILLED;
 			fill((char *)datap, optarg);
@@ -565,6 +593,7 @@
 	}
 
 	if (argc > 1) {
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 		rthlen = CMSG_SPACE(inet6_rth_space(IPV6_RTHDR_TYPE_0,
 		    argc - 1));
 		if (rthlen == 0) {
@@ -572,8 +601,12 @@
 			/*NOTREACHED*/
 		}
 		ip6optlen += rthlen;
+#else
+		errx(1, "compiled without support for routing headers");
+#endif
 	}
 
+#ifdef ANDROID_INCLUDE_MD5_SUPPORT
 	if (options & F_NIGROUP) {
 		target = nigroup(argv[argc - 1]);
 		if (target == NULL) {
@@ -581,6 +614,7 @@
 			/*NOTREACHED*/
 		}
 	} else
+#endif
 		target = argv[argc - 1];
 
 	/* getaddrinfo */
@@ -866,6 +900,7 @@
 #endif
 
 	if (argc > 1) {	/* some intermediate addrs are specified */
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 		int hops, error;
 		int rthdrlen;
 
@@ -896,6 +931,9 @@
 		}
 
 		scmsgp = CMSG_NXTHDR(&smsghdr, scmsgp);
+#else
+		errx(1, "compiled without support for routing headers");
+#endif
 	}
 
 	if (!(options & F_SRCADDR)) {
@@ -929,10 +967,12 @@
 		    (void *)&hoplimit, sizeof(hoplimit)))
 			err(1, "UDP setsockopt(IPV6_MULTICAST_HOPS)");
 
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 		if (rthdr &&
 		    setsockopt(dummy, IPPROTO_IPV6, IPV6_RTHDR,
 		    (void *)rthdr, (rthdr->ip6r_len + 1) << 3))
 			err(1, "UDP setsockopt(IPV6_RTHDR)");
+#endif
 
 		if (connect(dummy, (struct sockaddr *)&src, len) < 0)
 			err(1, "UDP connect");
@@ -1677,6 +1717,7 @@
 			continue;
 
 		switch (cm->cmsg_type) {
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 		case IPV6_HOPOPTS:
 			printf("  HbH Options: ");
 			pr_ip6opt(CMSG_DATA(cm));
@@ -1692,10 +1733,12 @@
 			printf("  Routing: ");
 			pr_rthdr(CMSG_DATA(cm));
 			break;
+#endif
 		}
 	}
 }
 
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 void
 pr_ip6opt(void *extbuf)
 {
@@ -1747,7 +1790,9 @@
 	}
 	return;
 }
+#endif
 
+#ifdef ANDROID_INCLUDE_RTHDR_SUPPORT
 void
 pr_rthdr(void *extbuf)
 {
@@ -1780,6 +1825,7 @@
 	return;
 
 }
+#endif
 
 int
 pr_bitrange(u_int32_t v, int soff, int ii)
@@ -2553,6 +2599,7 @@
 #endif
 #endif
 
+#ifdef ANDROID_INCLUDE_MD5_SUPPORT
 char *
 nigroup(char *name)
 {
@@ -2596,6 +2643,7 @@
 
 	return strdup(hbuf);
 }
+#endif
 
 void
 usage(void)