func (*Ufs) Read(req *srv.Req) { fid := req.Fid.Aux.(*Fid) tc := req.Tc rc := req.Rc err := fid.stat() if err != nil { req.RespondError(err) return } go9p.InitRread(rc, tc.Count) var count int var e error if fid.st.IsDir() { b := rc.Data if tc.Offset == 0 { fid.file.Close() fid.file, e = os.OpenFile(fid.path, omode2uflags(req.Fid.Omode), 0) if e != nil { req.RespondError(toError(e)) return } } for len(b) > 0 { if fid.dirs == nil { fid.dirs, e = fid.file.Readdir(16) if e != nil && e != io.EOF { req.RespondError(toError(e)) return } if len(fid.dirs) == 0 { break } } var i int for i = 0; i < len(fid.dirs); i++ { path := fid.path + "/" + fid.dirs[i].Name() st := dir2Dir(path, fid.dirs[i], req.Conn.Dotu, req.Conn.Srv.Upool) sz := go9p.PackDir(st, b, req.Conn.Dotu) if sz == 0 { break } b = b[sz:] count += sz } if i < len(fid.dirs) { fid.dirs = fid.dirs[i:] break } else { fid.dirs = nil } } } else { count, e = fid.file.ReadAt(rc.Data, int64(tc.Offset)) if e != nil && e != io.EOF { req.RespondError(toError(e)) return } } go9p.SetRreadCount(rc, uint32(count)) req.Respond() }