X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Futil%2Fos_installation.c;h=1226c59662272be443a1a0bf17a21717ec43d4ab;hb=79fb947eb8fba243ea65e19b40b65e04f8806865;hp=98ac7b989c18d90897a7d4aa737e39848742e108;hpb=61c39c60565b386e0e12ea669556b030e8cd7180;p=oweals%2Fgnunet.git diff --git a/src/util/os_installation.c b/src/util/os_installation.c index 98ac7b989..1226c5966 100644 --- a/src/util/os_installation.c +++ b/src/util/os_installation.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2006 Christian Grothoff (and other contributing authors) + Copyright (C) 2006-2016 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,14 +14,19 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** * @file src/util/os_installation.c * @brief get paths used by the program * @author Milan + * @author Christian Fuchs + * @author Christian Grothoff + * @author Matthias Wachs + * @author Heikki Lindholm + * @author LRN */ #include #include @@ -39,9 +44,65 @@ #endif -#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) +#define LOG(kind,...) GNUNET_log_from (kind, "util-os-installation", __VA_ARGS__) + +#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util-os-installation", syscall, filename) + + +/** + * Default project data used for installation path detection + * for GNUnet (core). + */ +static const struct GNUNET_OS_ProjectData default_pd = { + .libname = "libgnunetutil", + .project_dirname = "gnunet", + .binary_name = "gnunet-arm", + .env_varname = "GNUNET_PREFIX", + .base_config_varname = "GNUNET_BASE_CONFIG", + .bug_email = "gnunet-developers@gnu.org", + .homepage = "http://www.gnu.org/s/gnunet/", + .config_file = "gnunet.conf", + .user_config_file = "~/.config/gnunet.conf", +}; + +/** + * Which project data do we currently use for installation + * path detection? Never NULL. + */ +static const struct GNUNET_OS_ProjectData *current_pd = &default_pd; + +/** + * Return default project data used by 'libgnunetutil' for GNUnet. + */ +const struct GNUNET_OS_ProjectData * +GNUNET_OS_project_data_default (void) +{ + return &default_pd; +} + + +/** + * @return current project data. + */ +const struct GNUNET_OS_ProjectData * +GNUNET_OS_project_data_get () +{ + return current_pd; +} + + +/** + * Setup OS subsystem with project data. + * + * @param pd project data used to determine paths + */ +void +GNUNET_OS_init (const struct GNUNET_OS_ProjectData *pd) +{ + GNUNET_assert (NULL != pd); + current_pd = pd; +} -#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util", syscall, filename) #if LINUX /** @@ -64,8 +125,9 @@ get_path_from_proc_maps () while (NULL != fgets (line, sizeof (line), f)) { if ((1 == - SSCANF (line, "%*x-%*x %*c%*c%*c%*c %*x %*2u:%*2u %*u%*[ ]%1023s", dir)) && - (NULL != (lgu = strstr (dir, "libgnunetutil")))) + SSCANF (line, "%*x-%*x %*c%*c%*c%*c %*x %*2x:%*2x %*u%*[ ]%1023s", dir)) && + (NULL != (lgu = strstr (dir, + current_pd->libname)))) { lgu[0] = '\0'; FCLOSE (f); @@ -88,6 +150,7 @@ get_path_from_proc_exe () char fn[64]; char lnk[1024]; ssize_t size; + char *lep; GNUNET_snprintf (fn, sizeof (fn), "/proc/%u/exe", getpid ()); size = readlink (fn, lnk, sizeof (lnk) - 1); @@ -100,11 +163,15 @@ get_path_from_proc_exe () lnk[size] = '\0'; while ((lnk[size] != '/') && (size > 0)) size--; - /* test for being in lib/gnunet/libexec/ */ - if ( (size > strlen ("/gnunet/libexec/")) && - (0 == strcmp ("/gnunet/libexec/", - &lnk[size - strlen ("/gnunet/libexec/")])) ) - size -= strlen ("gnunet/libexec/"); + GNUNET_asprintf (&lep, + "/%s/libexec/", + current_pd->project_dirname); + /* test for being in lib/gnunet/libexec/ or lib/MULTIARCH/gnunet/libexec */ + if ( (size > strlen (lep)) && + (0 == strcmp (lep, + &lnk[size - strlen (lep)])) ) + size -= strlen (lep) - 1; + GNUNET_free (lep); if ((size < 4) || (lnk[size - 4] != '/')) { /* not installed in "/bin/" -- binary path probably useless */ @@ -115,17 +182,20 @@ get_path_from_proc_exe () } #endif -#if WINDOWS +#if WINDOWS static HINSTANCE dll_instance; -/* GNUNET_util_cl_init() in common_logging.c is preferred. +/** + * GNUNET_util_cl_init() in common_logging.c is preferred. * This function is only for thread-local storage (not used in GNUnet) * and hInstance saving. */ BOOL WINAPI -DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) { switch (fdwReason) { @@ -166,12 +236,15 @@ get_path_from_module_filename () do { pathlen = pathlen * 2; - modulepath = GNUNET_realloc (modulepath, pathlen * sizeof (wchar_t)); + modulepath = GNUNET_realloc (modulepath, + pathlen * sizeof (wchar_t)); SetLastError (0); - real_pathlen = GetModuleFileNameW (dll_instance, modulepath, pathlen * sizeof (wchar_t)); + real_pathlen = GetModuleFileNameW (dll_instance, + modulepath, + pathlen * sizeof (wchar_t)); } while (real_pathlen >= pathlen && pathlen < 16*1024); if (real_pathlen >= pathlen) - GNUNET_abort (); + GNUNET_assert (0); /* To be safe */ modulepath[real_pathlen] = '\0'; @@ -213,10 +286,10 @@ get_path_from_module_filename () /* modulepath is GNUNET_PREFIX */ u8_string = u16_to_u8 (modulepath, wcslen (modulepath), NULL, &u8_string_length); if (NULL == u8_string) - GNUNET_abort (); + GNUNET_assert (0); upath = GNUNET_malloc (u8_string_length + 1); - memcpy (upath, u8_string, u8_string_length); + GNUNET_memcpy (upath, u8_string, u8_string_length); upath[u8_string_length] = '\0'; free (u8_string); @@ -226,15 +299,18 @@ get_path_from_module_filename () } #endif + #if DARWIN /** * Signature of the '_NSGetExecutablePath" function. * * @param buf where to write the path - * @param number of bytes available in 'buf' + * @param number of bytes available in @a buf * @return 0 on success, otherwise desired number of bytes is stored in 'bufsize' */ -typedef int (*MyNSGetExecutablePathProto) (char *buf, size_t * bufsize); +typedef int +(*MyNSGetExecutablePathProto) (char *buf, + size_t *bufsize); /** @@ -291,7 +367,8 @@ get_path_from_dyld_image () c = _dyld_image_count (); for (i = 0; i < c; i++) { - if (((const void *) _dyld_get_image_header (i)) != (const void *)&_mh_dylib_header) + if (((const void *) _dyld_get_image_header (i)) != + ((const void *) &_mh_dylib_header) ) continue; path = _dyld_get_image_name (i); if ( (NULL == path) || (0 == strlen (path)) ) @@ -373,7 +450,11 @@ get_path_from_GNUNET_PREFIX () { const char *p; - if (NULL != (p = getenv ("GNUNET_PREFIX"))) + if ( (NULL != current_pd->env_varname) && + (NULL != (p = getenv (current_pd->env_varname))) ) + return GNUNET_strdup (p); + if ( (NULL != current_pd->env_varname_alt) && + (NULL != (p = getenv (current_pd->env_varname_alt))) ) return GNUNET_strdup (p); return NULL; } @@ -396,7 +477,8 @@ os_get_gnunet_path () if (NULL != (ret = get_path_from_proc_maps ())) return ret; /* try path *first*, before /proc/exe, as /proc/exe can be wrong */ - if (NULL != (ret = get_path_from_PATH ("gnunet-arm"))) + if ( (NULL != current_pd->binary_name) && + (NULL != (ret = get_path_from_PATH (current_pd->binary_name))) ) return ret; if (NULL != (ret = get_path_from_proc_exe ())) return ret; @@ -411,21 +493,20 @@ os_get_gnunet_path () if (NULL != (ret = get_path_from_NSGetExecutablePath ())) return ret; #endif - if (NULL != (ret = get_path_from_PATH ("gnunet-arm"))) + if ( (NULL != current_pd->binary_name) && + (NULL != (ret = get_path_from_PATH (current_pd->binary_name))) ) return ret; /* other attempts here */ LOG (GNUNET_ERROR_TYPE_ERROR, - _ - ("Could not determine installation path for %s. Set `%s' environment variable.\n"), - "GNUnet", "GNUNET_PREFIX"); + _("Could not determine installation path for %s. Set `%s' environment variable.\n"), + current_pd->project_dirname, + current_pd->env_varname); return NULL; } /** * @brief get the path to current app's bin/ - * @author Milan - * * @return a pointer to the executable path, or NULL on error */ static char * @@ -452,17 +533,18 @@ os_get_exec_path () /** * @brief get the path to a specific GNUnet installation directory or, - * with GNUNET_IPK_SELF_PREFIX, the current running apps installation directory - * @author Milan + * with #GNUNET_OS_IPK_SELF_PREFIX, the current running apps installation directory * @return a pointer to the dir path (to be freed by the caller) */ char * GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) { size_t n; - const char *dirname; + char *dirname; char *execpath = NULL; char *tmp; + char *multiarch; + char *libdir; int isbasedir; /* if wanted, try to get the current app's bin/ */ @@ -511,6 +593,17 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) execpath[n - 4] = '\0'; n -= 4; } + multiarch = NULL; + if (NULL != (libdir = strstr (execpath, "/lib/"))) + { + /* test for multi-arch path of the form "PREFIX/lib/MULTIARCH/"; + here we need to re-add 'multiarch' to lib and libexec paths later! */ + multiarch = &libdir[5]; + if (NULL == strchr (multiarch, '/')) + libdir[0] = '\0'; /* Debian multiarch format, cut of from 'execpath' but preserve in multicarch */ + else + multiarch = NULL; /* maybe not, multiarch still has a '/', which is not OK */ + } /* in case this was a directory named foo-bin, remove "foo-" */ while ((n > 1) && (execpath[n - 1] == DIR_SEPARATOR)) execpath[--n] = '\0'; @@ -518,97 +611,150 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) { case GNUNET_OS_IPK_PREFIX: case GNUNET_OS_IPK_SELF_PREFIX: - dirname = DIR_SEPARATOR_STR; + dirname = GNUNET_strdup (DIR_SEPARATOR_STR); break; case GNUNET_OS_IPK_BINDIR: - dirname = DIR_SEPARATOR_STR "bin" DIR_SEPARATOR_STR; + dirname = GNUNET_strdup (DIR_SEPARATOR_STR "bin" DIR_SEPARATOR_STR); break; case GNUNET_OS_IPK_LIBDIR: if (isbasedir) { - dirname = - DIR_SEPARATOR_STR "lib" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; - tmp = GNUNET_malloc (strlen (execpath) + strlen (dirname) + 1); - sprintf (tmp, "%s%s", execpath, dirname); - if ( (GNUNET_YES != - GNUNET_DISK_directory_test (tmp, GNUNET_YES)) && - (4 == sizeof (void *)) ) + GNUNET_asprintf (&tmp, + "%s%s%s%s%s%s%s", + execpath, + DIR_SEPARATOR_STR "lib", + (NULL != multiarch) ? DIR_SEPARATOR_STR : "", + (NULL != multiarch) ? multiarch : "", + DIR_SEPARATOR_STR, + current_pd->project_dirname, + DIR_SEPARATOR_STR); + if (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) { - GNUNET_free (tmp); - dirname = - DIR_SEPARATOR_STR "lib32" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; - tmp = GNUNET_malloc (strlen (execpath) + strlen (dirname) + 1); - sprintf (tmp, "%s%s", execpath, dirname); + GNUNET_free (execpath); + return tmp; } - if ( (GNUNET_YES != - GNUNET_DISK_directory_test (tmp, GNUNET_YES)) && - (8 == sizeof (void *)) ) + GNUNET_free (tmp); + tmp = NULL; + dirname = NULL; + if (4 == sizeof (void *)) { - dirname = - DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "lib32" DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR, + current_pd->project_dirname); + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); + } + if (8 == sizeof (void *)) + { + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR, + current_pd->project_dirname); + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); + } + + if ( (NULL != tmp) && + (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) ) + { + GNUNET_free (execpath); + GNUNET_free_non_null (dirname); + return tmp; } GNUNET_free (tmp); + GNUNET_free_non_null (dirname); } - else - dirname = DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR, + current_pd->project_dirname); break; case GNUNET_OS_IPK_DATADIR: - dirname = - DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR, + current_pd->project_dirname); break; case GNUNET_OS_IPK_LOCALEDIR: - dirname = - DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "locale" DIR_SEPARATOR_STR; + dirname = GNUNET_strdup (DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "locale" DIR_SEPARATOR_STR); break; case GNUNET_OS_IPK_ICONDIR: - dirname = - DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "icons" DIR_SEPARATOR_STR; + dirname = GNUNET_strdup (DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "icons" DIR_SEPARATOR_STR); break; case GNUNET_OS_IPK_DOCDIR: - dirname = - DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "doc" DIR_SEPARATOR_STR \ - "gnunet" DIR_SEPARATOR_STR; + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR "doc" DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR, + current_pd->project_dirname); break; case GNUNET_OS_IPK_LIBEXECDIR: if (isbasedir) { - dirname = - DIR_SEPARATOR_STR "lib" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ - "libexec" DIR_SEPARATOR_STR; - tmp = GNUNET_malloc (strlen (execpath) + strlen (dirname) + 1); - sprintf (tmp, "%s%s", execpath, dirname); - if ( (GNUNET_YES != - GNUNET_DISK_directory_test (tmp, GNUNET_YES)) && - (4 == sizeof (void *)) ) + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR "libexec" DIR_SEPARATOR_STR, + current_pd->project_dirname); + GNUNET_asprintf (&tmp, + "%s%s%s%s", + execpath, + DIR_SEPARATOR_STR "lib" DIR_SEPARATOR_STR, + (NULL != multiarch) ? multiarch : "", + dirname); + if (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) + { + GNUNET_free (execpath); + GNUNET_free (dirname); + return tmp; + } + GNUNET_free (tmp); + tmp = NULL; + dirname = NULL; + if (4 == sizeof (void *)) + { + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "lib32" DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR "libexec" DIR_SEPARATOR_STR, + current_pd->project_dirname); + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); + } + if (8 == sizeof (void *)) { - GNUNET_free (tmp); - dirname = - DIR_SEPARATOR_STR "lib32" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ - "libexec" DIR_SEPARATOR_STR; - tmp = GNUNET_malloc (strlen (execpath) + strlen (dirname) + 1); - sprintf (tmp, "%s%s", execpath, dirname); + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR "libexec" DIR_SEPARATOR_STR, + current_pd->project_dirname); + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); } - if ( (GNUNET_YES != - GNUNET_DISK_directory_test (tmp, GNUNET_YES)) && - (8 == sizeof (void *)) ) + if ( (NULL != tmp) && + (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) ) { - dirname = - DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ - "libexec" DIR_SEPARATOR_STR; + GNUNET_free (execpath); + GNUNET_free_non_null (dirname); + return tmp; } GNUNET_free (tmp); + GNUNET_free_non_null (dirname); } - else - dirname = - DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ - "libexec" DIR_SEPARATOR_STR; + GNUNET_asprintf (&dirname, + DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR "libexec" DIR_SEPARATOR_STR, + current_pd->project_dirname); break; default: GNUNET_free (execpath); return NULL; } - tmp = GNUNET_malloc (strlen (execpath) + strlen (dirname) + 1); - sprintf (tmp, "%s%s", execpath, dirname); + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); + GNUNET_free (dirname); GNUNET_free (execpath); return tmp; } @@ -625,30 +771,35 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) char * GNUNET_OS_get_libexec_binary_path (const char *progname) { + static char *cache; char *libexecdir; char *binary; - if (DIR_SEPARATOR == progname[0]) - return GNUNET_strdup (progname); - if (GNUNET_YES == GNUNET_STRINGS_path_is_absolute (progname, GNUNET_NO, NULL, NULL)) + if ( (DIR_SEPARATOR == progname[0]) || + (GNUNET_YES == + GNUNET_STRINGS_path_is_absolute (progname, + GNUNET_NO, + NULL, NULL)) ) return GNUNET_strdup (progname); - libexecdir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LIBEXECDIR); + if (NULL != cache) + libexecdir = cache; + else + libexecdir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LIBEXECDIR); if (NULL == libexecdir) return GNUNET_strdup (progname); GNUNET_asprintf (&binary, "%s%s", libexecdir, progname); - GNUNET_free (libexecdir); + cache = libexecdir; return binary; } /** - * Check whether an executable exists and possibly - * if the suid bit is set on the file. - * Attempts to find the file using the current - * PATH environment variable as a search path. + * Check whether an executable exists and possibly if the suid bit is + * set on the 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. * W32: must not have an .exe suffix. @@ -657,12 +808,14 @@ GNUNET_OS_get_libexec_binary_path (const char *progname) * binary with the -d flag. -d omits a programs main loop and only * executes all privileged operations in an binary. * @param params parameters used for w32 privilege checking (can be NULL for != w32 ) - * @return GNUNET_YES if the file is SUID (*nix) or can be executed with current privileges (W32), - * GNUNET_NO if not SUID (but binary exists), - * GNUNET_SYSERR on error (no such binary or not executable) + * @return #GNUNET_YES if the file is SUID (*nix) or can be executed with current privileges (W32), + * #GNUNET_NO if not SUID (but binary exists), + * #GNUNET_SYSERR on error (no such binary or not executable) */ int -GNUNET_OS_check_helper_binary (const char *binary, int check_suid, const char *params) +GNUNET_OS_check_helper_binary (const char *binary, + int check_suid, + const char *params) { struct stat statbuf; char *p; @@ -670,9 +823,13 @@ GNUNET_OS_check_helper_binary (const char *binary, int check_suid, const char *p #ifdef MINGW char *binaryexe; - GNUNET_asprintf (&binaryexe, "%s.exe", binary); - if ( (GNUNET_YES == GNUNET_STRINGS_path_is_absolute (binaryexe, GNUNET_NO, - NULL, NULL)) || + GNUNET_asprintf (&binaryexe, + "%s.exe", + binary); + if ( (GNUNET_YES == + GNUNET_STRINGS_path_is_absolute (binaryexe, + GNUNET_NO, + NULL, NULL)) || (0 == strncmp (binary, "./", 2)) ) p = GNUNET_strdup (binaryexe); else @@ -687,16 +844,24 @@ GNUNET_OS_check_helper_binary (const char *binary, int check_suid, const char *p } GNUNET_free (binaryexe); #else - if ( (GNUNET_YES == GNUNET_STRINGS_path_is_absolute (binary, GNUNET_NO, - NULL, NULL)) || + if ( (GNUNET_YES == + GNUNET_STRINGS_path_is_absolute (binary, + GNUNET_NO, + NULL, + NULL)) || (0 == strncmp (binary, "./", 2)) ) + { p = GNUNET_strdup (binary); + } else { p = get_path_from_PATH (binary); if (NULL != p) { - GNUNET_asprintf (&pf, "%s/%s", p, binary); + GNUNET_asprintf (&pf, + "%s/%s", + p, + binary); GNUNET_free (p); p = pf; } @@ -704,13 +869,17 @@ GNUNET_OS_check_helper_binary (const char *binary, int check_suid, const char *p #endif if (NULL == p) { - LOG (GNUNET_ERROR_TYPE_INFO, _("Could not find binary `%s' in PATH!\n"), + LOG (GNUNET_ERROR_TYPE_INFO, + _("Could not find binary `%s' in PATH!\n"), binary); return GNUNET_SYSERR; } - if (0 != ACCESS (p, X_OK)) + if (0 != ACCESS (p, + X_OK)) { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "access", p); + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, + "access", + p); GNUNET_free (p); return GNUNET_SYSERR; } @@ -719,22 +888,30 @@ GNUNET_OS_check_helper_binary (const char *binary, int check_suid, const char *p { /* as we run as root, we don't insist on SUID */ GNUNET_free (p); - return GNUNET_OK; + return GNUNET_YES; } #endif - if (0 != STAT (p, &statbuf)) + if (0 != STAT (p, + &statbuf)) { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", p); + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, + "stat", + p); GNUNET_free (p); return GNUNET_SYSERR; } - if (check_suid){ + if (check_suid) + { #ifndef MINGW - if ((0 != (statbuf.st_mode & S_ISUID)) && (0 == statbuf.st_uid)) + if ( (0 != (statbuf.st_mode & S_ISUID)) && + (0 == statbuf.st_uid) ) { GNUNET_free (p); return GNUNET_YES; } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Binary `%s' exists, but is not SUID\n"), + p); /* binary exists, but not SUID */ #else STARTUPINFO start;