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.
This commit is contained in:
Ludovic Courtès 2018-01-15 16:01:10 +01:00
parent 92423868bc
commit 95aa64bc48
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -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 @@ (define (call-with-clean-exit thunk)
(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 @@ (define (container-excursion* pid thunk)
(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)))