From ea982704430b061f263580041d4f94174d8ba5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 21 May 2015 23:23:47 +0200 Subject: [PATCH] syscalls: Add 'restart-on-EINTR'. * guix/build/syscalls.scm (call-with-restart-on-EINTR): New procedure. (restart-on-EINTR): New macro. --- guix/build/syscalls.scm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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")))