commit fdd86832f13940ed0a179d5c83d13ec59fa54f94
parent 5972869a67b1f2b564bc5a59fd84823bb03a41e2
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sun, 17 Sep 2023 07:39:07 +0900
add changeMSize()
Diffstat:
| M | server.go | | | 42 | ++++++++++++++++++++++++++++++------------ |
1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/server.go b/server.go
@@ -26,6 +26,13 @@ var (
ErrNotFound = fmt.Errorf("not found")
)
+func setError(r *Req, err error) {
+ r.ofcall = &RError{
+ tag: r.ifcall.Tag(),
+ ename: err,
+ }
+}
+
type Server struct {
fs FS
mSize uint32
@@ -50,6 +57,17 @@ func NewServer(fsys FS, mSize uint32, r io.Reader, w io.Writer) *Server {
}
}
+func (s *Server) changeMSize(mSize uint32) {
+ if (s.mSize == mSize) {
+ return
+ }
+ s.rlock.Lock()
+ s.wlock.Lock()
+ s.mSize = mSize
+ s.rlock.Unlock()
+ s.wlock.Unlock()
+}
+
func (s *Server) getReq() (*Req, error) {
s.rlock.Lock()
buf, err := read9PMsg(s.reader)
@@ -106,9 +124,7 @@ func sVersion(s *Server, r *Req) {
// TODO: In plan9, s.mSize is changed in rversion().
msize := ifcall.MSize()
- if msize < s.mSize {
- s.mSize = msize
- } else {
+ if msize > s.mSize {
msize = s.mSize
}
@@ -121,7 +137,12 @@ func sVersion(s *Server, r *Req) {
respond(r, nil)
}
-func rVersion(r *Req, err error) {}
+func rVersion(r *Req, err error) {
+ if err != nil {
+ panic(fmt.Errorf("rVersion err: %w", err))
+ }
+ r.srv.changeMSize(r.ofcall.(*RVersion).MSize())
+}
func sAuth(s *Server, r *Req) {
respond(r, fmt.Errorf("authentication not implemented"))
@@ -164,12 +185,9 @@ func sAttach(s *Server, r *Req) {
respond(r, nil)
}
-func rAttach(r *Req, err error) {}
-
-func rError(r *Req, err error) {
- r.ofcall = &RError{
- tag: r.ifcall.Tag(),
- ename: err,
+func rAttach(r *Req, err error) {
+ if err != nil {
+ r.srv.fPool.delete(r.ifcall.(*TAttach).Fid())
}
}
@@ -247,7 +265,7 @@ func rWalk(r *Req, err error) {
}
if len(ofcall.Qid()) == 0 {
if err == nil && ifcall.NWName() != 0 {
- rError(r, ErrNotFound)
+ setError(r, ErrNotFound)
return
}
}
@@ -744,7 +762,7 @@ func respond(r *Req, err error) {
if err == nil {
panic("neither ofcall nor err is set.")
}
- rError(r, err)
+ setError(r, err)
} else {
panic(fmt.Errorf("unknown message type %v", r.ofcall.Type()))
}