From c088aa2988ef82289c87ebfd6d07d8f1464dd8f0 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 28 Jul 2020 12:28:39 +0200 Subject: pack: "fakechroot" engine always creates its store. Previously it would silently fail to create the /gnu/store symlink when the host has a read-only /gnu as is the case in these tests. * gnu/packages/aux-files/run-in-namespace.c (exec_with_loader): Unlink the ancestor of ORIGINAL_STORE under NEW_ROOT. Check the return value of 'symlink' when creating NEW_STORE. * tests/guix-pack-relocatable.sh: Check the contents of the store as seen by the wrapped executable, with all three engines, and with both "/gnu" and "/gnu/store" erased. --- gnu/packages/aux-files/run-in-namespace.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'gnu') diff --git a/gnu/packages/aux-files/run-in-namespace.c b/gnu/packages/aux-files/run-in-namespace.c index 7f7e5c6885..436c0b6286 100644 --- a/gnu/packages/aux-files/run-in-namespace.c +++ b/gnu/packages/aux-files/run-in-namespace.c @@ -441,10 +441,23 @@ exec_with_loader (const char *store, int argc, char *argv[]) char *new_root = mkdtemp (strdup ("/tmp/guix-exec-XXXXXX")); mirror_directory ("/", new_root, make_symlink); + /* 'mirror_directory' created a symlink for the ancestor of ORIGINAL_STORE, + typically "/gnu". Remove that entry so we can create NEW_STORE + below. */ + const char *slash = strchr (original_store + 1, '/'); + const char *top = slash != NULL + ? strndupa (original_store, slash - original_store) + : original_store; + char *new_store_top = concat (new_root, top); + unlink (new_store_top); + + /* Now create the store under NEW_ROOT. */ char *new_store = concat (new_root, original_store); char *new_store_parent = dirname (strdup (new_store)); mkdir_p (new_store_parent); - symlink (store, new_store); + err = symlink (store, new_store); + if (err < 0) + assert_perror (errno); #ifdef GCONV_DIRECTORY /* Tell libc where to find its gconv modules. This is necessary because -- cgit 1.4.1