In Windows, pipes, files and the console have to be accessed
[oweals/gnunet.git] / src / vpn / gnunet-service-vpn.c
index 5a52a6cda915c975f9de11eafa76c0196aa0c2b0..1a46f0b5eb833c624b8dbb4263a4af73e7dc1864 100644 (file)
@@ -35,6 +35,7 @@
 #include "gnunet_statistics_service.h"
 #include "gnunet_constants.h"
 #include "gnunet_tun_lib.h"
+#include "gnunet_regex_lib.h"
 #include "vpn.h"
 #include "exit.h"
 
@@ -807,27 +808,45 @@ create_tunnel_to_destination (struct DestinationEntry *de,
   }
   else
   {
+    char *policy;
+
     switch (de->details.exit_destination.af)
     {
     case AF_INET:
-      GNUNET_MESH_peer_request_connect_by_type (ts->tunnel,
-                                               GNUNET_APPLICATION_TYPE_IPV4_GATEWAY);
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                 "Creating tunnel to exit peer for %s\n",
-                 "IPv4");
-     break;
+    {
+      char address[GNUNET_REGEX_IPV4_REGEXLEN];
+      GNUNET_REGEX_ipv4toregex (&de->details.exit_destination.ip.v4,
+                                "255.255.255.255", address);
+      GNUNET_asprintf (&policy, "%s%s%s",
+                       GNUNET_APPLICATION_TYPE_EXIT_REGEX_PREFIX,
+                       "4",
+                       address);
+      break;
+    }
     case AF_INET6:
-      GNUNET_MESH_peer_request_connect_by_type (ts->tunnel,
-                                               GNUNET_APPLICATION_TYPE_IPV6_GATEWAY);
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                 "Creating tunnel to exit peer for %s\n",
-                 "IPv6");
+    {
+      char address[GNUNET_REGEX_IPV6_REGEXLEN];
+      GNUNET_REGEX_ipv6toregex (&de->details.exit_destination.ip.v6,
+                                128, address);
+      GNUNET_asprintf (&policy, "%s%s%s",
+                       GNUNET_APPLICATION_TYPE_EXIT_REGEX_PREFIX,
+                       "6",
+                       address);
       break;
+    }
     default:
       GNUNET_assert (0);
       break;
     }
-  }  
+
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requesting connect by string: %s\n", policy);
+
+    GNUNET_MESH_peer_request_connect_by_string (ts->tunnel, policy);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Creating tunnel to exit peer for policy `%s'\n",
+                policy);
+    GNUNET_free (policy);
+  }
   return ts;
 }
 
@@ -3002,31 +3021,6 @@ client_disconnect (void *cls, struct GNUNET_SERVER_Client *client)
 }
 
 
-/**
- * Test if the given AF is supported by this system.
- * 
- * @param af to test
- * @return GNUNET_OK if the AF is supported
- */
-static int
-test_af (int af)
-{
-  int s;
-
-  s = socket (af, SOCK_STREAM, 0);
-  if (-1 == s)
-  {
-    if (EAFNOSUPPORT == errno)
-      return GNUNET_NO;
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
-                        "socket");
-    return GNUNET_SYSERR;
-  }
-  (void) close (s);
-  return GNUNET_OK;
-}
-
-
 /**
  * Main function that will be run by the scheduler.
  *
@@ -3063,16 +3057,21 @@ run (void *cls,
   char *ipv4mask;
   struct in_addr v4;
   struct in6_addr v6;
+  char *binary;
+
+  binary = GNUNET_OS_get_libexec_binary_path ("gnunet-helper-vpn");
 
   if (GNUNET_YES !=
-      GNUNET_OS_check_helper_binary ("gnunet-helper-vpn"))
+      GNUNET_OS_check_helper_binary (binary))
   {
     fprintf (stderr,
             "`%s' is not SUID, refusing to run.\n",
             "gnunet-helper-vpn");
+    GNUNET_free (binary);
     global_ret = 1;
     return;
   }
+  GNUNET_free (binary);
   cfg = cfg_;
   stats = GNUNET_STATISTICS_create ("vpn", cfg);
   if (GNUNET_OK !=
@@ -3100,7 +3099,7 @@ run (void *cls,
     return;
   }
   vpn_argv[1] = ifname;
-  if (GNUNET_OK == test_af (AF_INET6))
+  if (GNUNET_OK == GNUNET_NETWORK_test_pf (PF_INET6))
   {
     if ( (GNUNET_SYSERR ==
          GNUNET_CONFIGURATION_get_value_string (cfg, "vpn", "IPV6ADDR",
@@ -3140,7 +3139,7 @@ run (void *cls,
     vpn_argv[2] = GNUNET_strdup ("-");
     vpn_argv[3] = GNUNET_strdup ("-");
   }
-  if (GNUNET_OK == test_af (AF_INET))
+  if (GNUNET_OK == GNUNET_NETWORK_test_pf (PF_INET))
   {
     if ( (GNUNET_SYSERR ==
          GNUNET_CONFIGURATION_get_value_string (cfg, "vpn", "IPV4ADDR",