lib9p

Go 9P library.
Log | Files | Refs | LICENSE

commit 8a84f2d965a87e77b329f5ee8fc36bb770396eff
parent 9964bc7bfd0998c5e29e623ad1ce799ab103b178
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Mon, 25 Dec 2023 16:41:32 +0900

delete rOpen

Diffstat:
Mserver.go | 65++++++++++++++++++++---------------------------------------------
1 file changed, 20 insertions(+), 45 deletions(-)

diff --git a/server.go b/server.go @@ -436,9 +436,6 @@ func sWalk(ctx context.Context, s *Server, c <-chan *Req) { } func sOpen(ctx context.Context, s *Server, c <-chan *Req) { - rc := make(chan *Req) - defer close(rc) - go rOpen(ctx, rc) for { select { case <-ctx.Done(): @@ -447,31 +444,29 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) { if !ok { return } + var ( + p fs.FileMode + err error + qid Qid + st fs.FileInfo + ) ifcall := r.Ifcall.(*TOpen) r.Fid, ok = s.fPool.lookup(ifcall.Fid) if !ok { r.err = ErrUnknownFid - rc <- r - continue + goto resp } if r.Fid.OMode != -1 { r.err = ErrBotch - rc <- r - continue + goto resp } - var ( - err error - qid Qid - st fs.FileInfo - ) if afile, ok := r.Fid.File.(*AuthFile); ok { // s.Auth should set r.Fid.File to a valid *AuthFile, // so r.Fid.File should not be nil. st, err = r.Fid.File.Stat() if err != nil { r.err = fmt.Errorf("stat: %v", err) - rc <- r - continue + goto resp } qid = afile.Qid } else { @@ -482,17 +477,14 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) { st, err = fs.Stat(ExportFS{s.fs}, r.Fid.path) if err != nil { r.err = fmt.Errorf("stat: %v", err) - rc <- r - continue + goto resp } qid = st.Sys().(*Stat).Qid } if qid.Type == QTDIR && ifcall.Mode != OREAD { r.err = fmt.Errorf("is a directory") - rc <- r - continue + goto resp } - var p fs.FileMode switch ifcall.Mode & 3 { default: panic("invalid mode") @@ -510,64 +502,47 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) { } if qid.Type&QTDIR != 0 && p != AREAD { r.err = ErrPerm - rc <- r - continue + goto resp } if !hasPerm(s.fs, st, r.Fid.Uid, p) { r.err = ErrPerm - rc <- r - continue + goto resp } if ifcall.Mode&ORCLOSE != 0 { parentPath := path.Dir(r.Fid.path) st, err := fs.Stat(ExportFS{s.fs}, parentPath) if err != nil { r.err = fmt.Errorf("stat parent: %v", err) - rc <- r - continue + goto resp } if !hasPerm(s.fs, st, r.Fid.Uid, AWRITE) { r.err = ErrPerm - rc <- r - continue + goto resp } } r.Ofcall = &ROpen{ Qid: qid, Iounit: s.mSize() - IOHDRSZ, } - rc <- r - } - } -} - -func rOpen(ctx context.Context, c <-chan *Req) { - for { - select { - case <-ctx.Done(): - return - case r, ok := <-c: - if !ok { - return - } + resp: if r.err != nil { setError(r, r.err) - r.Srv.respChan <- r + s.respChan <- r continue } r.Fid.OMode = r.Ifcall.(*TOpen).Mode if _, ok := r.Fid.File.(*AuthFile); ok { - r.Srv.respChan <- r + s.respChan <- r continue } f, err := r.Srv.fs.OpenFile(r.Fid.path, r.Fid.OMode) if err != nil { setError(r, err) - r.Srv.respChan <- r + s.respChan <- r continue } r.Fid.File = f - r.Srv.respChan <- r + s.respChan <- r } } }