diff options
author | Ludovic Courtès <ludo@gnu.org> | 2022-12-08 16:30:52 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2022-12-09 08:46:21 +0100 |
commit | e625e9b194f2de3ff20872f04b5c802c70cb411c (patch) | |
tree | 68a0ab32517663aed8c9e99a16b18a9d82d8b349 | |
parent | 3405b2b16cbadbbbc0dcd61e6fb87a65561fc7f0 (diff) |
environment: '-C' doesn't throw when the NSS is dysfunctional.
Previously, if the name service switch was dysfunctional, as can happen
on foreign distros lacking nscd, "guix shell -C" would crash with a
backtrace on the uncaught 'getpwuid' exception. To address that, catch
the exception and deal with it gracefully.
Reported by remsd1 on #guix.
* guix/scripts/environment.scm (launch-environment/container): Wrap
'getpwuid' call in 'false-if-exception'.
-rw-r--r-- | guix/scripts/environment.scm | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm index 64597f6e9f..ab11b35335 100644 --- a/guix/scripts/environment.scm +++ b/guix/scripts/environment.scm @@ -728,14 +728,21 @@ WHILE-LIST." (home (getenv "HOME")) (uid (if user 1000 (getuid))) (gid (if user 1000 (getgid))) - (passwd (let ((pwd (getpwuid (getuid)))) + + ;; On a foreign distro, the name service switch might be + ;; dysfunctional and 'getpwuid' throws. Don't let that hamper + ;; operations. + (passwd (let ((pwd (false-if-exception (getpwuid (getuid))))) (password-entry - (name (or user (passwd:name pwd))) - (real-name (if user + (name (or user + (and=> pwd passwd:name) + (getenv "USER") + "charlie")) + (real-name (if (or user (not pwd)) "" (passwd:gecos pwd))) (uid uid) (gid gid) (shell bash) - (directory (if user + (directory (if (or user (not pwd)) (string-append "/home/" user) (passwd:dir pwd)))))) (groups (list (group-entry (name "users") (gid gid)) |