X-Git-Url: https://ruderich.org/simon/gitweb/?p=nsscash%2Fnsscash.git;a=blobdiff_plain;f=state.go;fp=state.go;h=43fc598b1814bc17a92821587a40ed35b697c87a;hp=4b3124137530213e5444867c797afa29e3ff5dea;hb=4d994341317c2e700370950bd5fd9ac05963fc66;hpb=1002c514a8530bb6608c556b4446e853be390917 diff --git a/state.go b/state.go index 4b31241..43fc598 100644 --- a/state.go +++ b/state.go @@ -23,6 +23,8 @@ import ( "os" "path/filepath" "time" + + "github.com/google/renameio" ) type State struct { @@ -68,26 +70,15 @@ func WriteState(path string, state *State) error { return err } - // Write the file in an atomic fashion by creating a temporary file - // and renaming it over the target file - - dir := filepath.Dir(path) - name := filepath.Base(path) - - f, err := ioutil.TempFile(dir, "tmp-"+name+"-") + f, err := renameio.TempFile(filepath.Dir(path), path) if err != nil { return err } - defer os.Remove(f.Name()) - defer f.Close() + defer f.Cleanup() _, err = f.Write(x) if err != nil { return err } - err = f.Sync() - if err != nil { - return err - } - return os.Rename(f.Name(), path) + return f.CloseAtomicallyReplace() }