lib9p

Go 9P library.
Log | Files | Refs

commit 0f3d00120eb9534fa8fef6d74d64e5c637caba02
parent 21fab3df1bde9bcde41cb0fca3eb76ff73819127
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 17 Sep 2023 12:13:37 +0900

fix offset of TRead

Diffstat:
Mserver.go | 31++++++++++++++++++-------------
1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/server.go b/server.go @@ -261,7 +261,6 @@ func sWalk(s *Server, r *Req) { wqids[i] = stat.Qid() cwd = child n++ - log.Printf("child, n: %s, %d", stat.Name(), n) } newFid.File = cwd @@ -437,17 +436,18 @@ func rCreate(r *Req, err error) { func sRead(s *Server, r *Req) { ifcall := r.ifcall.(*TRead) - 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, fmt.Errorf("not open")) return } - if fid.OMode != OREAD && fid.OMode != ORDWR && fid.OMode != OEXEC { + if r.fid.OMode != OREAD && r.fid.OMode != ORDWR && r.fid.OMode != OEXEC { respond(r, ErrPerm) return } @@ -455,20 +455,25 @@ func sRead(s *Server, r *Req) { data := make([]byte, ifcall.Count()) var n int var err error - fi, err := fid.File.Stat() + fi, err := r.fid.File.Stat() if err != nil { log.Printf("Stat: %v", err) respond(r, fmt.Errorf("internal error")) return } if fi.IsDir() { - children, err := fid.File.Child() + children, err := r.fid.File.Child() if err != nil { log.Printf("get children: %v", err) } - // BUG: TODO: fix offset. - for k := int(ifcall.Offset()); k < len(children); k++ { + // TODO: check if TRead offset matches that of last TRead message. + if ifcall.Offset() == 0 { + r.fid.DirOffset = 0 + } + k := r.fid.DirOffset + for ; k < len(children); k++ { + log.Printf("\nk = %d\n", k) if children[k] == nil { continue } @@ -487,11 +492,12 @@ func sRead(s *Server, r *Req) { } n += len(buf) } + r.fid.DirOffset = k } else { - if r, ok := fid.File.(io.ReaderAt); ok { - n, err = r.ReadAt(data, int64(ifcall.Offset())) + if reader, ok := r.fid.File.(io.ReaderAt); ok { + n, err = reader.ReadAt(data, int64(ifcall.Offset())) } else { - n, err = fid.File.Read(data) + n, err = r.fid.File.Read(data) } if err != io.EOF && err != nil { log.Printf("sRead: %v\n", err) @@ -499,11 +505,10 @@ func sRead(s *Server, r *Req) { return } } - ofcall := &RRead{ + r.ofcall = &RRead{ count: uint32(n), data: data[:n], } - r.ofcall = ofcall respond(r, nil) } func rRead(r *Req, err error) {}