janneke pushed a commit to branch wip-hurd in repository guix. commit a5a08455c1fd95ef16d07f34a19c84bedb975002 Author: Manolis Ragkousis <manolis...@gmail.com> AuthorDate: Wed Dec 28 02:49:22 2016 +0200
daemon: Avoid kill -1 bug on the Hurd. This allows for native builds on the Hurd, doing sudo ./pre-inst-env guix-daemon --disable-chroot --build-users-group=guixbuild & ./pre-inst-env guix build hello * nix/libutil/util.cc (killUser)[__GNU__]: Avoid kill -1 bug; kill only current process and ignore SIGKILL status in parent. Co-authored-by: Jan Nieuwenhuizen <jann...@gnu.org> --- nix/libutil/util.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc index fb2dfad..17d145b 100644 --- a/nix/libutil/util.cc +++ b/nix/libutil/util.cc @@ -861,6 +861,10 @@ void killUser(uid_t uid) which means "follow POSIX", which we don't want here */ if (syscall(SYS_kill, -1, SIGKILL, false) == 0) break; +#elif __GNU__ + /* Killing all a user's processes using PID=-1 does currently + not work on the Hurd. */ + if (kill(getpid(), SIGKILL) == 0) break; #else if (kill(-1, SIGKILL) == 0) break; #endif @@ -873,6 +877,10 @@ void killUser(uid_t uid) }); int status = pid.wait(true); +#if __GNU__ + /* When the child killed itself, status = SIGKILL. */ + if (status == SIGKILL) return; +#endif if (status != 0) throw Error(format("cannot kill processes for uid `%1%': %2%") % uid % statusToString(status));