if *autoToss {
autoTossFinish, autoTossBadCode = ctx.AutoToss(
node.Id,
- nice,
- *autoTossDoSeen,
- *autoTossNoFile,
- *autoTossNoFreq,
- *autoTossNoExec,
- *autoTossNoTrns,
- *autoTossNoArea,
- *autoTossNoACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ DoSeen: *autoTossDoSeen,
+ NoFile: *autoTossNoFile,
+ NoFreq: *autoTossNoFreq,
+ NoExec: *autoTossNoExec,
+ NoTrns: *autoTossNoTrns,
+ NoArea: *autoTossNoArea,
+ NoACK: *autoTossNoACK,
+ },
)
}
if call.AutoToss || *autoToss {
autoTossFinish, autoTossBadCode = ctx.AutoToss(
node.Id,
- call.Nice,
- call.AutoTossDoSeen || *autoTossDoSeen,
- call.AutoTossNoFile || *autoTossNoFile,
- call.AutoTossNoFreq || *autoTossNoFreq,
- call.AutoTossNoExec || *autoTossNoExec,
- call.AutoTossNoTrns || *autoTossNoTrns,
- call.AutoTossNoArea || *autoTossNoArea,
- call.AutoTossNoACK || *autoTossNoACK,
+ &nncp.TossOpts{
+ Nice: call.Nice,
+ DoSeen: call.AutoTossDoSeen || *autoTossDoSeen,
+ NoFile: call.AutoTossNoFile || *autoTossNoFile,
+ NoFreq: call.AutoTossNoFreq || *autoTossNoFreq,
+ NoExec: call.AutoTossNoExec || *autoTossNoExec,
+ NoTrns: call.AutoTossNoTrns || *autoTossNoTrns,
+ NoArea: call.AutoTossNoArea || *autoTossNoArea,
+ NoACK: call.AutoTossNoACK || *autoTossNoACK,
+ },
)
}
if *autoToss && nodeId != nil {
autoTossFinish, autoTossBadCode = ctx.AutoToss(
nodeId,
- nice,
- *autoTossDoSeen,
- *autoTossNoFile,
- *autoTossNoFreq,
- *autoTossNoExec,
- *autoTossNoTrns,
- *autoTossNoArea,
- *autoTossNoACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ DoSeen: *autoTossDoSeen,
+ NoFile: *autoTossNoFile,
+ NoFreq: *autoTossNoFreq,
+ NoExec: *autoTossNoExec,
+ NoTrns: *autoTossNoTrns,
+ NoArea: *autoTossNoArea,
+ NoACK: *autoTossNoACK,
+ },
)
}
<-nodeIdC // call completion
if *autoToss && nodeId != nil {
autoTossFinish, autoTossBadCode = ctx.AutoToss(
nodeId,
- nice,
- *autoTossDoSeen,
- *autoTossNoFile,
- *autoTossNoFreq,
- *autoTossNoExec,
- *autoTossNoTrns,
- *autoTossNoArea,
- *autoTossNoACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ DoSeen: *autoTossDoSeen,
+ NoFile: *autoTossNoFile,
+ NoFreq: *autoTossNoFreq,
+ NoExec: *autoTossNoExec,
+ NoTrns: *autoTossNoTrns,
+ NoArea: *autoTossNoArea,
+ NoACK: *autoTossNoACK,
+ },
)
}
<-nodeIdC // call completion
isBad = ctx.Toss(
node.Id,
nncp.TRx,
- nice,
- *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, *noACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ DoSeen: *doSeen,
+ NoFile: *noFile,
+ NoFreq: *noFreq,
+ NoExec: *noExec,
+ NoTrns: *noTrns,
+ NoArea: *noArea,
+ NoACK: *noACK,
+ },
) || isBad
if nodeId == *ctx.SelfId {
isBad = ctx.Toss(
node.Id,
nncp.TTx,
- nice,
- *dryRun, false, true, true, true, true, *noArea, *noACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ NoFile: true,
+ NoFreq: true,
+ NoExec: true,
+ NoTrns: true,
+ NoArea: *noArea,
+ NoACK: *noACK,
+ },
) || isBad
}
}
ctx.Toss(
nodeId,
nncp.TRx,
- nice,
- *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, *noACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ DryRun: *dryRun,
+ DoSeen: *doSeen,
+ NoFile: *noFile,
+ NoFreq: *noFreq,
+ NoExec: *noExec,
+ NoTrns: *noTrns,
+ NoArea: *noArea,
+ NoACK: *noACK,
+ },
)
if *nodeId == *ctx.SelfId {
ctx.Toss(
nodeId,
nncp.TTx,
- nice,
- *dryRun, false, true, true, true, true, *noArea, *noACK,
+ &nncp.TossOpts{
+ Nice: nice,
+ NoFile: true,
+ NoFreq: true,
+ NoExec: true,
+ NoTrns: true,
+ NoArea: *noArea,
+ NoACK: *noACK,
+ },
)
}
}
SeenDir = "seen"
)
+type TossOpts struct {
+ Nice uint8
+ DryRun bool
+ DoSeen bool
+ NoFile bool
+ NoFreq bool
+ NoExec bool
+ NoTrns bool
+ NoArea bool
+ NoACK bool
+}
+
func jobPath2Seen(jobPath string) string {
return filepath.Join(filepath.Dir(jobPath), SeenDir, filepath.Base(jobPath))
}
pktSize uint64,
jobPath string,
decompressor *zstd.Decoder,
- dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool,
+ opts *TossOpts,
) error {
defer pipeR.Close()
sendmail := ctx.Neigh[*ctx.SelfId].Exec["sendmail"]
})
switch pkt.Type {
case PktTypeExec, PktTypeExecFat:
- if noExec {
+ if opts.NoExec {
return nil
}
path := bytes.Split(pkt.Path[:int(pkt.PathLen)], []byte{0})
log.Fatalln(err)
}
}
- if !dryRun {
+ if !opts.DryRun {
cmd := exec.Command(cmdline[0], append(cmdline[1:], args...)...)
cmd.Env = append(
cmd.Env,
humanize.IBytes(pktSize),
)
})
- if !dryRun && jobPath != "" {
- if doSeen {
+ if !opts.DryRun && jobPath != "" {
+ if opts.DoSeen {
if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
return err
}
}
case PktTypeFile:
- if noFile {
+ if opts.NoFile {
return nil
}
dst := string(pkt.Path[:int(pkt.PathLen)])
})
return err
}
- if !dryRun {
+ if !opts.DryRun {
tmp, err := TempFile(dir, "file")
if err != nil {
ctx.LogE("rx-mktemp", les, err, func(les LEs) string {
dst, humanize.IBytes(pktSize), sender.Name,
)
})
- if !dryRun {
+ if !opts.DryRun {
if jobPath != "" {
- if doSeen {
+ if opts.DoSeen {
if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
return err
}
}
case PktTypeFreq:
- if noFreq {
+ if opts.NoFreq {
return nil
}
src := string(pkt.Path[:int(pkt.PathLen)])
)
return err
}
- if !dryRun {
+ if !opts.DryRun {
err = ctx.TxFile(
sender,
pkt.Nice,
ctx.LogI("rx", les, func(les LEs) string {
return fmt.Sprintf("Got file request %s to %s", src, sender.Name)
})
- if !dryRun {
+ if !opts.DryRun {
if jobPath != "" {
- if doSeen {
+ if opts.DoSeen {
if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
return err
}
}
case PktTypeTrns:
- if noTrns {
+ if opts.NoTrns {
return nil
}
dst := new([MTHSize]byte)
return err
}
ctx.LogD("rx-tx", les, logMsg)
- if !dryRun {
+ if !opts.DryRun {
if len(node.Via) == 0 {
if err = ctx.TxTrns(node, nice, int64(pktSize), pipeR); err != nil {
ctx.LogE("rx", les, err, func(les LEs) string {
humanize.IBytes(pktSize),
)
})
- if !dryRun && jobPath != "" {
- if doSeen {
+ if !opts.DryRun && jobPath != "" {
+ if opts.DoSeen {
if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
return err
}
}
case PktTypeArea:
- if noArea {
+ if opts.NoArea {
return nil
}
areaId := new(AreaId)
les = append(les, LE{"AreaMsg", msgHash})
ctx.LogD("rx-area", les, logMsg)
- if dryRun {
+ if opts.DryRun {
for _, nodeId := range area.Subs {
node := ctx.Neigh[*nodeId]
lesEcho := append(les, LE{"Echo", nodeId})
ctx.LogD("rx-area-seen", les, func(les LEs) string {
return logMsg(les) + ": already seen"
})
- if !dryRun && jobPath != "" {
+ if !opts.DryRun && jobPath != "" {
if err = os.Remove(jobPath); err != nil {
ctx.LogE("rx-area-remove", les, err, func(les LEs) string {
return fmt.Sprintf(
uint64(pktSizeWithoutEnc(int64(pktSize))),
"",
decompressor,
- dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK,
+ opts,
)
}()
_, _, _, err = PktEncRead(
}
}
- if !dryRun && jobPath != "" {
+ if !opts.DryRun && jobPath != "" {
if err = os.MkdirAll(seenDir, os.FileMode(0777)); err != nil {
ctx.LogE("rx-area-mkdir", les, err, logMsg)
return err
}
case PktTypeACK:
- if noACK {
+ if opts.NoACK {
return nil
}
hsh := Base32Codec.EncodeToString(pkt.Path[:MTHSize])
ctx.LogD("rx-ack", les, logMsg)
pktPath := filepath.Join(ctx.Spool, sender.Id.String(), string(TTx), hsh)
if _, err := os.Stat(pktPath); err == nil {
- if !dryRun {
+ if !opts.DryRun {
if err = os.Remove(pktPath); err != nil {
ctx.LogE("rx-ack", les, err, func(les LEs) string {
return logMsg(les) + ": removing packet"
return logMsg(les) + ": already disappeared"
})
}
- if !dryRun && doSeen {
+ if !opts.DryRun && opts.DoSeen {
if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
return err
}
}
}
}
- if !dryRun {
+ if !opts.DryRun {
if err = os.Remove(jobPath); err != nil {
ctx.LogE("rx", les, err, func(les LEs) string {
return logMsg(les) + ": removing job"
return nil
}
-func (ctx *Ctx) Toss(
- nodeId *NodeId,
- xx TRxTx,
- nice uint8,
- dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool,
-) bool {
+func (ctx *Ctx) Toss(nodeId *NodeId, xx TRxTx, opts *TossOpts) bool {
dirLock, err := ctx.LockDir(nodeId, "toss")
if err != nil {
return false
{"Pkt", pktName},
{"Nice", int(job.PktEnc.Nice)},
}
- if job.PktEnc.Nice > nice {
+ if job.PktEnc.Nice > opts.Nice {
ctx.LogD("rx-too-nice", les, func(les LEs) string {
return fmt.Sprintf(
"Tossing %s/%s: too nice: %s",
uint64(pktSizeWithoutEnc(job.Size)),
job.Path,
decompressor,
- dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK,
+ opts,
)
}()
pipeWB := bufio.NewWriter(pipeW)
return isBad
}
-func (ctx *Ctx) AutoToss(
- nodeId *NodeId,
- nice uint8,
- doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool,
-) (chan struct{}, chan bool) {
+func (ctx *Ctx) AutoToss(nodeId *NodeId, opts *TossOpts) (chan struct{}, chan bool) {
dw, err := ctx.NewDirWatcher(
filepath.Join(ctx.Spool, nodeId.String(), string(TRx)),
time.Second,
badCode <- bad
return
case <-dw.C:
- bad = !ctx.Toss(
- nodeId, TRx, nice, false,
- doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK) || bad
+ bad = !ctx.Toss(nodeId, TRx, opts) || bad
}
}
}()
if len(dirFiles(rxPath)) == 0 {
continue
}
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec-1,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceExec - 1})
if len(dirFiles(rxPath)) == 0 {
return false
}
ctx.Neigh[*nodeOur.Id].Exec = make(map[string][]string)
ctx.Neigh[*nodeOur.Id].Exec[handle] = []string{"/bin/sh", "-c", "false"}
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceExec})
if len(dirFiles(rxPath)) == 0 {
return false
}
filepath.Join(spool, "mbox"),
),
}
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceExec})
if len(dirFiles(rxPath)) != 0 {
return false
}
}
rxPath := filepath.Join(spool, ctx.Self.Id.String(), string(TRx))
os.Rename(filepath.Join(spool, ctx.Self.Id.String(), string(TTx)), rxPath)
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFile})
if len(dirFiles(rxPath)) == 0 {
return false
}
ctx.Neigh[*nodeOur.Id].Incoming = &incomingPath
- if ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile,
- false, false, false, false, false, false, false, false) {
+ if ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFile}) {
return false
}
if len(dirFiles(rxPath)) != 0 {
rxPath := filepath.Join(spool, ctx.Self.Id.String(), string(TRx))
os.Rename(filepath.Join(spool, ctx.Self.Id.String(), string(TTx)), rxPath)
ctx.Neigh[*nodeOur.Id].Incoming = &incomingPath
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFile})
expected := make(map[string]struct{})
expected["samefile"] = struct{}{}
for i := 0; i < files-1; i++ {
txPath := filepath.Join(spool, ctx.Self.Id.String(), string(TTx))
os.Rename(txPath, rxPath)
os.MkdirAll(txPath, os.FileMode(0700))
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFreq})
if len(dirFiles(txPath)) != 0 || len(dirFiles(rxPath)) == 0 {
return false
}
ctx.Neigh[*nodeOur.Id].FreqPath = &spool
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFreq})
if len(dirFiles(txPath)) != 0 || len(dirFiles(rxPath)) == 0 {
return false
}
panic(err)
}
}
- ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFreq})
if len(dirFiles(txPath)) == 0 || len(dirFiles(rxPath)) != 0 {
return false
}
panic(err)
}
}
- ctx.Toss(ctx.Self.Id, TRx, 123,
- false, false, false, false, false, false, false, false)
+ ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: 123})
if len(dirFiles(rxPath)) != 0 {
return false
}