/*
NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2022 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
r := <-results
payloadSize = r.size
pktEncMsg = r.pktEncRaw
+ wrappers--
}
for i := 0; i <= wrappers; i++ {
r := <-results
if r.err != nil {
tmp.Fd.Close()
- return nil, 0, err
+ return nil, 0, r.err
}
if r.pktEncRaw != nil {
pktEncRaw = r.pktEncRaw
if err != nil {
return err
}
- if info.IsDir() {
+ if info.Mode().IsDir() {
// directory header, PAX record header+contents
srcSize += TarBlockSize + 2*TarBlockSize
dirs = append(dirs, einfo{path: path, modTime: info.ModTime()})
- } else {
+ } else if info.Mode().IsRegular() {
// file header, PAX record header+contents, file content
srcSize += TarBlockSize + 2*TarBlockSize + info.Size()
if n := info.Size() % TarBlockSize; n != 0 {
}
logMsg := func(les LEs) string {
return fmt.Sprintf(
- "File %s (%s) sent to %s:%s",
+ "File %s (%s) is sent to %s:%s",
srcPath,
humanize.IBytes(uint64(finalSize)),
ctx.NodeName(node.Id),
}
logMsg := func(les LEs) string {
return fmt.Sprintf(
- "File %s (%s) sent to %s:%s",
+ "File %s (%s) is sent to %s:%s",
srcPath,
humanize.IBytes(uint64(size)),
ctx.NodeName(node.Id),
}
logMsg := func(les LEs) string {
return fmt.Sprintf(
- "File %s (%s) sent to %s:%s",
+ "File %s (%s) is sent to %s:%s",
srcPath,
humanize.IBytes(uint64(metaPktSize)),
ctx.NodeName(node.Id),
}
logMsg := func(les LEs) string {
return fmt.Sprintf(
- "File request from %s:%s to %s sent",
+ "File request from %s:%s to %s is sent",
ctx.NodeName(node.Id), srcPath,
dstPath,
)
}
logMsg := func(les LEs) string {
return fmt.Sprintf(
- "Exec sent to %s@%s (%s)",
+ "Exec is sent to %s@%s (%s)",
ctx.NodeName(node.Id), dst, humanize.IBytes(uint64(size)),
)
}
os.Symlink(nodePath, filepath.Join(ctx.Spool, node.Name))
return err
}
+
+func (ctx *Ctx) TxACK(
+ node *Node,
+ nice uint8,
+ hsh string,
+ minSize int64,
+) error {
+ hshRaw, err := Base32Codec.DecodeString(hsh)
+ if err != nil {
+ return err
+ }
+ if len(hshRaw) != MTHSize {
+ return errors.New("Invalid packet id size")
+ }
+ pkt, err := NewPkt(PktTypeACK, nice, []byte(hshRaw))
+ if err != nil {
+ return err
+ }
+ src := bytes.NewReader([]byte{})
+ _, _, err = ctx.Tx(node, pkt, nice, 0, minSize, MaxFileSize, src, hsh, nil)
+ les := LEs{
+ {"Type", "ack"},
+ {"Node", node.Id},
+ {"Nice", int(nice)},
+ {"Pkt", hsh},
+ }
+ logMsg := func(les LEs) string {
+ return fmt.Sprintf("ACK to %s of %s is sent", ctx.NodeName(node.Id), hsh)
+ }
+ if err == nil {
+ ctx.LogI("tx", les, logMsg)
+ } else {
+ ctx.LogE("tx", les, err, logMsg)
+ }
+ return err
+}