aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2016-01-06 14:49:48 +0100
committerLudovic Courtès <ludo@gnu.org>2016-01-06 14:49:48 +0100
commit3c4c8c3e06cb50724942780fd6f240a7c1891261 (patch)
tree88e92b2bfad132763b5f7c62e9737e631d88da03
parent341ae582134e1d0393db864584c42228341ac3ec (diff)
downloadpatches-3c4c8c3e06cb50724942780fd6f240a7c1891261.tar
patches-3c4c8c3e06cb50724942780fd6f240a7c1891261.tar.gz
services: cleanup-service: Catch 'system-error' instead of everything.
This makes sure that critical errors such as unbound-variable do not go undetected. * gnu/services.scm (cleanup-gexp): Introduce local 'fail-safe' macro and use it. Remove uses of 'false-if-exception'.
-rw-r--r--gnu/services.scm23
1 files changed, 17 insertions, 6 deletions
diff --git a/gnu/services.scm b/gnu/services.scm
index 27a4883f71..f302816e9e 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -255,12 +255,23 @@ boot."
;; XXX This needs to happen before service activations, so it
;; has to be here, but this also implicitly assumes that /tmp
;; and /var/run are on the root partition.
- (false-if-exception (delete-file-recursively "/tmp"))
- (false-if-exception (delete-file-recursively "/var/run"))
- (false-if-exception (mkdir "/tmp"))
- (false-if-exception (chmod "/tmp" #o1777))
- (false-if-exception (mkdir "/var/run"))
- (false-if-exception (chmod "/var/run" #o755))))))
+ (letrec-syntax ((fail-safe (syntax-rules ()
+ ((_ exp rest ...)
+ (begin
+ (catch 'system-error
+ (lambda () exp)
+ (const #f))
+ (fail-safe rest ...)))
+ ((_)
+ #t))))
+ ;; Ignore I/O errors so the system can boot.
+ (fail-safe
+ (delete-file-recursively "/tmp")
+ (delete-file-recursively "/var/run")
+ (mkdir "/tmp")
+ (chmod "/tmp" #o1777)
+ (mkdir "/var/run")
+ (chmod "/var/run" #o755)))))))
(define cleanup-service-type
;; Service that cleans things up in /tmp and similar.