lib9p

Go 9P library.
Log | Files | Refs

commit 51a2c7b227325c8674efab941191cf31bd9dcf09
parent b776bbca81c3e1903c221091cb5e2527394e5238
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat, 29 Jul 2023 13:22:30 +0900

change RError to struct

Diffstat:
Mfcall.go | 64++++++++++++++++++++++++++++++++++++----------------------------
Mparse.go | 2+-
Mserver.go | 17+++++------------
3 files changed, 42 insertions(+), 41 deletions(-)

diff --git a/fcall.go b/fcall.go @@ -335,14 +335,14 @@ func (msg TAttach) conv2M() []byte { pbit16(buf[cur:cur+2], uint16(len(uname))) cur += 2 for i := 0; i < len(uname); i++ { - buf[cur + i] = uname[i] + buf[cur+i] = uname[i] } cur += len(uname) aname := msg.AName() pbit16(buf[cur:cur+2], uint16(len(aname))) cur += 2 for i := 0; i < len(aname); i++ { - buf[cur + i] = aname[i] + buf[cur+i] = aname[i] } cur += len(aname) if cur != len(buf) { @@ -369,10 +369,10 @@ type RAttach struct { } func newRAttach(buf []byte) *RAttach { panic("not implemented") } -func (msg RAttach) Size() uint32 { return 4+1+2+13 } -func (msg RAttach) Type() MsgType { return Rattach } -func (msg RAttach) Tag() uint16 { return msg.tag } -func (msg RAttach) Qid() *Qid { return msg.qid } +func (msg RAttach) Size() uint32 { return 4 + 1 + 2 + 13 } +func (msg RAttach) Type() MsgType { return Rattach } +func (msg RAttach) Tag() uint16 { return msg.tag } +func (msg RAttach) Qid() *Qid { return msg.qid } func (msg RAttach) conv2M() []byte { cur := 0 buf := make([]byte, msg.Size()) @@ -397,31 +397,39 @@ func (msg RAttach) String() string { msg.Tag(), msg.Qid()) } -type RError []byte - -func (msg RError) Size() uint32 { return gbit32(msg[0:4]) } -func (msg RError) SetSize(s uint32) { pbit32(msg[0:4], s) } -func (msg RError) Type() MsgType { return MsgType(msg[4]) } -func (msg RError) SetType(t MsgType) { msg[4] = byte(t) } -func (msg RError) Tag() uint16 { return gbit16(msg[5:7]) } -func (msg RError) SetTag(t uint16) { pbit16(msg[5:7], t) } -func (msg RError) conv2M() []byte { return []byte(msg)[:msg.Size()] } -func (msg RError) EName() error { - size := gbit16(msg[7:9]) - return fmt.Errorf("%s", string(msg[9:9+size])) -} -func (msg RError) SetEName(err error) { - size := uint32(len(err.Error())) - uint16Max := uint32(1 << 16) - if size >= uint16Max { - panic("error message too large") +type RError struct { + tag uint16 + ename error +} + +func newRError(buf []byte) *RError { panic("not implemented") } +func (msg *RError) Size() uint32 { return uint32(4+1+2+2+len(msg.EName())) } +func (msg *RError) Type() MsgType { return Rerror } +func (msg *RError) Tag() uint16 { return msg.tag } +func (msg *RError) EName() string { return msg.ename.Error() } +func (msg *RError) conv2M() []byte { + cur := 0 + buf := make([]byte, msg.Size()) + pbit32(buf[cur:cur+4], msg.Size()) + cur += 4 + buf[cur] = uint8(Rerror) + cur += 1 + pbit16(buf[cur:cur+2], msg.Tag()) + cur += 2 + ename := msg.EName() + pbit16(buf[cur:cur+2], uint16(len(ename))) + cur += 2 + for i := 0; i < len(ename); i++ { + buf[cur+i] = ename[i] } - pbit16(msg[7:9], uint16(size)) - for i := 0; i < int(size); i++ { - msg[9+i] = err.Error()[i] + cur += len(ename) + if cur != len(buf) { + panic("length of buf and cursor position don't match") } + return buf } -func (msg RError) String() string { + +func (msg *RError) String() string { return fmt.Sprintf("Rerror tag %d ename %v", msg.Tag(), msg.EName()) } diff --git a/parse.go b/parse.go @@ -47,7 +47,7 @@ func unmarshal(buf []byte) (Msg, error) { case Rattach: return newRAttach(buf), nil case Rerror: - return RError(buf), nil + return newRError(buf), nil case Twalk: return newTWalk(buf), nil case Rwalk: diff --git a/server.go b/server.go @@ -116,12 +116,7 @@ func sAuth(s *Server, r *Req) { func rAuth(r *Req, err error) { if err != nil { - size := uint32(4 + 1 + 2 + 2 + len(err.Error())) - ofcall := RError(make([]byte, size)) - ofcall.SetSize(size) - ofcall.SetType(Rerror) - ofcall.SetEName(err) - r.ofcall = ofcall + rError(r, err) } } @@ -172,12 +167,10 @@ func sOpen(s *Server, r *Req) {} func rOpen(r *Req, err error) {} func rError(r *Req, err error) { - size := uint32(4 + 1 + 2 + 2 + len(err.Error())) - ofcall := RError(make([]byte, size)) - ofcall.SetSize(size) - ofcall.SetType(Rerror) - ofcall.SetTag(r.ifcall.Tag()) - ofcall.SetEName(err) + ofcall := &RError{ + tag: r.ifcall.Tag(), + ename: err, + } r.ofcall = ofcall }