commit a594aeb30977473f6adfbbfec7812f5ebd43233a
parent 37625511b5c1e1df78a7b66e0ce5299e0a5ae486
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 29 Jul 2023 12:44:48 +0900
change TAttach to struct
Diffstat:
| M | fcall.go | | | 113 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------- |
| M | parse.go | | | 2 | +- |
| M | server.go | | | 4 | ++-- |
3 files changed, 87 insertions(+), 32 deletions(-)
diff --git a/fcall.go b/fcall.go
@@ -168,31 +168,30 @@ func (msg *RVersion) String() string {
}
type TAuth struct {
- size uint32
- tag uint16
- afid uint32
+ 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])
+ msg.size = gbit32(buf[cur : cur+4])
cur += 4
cur += 1 // message type
- msg.tag = gbit16(buf[cur:cur+2])
+ msg.tag = gbit16(buf[cur : cur+2])
cur += 2
- msg.afid = gbit32(buf[cur:cur+4])
+ msg.afid = gbit32(buf[cur : cur+4])
cur += 4
- l := int(gbit16(buf[cur:cur+2]))
+ l := int(gbit16(buf[cur : cur+2]))
cur += 2
- msg.uname = string(buf[cur:cur+l])
+ msg.uname = string(buf[cur : cur+l])
cur += l
- l = int(gbit16(buf[cur:cur+2]))
+ l = int(gbit16(buf[cur : cur+2]))
cur += 2
- msg.aname = string(buf[cur:cur+l])
+ msg.aname = string(buf[cur : cur+l])
cur += l
if cur != int(msg.size) {
panic("length of buf and cursor position not match")
@@ -220,14 +219,14 @@ func (msg TAuth) 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) {
@@ -245,12 +244,12 @@ func (msg TAuth) String() string {
}
type RAuth struct {
- tag uint16
+ tag uint16
aqid *Qid
}
func newRAuth(buf []byte) *RAuth { panic("not implemented") }
-func (msg RAuth) Size() uint32 { return 4+1+2+13 }
+func (msg RAuth) Size() uint32 { return 4 + 1 + 2 + 13 }
func (msg RAuth) Type() MsgType { return Rauth }
func (msg RAuth) Tag() uint16 { return msg.tag }
func (msg RAuth) AQid() *Qid { return msg.aqid }
@@ -278,23 +277,79 @@ func (msg RAuth) String() string {
msg.Tag(), msg.AQid())
}
-type TAttach []byte
+type TAttach struct {
+ size uint32
+ tag uint16
+ fid uint32
+ afid uint32
+ uname string
+ aname string
+}
-func (msg TAttach) Size() uint32 { return gbit32(msg[0:4]) }
-func (msg TAttach) Type() MsgType { return MsgType(msg[4]) }
-func (msg TAttach) Tag() uint16 { return gbit16(msg[5:7]) }
-func (msg TAttach) Fid() uint32 { return gbit32(msg[7:11]) }
-func (msg TAttach) AFid() uint32 { return gbit32(msg[11:15]) }
-func (msg TAttach) UName() string {
- usize := gbit16(msg[15:17])
- return string(msg[17 : 17+usize])
+func newTAttach(buf []byte) *TAttach {
+ cur := 0
+ msg := new(TAttach)
+ msg.size = gbit32(buf[cur : cur+4])
+ cur += 4
+ cur += 1 // message type
+ msg.tag = gbit16(buf[cur : cur+2])
+ cur += 2
+ msg.fid = gbit32(buf[cur : cur+4])
+ cur += 4
+ 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 TAttach) AName() string {
- usize := gbit16(msg[15:17])
- asize := gbit16(msg[17+usize : 17+usize+2])
- return string(msg[17+usize+2 : 17+usize+2+asize])
+func (msg TAttach) Size() uint32 { return msg.size }
+func (msg TAttach) Type() MsgType { return Tattach }
+func (msg TAttach) Tag() uint16 { return msg.tag }
+func (msg TAttach) Fid() uint32 { return msg.fid }
+func (msg TAttach) AFid() uint32 { return msg.afid }
+func (msg TAttach) UName() string { return msg.uname }
+func (msg TAttach) AName() string { return msg.aname }
+func (msg TAttach) conv2M() []byte {
+ cur := 0
+ buf := make([]byte, msg.Size())
+ pbit32(buf[cur:cur+4], msg.Size())
+ cur += 4
+ buf[cur] = uint8(Rauth)
+ cur += 1
+ pbit16(buf[cur:cur+2], msg.Tag())
+ cur += 2
+ pbit32(buf[cur:cur+4], msg.Fid())
+ cur += 4
+ 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 TAttach) conv2M() []byte { return []byte(msg)[:msg.Size()] }
func (msg TAttach) String() string {
fid := int64(msg.Fid())
if fid == int64(NOFID) {
diff --git a/parse.go b/parse.go
@@ -43,7 +43,7 @@ func unmarshal(buf []byte) (Msg, error) {
case Rauth:
return newRAuth(buf), nil
case Tattach:
- return TAttach(buf), nil
+ return newTAttach(buf), nil
case Rattach:
return RAttach(buf), nil
case Rerror:
diff --git a/server.go b/server.go
@@ -126,7 +126,7 @@ func rAuth(r *Req, err error) {
}
func sAttach(s *Server, r *Req) {
- ifcall, ok := r.ifcall.(TAttach)
+ ifcall, ok := r.ifcall.(*TAttach)
if !ok {
panic("not TAttach")
}
@@ -233,7 +233,7 @@ func (s *Server) Serve() {
sVersion(s, r)
case *TAuth:
sAuth(s, r)
- case TAttach:
+ case *TAttach:
sAttach(s, r)
case *TWalk:
sWalk(s, r)