]> ruderich.org/simon Gitweb - nsscash/nsscash.git/blobdiff - misc.go
Guarantee durability after renaming temporary files
[nsscash/nsscash.git] / misc.go
diff --git a/misc.go b/misc.go
index 897a764d6fcbb4ef5d009d388977342db772d3ff..3cbe90f277387eee2e04910852003138c981df84 100644 (file)
--- a/misc.go
+++ b/misc.go
@@ -20,6 +20,7 @@ package main
 import (
        "bytes"
        "fmt"
+       "os"
 )
 
 func alignBufferTo(b *bytes.Buffer, align int) {
@@ -35,3 +36,24 @@ func alignBufferTo(b *bytes.Buffer, align int) {
                b.WriteByte(0)
        }
 }
+
+// syncPath syncs path, which should be a directory. To guarantee durability
+// it must be called on a parent directory after adding, renaming or removing
+// files therein.
+//
+// Calling sync on the files itself is not enough according to POSIX; man 2
+// fsync: "Calling fsync() does not necessarily ensure that the entry in the
+// directory containing the file has also reached disk. For that an explicit
+// fsync() on a file descriptor for the directory is also needed."
+func syncPath(path string) error {
+       x, err := os.Open(path)
+       if err != nil {
+               return err
+       }
+       err = x.Sync()
+       closeErr := x.Close()
+       if err != nil {
+               return err
+       }
+       return closeErr
+}