commit 51a2c7b227325c8674efab941191cf31bd9dcf09
parent b776bbca81c3e1903c221091cb5e2527394e5238
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 29 Jul 2023 13:22:30 +0900
change RError to struct
Diffstat:
| M | fcall.go | | | 64 | ++++++++++++++++++++++++++++++++++++---------------------------- |
| M | parse.go | | | 2 | +- |
| M | server.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
}