exit: initial (very rough, builds) *BSD support - to the point
authorng0 <ng0@n0.is>
Fri, 22 Nov 2019 23:38:31 +0000 (23:38 +0000)
committerng0 <ng0@n0.is>
Fri, 22 Nov 2019 23:38:31 +0000 (23:38 +0000)
where the Linux specific binaries would still be used, thus marked
as experimental.

src/exit/Makefile.am
src/exit/gnunet-helper-exit.c

index c0323d0d617f4d4312f62e8ba67bfbcbb275a687..811761ed0f128ffc58c800bfacc7a3bd290c0705 100644 (file)
@@ -17,6 +17,12 @@ dist_pkgcfg_DATA = \
 if LINUX
 EXITBIN = gnunet-helper-exit
 endif
+# For testing purposes:
+if HAVE_EXPERIMENTAL
+if XBSD
+EXITBIN = gnunet-helper-exit
+endif
+endif
 
 
 libexec_PROGRAMS = \
index cf322725d0b22fc4e0fc17ff8f579a27f9cef4e6..9d20a0c50c942fd618217766d392025e58cd64f8 100644 (file)
  * - Philipp Tölke
  */
 #include "platform.h"
-#include <linux/if_tun.h>
+
+#ifdef IF_TUN_HDR
+#include IF_TUN_HDR
+#endif
+
+#if defined(BSD) || defined(SOLARIS)
+#define ifr_netmask ifr_ifru.ifru_addr
+#define SIOGIFINDEX SIOCGIFINDEX
+#endif
 
 /**
  * Need 'struct GNUNET_MessageHeader'.
@@ -182,6 +190,7 @@ fork_and_exec (const char *file,
  *        if *dev == '\\0', uses the name supplied by the kernel;
  * @return the fd to the tun or -1 on error
  */
+#ifdef IFF_TUN /* LINUX */
 static int
 init_tun (char *dev)
 {
@@ -225,7 +234,34 @@ init_tun (char *dev)
   strcpy (dev, ifr.ifr_name);
   return fd;
 }
+#else /* BSD et al, including DARWIN */
 
+#ifdef SIOCIFCREATE
+static int
+init_tun(char *dev)
+{
+  int fd;
+  int s;
+  struct ifreq ifr;
+
+  fd = open(dev, O_RDWR);
+  if(fd == -1)
+  {
+    s = socket(AF_INET, SOCK_DGRAM, 0);
+    if (s < 0)
+      return -1;
+    memset(&ifr, 0, sizeof(ifr));
+    strncpy(ifr.ifr_name, dev + 5, sizeof(ifr.ifr_name) - 1);
+    if (!ioctl(s, SIOCIFCREATE, &ifr))
+      fd = open(dev, O_RDWR);
+    close(s);
+  }
+  return fd;
+}
+#else
+#define init_tun(dev) open(dev, O_RDWR)
+#endif
+#endif /* !IFF_TUN (BSD) */
 
 /**
  * @brief Sets the IPv6-Address given in address on the interface dev