commit 4997613a667a192c3c1646974aac63b29dd88485
parent c906244a1cb98a8524fe21e7f6b7c0de3cec5ac3
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 28 Jul 2023 16:02:23 +0900
change TAuth to struct
Diffstat:
| M | fcall.go | | | 84 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------- |
| M | parse.go | | | 2 | +- |
| M | server.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)