[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r15878 - in gnunet/src: include nat util
From: |
gnunet |
Subject: |
[GNUnet-SVN] r15878 - in gnunet/src: include nat util |
Date: |
Thu, 7 Jul 2011 18:02:58 +0200 |
Author: grothoff
Date: 2011-07-07 18:02:57 +0200 (Thu, 07 Jul 2011)
New Revision: 15878
Modified:
gnunet/src/include/gnunet_os_lib.h
gnunet/src/nat/nat.c
gnunet/src/util/os_installation.c
Log:
move SUID test code to util
Modified: gnunet/src/include/gnunet_os_lib.h
===================================================================
--- gnunet/src/include/gnunet_os_lib.h 2011-07-07 15:32:31 UTC (rev 15877)
+++ gnunet/src/include/gnunet_os_lib.h 2011-07-07 16:02:57 UTC (rev 15878)
@@ -282,6 +282,22 @@
const struct
GNUNET_SCHEDULER_TaskContext * tc);
+
+/**
+ * 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.
+ * On W32, if the binary exists, this function tests if we are running
+ * with administrative rights (sufficient to create RAW sockets).
+ *
+ * @param binary the name of the file to check
+ * @return GNUNET_YES if the file is SUID,
+ * GNUNET_NO if not,
+ * GNUNET_SYSERR on error
+ */
+int
+GNUNET_OS_check_helper_binary (const char *binary);
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
Modified: gnunet/src/nat/nat.c
===================================================================
--- gnunet/src/nat/nat.c 2011-07-07 15:32:31 UTC (rev 15877)
+++ gnunet/src/nat/nat.c 2011-07-07 16:02:57 UTC (rev 15878)
@@ -675,121 +675,6 @@
/**
- * Return the actual path to a file found in the current
- * PATH environment variable.
- *
- * @param binary the name of the file to find
- * @return path to binary, NULL if not found
- */
-static char *
-get_path_from_PATH (const char *binary)
-{
- char *path;
- char *pos;
- char *end;
- char *buf;
- const char *p;
-
- p = getenv ("PATH");
- if (p == NULL)
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
- "tcp",
- _("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;
-
- while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
- {
- *end = '\0';
- sprintf (buf, "%s/%s", pos, binary);
- if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
- {
- GNUNET_free (path);
- return buf;
- }
- pos = end + 1;
- }
- sprintf (buf, "%s/%s", pos, binary);
- if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
- {
- 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 file is SUID,
- * GNUNET_NO if not,
- * GNUNET_SYSERR on error
- */
-static int
-check_gnunet_nat_binary (const char *binary)
-{
- struct stat statbuf;
- char *p;
-#ifdef MINGW
- SOCKET rawsock;
- 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)
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
- "tcp",
- _("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_from (GNUNET_ERROR_TYPE_WARNING,
- "tcp",
- "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) failed! GLE =
%d\n", err);
- return GNUNET_NO; /* not running as administrator */
- }
- closesocket (rawsock);
- return GNUNET_YES;
-#endif
-}
-
-
-/**
* Task that restarts the gnunet-helper-nat-server process after a crash
* after a certain delay.
*
@@ -1251,7 +1136,7 @@
/* Test for SUID binaries */
if ( (h->behind_nat == GNUNET_YES) &&
(GNUNET_YES == h->enable_nat_server) &&
- (GNUNET_YES != check_gnunet_nat_binary("gnunet-helper-nat-server")) )
+ (GNUNET_YES !=
GNUNET_OS_check_helper_binary("gnunet-helper-nat-server")) )
{
h->enable_nat_server = GNUNET_NO;
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -1259,7 +1144,7 @@
"gnunet-helper-nat-server");
}
if ( (GNUNET_YES == h->enable_nat_client) &&
- (GNUNET_YES != check_gnunet_nat_binary("gnunet-helper-nat-client")) )
+ (GNUNET_YES !=
GNUNET_OS_check_helper_binary("gnunet-helper-nat-client")) )
{
h->enable_nat_client = GNUNET_NO;
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
Modified: gnunet/src/util/os_installation.c
===================================================================
--- gnunet/src/util/os_installation.c 2011-07-07 15:32:31 UTC (rev 15877)
+++ gnunet/src/util/os_installation.c 2011-07-07 16:02:57 UTC (rev 15878)
@@ -193,8 +193,15 @@
}
#endif
+/**
+ * Return the actual path to a file found in the current
+ * PATH environment variable.
+ *
+ * @param binary the name of the file to find
+ * @return path to binary, NULL if not found
+ */
static char *
-get_path_from_PATH ()
+get_path_from_PATH (const char *binary)
{
char *path;
char *pos;
@@ -212,7 +219,7 @@
while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
{
*end = '\0';
- sprintf (buf, "%s/%s", pos, "gnunet-arm");
+ sprintf (buf, "%s/%s", pos, binary);
if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
{
pos = GNUNET_strdup (pos);
@@ -222,7 +229,7 @@
}
pos = end + 1;
}
- sprintf (buf, "%s/%s", pos, "gnunet-arm");
+ sprintf (buf, "%s/%s", pos, binary);
if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
{
pos = GNUNET_strdup (pos);
@@ -281,7 +288,7 @@
if (ret != NULL)
return ret;
#endif
- ret = get_path_from_PATH ();
+ ret = get_path_from_PATH ("gnunet-arm");
if (ret != NULL)
return ret;
/* other attempts here */
@@ -430,4 +437,69 @@
return tmp;
}
+
+/**
+ * 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 file is SUID,
+ * GNUNET_NO if not,
+ * GNUNET_SYSERR on error
+ */
+int
+GNUNET_OS_check_helper_binary (const char *binary)
+{
+ struct stat statbuf;
+ char *p;
+#ifdef MINGW
+ SOCKET rawsock;
+ 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)
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
+ "tcp",
+ _("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_from (GNUNET_ERROR_TYPE_WARNING,
+ "tcp",
+ "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) failed! GLE =
%d\n", err);
+ return GNUNET_NO; /* not running as administrator */
+ }
+ closesocket (rawsock);
+ return GNUNET_YES;
+#endif
+}
+
+
/* end of os_installation.c */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r15878 - in gnunet/src: include nat util,
gnunet <=