lib9p

Go 9P library.
Log | Files | Refs

commit 4997613a667a192c3c1646974aac63b29dd88485
parent c906244a1cb98a8524fe21e7f6b7c0de3cec5ac3
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 28 Jul 2023 16:02:23 +0900

change TAuth to struct

Diffstat:
Mfcall.go | 84++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Mparse.go | 2+-
Mserver.go | 2+-
3 files changed, 70 insertions(+), 18 deletions(-)

diff --git a/fcall.go b/fcall.go @@ -167,22 +167,74 @@ func (msg *RVersion) String() string { msg.Tag(), msg.MSize(), msg.Version()) } -type TAuth []byte - -func (msg TAuth) Size() uint32 { return gbit32(msg[0:4]) } -func (msg TAuth) Type() MsgType { return MsgType(msg[4]) } -func (msg TAuth) Tag() uint16 { return gbit16(msg[5:7]) } -func (msg TAuth) AFid() uint32 { return gbit32(msg[7:11]) } -func (msg TAuth) UName() string { - size := gbit16(msg[11:13]) - return string(msg[13 : 13+size]) -} -func (msg TAuth) AName() string { - usize := gbit16(msg[11:13]) - asize := gbit16(msg[13+usize : 13+usize+2]) - return string(msg[13+usize+2 : 13+usize+2+asize]) -} -func (msg TAuth) conv2M() []byte { return []byte(msg)[:msg.Size()] } +type TAuth struct { + size uint32 + tag uint16 + afid uint32 + uname string + aname string + +} + +func newTAuth(buf []byte) *TAuth { + cur := 0 + msg := new(TAuth) + msg.size = gbit32(buf[cur:cur+4]) + cur += 4 + cur += 1 // message type + msg.tag = gbit16(buf[cur:cur+2]) + cur += 2 + msg.afid = gbit32(buf[cur:cur+4]) + cur += 4 + l := int(gbit16(buf[cur:cur+2])) + cur += 2 + msg.uname = string(buf[cur:cur+l]) + cur += l + l = int(gbit16(buf[cur:cur+2])) + cur += 2 + msg.aname = string(buf[cur:cur+l]) + cur += l + if cur != int(msg.size) { + panic("length of buf and cursor position not match") + } + return msg +} +func (msg TAuth) Size() uint32 { return msg.size } +func (msg TAuth) Type() MsgType { return Tauth } +func (msg TAuth) Tag() uint16 { return msg.tag } +func (msg TAuth) AFid() uint32 { return msg.afid } +func (msg TAuth) UName() string { return msg.uname } +func (msg TAuth) AName() string { return msg.aname } +func (msg TAuth) conv2M() []byte { + cur := 0 + buf := make([]byte, msg.Size()) + pbit32(buf[cur:cur+4], msg.Size()) + cur += 4 + buf[cur] = uint8(Tauth) + cur += 1 + pbit16(buf[cur:cur+2], msg.Tag()) + cur += 2 + pbit32(buf[cur:cur+4], msg.AFid()) + cur += 4 + uname := msg.UName() + pbit16(buf[cur:cur+2], uint16(len(uname))) + cur += 2 + for i := 0; i < len(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] + } + cur += len(aname) + if cur != len(buf) { + panic("length of buf and cursor position don't match") + } + return buf +} func (msg TAuth) String() string { afid := int64(msg.AFid()) if afid == int64(NOFID) { diff --git a/parse.go b/parse.go @@ -39,7 +39,7 @@ func unmarshal(buf []byte) (Msg, error) { case Rversion: return newRVersion(buf), nil case Tauth: - return TAuth(buf), nil + return newTAuth(buf), nil case Rauth: return RAuth(buf), nil case Tattach: diff --git a/server.go b/server.go @@ -231,7 +231,7 @@ func (s *Server) Serve() { respond(r, fmt.Errorf("unknown message type: %d", r.ifcall.Type())) case *TVersion: sVersion(s, r) - case TAuth: + case *TAuth: sAuth(s, r) case TAttach: sAttach(s, r)