commit 38741a122abec09a06e4f2004d4a53549db508cd
parent 315e9491eed9cda80cb82cdca7aee1218aac0a04
Author: Matsuda Kenji <info@mtkn.jp>
Date: Wed, 30 Aug 2023 09:28:59 +0900
use fs.DirEntry to ReadDir() without Open()ing file
and fix bug where nextQid is not incremented
Diffstat:
3 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/iofs/file.go b/iofs/file.go
@@ -151,18 +151,15 @@ func (f *File) ReadDir(n int) ([]*lib9p.DirEntry, error) {
}
de := make([]*lib9p.DirEntry, len(fsde))
for i := 0; i < len(de); i++ {
- fpath := path.Join(f.path, fsde[i].Name())
- qid, err := pathQid(f.fs.qidPool, fpath)
- if err != nil {
- return nil, fmt.Errorf("pathQid: %v", err)
- }
info, err := fsde[i].Info()
if err != nil {
return nil, fmt.Errorf("stat: %v", err)
}
+ fpath := path.Join(f.path, info.Name())
+
de[i] = &lib9p.DirEntry{
- Stat: fiStat(info, qid),
+ Stat: fiStat(f.fs.qidPool, fileID(fpath), info),
}
}
return de, nil
diff --git a/iofs/qid.go b/iofs/qid.go
@@ -52,6 +52,7 @@ func (pool *QidPool) alloc(f *File) (lib9p.Qid, error) {
Type: qtype,
}
pool.m[id] = qid
+ pool.nextQid++
return qid, nil
}
@@ -62,11 +63,3 @@ func (pool *QidPool) delete(f *File) {
}
delete(pool.m, id)
}
-
-func pathQid(pool *QidPool, path string) (*lib9p.Qid, error) {
- qid, ok := pool.m[fileID(path)]
- if !ok {
- return nil, fmt.Errorf("not found")
- }
- return &qid, nil
-}
-\ No newline at end of file
diff --git a/iofs/stat.go b/iofs/stat.go
@@ -17,7 +17,23 @@ func fiUid(fi fs.FileInfo) string { return "" }
func fiGid(fi fs.FileInfo) string { return "" }
func fiMuid(fi fs.FileInfo) string { return "" }
-func fiStat(fi fs.FileInfo, qid *lib9p.Qid) *lib9p.Stat {
+func fiQid(pool *QidPool, id fileID, fi fs.FileInfo) (*lib9p.Qid, error) {
+ qid, ok := pool.m[id]
+ if ok {
+ return &qid, nil
+ }
+ qtype := lib9p.FSModeToQidType(fi.Mode())
+ qid = lib9p.Qid{
+ Path: pool.nextQid,
+ Type: qtype,
+ }
+ pool.m[id] = qid
+ pool.nextQid++
+ return &qid, nil
+}
+
+func fiStat(pool *QidPool, id fileID, fi fs.FileInfo) *lib9p.Stat {
+ qid, _ := fiQid(pool, id, fi)
return &lib9p.Stat{
Qid: qid,
Name: fiName(fi),