commit 0f3d00120eb9534fa8fef6d74d64e5c637caba02
parent 21fab3df1bde9bcde41cb0fca3eb76ff73819127
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sun, 17 Sep 2023 12:13:37 +0900
fix offset of TRead
Diffstat:
| M | server.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) {}