lib9p

Go 9P library.
Log | Files | Refs

commit a594aeb30977473f6adfbbfec7812f5ebd43233a
parent 37625511b5c1e1df78a7b66e0ce5299e0a5ae486
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat, 29 Jul 2023 12:44:48 +0900

change TAttach to struct

Diffstat:
Mfcall.go | 113++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Mparse.go | 2+-
Mserver.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)