lib9p

Go 9P library.
Log | Files | Refs

commit 0c2157f07221fb65ae9222cedf34cf559b2b3bbd
parent e02cbb498335d20ede00a4487e12b9e0a5d5c75c
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu,  7 Sep 2023 09:55:50 +0900

restore

Diffstat:
Mfile.go | 2+-
Mfs.go | 6+++++-
Miofs/file.go | 90++++++++++++++++++++-----------------------------------------------------------
Miofs/qid.go | 6+++++-
Mstat.go | 3---
5 files changed, 33 insertions(+), 74 deletions(-)

diff --git a/file.go b/file.go @@ -6,7 +6,7 @@ import ( type File interface { fs.File -// PathName() string // path from the root of the fs which this file belongs to. + PathName() string // path from the root of the fs which this file belongs to. } type ReadDirFile interface { diff --git a/fs.go b/fs.go @@ -18,7 +18,11 @@ func walk(fsys FS, root string, wnames []string) ([]Qid, error) { if err != nil { return wqids, err } - qid := f.Qid() + fi, err := f.Stat() + if err != nil { + return wqids, err + } + qid := fi.(*FileInfo).Qid() wqids[i] = qid } return wqids, nil diff --git a/iofs/file.go b/iofs/file.go @@ -4,7 +4,6 @@ import ( "fmt" "io" "io/fs" - "log" "path" "lib9p" @@ -30,78 +29,33 @@ func openFile(fsys *FS, fpath string) (*File, error) { } func (f *File) PathName() string { return f.path } -func (f *File) Type() uint16 { return 0 } -func (f *File) Dev() uint32 { return 0 } -func (f *File) Qid() lib9p.Qid { - qid, ok := f.fs.qidPool.lookup(f) - if ok { - return qid - } - qid, err := f.fs.qidPool.alloc(f) - if err != nil { - panic(fmt.Errorf("alloc qid: %v", err)) - } - return qid -} - -func (f *File) Length() int64 { - fi, err := f.file.Stat() - if err != nil { - log.Printf("stat: %v", err) - return 0 - } - return fi.Size() -} -func (f *File) Mode() lib9p.FileMode { - fi, err := f.file.Stat() - if err != nil { - log.Printf("stat: %v", err) - return 0 - } - return lib9p.FSModeTo9Mode(fi.Mode()) -} -func (f *File) Name() string { - fi, err := f.file.Stat() - if err != nil { - log.Printf("stat: %v", err) - return "" - } - return fi.Name() -} - -func (f *File) Atime() uint32 { - fi, err := f.file.Stat() +func (f *File) Stat() (fs.FileInfo, error) { + fsfi, err := f.file.Stat() if err != nil { - log.Printf("stat error: %v", err) - return 0 // TODO: error check? + return nil, fmt.Errorf("stat: %v") } - return uint32(fi.ModTime().Unix()) -} -func (f *File) Mtime() uint32 { - fi, err := f.file.Stat() - if err != nil { - log.Printf("stat error: %v", err) - return 0 // TODO: error check? + var stat lib9p.Stat + stat.Type = 0 + stat.Dev = 0 + qid, ok := f.fs.qidPool.lookup(f) + if !ok { + qid, err = f.fs.qidPool.alloc(f) + if err != nil { + panic(fmt.Errorf("alloc qid: %v", err)) + } } - return uint32(fi.ModTime().Unix()) -} - -func (f *File) Uid() string { - return "" -} - -func (f *File) Gid() string { - return "" -} - -func (f *File) Muid() string { - return "" -} - -func (f *File) Stat() (fs.FileInfo, error) { - return &lib9p.FileInfo{Stat: *lib9p.StatFromFile(f)}, nil + stat.Qid = qid + stat.Length = fsfi.Size() + stat.Mode = lib9p.FSModeTo9Mode(fsfi.Mode()) + stat.Name = fsfi.Name() + stat.Atime = uint32(fsfi.ModTime().Unix()) + stat.Mtime = uint32(fsfi.ModTime().Unix()) + stat.Uid = "" + stat.Gid = "" + stat.Muid = "" + return &lib9p.FileInfo{stat}, nil } func (f *File) Close() error { diff --git a/iofs/qid.go b/iofs/qid.go @@ -44,7 +44,11 @@ func (pool *QidPool) lookup(f *File) (lib9p.Qid, bool) { return lib9p.Qid{}, false } - mtime := time.Unix(int64(f.Mtime()), 0) + stat, err := f.file.Stat() + if err != nil { + return lib9p.Qid{}, false + } + mtime := stat.ModTime() if qreq.mtime.Before(mtime) { qreq.qid.Vers++ qreq.mtime = mtime diff --git a/stat.go b/stat.go @@ -171,8 +171,6 @@ func (s *Stat) String() string { type FileInfo struct { Stat Stat - Path string - Fsys FS } func (fi *FileInfo) Name() string { return fi.Stat.Name } @@ -182,7 +180,6 @@ func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime) func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&DMDIR != 0 } func (fi *FileInfo) Sys() any { return &fi.Stat } func (fi *FileInfo) Qid() Qid { return fi.Stat.Qid } -func (fi *FileInfo) File() (File, error) { return fi.Fsys.Open(fi.Path) } type DirEntry = FileInfo