diff --git a/src/Intrinsic.c b/src/Intrinsic.c --- a/src/Intrinsic.c +++ b/src/Intrinsic.c @@ -1345,21 +1345,99 @@ FillInLangSubs(Substitution subs, XtPerDisplay pd) } /* - * 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) +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; } @@ -1388,7 +1466,7 @@ XtResolvePathname(Display *dpy, { 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; sts/networking.scm?id=f73ba627abd46018da7f6f41ebd5efb99412cc54'>tests: Replace uses of deprecated 'static-networking-service'....* gnu/tests/ganeti.scm (%ganeti-os): Replace call to 'static-networking-service' by instantiating STATIC-NETWORKING-SERVICE-TYPE. * gnu/tests/networking.scm (%test-static-networking) (%openvswitch-os, %dhcpd-os): Likewise. Ludovic Courtès 2021-12-12services: static-networking: Change interface to mimic netlink....* gnu/services/base.scm (<static-networking>)[interface, ip, netmask] [gateway]: Remove. [addresses, links, routes]: New fields. [requirement]: Default to '(udev). (<network-address>, <network-link>, <network-route>): New record types. (ensure-no-separate-netmask, %ensure-no-separate-netmask): Remove. (ipv6-address?, cidr->netmask, ip+netmask->cidr) (network-set-up/hurd, network-tear-down/hurd) (network-set-up/linux, network-tear-down/linux) (static-networking->hurd-pfinet-options): New procedures. (static-networking-shepherd-service): New procedure. (static-networking-shepherd-services): Rewrite in terms of the above. (static-networking-service): Deprecate. Adjust to new 'static-networking' API. (%base-services): Likewise. * gnu/system/install.scm (%installation-services): Likewise. * gnu/system/hurd.scm (%base-services/hurd): Likewise, and separate 'loopback' from 'networking'. * gnu/build/hurd-boot.scm (set-hurd-device-translators): Remove "servers/socket/2". * gnu/tests/networking.scm (run-openvswitch-test)["networking has started on ovs0"]: Check for 'networking instead of 'networking-ovs0, which is no longer provided. * doc/guix.texi (Networking Setup): Document the new interface. Remove documentation of 'static-networking-service'. (Virtualization Services): Change Ganeti example to use the new interface. Ludovic Courtès 2021-12-12tests: openvswitch: Check whether ovs0 is up....* gnu/tests/networking.scm (run-openvswitch-test)["ovs0 is up"]: New test. Ludovic Courtès 2021-12-12tests: Add 'static-networking' test....* gnu/tests/networking.scm (run-static-networking-test): New procedure. (%test-static-networking): New variable. Ludovic Courtès