From 081bd3bd29c8af228c237a178c171fcdf05425cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Fri, 5 Feb 2016 13:07:57 +0100
Subject: [PATCH] service: shepherd: Guard against exceptions raised by
 'start'.

Fixes <http://bugs.gnu.org/22548>.
Reported by Albin <albin@fripost.org>, Mark H Weaver, and Alex Kost.

* gnu/services/shepherd.scm (shepherd-configuration-file)[config]: Guard
against 'service-error?'.
---
 gnu/services/shepherd.scm | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index 6cf15a5e00..207501cb1a 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -234,7 +234,8 @@ stored."
             (set! %load-compiled-path
               (cons #$compiled %load-compiled-path)))
 
-          (use-modules (system repl error-handling))
+          (use-modules (srfi srfi-34)
+                       (system repl error-handling))
 
           ;; Arrange to spawn a REPL if loading one of FILES fails.  This is
           ;; better than a kernel panic.
@@ -246,7 +247,16 @@ stored."
           (setenv "PATH" "/run/current-system/profile/bin")
 
           (format #t "starting services...~%")
-          (for-each start
+          (for-each (lambda (service)
+                      ;; In the Shepherd 0.3 the 'start' method can raise
+                      ;; '&action-runtime-error' if it fails, so protect
+                      ;; against it.  (XXX: 'action-runtime-error?' is not
+                      ;; exported is 0.3, hence 'service-error?'.)
+                      (guard (c ((service-error? c)
+                                 (format (current-error-port)
+                                         "failed to start service '~a'~%"
+                                         service)))
+                        (start service)))
                     '#$(append-map shepherd-service-provision
                                    (filter shepherd-service-auto-start?
                                            services)))))