~ruther/guix-local

13bc8d5e4f842fe595306c22c99a5868d8016318 — David Thompson 10 years ago c878683
environment: Properly handle SIGINT.

Switching to execlp means that the process spawned in a container is PID
1, which obsoleted one of the 'guix environment --container' tests
because the init process can't be killed in the usual manner.

* guix/scripts/environment.scm (launch-environment/fork): New procedure.
(launch-environment): Switch from system* to execlp.  Add handler for
SIGINT.
(guix-environment): Use launch-environment/fork.
* tests/guix-environment-container.sh: Replace abnormal exit test with
one that works now that the spawned process is PID 1.
2 files changed, 23 insertions(+), 3 deletions(-)

M guix/scripts/environment.scm
M tests/guix-environment-container.sh
M guix/scripts/environment.scm => guix/scripts/environment.scm +17 -2
@@ 358,8 358,22 @@ and suitable for 'exit'."
  "Run COMMAND in a new environment containing INPUTS, using the native search
paths defined by the list PATHS.  When PURE?, pre-existing environment
variables are cleared before setting the new ones."
  ;; Properly handle SIGINT, so pressing C-c in an interactive terminal
  ;; application works.
  (sigaction SIGINT SIG_DFL)
  (create-environment inputs paths pure?)
  (apply system* command))
  (match command
    ((program . args)
     (apply execlp program program args))))

(define (launch-environment/fork command inputs paths pure?)
  "Run COMMAND in a new process with an environment containing INPUTS, using
the native search paths defined by the list PATHS.  When PURE?, pre-existing
environment variables are cleared before setting the new ones."
  (match (primitive-fork)
    (0 (launch-environment command inputs paths pure?))
    (pid (match (waitpid pid)
           ((_ . status) status)))))

(define* (launch-environment/container #:key command bash user-mappings
                                       profile paths network?)


@@ 582,4 596,5 @@ message if any test fails."
                 (else
                  (return
                   (exit/status
                    (launch-environment command profile paths pure?)))))))))))))
                    (launch-environment/fork command profile
                                             paths pure?)))))))))))))

M tests/guix-environment-container.sh => tests/guix-environment-container.sh +6 -1
@@ 82,8 82,13 @@ grep -e "$NIX_STORE_DIR/.*-bash" $tmpdir/mounts # bootstrap bash

rm $tmpdir/mounts

abnormal_exit_code="
(use-modules (system foreign))
;; Purposely make Guile crash with a segfault. :)
(pointer->string (make-pointer 123) 123)"

if guix environment --bootstrap --container \
	--ad-hoc bootstrap-binaries -- kill -SEGV 2
	--ad-hoc guile-bootstrap -- guile -c "$abnormal_exit_code"
then false;
else
    test $? -gt 127