lib9p

Go 9P library.
Log | Files | Refs

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:
Mdiskfs/file.go | 5++---
Mfile.go | 12+++++-------
Miofs/file.go | 12+++++-------
Miofs/qid.go | 8++++++++
Aiofs/stat.go | 32++++++++++++++++++++++++++++++++
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), + } +}