]> ruderich.org/simon Gitweb - nsscash/nsscash.git/blobdiff - misc.go
.github: update upstream actions to latest version
[nsscash/nsscash.git] / misc.go
diff --git a/misc.go b/misc.go
index 947bb517b34d76fcf7627974b786d96179bd605c..3cbe90f277387eee2e04910852003138c981df84 100644 (file)
--- a/misc.go
+++ b/misc.go
@@ -1,6 +1,6 @@
 // Miscellaneous functions
 
-// Copyright (C) 2019-2020  Simon Ruderich
+// Copyright (C) 2019-2021  Simon Ruderich
 //
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU Affero General Public License as published by
@@ -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
+}