X-Git-Url: https://ruderich.org/simon/gitweb/?p=nsscash%2Fnsscash.git;a=blobdiff_plain;f=misc.go;h=3cbe90f277387eee2e04910852003138c981df84;hp=947bb517b34d76fcf7627974b786d96179bd605c;hb=HEAD;hpb=1002c514a8530bb6608c556b4446e853be390917 diff --git a/misc.go b/misc.go index 947bb51..3cbe90f 100644 --- 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 +}