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)