commit 4f637c315726a6bcf1582df0b9c56ad45eca8172
parent d9bc331f00252540f4a8ae5cc3d86203baa339c8
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 18 Sep 2023 08:14:25 +0900
refactor
Diffstat:
| M | server.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")
}