+func (ctx *Ctx) HdrRead(fd *os.File) (*PktEnc, []byte, error) {
+ var pktEnc PktEnc
+ _, err := xdr.Unmarshal(fd, &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", []LE{}, err, "new")
+ return err
+ }
+ if _, err = tmpHdr.Write(pktEncRaw); err != nil {
+ ctx.LogE("hdr-write", []LE{}, err, "write")
+ os.Remove(tmpHdr.Name())
+ return err
+ }
+ if err = tmpHdr.Close(); err != nil {
+ ctx.LogE("hdr-write", []LE{}, err, "close")
+ os.Remove(tmpHdr.Name())
+ return err
+ }
+ if err = os.Rename(tmpHdr.Name(), tgt+HdrSuffix); err != nil {
+ ctx.LogE("hdr-write", []LE{}, err, "rename")
+ return err
+ }
+ return err
+}
+