From f57cbab24fb7a22fc982eb8b6c4a2d18402be460 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 30 Jan 2014 14:47:20 +0000 Subject: fix #3284: support lib/MULTIARCH/ paths in installation, use GNUNET_PREFIX=@libdir@ so that we can extract the value of MULTIARCH during 'make check' --- src/util/Makefile.am | 2 +- src/util/configuration.c | 4 +- src/util/os_installation.c | 123 +++++++++++++++++++++++++++++++------------ src/util/test_resolver_api.c | 8 +-- 4 files changed, 96 insertions(+), 41 deletions(-) (limited to 'src/util') diff --git a/src/util/Makefile.am b/src/util/Makefile.am index a2c55d5c3..f520d1cb4 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -279,7 +279,7 @@ check_PROGRAMS = \ test_common_logging_runtime_loglevels if ENABLE_TEST_RUN -TESTS_ENVIRONMENT=export GNUNET_PREFIX=@prefix@;export PATH=@prefix@/bin:$$PATH; +TESTS_ENVIRONMENT=export GNUNET_PREFIX=@libdir@;export PATH=@prefix@/bin:$$PATH; TESTS = $(check_PROGRAMS) endif diff --git a/src/util/configuration.c b/src/util/configuration.c index ca27b5aef..3d9281e8d 100644 --- a/src/util/configuration.c +++ b/src/util/configuration.c @@ -1632,7 +1632,7 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, char *ipath; ipath = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR); - if (ipath == NULL) + if (NULL == ipath) return GNUNET_SYSERR; baseconfig = NULL; GNUNET_asprintf (&baseconfig, "%s%s", ipath, "config.d"); @@ -1644,7 +1644,7 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, return GNUNET_SYSERR; /* no configuration at all found */ } GNUNET_free (baseconfig); - if ((filename != NULL) && + if ((NULL != filename) && (GNUNET_OK != GNUNET_CONFIGURATION_parse (cfg, filename))) { /* specified configuration not found */ diff --git a/src/util/os_installation.c b/src/util/os_installation.c index 30e729dc6..02d23688c 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) + (C) 2006-2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -65,7 +65,7 @@ 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)) && + SSCANF (line, "%*x-%*x %*c%*c%*c%*c %*x %*2x:%*2x %*u%*[ ]%1023s", dir)) && (NULL != (lgu = strstr (dir, "libgnunetutil")))) { lgu[0] = '\0'; @@ -101,7 +101,7 @@ get_path_from_proc_exe () lnk[size] = '\0'; while ((lnk[size] != '/') && (size > 0)) size--; - /* test for being in lib/gnunet/libexec/ */ + /* test for being in lib/gnunet/libexec/ or lib/MULTIARCH/gnunet/libexec */ if ( (size > strlen ("/gnunet/libexec/")) && (0 == strcmp ("/gnunet/libexec/", &lnk[size - strlen ("/gnunet/libexec/")])) ) @@ -465,6 +465,8 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) const char *dirname; char *execpath = NULL; char *tmp; + char *multiarch; + char *libdir; int isbasedir; /* if wanted, try to get the current app's bin/ */ @@ -513,6 +515,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'; @@ -530,29 +543,48 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) { 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", + execpath, + dirname, + (NULL != multiarch) ? multiarch : ""); + if (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) + { + GNUNET_free (execpath); + return tmp; + } + GNUNET_free (tmp); + tmp = NULL; + if (4 == sizeof (void *)) { - 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_asprintf (&tmp, + "%s%s", + execpath, + dirname); } - if ( (GNUNET_YES != - GNUNET_DISK_directory_test (tmp, GNUNET_YES)) && - (8 == sizeof (void *)) ) + if (8 == sizeof (void *)) { dirname = DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); + } + + if ( (NULL != tmp) && + (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) ) + { + GNUNET_free (execpath); + return tmp; } GNUNET_free (tmp); } - else - dirname = DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; + dirname = DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR; break; case GNUNET_OS_IPK_DATADIR: dirname = @@ -575,42 +607,63 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) 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 *)) ) + DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR "libexec" DIR_SEPARATOR_STR; + 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); + return tmp; + } + GNUNET_free (tmp); + tmp = NULL; + if (4 == 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 (&tmp, + "%s%s", + execpath, + dirname); } - if ( (GNUNET_YES != - GNUNET_DISK_directory_test (tmp, GNUNET_YES)) && - (8 == sizeof (void *)) ) + if (8 == sizeof (void *)) { dirname = DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ "libexec" DIR_SEPARATOR_STR; + GNUNET_asprintf (&tmp, + "%s%s", + execpath, + dirname); + } + if ( (NULL != tmp) && + (GNUNET_YES == + GNUNET_DISK_directory_test (tmp, GNUNET_YES)) ) + { + GNUNET_free (execpath); + return tmp; } + GNUNET_free (tmp); } - else - dirname = - DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ - "libexec" DIR_SEPARATOR_STR; + dirname = + DIR_SEPARATOR_STR "gnunet" DIR_SEPARATOR_STR \ + "libexec" DIR_SEPARATOR_STR; 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 (execpath); return tmp; } diff --git a/src/util/test_resolver_api.c b/src/util/test_resolver_api.c index 220f4bdac..c94990415 100644 --- a/src/util/test_resolver_api.c +++ b/src/util/test_resolver_api.c @@ -199,7 +199,9 @@ check_rootserver_name (void *cls, const char *hostname) else { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received invalid rootserver hostname `%s'.\n", hostname); + "Received invalid rootserver hostname `%s', expected `%s'\n", + hostname, + ROOTSERVER_NAME); GNUNET_break (0); } } @@ -292,11 +294,11 @@ run (void *cls, char *const *args, const char *cfgfile, rootserver = gethostbyaddr (&rootserver_addr, sizeof (rootserver_addr), AF_INET); - if (rootserver == NULL) + if (NULL == rootserver) { /* Error: resolving IP addresses does not work */ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("gethostbyaddr() could not lookup hostname: %s\n"), + "gethostbyaddr() could not lookup hostname: %s\n", hstrerror (h_errno)); GNUNET_break (0); } -- cgit v1.2.3