commit d011dcacff99fef048b1fcf018ec1b461713ad3d
parent 12d5d20995251f28c26fb73f0b1042b88be1b652
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sun, 17 Sep 2023 10:12:40 +0900
refactor
Diffstat:
| M | fid.go | | | 9 | +++++---- |
| M | server.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)