~ruther/guix-local

4bd70904c7f555a953808a9a4f892f462ffd352f — Ludovic Courtès 8 years ago cbb7678
gnu: shepherd: Avoid "Bad file descriptor" warnings.

* gnu/packages/patches/shepherd-close-fds.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/admin.scm (shepherd)[source]: Use it.
3 files changed, 39 insertions(+), 1 deletions(-)

M gnu/local.mk
M gnu/packages/admin.scm
A gnu/packages/patches/shepherd-close-fds.patch
M gnu/local.mk => gnu/local.mk +1 -0
@@ 1061,6 1061,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/scotch-test-threading.patch		\
  %D%/packages/patches/sdl-libx11-1.6.patch			\
  %D%/packages/patches/seq24-rename-mutex.patch			\
  %D%/packages/patches/shepherd-close-fds.patch			\
  %D%/packages/patches/shishi-fix-libgcrypt-detection.patch	\
  %D%/packages/patches/slim-session.patch			\
  %D%/packages/patches/slim-config.patch			\

M gnu/packages/admin.scm => gnu/packages/admin.scm +2 -1
@@ 162,7 162,8 @@ and provides a \"top-like\" mode (monitoring).")
                                  version ".tar.gz"))
              (sha256
               (base32
                "174q1qg7yg6w1hfvlfv720hr6hid4h5xzw15y3ycfpspllzldhcb"))))
                "174q1qg7yg6w1hfvlfv720hr6hid4h5xzw15y3ycfpspllzldhcb"))
              (patches (search-patches "shepherd-close-fds.patch"))))
    (build-system gnu-build-system)
    (arguments
     '(#:configure-flags '("--localstatedir=/var")))

A gnu/packages/patches/shepherd-close-fds.patch => gnu/packages/patches/shepherd-close-fds.patch +36 -0
@@ 0,0 1,36 @@
commit 3e346a2a84b099766ea8a3a4a4549f6172483062
Author: Ludovic Courtès <ludo@gnu.org>
Date:   Sun Dec 3 22:30:03 2017 +0100

    service: In 'exec-command', close open ports before 'execl'.
    
    This gets rid of annoying "Bad file descriptor" warnings from shepherd.
    
    * modules/shepherd/service.scm (exec-command): In 'loop', invoke
    'close-port' and the ports returned by (fdes->ports i).

diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm
index b2d8bc5..0ad28a0 100644
--- a/modules/shepherd/service.scm
+++ b/modules/shepherd/service.scm
@@ -1,5 +1,5 @@
 ;; service.scm -- Representation of services.
-;; Copyright (C) 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;; Copyright (C) 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;; Copyright (C) 2002, 2003 Wolfgang Järling <wolfgang@pro-linux.de>
 ;; Copyright (C) 2014 Alex Sassmannshausen <alex.sassmannshausen@gmail.com>
 ;; Copyright (C) 2016 Alex Kost <alezost@gmail.com>
@@ -744,6 +744,14 @@ false."
 
        (let loop ((i 3))
          (when (< i max-fd)
+           ;; First try to close any ports associated with file descriptor I.
+           ;; Otherwise the finalization thread might get around to closing
+           ;; those ports eventually, which will raise an EBADF exception (on
+           ;; 2.2), leading to messages like "error in the finalization
+           ;; thread: Bad file descriptor".
+           (for-each (lambda (port)
+                       (catch-system-error (close-port port)))
+                     (fdes->ports i))
            (catch-system-error (close-fdes i))
            (loop (+ i 1)))))