X-Git-Url: https://ruderich.org/simon/gitweb/?p=nsscash%2Fnsscash.git;a=blobdiff_plain;f=misc.go;fp=misc.go;h=3cbe90f277387eee2e04910852003138c981df84;hp=897a764d6fcbb4ef5d009d388977342db772d3ff;hb=f00fb4706c4c2459d528fb5f8ad0fa112b00bdd0;hpb=278c50be3d8a8c433aa862d602492112b9f26a67 diff --git a/misc.go b/misc.go index 897a764..3cbe90f 100644 --- 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 +}