lib9p

Go 9P library.
Log | Files | Refs

commit 95b619fdba1190fe65c98cc5b138ad114e8d772d
parent 8d89e48215955e21c4e96b81bd4be23b4bf89615
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 17 Oct 2023 11:33:54 +0900

delete File.Qid()

Diffstat:
Mfile.go | 2+-
Mserver.go | 37+++++++++++++++++++++++++++++--------
2 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/file.go b/file.go @@ -13,7 +13,7 @@ type File interface { // Child() ([]File, error) // Children Stat() (*FileInfo, error) - Qid() Qid +// Qid() Qid // Open(mode OpenMode) error Close() error io.Reader diff --git a/server.go b/server.go @@ -238,12 +238,16 @@ func sAttach(s *Server, r *Req) { respond(r, fmt.Errorf("open root: %v", err)) return } - fid.Uid = ifcall.UName() fid.OMode = -1 // TODO: right? + st, err := fid.File.Stat() + if err != nil { + respond(r, fmt.Errorf("stat root: %v", err)) + return + } r.ofcall = &RAttach{ - qid: fid.File.Qid(), + qid: st.Sys().(*Stat).Qid, } respond(r, nil) } @@ -281,7 +285,12 @@ func sWalk(s *Server, r *Req) { respond(r, fmt.Errorf("cannot clone open fid")) return } - if ifcall.NWName() > 0 && oldFid.File.Qid().Type&QTDIR == 0 { + oldst, err := oldFid.File.Stat() + if err != nil { + respond(r, fmt.Errorf("stat: %v")) + return + } + if ifcall.NWName() > 0 && oldst.Sys().(*Stat).Qid.Type&QTDIR == 0 { respond(r, fmt.Errorf("walk on non-dir")) return } @@ -302,7 +311,7 @@ func sWalk(s *Server, r *Req) { wqids := make([]Qid, ifcall.NWName()) cwdp := oldFid.path cwdf := oldFid.File - var err error + err = nil var n int for i, name := range ifcall.WName() { cwdp = path.Join(cwdp, name) @@ -361,7 +370,13 @@ func sOpen(s *Server, r *Req) { // See open(5). // In plan9 implementation, ifcall.Mode() is ANDed with ^ORCLOSE, // but ORCLOSE is also prohibitted by the protocol... - if r.fid.File.Qid().Type == QTDIR && ifcall.Mode() != OREAD { + st, err := r.fid.File.Stat() + if err != nil { + respond(r, fmt.Errorf("stat: %v", err)) + return + } + qid := st.Sys().(*Stat).Qid + if qid.Type == QTDIR && ifcall.Mode() != OREAD { respond(r, fmt.Errorf("is a directory")) return } @@ -381,7 +396,7 @@ func sOpen(s *Server, r *Req) { if ifcall.Mode()&OTRUNC != 0 { p |= AWRITE } - if r.fid.File.Qid().Type&QTDIR != 0 && p != AREAD { + if qid.Type&QTDIR != 0 && p != AREAD { respond(r, ErrPerm) return } @@ -406,7 +421,7 @@ func sOpen(s *Server, r *Req) { } r.ofcall = &ROpen{ - qid: r.fid.File.Qid(), + qid: qid, iounit: s.mSize() - IOHDRSZ, } respond(r, nil) @@ -476,8 +491,14 @@ func sCreate(s *Server, r *Req) { r.fid.File = file r.fid.path = path.Join(r.fid.path, ifcall.Name()) + st, err := r.fid.File.Stat() + if err != nil { + respond(r, fmt.Errorf("stat: %v", err)) + return + } + r.ofcall = &RCreate{ - qid: r.fid.File.Qid(), + qid: st.Sys().(*Stat).Qid, iounit: s.mSize() - IOHDRSZ, } respond(r, nil)