}
selfPath := filepath.Join(flag.Arg(0), ctx.Self.Id.String())
- badExit := false
+ isBad := false
var dir *os.File
var fis []os.FileInfo
sds := nncp.SDS{}
goto Tx
}
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "stat")
- badExit = true
+ isBad = true
goto Tx
}
dir, err = os.Open(selfPath)
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "open")
- badExit = true
+ isBad = true
goto Tx
}
fis, err = dir.Readdir(0)
dir.Close()
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "read")
- badExit = true
+ isBad = true
goto Tx
}
for _, fi := range fis {
dir, err = os.Open(filepath.Join(selfPath, fi.Name()))
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "open")
- badExit = true
+ isBad = true
continue
}
fisInt, err := dir.Readdir(0)
dir.Close()
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "read")
- badExit = true
+ isBad = true
continue
}
for _, fiInt := range fisInt {
fd, err := os.Open(filename)
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "open")
- badExit = true
+ isBad = true
continue
}
var pktEnc nncp.PktEnc
copied, err := io.Copy(tmp.W, bufio.NewReader(fd))
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "copy")
- badExit = true
+ isBad = true
fd.Close()
tmp.Cancel()
continue
if !*keep {
if err = os.Remove(filename); err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "remove")
- badExit = true
+ isBad = true
}
}
}
Tx:
if *rxOnly {
- if badExit {
+ if isBad {
os.Exit(1)
}
return
if err = os.Mkdir(nodePath, os.FileMode(0700)); err != nil {
ctx.UnlockDir(dirLock)
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "mkdir")
- badExit = true
+ isBad = true
continue
}
} else {
ctx.UnlockDir(dirLock)
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "stat")
- badExit = true
+ isBad = true
continue
}
}
if err = os.Mkdir(dstPath, os.FileMode(0700)); err != nil {
ctx.UnlockDir(dirLock)
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "mkdir")
- badExit = true
+ isBad = true
continue
}
} else {
ctx.UnlockDir(dirLock)
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "stat")
- badExit = true
+ isBad = true
continue
}
}
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "mktemp")
job.Fd.Close()
- badExit = true
+ isBad = true
break
}
sds["tmp"] = tmp.Name()
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "copy")
tmp.Close()
- badExit = true
+ isBad = true
continue
}
err = bufW.Flush()
tmp.Close()
if err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "copy")
- badExit = true
+ isBad = true
continue
}
if err = os.Rename(tmp.Name(), filepath.Join(dstPath, pktName)); err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "rename")
- badExit = true
+ isBad = true
continue
}
delete(sds, "tmp")
if !*keep {
if err = os.Remove(job.Fd.Name()); err != nil {
ctx.LogE("nncp-xfer", nncp.SdsAdd(sds, nncp.SDS{"err": err}), "remove")
- badExit = true
+ isBad = true
}
}
}
ctx.UnlockDir(dirLock)
}
- if badExit {
+ if isBad {
os.Exit(1)
}
}
}
}
-func (ctx *Ctx) Toss(nodeId *NodeId, nice uint8, dryRun bool) {
+func (ctx *Ctx) Toss(nodeId *NodeId, nice uint8, dryRun bool) bool {
dirLock, err := ctx.LockDir(nodeId, TRx)
if err != nil {
- return
+ return false
}
defer ctx.UnlockDir(dirLock)
+ isBad := false
for job := range ctx.Jobs(nodeId, TRx) {
pktName := filepath.Base(job.Fd.Name())
sds := SDS{"node": job.PktEnc.Sender, "pkt": pktName}
var pktSize int64
if _, err = xdr.Unmarshal(pipeR, &pkt); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "unmarshal")
+ isBad = true
goto Closing
}
pktSize = job.Size - PktEncOverhead - PktOverhead
cmd.Stdin = decompressor
if err = cmd.Run(); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "sendmail")
+ isBad = true
goto Closing
}
}
if !dryRun {
if err = os.Remove(job.Fd.Name()); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "remove")
+ isBad = true
}
}
case PktTypeFile:
incoming := ctx.Neigh[*job.PktEnc.Sender].Incoming
if incoming == nil {
ctx.LogE("rx", sds, "incoming is not allowed")
+ isBad = true
goto Closing
}
dir := filepath.Join(*incoming, path.Dir(dst))
if err = os.MkdirAll(dir, os.FileMode(0700)); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "mkdir")
+ isBad = true
goto Closing
}
if !dryRun {
ctx.LogD("rx", sds, "created")
if err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "mktemp")
+ isBad = true
goto Closing
}
bufW := bufio.NewWriter(tmp)
if _, err = io.Copy(bufW, pipeR); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "copy")
+ isBad = true
goto Closing
}
bufW.Flush()
break
}
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "stat")
+ isBad = true
goto Closing
}
dstPath = dstPathOrig + strconv.Itoa(dstPathCtr)
}
if err = os.Rename(tmp.Name(), dstPath); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "rename")
+ isBad = true
}
delete(sds, "tmp")
}
if !dryRun {
if err = os.Remove(job.Fd.Name()); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "remove")
+ isBad = true
}
sendmail := ctx.Neigh[*ctx.Self.Id].Sendmail
if ctx.NotifyFile != nil {
dstRaw, err := ioutil.ReadAll(pipeR)
if err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "read")
+ isBad = true
goto Closing
}
dst := string(dstRaw)
freq := sender.Freq
if freq == nil {
ctx.LogE("rx", sds, "freqing is not allowed")
+ isBad = true
goto Closing
}
if !dryRun {
if err = ctx.TxFile(sender, job.PktEnc.Nice, filepath.Join(*freq, src), dst); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "tx file")
+ isBad = true
goto Closing
}
}
if !dryRun {
if err = os.Remove(job.Fd.Name()); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "remove")
+ isBad = true
}
if ctx.NotifyFreq != nil {
sendmail := ctx.Neigh[*ctx.Self.Id].Sendmail
sds := SdsAdd(sds, SDS{"type": "trns", "dst": nodeId})
if !known {
ctx.LogE("rx", sds, "unknown node")
+ isBad = true
goto Closing
}
ctx.LogD("rx", sds, "taken")
if !dryRun {
if err = ctx.TxTrns(node, job.PktEnc.Nice, pktSize, pipeR); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "tx trns")
+ isBad = true
goto Closing
}
}
if !dryRun {
if err = os.Remove(job.Fd.Name()); err != nil {
ctx.LogE("rx", SdsAdd(sds, SDS{"err": err}), "remove")
+ isBad = true
}
}
default:
ctx.LogE("rx", sds, "unknown type")
+ isBad = true
}
Closing:
pipeR.Close()
}
+ return isBad
}