]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/sp.go
Sync directories for rename assurance
[nncp.git] / src / sp.go
index 7e2f7c3be104029977f94fa6e1cdc7b52aa89273..b6e49b415e06b8f9f7a9b65f5079ff25e7d16dd6 100644 (file)
--- a/src/sp.go
+++ b/src/sp.go
@@ -30,7 +30,7 @@ import (
        "sync"
        "time"
 
-       "github.com/davecgh/go-xdr/xdr2"
+       xdr "github.com/davecgh/go-xdr/xdr2"
        "github.com/flynn/noise"
 )
 
@@ -104,7 +104,7 @@ type FreqWithNice struct {
 }
 
 type ConnDeadlined interface {
-       io.ReadWriter
+       io.ReadWriteCloser
        SetReadDeadline(t time.Time) error
        SetWriteDeadline(t time.Time) error
 }
@@ -838,17 +838,17 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                        sdsp["xx"] = string(TRx)
                        sdsp["hash"] = ToBase32(file.Hash[:])
                        sdsp["size"] = strconv.Itoa(len(file.Payload))
-                       filePath := filepath.Join(
+                       dirToSync := filepath.Join(
                                state.Ctx.Spool,
                                state.Node.Id.String(),
                                string(TRx),
-                               ToBase32(file.Hash[:]),
                        )
+                       filePath := filepath.Join(dirToSync, ToBase32(file.Hash[:]))
                        state.Ctx.LogD("sp-file", sdsp, "opening part")
                        fd, err := os.OpenFile(
                                filePath+PartSuffix,
                                os.O_RDWR|os.O_CREATE,
-                               os.FileMode(0600),
+                               os.FileMode(0666),
                        )
                        if err != nil {
                                state.Ctx.LogE("sp-file", SdsAdd(sdsp, SDS{"err": err}), "")
@@ -901,7 +901,14 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                        return
                                }
                                state.Ctx.LogI("sp-done", SdsAdd(sdsp, SDS{"xx": string(TRx)}), "")
-                               os.Rename(filePath+PartSuffix, filePath)
+                               if err = os.Rename(filePath+PartSuffix, filePath); err != nil {
+                                       state.Ctx.LogE("sp-file", SdsAdd(sdsp, SDS{"err": err}), "rename")
+                                       return
+                               }
+                               if err = DirSync(dirToSync); err != nil {
+                                       state.Ctx.LogE("sp-file", SdsAdd(sdsp, SDS{"err": err}), "sync")
+                                       return
+                               }
                                state.Lock()
                                delete(state.infosTheir, *file.Hash)
                                state.Unlock()