commit 315e9491eed9cda80cb82cdca7aee1218aac0a04
parent 9ad7c56e7959e59f86e90d2c4181eea964935705
Author: Matsuda Kenji <info@mtkn.jp>
Date: Wed, 30 Aug 2023 09:10:59 +0900
change DirEntry to use fs.DirEntry without opening File
wip
Diffstat:
5 files changed, 52 insertions(+), 17 deletions(-)
diff --git a/diskfs/file.go b/diskfs/file.go
@@ -133,7 +133,6 @@ func (f *File) Stat() (fs.FileInfo, error) {
qid := f.Qid()
fi := &lib9p.FileInfo{
- //Info: fsfi,
Stat: &lib9p.Stat{
Qid: &qid,
Name: f.Name(),
@@ -179,8 +178,8 @@ func (f *File) ReadDir(n int) ([]*lib9p.DirEntry, error) {
return nil, fmt.Errorf("stat: %v", err)
}
de[i] = &lib9p.DirEntry{
- DirEnt: fsde[i],
- FileInfo: info.(*lib9p.FileInfo),
+ //DirEnt: fsde[i],
+ Stat: info.(*lib9p.FileInfo).Stat,
//File: file.(*File),
}
}
diff --git a/file.go b/file.go
@@ -179,12 +179,10 @@ type ReadDirFile interface {
}
type DirEntry struct {
- DirEnt fs.DirEntry // underlying fs.DirEntry
- FileInfo *FileInfo
-// File File
+ Stat *Stat
}
-func (e *DirEntry) Name() string { return e.DirEnt.Name() }
-func (e *DirEntry) IsDir() bool { return e.DirEnt.IsDir() }
-func (e *DirEntry) Type() fs.FileMode { return e.DirEnt.Type() }
-func (e *DirEntry) Info() (*FileInfo, error) { return e.FileInfo, nil }
+func (e *DirEntry) Name() string { return e.Stat.Name }
+func (e *DirEntry) IsDir() bool { return e.Stat.Mode&DMDIR != 0 }
+func (e *DirEntry) Type() fs.FileMode { return Mode9ToFSMode(e.Stat.Mode) }
+func (e *DirEntry) Info() (*FileInfo, error) { return &FileInfo{e.Stat}, nil }
diff --git a/iofs/file.go b/iofs/file.go
@@ -152,19 +152,17 @@ 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())
- file, err := f.fs.Open(fpath)
+ qid, err := pathQid(f.fs.qidPool, fpath)
if err != nil {
- return nil, fmt.Errorf("open file: %v", err)
+ return nil, fmt.Errorf("pathQid: %v", err)
}
- // BUG: TODO: use fsde.Info()
- info, err := file.Stat()
+ info, err := fsde[i].Info()
if err != nil {
return nil, fmt.Errorf("stat: %v", err)
}
+
de[i] = &lib9p.DirEntry{
- DirEnt: fsde[i],
- FileInfo: info.(*lib9p.FileInfo),
- //File: file.(*File),
+ Stat: fiStat(info, qid),
}
}
return de, nil
diff --git a/iofs/qid.go b/iofs/qid.go
@@ -61,4 +61,12 @@ func (pool *QidPool) delete(f *File) {
return
}
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
@@ -0,0 +1,32 @@
+package iofs
+
+import (
+ "io/fs"
+
+ "lib9p"
+)
+
+func fiType(fi fs.FileInfo) uint16 { return 0 }
+func fiDev(fi fs.FileInfo) uint32 { return 0 }
+func fiLength(fi fs.FileInfo) int64 { return fi.Size() }
+func fiMode(fi fs.FileInfo) lib9p.FileMode { return lib9p.FSModeTo9Mode(fi.Mode()) }
+func fiName(fi fs.FileInfo) string { return fi.Name() }
+func fiAtime(fi fs.FileInfo) uint32 { return uint32(fi.ModTime().Unix()) }
+func fiMtime(fi fs.FileInfo) uint32 { return uint32(fi.ModTime().Unix()) }
+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 {
+ return &lib9p.Stat{
+ Qid: qid,
+ Name: fiName(fi),
+ Mode: fiMode(fi),
+ Atime: fiAtime(fi),
+ Mtime: fiMtime(fi),
+ Length: fiLength(fi),
+ Uid: fiUid(fi),
+ Gid: fiGid(fi),
+ Muid: fiMuid(fi),
+ }
+}