/* GNU Guix --- Functional package management for GNU Copyright (C) 2020 Ludovic Courtès This file is part of GNU Guix. GNU Guix is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. GNU Guix is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Guix. If not, see . */ /* This file implements part of the GNU ld.so audit interface. It is used by the "fakechroot" engine of the 'guix pack -RR' wrappers to make sure the loader looks for shared objects under the "fake" root directory. */ #define _GNU_SOURCE 1 #include #include #include #include #include /* The pseudo root directory and store that we are relocating to. */ static const char *root_directory; static char *store; /* The original store, "/gnu/store" by default. */ static const char original_store[] = "@STORE_DIRECTORY@"; /* Like 'malloc', but abort if 'malloc' returns NULL. */ static void * xmalloc (size_t size) { void *result = malloc (size); assert (result != NULL); return result; } unsigned int la_version (unsigned int v) { if (v != LAV_CURRENT) error (1, 0, "cannot handle interface version %u", v); root_directory = getenv ("FAKECHROOT_BASE"); if (root_directory == NULL) error (1, 0, "'FAKECHROOT_BASE' is not set"); store = xmalloc (strlen (root_directory) + sizeof original_store); strcpy (store, root_directory); strcat (store, original_store); return v; } /* Return NAME, a shared object file name, relocated under STORE. This function is called by the loader whenever it looks for a shared object. */ char * la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag) { char *result; if (strncmp (name, original_store, sizeof original_store - 1) == 0) { size_t len = strlen (name) - sizeof original_store + strlen (store) + 1; result = xmalloc (len); strcpy (result, store); strcat (result, name + sizeof original_store - 1); } else result = strdup (name); return result; } '>Expand)Author 2023-04-21tests: Fix checks for expected failures....Addresses <https://issues.guix.gnu.org/62406>. With 'set -e', a return status inverted with '!' does not cause the shell to exit immediately. Instead use '&& false' to indicate an expected failure. * tests/guix-archive.sh, tests/guix-build-branch.sh, tests/guix-build.sh, tests/guix-daemon.sh, tests/guix-download.sh, tests/guix-environment-container.sh, tests/guix-environment.sh, tests/guix-gc.sh, tests/guix-git-authenticate.sh, tests/guix-graph.sh, tests/guix-hash.sh, tests/guix-home.sh, tests/guix-pack-relocatable.sh, tests/guix-pack.sh, tests/guix-package-aliases.sh, tests/guix-package-net.sh, tests/guix-package.sh, tests/guix-refresh.sh, tests/guix-shell.sh, tests/guix-style.sh, tests/guix-system.sh: Replace uses of '! ...' with '... && false' or `test ! ...` as appropriate. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Eric Bavier 2022-10-22Remove now unnecessary uses of (guix grafts)....These modules would use (guix grafts) just to access '%graft?' and related bindings, which are now in (guix store). * gnu/ci.scm, guix/gexp.scm, guix/lint.scm, guix/scripts.scm, guix/scripts/archive.scm, guix/scripts/build.scm, guix/scripts/challenge.scm, guix/scripts/deploy.scm, guix/scripts/environment.scm, guix/scripts/home.scm, guix/scripts/pack.scm, guix/scripts/package.scm, guix/scripts/pull.scm, guix/scripts/size.scm, guix/scripts/system.scm, guix/scripts/weather.scm, tests/builders.scm, tests/channels.scm, tests/cpan.scm, tests/derivations.scm, tests/gexp.scm, tests/graph.scm, tests/guix-daemon.sh, tests/monads.scm, tests/pack.scm, tests/packages.scm, tests/profiles.scm, tests/system.scm: Remove #:use-module (guix grafts). Ludovic Courtès