lib9p

Go 9P library.
Log | Files | Refs

commit 4f637c315726a6bcf1582df0b9c56ad45eca8172
parent d9bc331f00252540f4a8ae5cc3d86203baa339c8
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Mon, 18 Sep 2023 08:14:25 +0900

refactor

Diffstat:
Mserver.go | 74+++++++++++++++++++++++++++++++++++++++++---------------------------------
1 file changed, 41 insertions(+), 33 deletions(-)

diff --git a/server.go b/server.go @@ -42,7 +42,7 @@ type Server struct { writer io.Writer wlock *sync.Mutex - auth func(*Req, *Fid) + auth func(*Req, *Fid) } func NewServer(fsys FS, mSize uint32, r io.Reader, w io.Writer) *Server { @@ -59,7 +59,7 @@ func NewServer(fsys FS, mSize uint32, r io.Reader, w io.Writer) *Server { } func (s *Server) changeMSize(mSize uint32) { - if (s.mSize == mSize) { + if s.mSize == mSize { return } s.rlock.Lock() @@ -354,7 +354,7 @@ func sOpen(s *Server, r *Req) { r.ofcall = &ROpen{ qid: r.fid.Qid, - iounit: s.mSize - 23, + iounit: s.mSize - IOHDRSZ, } respond(r, nil) } @@ -421,7 +421,7 @@ func sCreate(s *Server, r *Req) { r.ofcall = &RCreate{ qid: fi.Qid(), - iounit: s.mSize - 23, + iounit: s.mSize - IOHDRSZ, } respond(r, nil) } @@ -473,7 +473,6 @@ func sRead(s *Server, r *Req) { } k := r.fid.DirOffset for ; k < len(children); k++ { - log.Printf("\nk = %d\n", k) if children[k] == nil { continue } @@ -515,20 +514,29 @@ func rRead(r *Req, err error) {} func sWrite(s *Server, r *Req) { ifcall := r.ifcall.(*TWrite) - fid, ok := s.fPool.lookup(ifcall.Fid()) + var ok bool + r.fid, ok = s.fPool.lookup(ifcall.Fid()) if !ok { respond(r, ErrUnknownFid) return } - file := fid.File - - if !hasPerm(file, fid.Uid, AWRITE) { + // TODO: should I use exported function instead of directly + // accessing the struct field? + if ifcall.count > s.mSize-IOHDRSZ { + ifcall.count = s.mSize - IOHDRSZ + } + if !hasPerm(r.fid.File, r.fid.Uid, AWRITE) { respond(r, ErrPerm) return } + omode := r.fid.OMode & 3 + if omode != OWRITE && omode != ORDWR { + respond(r, fmt.Errorf("write on fid with open mode 0x%x", r.fid.OMode)) + return + } ofcall := new(RWrite) - switch file := file.(type) { + switch file := r.fid.File.(type) { case io.WriterAt: n, err := file.WriteAt(ifcall.data, int64(ifcall.offset)) if err != nil { @@ -551,7 +559,9 @@ func sWrite(s *Server, r *Req) { respond(r, nil) } -func rWrite(r *Req, err error) {} +func rWrite(r *Req, err error) { + // TODO: Increment Qid.Vers +} func sClunk(s *Server, r *Req) { ifcall := r.ifcall.(*TClunk) @@ -569,36 +579,32 @@ func rClunk(r *Req, err error) {} func sRemove(s *Server, r *Req) { ifcall := r.ifcall.(*TRemove) - fid, ok := s.fPool.lookup(ifcall.Fid()) + var ok bool + r.fid, ok = s.fPool.lookup(ifcall.Fid()) if !ok { respond(r, ErrUnknownFid) return } - defer s.fPool.delete(ifcall.Fid()) - parent, err := fid.File.Parent() + parent, err := r.fid.File.Parent() if err != nil { respond(r, fmt.Errorf("open parent: %v", err)) return } - - if !hasPerm(parent, fid.Uid, AWRITE) { + if !hasPerm(parent, r.fid.Uid, AWRITE) { respond(r, ErrPerm) return } - - rfile, ok := fid.File.(RemoverFile) + rfile, ok := r.fid.File.(RemoverFile) if !ok { respond(r, ErrOperation) return } - if err := rfile.Remove(); err != nil { respond(r, fmt.Errorf("remove: %v", err)) return } - r.ofcall = &RRemove{} respond(r, nil) } @@ -606,18 +612,18 @@ func rRemove(r *Req, err error) {} func sStat(s *Server, r *Req) { ifcall := r.ifcall.(*TStat) - fid, ok := s.fPool.lookup(ifcall.Fid()) + var ok bool + r.fid, ok = s.fPool.lookup(ifcall.Fid()) if !ok { respond(r, ErrUnknownFid) return } - fileInfo, err := fid.File.Stat() + fileInfo, err := r.fid.File.Stat() if err != nil { - log.Printf("stat %v: %v", fid.File, err) + log.Printf("stat %v: %v", r.fid.File, err) respond(r, fmt.Errorf("internal error")) return } - r.ofcall = &RStat{ stat: fileInfo.Sys().(*Stat), } @@ -628,20 +634,21 @@ func rStat(r *Req, err error) {} func sWStat(s *Server, r *Req) { ifcall := r.ifcall.(*TWStat) - fid, ok := s.fPool.lookup(ifcall.Fid()) + var ok bool + r.fid, ok = s.fPool.lookup(ifcall.Fid()) if !ok { respond(r, ErrUnknownFid) return } - wsfile, ok := fid.File.(WriterStatFile) + wsfile, ok := r.fid.File.(WriterStatFile) if !ok { respond(r, ErrOperation) return } wstat := ifcall.Stat() - fi, err := fid.File.Stat() + fi, err := r.fid.File.Stat() if err != nil { respond(r, fmt.Errorf("stat: %v", err)) return @@ -657,12 +664,12 @@ func sWStat(s *Server, r *Req) { } if wstat.Name != "" { - parent, err := fid.File.Parent() + parent, err := r.fid.File.Parent() if err != nil { respond(r, fmt.Errorf("get parent: %v", err)) return } - if !hasPerm(parent, fid.Uid, AWRITE) { + if !hasPerm(parent, r.fid.Uid, AWRITE) { respond(r, ErrPerm) return } @@ -686,7 +693,7 @@ func sWStat(s *Server, r *Req) { } if wstat.Length != ^int64(0) { - if fi.IsDir() || !hasPerm(fid.File, fid.Uid, AWRITE) { + if fi.IsDir() || !hasPerm(r.fid.File, r.fid.Uid, AWRITE) { respond(r, ErrPerm) return } @@ -695,7 +702,7 @@ func sWStat(s *Server, r *Req) { if wstat.Mode != FileMode(^uint32(0)) { // the owner of the file or the group leader of the file's group. - if fid.Uid != newStat.Uid && fid.Uid != newStat.Gid { + if r.fid.Uid != newStat.Uid && r.fid.Uid != newStat.Gid { respond(r, ErrPerm) return } @@ -708,7 +715,7 @@ func sWStat(s *Server, r *Req) { if wstat.Mtime != ^uint32(0) { // the owner of the file or the group leader of the file's group. - if fid.Uid != newStat.Uid && fid.Uid != newStat.Gid { + if r.fid.Uid != newStat.Uid && r.fid.Uid != newStat.Gid { respond(r, ErrPerm) return } @@ -822,12 +829,13 @@ func respond(r *Req, err error) { case *RWStat: rWStat(r, err) } + + r.ofcall.SetTag(r.tag) if chatty9P { fmt.Fprintf(os.Stderr, "--> %s\n", r.ofcall) } // free tag. - r.ofcall.SetTag(r.tag) if r.pool == nil && err != ErrDupTag { panic("ReqPool is nil but err is not EDupTag") }