]> Cypherpunks.ru repositories - gocheese.git/blobdiff - tmp.go
Fix digest mismatch error
[gocheese.git] / tmp.go
diff --git a/tmp.go b/tmp.go
index 876e23d8502bc3690bff9e99bc0523859420f64f..70d3f1123840718924d05f4817cdabdcf6034aa6 100644 (file)
--- a/tmp.go
+++ b/tmp.go
@@ -30,3 +30,38 @@ func TempFile(dir string) (*os.File, error) {
        name := filepath.Join(dir, "nncp"+suffix)
        return os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, os.FileMode(0666))
 }
+
+func DirSync(dirPath string) error {
+       fd, err := os.Open(dirPath)
+       if err != nil {
+               return err
+       }
+       err = fd.Sync()
+       if err != nil {
+               fd.Close()
+               return err
+       }
+       return fd.Close()
+}
+
+func WriteFileSync(dirPath, filePath string, data []byte) error {
+       dst, err := TempFile(dirPath)
+       if err != nil {
+               return err
+       }
+       if _, err = dst.Write(data); err != nil {
+               os.Remove(dst.Name())
+               dst.Close()
+               return err
+       }
+       if err = dst.Sync(); err != nil {
+               os.Remove(dst.Name())
+               dst.Close()
+               return err
+       }
+       dst.Close()
+       if err = os.Rename(dst.Name(), filePath); err != nil {
+               return err
+       }
+       return DirSync(dirPath)
+}