/*
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
"os"
"strings"
- "go.cypherpunks.ru/nncp/v7"
+ "go.cypherpunks.ru/nncp/v8"
)
func usage() {
fmt.Fprintf(os.Stderr, nncp.UsageHeader())
fmt.Fprintf(os.Stderr, "nncp-file -- send file\n\n")
- fmt.Fprintf(os.Stderr, "Usage: %s [options] SRC NODE:[DST]\nOptions:\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, "Usage: %s [options] SRC NODE:[DST]\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s [options] SRC %s:AREA:[DST]\nOptions:\n",
+ os.Args[0], nncp.AreaDir)
flag.PrintDefaults()
fmt.Fprint(os.Stderr, `
-If SRC equals to -, then read data from stdin to temporary file.
+If SRC equals to "-", then data is read from stdin.
+If SRC is directory, then create pax archive with its contents.
-minsize/-chunked take NODE's freq.minsize/freq.chunked configuration
options by default. You can forcefully turn them off by specifying 0 value.
cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
niceRaw = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFile), "Outbound packet niceness")
argMinSize = flag.Int64("minsize", -1, "Minimal required resulting packet size, in KiB")
+ argMaxSize = flag.Uint64("maxsize", 0, "Maximal allowable resulting packets size, in KiB")
argChunkSize = flag.Int64("chunked", -1, "Split file on specified size chunks, in KiB")
viaOverride = flag.String("via", "", "Override Via path to destination node")
spoolPath = flag.String("spool", "", "Override path to spool")
log.Fatalln("Config lacks private keys")
}
- splitted := strings.SplitN(flag.Arg(1), ":", 2)
- if len(splitted) != 2 {
+ splitted := strings.Split(flag.Arg(1), ":")
+ if len(splitted) < 2 {
usage()
os.Exit(1)
}
- node, err := ctx.FindNode(splitted[0])
- if err != nil {
- log.Fatalln("Invalid NODE specified:", err)
+ var areaId *nncp.AreaId
+ var node *nncp.Node
+ if splitted[0] == nncp.AreaDir {
+ if len(splitted) < 3 {
+ usage()
+ os.Exit(1)
+ }
+ areaId = ctx.AreaName2Id[splitted[1]]
+ if areaId == nil {
+ log.Fatalln("Unknown area specified")
+ }
+ node = ctx.Neigh[*ctx.SelfId]
+ splitted = splitted[2:]
+ } else {
+ node, err = ctx.FindNode(splitted[0])
+ if err != nil {
+ log.Fatalln("Invalid NODE specified:", err)
+ }
+ splitted = splitted[1:]
}
nncp.ViaOverride(*viaOverride, ctx, node)
ctx.Umask()
+ var chunkSize int64
+ if *argChunkSize < 0 {
+ chunkSize = node.FreqChunked
+ } else if *argChunkSize > 0 {
+ chunkSize = *argChunkSize * 1024
+ }
+
var minSize int64
if *argMinSize < 0 {
minSize = node.FreqMinSize
minSize = *argMinSize * 1024
}
- var chunkSize int64
- if *argChunkSize < 0 {
- chunkSize = node.FreqChunked
- } else if *argChunkSize > 0 {
- chunkSize = *argChunkSize * 1024
- }
- if chunkSize == 0 {
- chunkSize = nncp.MaxFileSize
+ maxSize := int64(nncp.MaxFileSize)
+ if *argMaxSize > 0 {
+ maxSize = int64(*argMaxSize) * 1024
}
if err = ctx.TxFile(
node,
nice,
flag.Arg(0),
- splitted[1],
+ strings.Join(splitted, ":"),
chunkSize,
minSize,
- nncp.MaxFileSize,
+ maxSize,
+ areaId,
); err != nil {
log.Fatalln(err)
}