guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

09/09: accounts: Call 'fdatasync' when writing databases.


From: guix-commits
Subject: 09/09: accounts: Call 'fdatasync' when writing databases.
Date: Wed, 5 Jun 2019 17:11:22 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit d088d5c4848f08bd62e722789132f9345659c52c
Author: Ludovic Court├Ęs <address@hidden>
Date:   Wed Jun 5 11:14:41 2019 +0200

    accounts: Call 'fdatasync' when writing databases.
    
    * gnu/build/accounts.scm (catch-ENOSYS): New macro.
    (database-writer): Call 'fdatasync'.
---
 gnu/build/accounts.scm | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/gnu/build/accounts.scm b/gnu/build/accounts.scm
index 2120c1d..b901495 100644
--- a/gnu/build/accounts.scm
+++ b/gnu/build/accounts.scm
@@ -19,6 +19,7 @@
 (define-module (gnu build accounts)
   #:use-module (guix records)
   #:use-module (guix combinators)
+  #:use-module ((guix build syscalls) #:select (fdatasync))
   #:use-module (gnu system accounts)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-11)
@@ -230,6 +231,14 @@ each field."
   ;; grab this lock with 'with-file-lock' when they access the databases.
   "/etc/.pwd.lock")
 
+(define-syntax-rule (catch-ENOSYS exp)
+  (catch 'system-error
+    (lambda () exp)
+    (lambda args
+      (if (= ENOSYS (system-error-errno args))
+          #f
+          (apply throw args)))))
+
 (define (database-writer file mode entry->string)
   (lambda* (entries #:optional (file-or-port file))
     "Write ENTRIES to FILE-OR-PORT.  When FILE-OR-PORT is a file name, write
@@ -249,6 +258,11 @@ to it atomically and set the appropriate permissions."
             (lambda ()
               (chmod port mode)
               (write-entries port)
+
+              ;; XXX: When booting with the statically-linked Guile,
+              ;; 'fdatasync' is unavailable.
+              (catch-ENOSYS (fdatasync port))
+
               (close-port port)
               (rename-file template file-or-port))
             (lambda ()



reply via email to

[Prev in Thread] Current Thread [Next in Thread]