From 370488067045ce84c89f88cfd70577be14c9a48c Mon Sep 17 00:00:00 2001
From: Daniele Lacamera <danielinux@users.noreply.github.com>
Date: Wed, 20 Mar 2013 10:26:31 +0000

--- a/configure.ac
+++ b/configure.ac
@@ -41,6 +41,9 @@
 
 AC_CHECK_HEADERS([openssl/blowfish.h], [],
   [add_cryptcab_support=no ; warn_cryptcab=yes])
+
+AC_CHECK_HEADERS([sysexits.h], [],
+  [add_over_ns_support=no ; warn_over_ns=yes])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
@@ -91,7 +94,11 @@
 # Define VDE_LINUX or VDE_DARWIN
 case "$build_os" in
   linux*)
-    AC_DEFINE([VDE_LINUX], 1, [If defined, this is a Linux system])
+    if expr "$host_os" : ".*android" > /dev/null; then
+      AC_DEFINE([VDE_BIONIC], 1, [If defined, this is a Linux/bionic system])
+    else
+      AC_DEFINE([VDE_LINUX], 1, [If defined, this is a Linux system])
+    fi
   ;;
   darwin*)
     AC_DEFINE([VDE_DARWIN], 1, [If defined, this is a Darwin system])
@@ -123,6 +130,12 @@
   AS_HELP_STRING([--disable-cryptcab],
     [Disable libcrypto-dependend vde_cryptcab compilation]),
   [if test $enableval = "no" ; then add_cryptcab_support=no ; warn_cryptcab=no ; fi])
+
+# Disable vde_over_ns? (not working on android, maybe unwanted)
+AC_ARG_ENABLE([vde_over_ns],
+  AS_HELP_STRING([--disable-vde_over_ns],
+    [Disable vde_over_ns compilation]),
+  [if test $enableval = "no" ; then add_over_ns_support=no ; warn_over_ns=no ; fi])
 
 # Check of tuntap device
 AC_ARG_ENABLE([tuntap],
@@ -212,6 +225,7 @@
 
 
 AM_CONDITIONAL(ENABLE_CRYPTCAB, test "$add_cryptcab_support" = yes)
+AM_CONDITIONAL(ENABLE_VDE_OVER_NS, test "$add_over_ns_support" = yes)
 AM_CONDITIONAL(ENABLE_PYTHON, test "$enable_python" = yes)
 AM_CONDITIONAL(ENABLE_PCAP, test "$add_pcap" = yes)
 AM_CONDITIONAL(CAN_MAKE_LIBVDETAP, test "$can_make_libvdetap" = yes)
@@ -307,6 +321,14 @@
   fi
 fi
 
+if ! test x$add_over_ns_support = "xyes" ; then
+  if test x$warn_over_ns = "xyes" ; then
+    AC_MSG_WARN([VDE vde_over_ns support has been disabled because your libc
+    sysexits.h could not be found.])
+    AS_ECHO
+  fi
+fi
+
 if ! test x$enable_python = "xyes" ; then
     AC_MSG_WARN([Python libraries support has been disabled because python is
 not installed on your system, or because it could not be found. Please install

diff --git a/vde-2/src/Makefile.am b/vde-2/src/Makefile.am
index 49f8b78..8f79680 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -29,6 +29,10 @@
 
 if ENABLE_CRYPTCAB
   SUBDIRS += vde_cryptcab
+endif
+
+if ENABLE_VDE_OVER_NS
+  SUBDIRS += vde_over_ns
 endif
 
 if ENABLE_KERNEL_SWITCH

diff --git a/vde-2/src/lib/libvdeplug.c b/vde-2/src/lib/libvdeplug.c
index aa76b6a..e3623d9 100644
--- a/src/lib/libvdeplug.c
+++ b/src/lib/libvdeplug.c
@@ -189,10 +189,10 @@
 		}
 	} else {
 		char *split;
-		if((split = strstr(given_sockname,"->")) != NULL && rindex(split,':') != NULL)
+		if((split = strstr(given_sockname,"->")) != NULL && strrchr(split,':') != NULL)
 			flags |= VDEFLAG_UDP_SOCKET;
 		else if(given_sockname[strlen(given_sockname)-1] == ']' 
-				&& (split=rindex(given_sockname,'[')) != NULL) {
+				&& (split=strrchr(given_sockname,'[')) != NULL) {
 			*split=0;
 			split++;
 			port=atoi(split);
@@ -282,14 +282,14 @@
 		hints.ai_socktype=SOCK_DGRAM;
 		*dst=0;
 		dst+=2;
-		dstport=rindex(dst,':');
+		dstport=strrchr(dst,':');
 		if (dstport==NULL) {
 			errno=EINVAL;
 			goto abort;
 		}
 		*dstport=0;
 		dstport++;
-		srcport=rindex(src,':');
+		srcport=strrchr(src,':');
 		if (srcport==NULL) {
 			srcport=src;
 			src=NULL;
diff --git a/vde-2/src/vde_l3/vde_l3.c b/vde-2/src/vde_l3/vde_l3.c
index 3c4f72e..6a63467 100644
--- a/src/vde_l3/vde_l3.c
+++ b/src/vde_l3/vde_l3.c
@@ -40,7 +40,7 @@
 #define MAXCMD 255
 #define DEBUG 0
 
-#if defined(VDE_FREEBSD) || defined(VDE_DARWIN)
+#if defined(VDE_FREEBSD) || defined(VDE_DARWIN) || defined(VDE_BIONIC)
 #define ICMP_DEST_UNREACH 3
 #define ICMP_PROT_UNREACH 2
 #endif
diff --git a/vde-2/src/vde_plug2tap.c b/vde-2/src/vde_plug2tap.c
index 02b2d58..c769353 100644
--- a/src/vde_plug2tap.c
+++ b/src/vde_plug2tap.c
@@ -29,7 +29,7 @@
 
 #define BUFSIZE 2048
 
-#ifdef VDE_LINUX
+#if defined VDE_LINUX || defined VDE_BIONIC
 #include <net/if.h>
 #include <linux/if_tun.h>
 #endif
@@ -112,7 +112,7 @@ static void setsighandlers()
 		{ SIGUSR2, "SIGUSR2", 1 },
 		{ SIGPROF, "SIGPROF", 1 },
 		{ SIGVTALRM, "SIGVTALRM", 1 },
-#ifdef VDE_LINUX
+#if defined VDE_LINUX || defined VDE_BIONIC
 		{ SIGPOLL, "SIGPOLL", 1 },
 #ifdef SIGSTKFLT
 		{ SIGSTKFLT, "SIGSTKFLT", 1 },
@@ -172,6 +172,29 @@ int open_tap(char *dev)
 }
 #endif
 
+#ifdef VDE_BIONIC
+int open_tap(char *dev)
+{
+	struct ifreq ifr;
+	int fd;
+
+	if((fd = open("/dev/tun", O_RDWR)) < 0){
+		printlog(LOG_ERR,"Failed to open /dev/tun %s",strerror(errno));
+		return(-1);
+	}
+	memset(&ifr, 0, sizeof(ifr));
+	ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+	strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1);
+	/*printf("dev=\"%s\", ifr.ifr_name=\"%s\"\n", ifr.ifr_name, dev);*/
+	if(ioctl(fd, TUNSETIFF, (void *) &ifr) < 0){
+		printlog(LOG_ERR,"TUNSETIFF failed %s",strerror(errno));
+		close(fd);
+		return(-1);
+	}
+	return(fd);
+}
+#endif
+
 #if defined(VDE_DARWIN) || defined(VDE_FREEBSD)
 int open_tap(char *dev)
 {
diff --git a/vde-2/src/vde_switch/port.c b/vde-2/src/vde_switch/port.c
index 94c5660..f86897c 100644
--- a/src/vde_switch/port.c
+++ b/src/vde_switch/port.c
@@ -188,6 +188,9 @@
 	}
 }
 
+#ifdef VDE_BIONIC
+  static inline int user_belongs_to_group(uid_t uid, gid_t gid) { return 0; }
+#else
 /* 1 if user belongs to the group, 0 otherwise) */
 static int user_belongs_to_group(uid_t uid, gid_t gid)
 {
@@ -216,6 +219,7 @@
 		}
 	}
 }
