diff --git a/src/Intrinsic.c b/src/Intrinsic.c index c9624ec..addcdba 100644 --- a/src/Intrinsic.c +++ b/src/Intrinsic.c @@ -1312,21 +1312,101 @@ static void FillInLangSubs( } else (void) strcpy(*rest, string); } + + /* - * default path used if environment variable XFILESEARCHPATH - * is not defined. Also substitued for %D. - * The exact value should be documented in the implementation - * notes for any Xt implementation. + Return the default search path for the function + XtResolvePathname to use if XFILESEARCHPATH is + not defined. + + It returns the combination the set of values which are the 6 "stems" below, + prepended with "/run/current-system/profile", and $GUIX_PROFILE and + "$HOME/.guix-profile" + + These values provide the default paths where Guix/GuixSD can expect + to find resources for installed packages. */ -static const char *implementation_default_path(void) +static const char *guix_default_path(void) { -#if defined(WIN32) - static char xfilesearchpath[] = ""; + static const char *search_path_default_stem[] = { + "/lib/X11/%L/%T/%N%C%S", + "/lib/X11/%l/%T/%N%C%S", + "/lib/X11/%T/%N%C%S", + "/lib/X11/%L/%T/%N%S", + "/lib/X11/%l/%T/%N%S", + "/lib/X11/%T/%N%S" + }; + +#define SIZEOF_STEMS (strlen (search_path_default_stem[0]) \ + + strlen (search_path_default_stem[1]) \ + + strlen (search_path_default_stem[2]) \ + + strlen (search_path_default_stem[3]) \ + + strlen (search_path_default_stem[4]) \ + + strlen (search_path_default_stem[5])) + + + int i; + const char *current_profile = "/run/current-system/profile"; + char *home = getenv ("HOME"); + char *guix_profile = getenv ("GUIX_PROFILE"); + + size_t bytesAllocd = SIZEOF_STEMS + 1; + + /* This function is evaluated multiple times and the calling + code assumes that it is idempotent. So we must not allow + (say) a changed environment variable to cause it to return + something different. */ + static char *path = NULL; + if (path) + return path; + + bytesAllocd += 6 * (1 + strlen (current_profile)); + + if (guix_profile != NULL) + { + bytesAllocd += SIZEOF_STEMS; + bytesAllocd += 6 * (1 + strlen (guix_profile)); + } - return xfilesearchpath; -#else - return XFILESEARCHPATHDEFAULT; -#endif + if (home != NULL) + { + bytesAllocd += SIZEOF_STEMS; + bytesAllocd += 6 * (1 + strlen(home) + strlen ("/.guix-profile")); + } + + path = XtMalloc(bytesAllocd); + if (path == NULL) _XtAllocError(NULL); + + memset (path, 0, bytesAllocd); + + for (i = 0 ; i < 6 ; ++i) + { + strcat (path, current_profile); + strcat (path, search_path_default_stem[i]); + strcat (path, ":"); + } + + if (guix_profile != NULL) + for (i = 0 ; i < 6 ; ++i) + { + strcat (path, guix_profile); + strcat (path, search_path_default_stem[i]); + strcat (path, ":"); + } + + if (home != NULL) + for (i = 0 ; i < 6 ; ++i) + { + strcat (path, home); + strcat (path, "/.guix-profile"); + strcat (path, search_path_default_stem[i]); + strcat (path, ":"); + } + + /* Remove final : */ + path[strlen(path) - 1] = '\0'; + + return path; } @@ -1354,7 +1434,7 @@ _XtString XtResolvePathname( { XtPerDisplay pd; static const char *defaultPath = NULL; - const char *impl_default = implementation_default_path(); + const char *impl_default = guix_default_path(); int idef_len = (int) strlen(impl_default); char *massagedPath; int bytesAllocd, bytesLeft;