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 09:59:53 +0100 |
commit | 0406df0b9b1bf39caa39eba50f918c897ea204e6 (patch) | |
tree | 511da610d81a22dd127ed11723a7ef427079fbf3 | |
parent | 416a691cff8b75d0fcba50412c6e347212ab5973 (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)) |