+#endif
 
 
 /* Access Control check:
diff --git a/vde-2/src/vde_switch/tuntap.c b/vde-2/src/vde_switch/tuntap.c
index 9f3c0a2..59f3501 100644
--- a/src/vde_switch/tuntap.c
+++ b/src/vde_switch/tuntap.c
@@ -29,7 +29,7 @@
 
 #ifdef HAVE_TUNTAP
 
-#ifdef VDE_LINUX
+#if defined(VDE_LINUX) || defined(VDE_BIONIC)
 #include <net/if.h>
 #include <linux/if_tun.h>
 #endif
@@ -152,6 +152,29 @@
 	}
 	return outc;
 }
+
+#ifdef VDE_BIONIC
+int open_tap(char *dev)
+{
+	struct ifreq ifr;
+	int fd;
+
+	if((fd = open("/dev/tun", O_RDWR)) < 0){
+		printlog(LOG_ERR,"Failed to open /dev/tun %s",strerror(errno));
+		return(-1);
+	}
+	memset(&ifr, 0, sizeof(ifr));
+	ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+	strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1);
+	/*printf("dev=\"%s\", ifr.ifr_name=\"%s\"\n", ifr.ifr_name, dev);*/
+	if(ioctl(fd, TUNSETIFF, (void *) &ifr) < 0){
+		printlog(LOG_ERR,"TUNSETIFF failed %s",strerror(errno));
+		close(fd);
+		return(-1);
+	}
+	return(fd);
+}
+#endif
 
 #ifdef VDE_LINUX
 int open_tap(char *dev)

diff --git a/vde-2/src/vdetaplib/libvdetap.c b/vde-2/src/vdetaplib/libvdetap.c
index 00cd401..910811c 100644
--- a/src/vdetaplib/libvdetap.c
+++ b/src/vdetaplib/libvdetap.c
@@ -154,7 +154,12 @@
 		return "";
 }
 
+
+#ifdef VDE_BIONIC
+int ioctl(int fd, int command, ...)
+#else
 int ioctl(int fd, unsigned long int command, ...)
+#endif
 {
 	va_list ap;
 	char *data;