aboutsummaryrefslogtreecommitdiff
path: root/guix/build/syscalls.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-05-21 23:23:47 +0200
committerLudovic Courtès <ludo@gnu.org>2015-05-22 11:51:12 +0200
commitea982704430b061f263580041d4f94174d8ba5cd (patch)
tree8bf9ef71b798984da2d02cbc78bdd404d3434c7b /guix/build/syscalls.scm
parent4520354282de331f82064f52d49a51d5eb28ab5e (diff)
downloadgnu-guix-ea982704430b061f263580041d4f94174d8ba5cd.tar
gnu-guix-ea982704430b061f263580041d4f94174d8ba5cd.tar.gz
syscalls: Add 'restart-on-EINTR'.
* guix/build/syscalls.scm (call-with-restart-on-EINTR): New procedure. (restart-on-EINTR): New macro.
Diffstat (limited to 'guix/build/syscalls.scm')
-rw-r--r--guix/build/syscalls.scm14
1 files changed, 14 insertions, 0 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 5bc4595d08..9ec7e8b4a9 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -29,6 +29,7 @@
MS_REMOUNT
MS_BIND
MS_MOVE
+ restart-on-EINTR
mount
umount
mount-points
@@ -89,6 +90,19 @@
(ref bv))))
(lambda () 0)))
+(define (call-with-restart-on-EINTR thunk)
+ (let loop ()
+ (catch 'system-error
+ thunk
+ (lambda args
+ (if (= (system-error-errno args) EINTR)
+ (loop)
+ (apply throw args))))))
+
+(define-syntax-rule (restart-on-EINTR expr)
+ "Evaluate EXPR and restart upon EINTR. Return the value of EXPR."
+ (call-with-restart-on-EINTR (lambda () expr)))
+
(define (augment-mtab source target type options)
"Augment /etc/mtab with information about the given mount point."
(let ((port (open-file "/etc/mtab" "a")))