aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-06-03 17:13:30 +0200
committerLudovic Courtès <ludo@gnu.org>2019-06-05 23:10:36 +0200
commit5f0cf1df710cca3eeff6b41ce8e665fb911cfb41 (patch)
tree8840bf254bcac4a4ed8b1b3e08d69509e219a9ec
parent89ceb86ad415ea92450ebda60359a7ee0ec79eb6 (diff)
downloadguix-5f0cf1df710cca3eeff6b41ce8e665fb911cfb41.tar
guix-5f0cf1df710cca3eeff6b41ce8e665fb911cfb41.tar.gz
syscalls: 'with-lock-file' catches ENOSYS.
* guix/build/syscalls.scm (call-with-file-lock): Catch ENOSYS raised by 'lock-file'.
-rw-r--r--guix/build/syscalls.scm15
1 files changed, 13 insertions, 2 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 3af41f2cf5..5c2eb3c14d 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -1084,13 +1084,24 @@ exception if it's already taken."
#t)
(define (call-with-file-lock file thunk)
- (let ((port (lock-file file)))
+ (let ((port (catch 'system-error
+ (lambda ()
+ (lock-file file))
+ (lambda args
+ ;; When using the statically-linked Guile in the initrd,
+ ;; 'fcntl-flock' returns ENOSYS unconditionally. Ignore
+ ;; that error since we're typically the only process running
+ ;; at this point.
+ (if (= ENOSYS (system-error-errno args))
+ #f
+ (apply throw args))))))
(dynamic-wind
(lambda ()
#t)
thunk
(lambda ()
- (unlock-file port)))))
+ (when port
+ (unlock-file port))))))
(define-syntax-rule (with-file-lock file exp ...)
"Wait to acquire a lock on FILE and evaluate EXP in that context."