lib9p

Go 9P library.
Log | Files | Refs

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:
Miofs/file.go | 9+++------
Miofs/qid.go | 10+---------
Miofs/stat.go | 18+++++++++++++++++-
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),