summaryrefslogtreecommitdiff
path: root/guix/build
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2016-06-13 17:52:08 +0200
committerLudovic Courtès <ludo@gnu.org>2016-06-13 18:05:54 +0200
commit1752a17a1e6f7138892eeeb4806cd04ccb3ca1b0 (patch)
treeb214b397e41996725a20c81da83bc4cd4187383e /guix/build
parent9f8ee3fe0ed615a89520618c4df66647845b15b3 (diff)
utils: 'with-atomic-file-output' calls 'fdatasync'.
Suggested by Danny Milosavljevic <dannym@scratchpost.org> at <https://lists.gnu.org/archive/html/guix-devel/2016-06/msg00456.html>. * guix/build/syscalls.scm (fdatasync): New procedure. * guix/utils.scm (with-atomic-file-output): Use it. Use 'close-port' instead of 'close'.
Diffstat (limited to 'guix/build')
-rw-r--r--guix/build/syscalls.scm15
1 files changed, 15 insertions, 0 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 48ff227e10..ed0eb060d9 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -64,6 +64,7 @@
processes
mkdtemp!
+ fdatasync
pivot-root
fcntl-flock
@@ -506,6 +507,20 @@ string TMPL and return its file name. TMPL must end with 'XXXXXX'."
(list err)))
(pointer->string result)))))
+(define fdatasync
+ (let ((proc (syscall->procedure int "fdatasync" (list int))))
+ (lambda (port)
+ "Flush buffered output of PORT, an output file port, and then call
+fdatasync(2) on the underlying file descriptor."
+ (force-output port)
+ (let* ((fd (fileno port))
+ (ret (proc fd))
+ (err (errno)))
+ (unless (zero? ret)
+ (throw 'system-error "fdatasync" "~S: ~A"
+ (list fd (strerror err))
+ (list err)))))))
+
(define-record-type <file-system>
(file-system type block-size blocks blocks-free