+func JobPath2Hdr(jobPath string) string {
+ return filepath.Join(filepath.Dir(jobPath), HdrDir, filepath.Base(jobPath))
+}
+
+func (ctx *Ctx) HdrRead(r io.Reader) (*PktEnc, []byte, error) {
+ var pktEnc PktEnc
+ _, err := xdr.Unmarshal(r, &pktEnc)
+ if err != nil {
+ return nil, nil, err
+ }
+ var raw bytes.Buffer
+ if _, err = xdr.Marshal(&raw, pktEnc); err != nil {
+ panic(err)
+ }
+ return &pktEnc, raw.Bytes(), nil
+}
+
+func (ctx *Ctx) HdrWrite(pktEncRaw []byte, tgt string) error {
+ tmpHdr, err := ctx.NewTmpFile()
+ if err != nil {
+ ctx.LogE("hdr-write-tmp-new", nil, err, func(les LEs) string {
+ return "Header writing: new temporary file"
+ })
+ return err
+ }
+ if _, err = tmpHdr.Write(pktEncRaw); err != nil {
+ ctx.LogE("hdr-write-write", nil, err, func(les LEs) string {
+ return "Header writing: writing"
+ })
+ os.Remove(tmpHdr.Name())
+ return err
+ }
+ if err = tmpHdr.Close(); err != nil {
+ ctx.LogE("hdr-write-close", nil, err, func(les LEs) string {
+ return "Header writing: closing"
+ })
+ os.Remove(tmpHdr.Name())
+ return err
+ }
+ if err = ensureDir(filepath.Dir(tgt), HdrDir); err != nil {
+ ctx.LogE("hdr-write-ensure-mkdir", nil, err, func(les LEs) string {
+ return "Header writing: ensuring directory"
+ })
+ return err
+ }
+ if err = os.Rename(tmpHdr.Name(), JobPath2Hdr(tgt)); err != nil {
+ ctx.LogE("hdr-write-rename", nil, err, func(les LEs) string {
+ return "Header writing: renaming"
+ })
+ return err
+ }
+ return err
+}
+
+func (ctx *Ctx) jobsFind(nodeId *NodeId, xx TRxTx, nock, part bool) chan Job {