lib9p

Go 9P library.
Log | Files | Refs

commit c906244a1cb98a8524fe21e7f6b7c0de3cec5ac3
parent 51da7e87bad29b7c3983eb9cf3e32db331d1daa0
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 28 Jul 2023 15:45:54 +0900

change RVersion to struct

Diffstat:
Mfcall.go | 56++++++++++++++++++++++++++++++++++++--------------------
Mparse.go | 29+++++++++++++++++++++++++++++
Mreq.go | 29-----------------------------
Mserver.go | 18++++++++++--------
4 files changed, 75 insertions(+), 57 deletions(-)

diff --git a/fcall.go b/fcall.go @@ -125,28 +125,44 @@ func (msg *TVersion) String() string { msg.Tag(), msg.MSize(), msg.Version()) } -type RVersion []byte - -func (msg RVersion) Size() uint32 { return gbit32(msg[0:4]) } -func (msg RVersion) SetSize(s uint32) { pbit32(msg[0:4], s) } -func (msg RVersion) Type() MsgType { return MsgType(msg[4]) } -func (msg RVersion) SetType(t MsgType) { msg[4] = byte(t) } -func (msg RVersion) Tag() uint16 { return gbit16(msg[5:7]) } -func (msg RVersion) SetTag(t uint16) { pbit16(msg[5:7], t) } -func (msg RVersion) MSize() uint32 { return gbit32(msg[7:11]) } -func (msg RVersion) SetMSize(s uint32) { pbit32(msg[7:11], s) } -func (msg RVersion) Version() string { - vsize := gbit16(msg[11:13]) - return string(msg[13 : 13+vsize]) -} -func (msg RVersion) SetVersion(v string) { - pbit16(msg[4+1+2+4:4+1+2+4+2], uint16(len(v))) - for i := 0; i < len(v); i++ { - msg[4+1+2+4+2+i] = byte(v[i]) +type RVersion struct { + tag uint16 + mSize uint32 + version string +} + +func newRVersion(buf []byte) *RVersion { panic("not implemented") } +func (msg *RVersion) Size() uint32 { return uint32(4 + 1 + 2 + 4 + 2 + len(msg.version)) } +func (msg *RVersion) Type() MsgType { return Rversion } +func (msg *RVersion) Tag() uint16 { return msg.tag } +func (msg *RVersion) SetTag(t uint16) { msg.tag = t } +func (msg *RVersion) MSize() uint32 { return msg.mSize } +func (msg *RVersion) SetMSize(s uint32) { msg.mSize = s } +func (msg *RVersion) Version() string { return msg.version } +func (msg *RVersion) SetVersion(v string) { msg.version = v } +func (msg *RVersion) conv2M() []byte { + cur := 0 + buf := make([]byte, msg.Size()) + pbit32(buf[cur:cur+4], msg.Size()) + cur += 4 + buf[cur] = uint8(Rversion) + cur += 1 + pbit16(buf[cur:cur+2], msg.Tag()) + cur += 2 + pbit32(buf[cur:cur+4], msg.MSize()) + cur += 4 + pbit16(buf[cur:cur+2], uint16(len(msg.Version()))) + cur += 2 + for i, b := range []byte(msg.Version()) { + buf[cur+i] = b } + cur += len(msg.Version()) + if cur != len(buf) { + panic("length of buf and cursor not match") + } + return buf } -func (msg RVersion) conv2M() []byte { return []byte(msg)[:msg.Size()] } -func (msg RVersion) String() string { +func (msg *RVersion) String() string { return fmt.Sprintf("Rversion tag %d msize %d version '%s'", msg.Tag(), msg.MSize(), msg.Version()) } diff --git a/parse.go b/parse.go @@ -31,3 +31,32 @@ func read9PMsg(r io.Reader) ([]byte, error) { } return buf, nil } + +func unmarshal(buf []byte) (Msg, error) { + switch t := bufMsg(buf).Type(); t { + case Tversion: + return newTVersion(buf), nil + case Rversion: + return newRVersion(buf), nil + case Tauth: + return TAuth(buf), nil + case Rauth: + return RAuth(buf), nil + case Tattach: + return TAttach(buf), nil + case Rattach: + return RAttach(buf), nil + case Rerror: + return RError(buf), nil + case Twalk: + return newTWalk(buf), nil + case Rwalk: + return newRWalk(buf), nil + case Tstat: + return newTStat(buf), nil + case Rstat: + return newRStat(buf), nil + default: + return nil, fmt.Errorf("unknown message type %v", t) + } +} diff --git a/req.go b/req.go @@ -11,35 +11,6 @@ type Req struct { pool *ReqPool } -func unmarshal(buf []byte) (Msg, error) { - switch t := bufMsg(buf).Type(); t { - case Tversion: - return newTVersion(buf), nil - case Rversion: - return RVersion(buf), nil - case Tauth: - return TAuth(buf), nil - case Rauth: - return RAuth(buf), nil - case Tattach: - return TAttach(buf), nil - case Rattach: - return RAttach(buf), nil - case Rerror: - return RError(buf), nil - case Twalk: - return newTWalk(buf), nil - case Rwalk: - return newRWalk(buf), nil - case Tstat: - return newTStat(buf), nil - case Rstat: - return newRStat(buf), nil - default: - return nil, fmt.Errorf("unknown message type %v", t) - } -} - type ReqPool struct { m map[uint16]*Req } diff --git a/server.go b/server.go @@ -10,6 +10,7 @@ import ( ) var chatty9P = false + func Chatty() { chatty9P = true } @@ -97,13 +98,11 @@ func sVersion(s *Server, r *Req) { msize = s.MSize } - size := uint32(4 + 1 + 2 + 4 + 2 + len(version)) - ofcall := RVersion(make([]byte, size)) - ofcall.SetSize(size) - ofcall.SetType(Rversion) - ofcall.SetTag(ifcall.Tag()) - ofcall.SetMSize(msize) - ofcall.SetVersion(version) + ofcall := &RVersion{ + tag: ifcall.Tag(), + mSize: msize, + version: version, + } r.ofcall = ofcall respond(r, nil) @@ -170,6 +169,9 @@ func sWalk(s *Server, r *Req) { func rWalk(r *Req, err error) {} +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)) @@ -258,7 +260,7 @@ func respond(r *Req, err error) { } else { rError(r, fmt.Errorf("unknown message type: %d", r.ofcall.Type())) } - case RVersion: + case *RVersion: rVersion(r, err) case RAuth: rAuth(r, err)