gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r13901 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r13901 - gnunet/src/transport
Date: Tue, 14 Dec 2010 16:00:26 +0100

Author: nevans
Date: 2010-12-14 16:00:26 +0100 (Tue, 14 Dec 2010)
New Revision: 13901

Modified:
   gnunet/src/transport/test_transport_api.c
Log:
windoze friendly check for nat binaries

Modified: gnunet/src/transport/test_transport_api.c
===================================================================
--- gnunet/src/transport/test_transport_api.c   2010-12-14 10:37:04 UTC (rev 
13900)
+++ gnunet/src/transport/test_transport_api.c   2010-12-14 15:00:26 UTC (rev 
13901)
@@ -470,9 +470,14 @@
   return ok;
 }
 
-
+/**
+ * Return the actual path to a file found in the current
+ * PATH environment variable.
+ *
+ * @param binary the name of the file to find
+ */
 static char *
-get_path_from_PATH ()
+get_path_from_PATH (char *binary)
 {
   char *path;
   char *pos;
@@ -482,7 +487,11 @@
 
   p = getenv ("PATH");
   if (p == NULL)
-    return NULL;
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  _("PATH environment variable is unset.\n"));
+      return NULL;
+    }
   path = GNUNET_strdup (p);     /* because we write on it */
   buf = GNUNET_malloc (strlen (path) + 20);
   pos = path;
@@ -490,7 +499,7 @@
   while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
     {
       *end = '\0';
-      sprintf (buf, "%s/%s", pos, "gnunet-nat-server");
+      sprintf (buf, "%s/%s", pos, binary);
       if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
         {
           GNUNET_free (path);
@@ -498,34 +507,78 @@
         }
       pos = end + 1;
     }
-  sprintf (buf, "%s/%s", pos, "gnunet-nat-server");
-  GNUNET_free (path);
+  sprintf (buf, "%s/%s", pos, binary);
   if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
-    return buf;
+    {
+      GNUNET_free (path);
+      return buf;
+    }
   GNUNET_free (buf);
+  GNUNET_free (path);
   return NULL;
 }
 
-
+/**
+ * Check whether the suid bit is set on a file.
+ * Attempts to find the file using the current
+ * PATH environment variable as a search path.
+ *
+ * @param binary the name of the file to check
+ *
+ * @return GNUNET_YES if the binary is found and
+ *         can be run properly, GNUNET_NO otherwise
+ */
 static int
-check_gnunet_nat_server()
+check_gnunet_nat_binary(char *binary)
 {
   struct stat statbuf;
   char *p;
+#ifdef MINGW
+  SOCKET rawsock;
+#endif
 
-  p = get_path_from_PATH ();
+#ifdef MINGW
+  char *binaryexe;
+  GNUNET_asprintf (&binaryexe, "%s.exe", binary);
+  p = get_path_from_PATH (binaryexe);
+  free (binaryexe);
+#else
+  p = get_path_from_PATH (binary);
+#endif
   if (p == NULL)
-    return GNUNET_NO;
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  _("Could not find binary `%s' in PATH!\n"),
+                  binary);
+      return GNUNET_NO;
+    }
   if (0 != STAT (p, &statbuf))
     {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  _("stat (%s) failed: %s\n"),
+                  p,
+                  STRERROR (errno));
       GNUNET_free (p);
       return GNUNET_SYSERR;
     }
   GNUNET_free (p);
+#ifndef MINGW
   if ( (0 != (statbuf.st_mode & S_ISUID)) &&
        (statbuf.st_uid == 0) )
     return GNUNET_YES;
   return GNUNET_NO;
+#else
+  rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);
+  if (INVALID_SOCKET == rawsock)
+    {
+      DWORD err = GetLastError ();
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) have failed! GLE = 
%d\n", err);
+      return GNUNET_NO; /* not running as administrator */
+    }
+  closesocket (rawsock);
+  return GNUNET_YES;
+#endif
 }
 
 int
@@ -547,7 +600,7 @@
   if (strstr(argv[0], "tcp_nat") != NULL)
     {
       is_tcp_nat = GNUNET_YES;
-      if (check_gnunet_nat_server() != GNUNET_OK)
+      if (GNUNET_YES != check_gnunet_nat_binary("gnunet-nat-server"))
         {
           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                       "`%s' not properly installed, cannot run NAT test!\n",
@@ -562,7 +615,7 @@
   else if (strstr(argv[0], "udp_nat") != NULL)
     {
       is_udp_nat = GNUNET_YES;
-      if (check_gnunet_nat_server() != GNUNET_OK)
+      if (GNUNET_YES != check_gnunet_nat_binary("gnunet-nat-server"))
         {
           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                       "`%s' not properly installed, cannot run NAT test!\n",




reply via email to

[Prev in Thread] Current Thread [Next in Thread]