отсылать дешифрованные данные внешней команде. Старые версии не
поддерживаются.
@item
+Проверка доступного места перед копированием во время работы
+@command{nncp-xfer}, @command{nncp-daemon}, @command{nncp-call(er)}.
+@item
Зависимые библиотеки обновлены.
@item
Небольшие исправления ошибок.
@command{nncp-toss} did not verify encrypted packet's MAC before feeding
decrypted data to external command. Older versions are not supported.
@item
+Available free space checking before copying in @command{nncp-xfer},
+@command{nncp-daemon}, @command{nncp-call(er)}.
+@item
Dependant libraries are updated.
@item
Minor bugfixes.
}
filename := filepath.Join(dir.Name(), fiInt.Name())
sds["file"] = filename
+ delete(sds, "size")
fd, err := os.Open(filename)
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "open")
fd.Close()
continue
}
+ sds["size"] = strconv.FormatInt(fiInt.Size(), 10)
+ if !ctx.IsEnoughSpace(fiInt.Size()) {
+ ctx.LogE("nncp-xfer", sds, "is not enough space")
+ fd.Close()
+ continue
+ }
fd.Seek(0, 0)
tmp, err := ctx.NewTmpFileWHash()
if err != nil {
log.Fatalln(err)
}
- copied, err := io.Copy(tmp.W, bufio.NewReader(fd))
- if err != nil {
+ if _, err = io.CopyN(tmp.W, bufio.NewReader(fd), fiInt.Size()); err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "copy")
isBad = true
fd.Close()
)); err != nil {
log.Fatalln(err)
}
- ctx.LogI("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{
- "size": strconv.FormatInt(copied, 10),
- }), "")
+ ctx.LogI("nncp-xfer", sds, "")
if !*keep {
if err = os.Remove(filename); err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "remove")
import (
"errors"
"io/ioutil"
+ "log"
"os"
"path/filepath"
+
+ "golang.org/x/sys/unix"
)
type Ctx struct {
ctx.Debug = debug
return ctx, nil
}
+
+func (ctx *Ctx) IsEnoughSpace(want int64) bool {
+ var s unix.Statfs_t
+ if err := unix.Statfs(ctx.Spool, &s); err != nil {
+ log.Fatalln(err)
+ }
+ return s.Bavail*int64(s.Bsize) > want
+}
}
if err, exists := sds["err"]; exists {
msg += ": " + err
+ } else {
+ msg += " " + rem
}
case "nncp-bundle":
switch sds["xx"] {
return s
}
msg += fmt.Sprintf("%s packets, %s", sds["pkts"], size)
+ case "sp-process":
+ msg = fmt.Sprintf("%s has %s (%s): %s", nodeS, sds["hash"], size, rem)
case "sp-file":
switch sds["xx"] {
case "rx":
"part exists",
)
}
+ if !state.ctx.IsEnoughSpace(int64(info.Size) - offset) {
+ state.ctx.LogI("sp-process", sdsp, "not enough space")
+ continue
+ }
replies = append(replies, MarshalSP(
SPTypeFreq,
SPFreq{info.Hash, uint64(offset)},