lib9p

Go 9P library.
Log | Files | Refs

commit d011dcacff99fef048b1fcf018ec1b461713ad3d
parent 12d5d20995251f28c26fb73f0b1042b88be1b652
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 17 Sep 2023 10:12:40 +0900

refactor

Diffstat:
Mfid.go | 9+++++----
Mserver.go | 59++++++++++++++++++++++++++++++++++-------------------------
2 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/fid.go b/fid.go @@ -23,15 +23,16 @@ type Fid struct { File File Uid string Qid Qid + DirOffset int } const NOFID = ^uint32(0) func newFid(fid uint32) *Fid { - f := new(Fid) - f.Fid = fid - f.OMode = -1 - return f + return &Fid{ + Fid: fid, + OMode: -1, + } } func (f *Fid) String() string { diff --git a/server.go b/server.go @@ -296,12 +296,13 @@ func rWalk(r *Req, err error) { func sOpen(s *Server, r *Req) { ifcall := r.ifcall.(*TOpen) - fid, ok := s.fPool.lookup(ifcall.Fid()) + var ok bool + r.fid, ok = s.fPool.lookup(ifcall.Fid()) if !ok { respond(r, ErrUnknownFid) return } - if fid.OMode != -1 { + if r.fid.OMode != -1 { respond(r, ErrBotch) return } @@ -309,7 +310,7 @@ 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 fid.Qid.Type == QTDIR && ifcall.Mode() != OREAD { + if r.fid.Qid.Type == QTDIR && ifcall.Mode() != OREAD { respond(r, fmt.Errorf("is a directory")) return } @@ -329,29 +330,31 @@ func sOpen(s *Server, r *Req) { if ifcall.Mode()&OTRUNC != 0 { p |= AWRITE } - if fid.Qid.Type&QTDIR != 0 && p != AREAD { + if r.fid.Qid.Type&QTDIR != 0 && p != AREAD { respond(r, ErrPerm) return } - if !hasPerm(fid.File, fid.Uid, p) { + if !hasPerm(r.fid.File, r.fid.Uid, p) { respond(r, ErrPerm) return } - parent, err := fid.File.Parent() - if err != nil { - respond(r, fmt.Errorf("open parent")) - return - } - if ifcall.Mode()&ORCLOSE != 0 && !hasPerm(parent, fid.Uid, AWRITE) { - respond(r, ErrPerm) - return + if ifcall.Mode()&ORCLOSE != 0 { + parent, err := r.fid.File.Parent() + defer parent.Close() + if err != nil { + respond(r, fmt.Errorf("open parent")) + return + } + if !hasPerm(parent, r.fid.Uid, AWRITE) { + respond(r, ErrPerm) + return + } } - fid.OMode = ifcall.Mode() r.ofcall = &ROpen{ - qid: fid.Qid, + qid: r.fid.Qid, iounit: s.mSize - 23, } respond(r, nil) @@ -360,17 +363,19 @@ func rOpen(r *Req, err error) { if err != nil { return } + r.fid.OMode = r.ifcall.(*TOpen).Mode() } func sCreate(s *Server, r *Req) { ifcall := r.ifcall.(*TCreate) - fid, ok := s.fPool.lookup(ifcall.Fid()) + var ok bool + r.fid, ok = s.fPool.lookup(ifcall.Fid()) if !ok { respond(r, ErrUnknownFid) return } - dir := fid.File + dir := r.fid.File dirstat, err := dir.Stat() if err != nil { respond(r, fmt.Errorf("stat: %v", err)) @@ -380,12 +385,12 @@ func sCreate(s *Server, r *Req) { respond(r, fmt.Errorf("create in non-dir")) return } - if !hasPerm(dir, fid.Uid, AWRITE) { + if !hasPerm(dir, r.fid.Uid, AWRITE) { respond(r, ErrPerm) return } - cfdir, ok := fid.File.(CreaterFile) + cfdir, ok := r.fid.File.(CreaterFile) if !ok { respond(r, ErrOperation) return @@ -399,12 +404,12 @@ func sCreate(s *Server, r *Req) { perm &= ^FileMode(0777) | (dirperm & FileMode(0777)) } - file, err := cfdir.Create(ifcall.Name(), fid.Uid, ifcall.Mode(), perm) + file, err := cfdir.Create(ifcall.Name(), r.fid.Uid, ifcall.Mode(), perm) if err != nil { respond(r, fmt.Errorf("create: %v", err)) return } - if err := fid.File.Close(); err != nil { + if err := r.fid.File.Close(); err != nil { respond(r, fmt.Errorf("close: %v", err)) return } @@ -413,9 +418,7 @@ func sCreate(s *Server, r *Req) { respond(r, fmt.Errorf("stat: %v", err)) return } - fid.File = file - fid.Qid = fi.Qid() - fid.OMode = ifcall.Mode() + r.fid.File = file r.ofcall = &RCreate{ qid: fi.Qid(), @@ -423,7 +426,13 @@ func sCreate(s *Server, r *Req) { } respond(r, nil) } -func rCreate(r *Req, err error) {} +func rCreate(r *Req, err error) { + if err != nil { + return + } + r.fid.Qid = r.ofcall.(*RCreate).Qid() + r.fid.OMode = r.ifcall.(*TCreate).Mode() +} func sRead(s *Server, r *Req) { ifcall := r.ifcall.(*TRead)