~ruther/guix-local

95aa64bc48cae061effafa7675ea9d9ccbe311a4 — Ludovic Courtès 8 years ago 9242386
linux-container: Work around EBADF errors upon exit.

Typically 'read-pid-file/container' would fail when starting services in
containers such as BitlBee.

* gnu/build/linux-container.scm (call-with-clean-exit): Use
'primitive-_exit' instead of 'primitive-exit'.
(container-excursion*): Close OUT.
1 files changed, 10 insertions(+), 4 deletions(-)

M gnu/build/linux-container.scm
M gnu/build/linux-container.scm => gnu/build/linux-container.scm +10 -4
@@ 1,6 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 David Thompson <davet@gnu.org>
;;; Copyright © 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 61,9 61,14 @@ exists."
    (const #t)
    (lambda ()
      (thunk)
      (primitive-exit 0))

      ;; XXX: Somehow we sometimes get EBADF from write(2) or close(2) upon
      ;; exit (coming from fd finalizers) when used by the Shepherd.  To work
      ;; around that, exit forcefully so fd finalizers don't have a chance to
      ;; run and fail.
      (primitive-_exit 0))
    (lambda ()
      (primitive-exit 1))))
      (primitive-_exit 1))))

(define (purify-environment)
  "Unset all environment variables."


@@ 335,7 340,8 @@ return the exit status."
     (match (container-excursion pid
              (lambda ()
                (close-port in)
                (write (thunk) out)))
                (write (thunk) out)
                (close-port out)))
       (0
        (close-port out)
        (let ((result (read in)))