]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/tmp.go
Merge branch 'develop'
[nncp.git] / src / tmp.go
index 6d1e49c08e132794b5faa1934342bbb7b5d32823..c4f57c167dad4ba6353f1c08c2edbde8ddaeff32 100644 (file)
@@ -1,6 +1,6 @@
 /*
 NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2023 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -28,6 +28,12 @@ import (
        "time"
 )
 
+var NoSync bool
+
+func init() {
+       NoSync = os.Getenv(CfgNoSync) != ""
+}
+
 func TempFile(dir, prefix string) (*os.File, error) {
        // Assume that probability of suffix collision is negligible
        suffix := strconv.FormatInt(time.Now().UnixNano()+int64(os.Getpid()), 16)
@@ -37,13 +43,8 @@ func TempFile(dir, prefix string) (*os.File, error) {
 
 func (ctx *Ctx) NewTmpFile() (*os.File, error) {
        jobsPath := filepath.Join(ctx.Spool, "tmp")
-       if _, err := os.Stat(jobsPath); err != nil {
-               if !os.IsNotExist(err) {
-                       return nil, err
-               }
-               if err := os.MkdirAll(jobsPath, os.FileMode(0777)); err != nil {
-                       return nil, err
-               }
+       if err := ensureDir(jobsPath); err != nil {
+               return nil, err
        }
        fd, err := TempFile(jobsPath, "")
        if err == nil {
@@ -82,6 +83,9 @@ func (tmp *TmpFileWHash) Cancel() {
 }
 
 func DirSync(dirPath string) error {
+       if NoSync {
+               return nil
+       }
        fd, err := os.Open(dirPath)
        if err != nil {
                return err
@@ -100,21 +104,18 @@ func (tmp *TmpFileWHash) Checksum() string {
 
 func (tmp *TmpFileWHash) Commit(dir string) error {
        var err error
-       if _, err = os.Stat(dir); err != nil {
-               if !os.IsNotExist(err) {
-                       return err
-               }
-               if err = os.MkdirAll(dir, os.FileMode(0777)); err != nil {
-                       return err
-               }
+       if err = ensureDir(dir); err != nil {
+               return err
        }
        if err = tmp.W.Flush(); err != nil {
                tmp.Fd.Close()
                return err
        }
-       if err = tmp.Fd.Sync(); err != nil {
-               tmp.Fd.Close()
-               return err
+       if !NoSync {
+               if err = tmp.Fd.Sync(); err != nil {
+                       tmp.Fd.Close()
+                       return err
+               }
        }
        if err = tmp.Fd.Close(); err != nil {
                return err