X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcmd%2Fnncp-xfer%2Fmain.go;h=7790ba378a93cfcb5266b72fc3d8f8ddb4189aad;hb=68b7c1266ec724ae6859c89d12575c868993145f;hp=a1ef5fa5d51c438179b33450f7876352d62d5242;hpb=2cad23b498bbb9fc1e929b4900b40e520017c614;p=nncp.git diff --git a/src/cmd/nncp-xfer/main.go b/src/cmd/nncp-xfer/main.go index a1ef5fa..7790ba3 100644 --- a/src/cmd/nncp-xfer/main.go +++ b/src/cmd/nncp-xfer/main.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2022 Sergey Matveev +Copyright (C) 2016-2023 Sergey Matveev 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 @@ -24,6 +24,7 @@ import ( "flag" "fmt" "io" + "io/fs" "log" "os" "path/filepath" @@ -33,8 +34,7 @@ import ( ) func usage() { - fmt.Fprintf(os.Stderr, nncp.UsageHeader()) - fmt.Fprintf(os.Stderr, "nncp-xfer -- copy inbound and outbounds packets\n\n") + fmt.Fprint(os.Stderr, "nncp-xfer -- copy inbound and outbounds packets\n\n") fmt.Fprintf(os.Stderr, "Usage: %s [options] DIR\nOptions:\n", os.Args[0]) flag.PrintDefaults() } @@ -105,7 +105,7 @@ func main() { selfPath := filepath.Join(flag.Arg(0), ctx.SelfId.String()) isBad := false var dir *os.File - var fis []os.FileInfo + var entries []os.DirEntry var les nncp.LEs var logMsg func(les nncp.LEs) string if *txOnly { @@ -120,7 +120,7 @@ func main() { } ctx.LogD("xfer-self", les, logMsg) if _, err = os.Stat(selfPath); err != nil { - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { ctx.LogD("xfer-self-no-dir", les, func(les nncp.LEs) string { return logMsg(les) + ": no directory" }) @@ -140,7 +140,7 @@ func main() { isBad = true goto Tx } - fis, err = dir.Readdir(0) + entries, err = dir.ReadDir(0) dir.Close() if err != nil { ctx.LogE("xfer-self-read", les, err, func(les nncp.LEs) string { @@ -149,12 +149,12 @@ func main() { isBad = true goto Tx } - for _, fi := range fis { - if !fi.IsDir() { + for _, entry := range entries { + if !entry.IsDir() { continue } - nodeId, err := nncp.NodeIdFromString(fi.Name()) - les := append(les, nncp.LE{K: "Node", V: fi.Name()}) + nodeId, err := nncp.NodeIdFromString(entry.Name()) + les := append(les, nncp.LE{K: "Node", V: entry.Name()}) logMsg := func(les nncp.LEs) string { return "Packet transfer, received from " + ctx.NodeName(nodeId) } @@ -176,7 +176,7 @@ func main() { }) continue } - dir, err = os.Open(filepath.Join(selfPath, fi.Name())) + dir, err = os.Open(filepath.Join(selfPath, entry.Name())) if err != nil { ctx.LogE("xfer-rx-open", les, err, func(les nncp.LEs) string { return logMsg(les) + ": opening" @@ -194,7 +194,7 @@ func main() { continue } for _, fiInt := range fisInt { - if !fi.IsDir() { + if fiInt.IsDir() { continue } // Check that it is valid Base32 encoding @@ -209,6 +209,24 @@ func main() { ctx.NodeName(nodeId), filename, ) } + if _, err = os.Stat(filepath.Join( + ctx.Spool, + nodeId.String(), + string(nncp.TRx), + nncp.SeenDir, + fiInt.Name(), + )); err == nil || !errors.Is(err, fs.ErrNotExist) { + ctx.LogI("xfer-rx-seen", les, func(les nncp.LEs) string { + return logMsg(les) + ": packet already seen" + }) + if !*keep { + if err = os.Remove(filename); err != nil { + ctx.LogE("xfer-rx-remove", les, err, logMsg) + isBad = true + } + } + continue + } fd, err := os.Open(filename) if err != nil { ctx.LogE("xfer-rx-open", les, err, func(les nncp.LEs) string { @@ -275,7 +293,9 @@ func main() { } r, w := io.Pipe() go func() { - _, err := io.CopyN(w, bufio.NewReader(fd), fiInt.Size()) + _, err := io.CopyN( + w, bufio.NewReaderSize(fd, nncp.MTHBlockSize), fiInt.Size(), + ) if err == nil { err = w.Close() } @@ -369,7 +389,7 @@ Tx: } _, err = os.Stat(nodePath) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { ctx.LogD("xfer-tx-not-exist", les, func(les nncp.LEs) string { return logMsg(les) + ": does not exist" }) @@ -400,7 +420,7 @@ Tx: } _, err = os.Stat(dstPath) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { if err = os.Mkdir(dstPath, os.FileMode(0777)); err != nil { ctx.UnlockDir(dirLock) ctx.LogE("xfer-tx-mkdir", les, err, logMsg) @@ -430,20 +450,12 @@ Tx: }) continue } - if _, err = os.Stat(filepath.Join(dstPath, pktName)); err == nil || !os.IsNotExist(err) { + if _, err = os.Stat(filepath.Join(dstPath, pktName)); err == nil || !errors.Is(err, fs.ErrNotExist) { ctx.LogD("xfer-tx-exists", les, func(les nncp.LEs) string { return logMsg(les) + ": already exists" }) continue } - if _, err = os.Stat(filepath.Join( - dstPath, nncp.SeenDir, pktName, - )); err == nil || !os.IsNotExist(err) { - ctx.LogD("xfer-tx-seen", les, func(les nncp.LEs) string { - return logMsg(les) + ": already seen" - }) - continue - } tmp, err := nncp.TempFile(dstPath, "xfer") if err != nil { ctx.LogE("xfer-tx-mktemp", les, err, func(les nncp.LEs) string { @@ -467,7 +479,7 @@ Tx: } bufW := bufio.NewWriter(tmp) copied, err := nncp.CopyProgressed( - bufW, bufio.NewReader(fd), "Tx", + bufW, bufio.NewReaderSize(fd, nncp.MTHBlockSize), "Tx", append(les, nncp.LE{K: "FullSize", V: job.Size}), ctx.ShowPrgrs, )