lib9p

Go 9P library.
Log | Files | Refs | LICENSE

commit 82a33ec72fb94fa6d53665e95fb8e94f1715534a
parent 056923bfd62772d83e9adccbc914224a081d3322
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat,  4 Nov 2023 13:28:16 +0900

export fs

Diffstat:
Mauth.go | 2+-
Mclient/file.go | 3++-
Mcmd/numfs/main.go | 8++++----
Mcmd/semfs/fs.go | 10+++++-----
Mdiskfs/file.go | 2+-
Aexport_fs.go | 15+++++++++++++++
Aexport_fs_test.go | 11+++++++++++
Mfile.go | 5+++--
Miofs/file.go | 2+-
Mserver.go | 2+-
Mstat.go | 5+++--
Mtestfs/fs.go | 9+++++----
Muid_test.go | 2+-
13 files changed, 53 insertions(+), 23 deletions(-)

diff --git a/auth.go b/auth.go @@ -16,7 +16,7 @@ type AuthFile struct { R io.Reader } -func (af *AuthFile) Stat() (*FileInfo, error) { +func (af *AuthFile) Stat() (fs.FileInfo, error) { if af.Qid.Type&QTAUTH == 0 { panic("QTAUTH bit not set") } diff --git a/client/file.go b/client/file.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "io/fs" "git.mtkn.jp/lib9p" ) @@ -18,7 +19,7 @@ type ClientFile struct { fs *ClientFS } -func (cf *ClientFile) Stat() (*lib9p.FileInfo, error) { +func (cf *ClientFile) Stat() (fs.FileInfo, error) { tag, err := cf.fs.tPool.add() if err != nil { return nil, err diff --git a/cmd/numfs/main.go b/cmd/numfs/main.go @@ -66,7 +66,7 @@ type numFile struct { func (f *numFile) Fsys() lib9p.FS { return f.fs } -func (f *numFile) Stat() (*lib9p.FileInfo, error) { +func (f *numFile) Stat() (fs.FileInfo, error) { var stat lib9p.Stat stat.Type = 0 stat.Dev = 0 @@ -137,17 +137,17 @@ func (f *numFile) ReadAt(p []byte, off int64) (n int, err error) { return f.reader.ReadAt(p, off) } -func (f *numFile) ReadDir(n int) ([]*lib9p.DirEntry, error) { +func (f *numFile) ReadDir(n int) ([]fs.DirEntry, error) { if f.id != -1 { return nil, fmt.Errorf("not a directory") } - de := make([]*lib9p.DirEntry, len(f.children)) + de := make([]fs.DirEntry, len(f.children)) for i, c := range f.children { s, err := c.Stat() if err != nil { return nil, fmt.Errorf("stat: %v", err) } - de[i] = s + de[i] = s.(*lib9p.FileInfo) } return de, nil } diff --git a/cmd/semfs/fs.go b/cmd/semfs/fs.go @@ -39,7 +39,7 @@ func (fsys *semFS) OpenFile(name string, omode lib9p.OpenMode, perm fs.FileMode) } } -func (root *semFS) Stat() (*lib9p.FileInfo, error) { +func (root *semFS) Stat() (fs.FileInfo, error) { t := uint32(time.Now().Unix()) return &lib9p.FileInfo{Stat: lib9p.Stat{ Qid: lib9p.Qid{Type: lib9p.QTDIR, Vers: 0, Path: 0}, @@ -76,8 +76,8 @@ func (root *semFS) Read(p []byte) (n int, err error) { return 0, errors.New("is a directory") } -func (root *semFS) ReadDir(n int) ([]*lib9p.DirEntry, error) { - de := make([]*lib9p.DirEntry, 0, len(root.semfiles)) +func (root *semFS) ReadDir(n int) ([]fs.DirEntry, error) { + de := make([]fs.DirEntry, 0, len(root.semfiles)) for _, f := range root.semfiles { if f == nil { continue @@ -86,7 +86,7 @@ func (root *semFS) ReadDir(n int) ([]*lib9p.DirEntry, error) { if err != nil { return nil, err } - de = append(de, fi) + de = append(de, fi.(*lib9p.FileInfo)) } return de, nil } @@ -135,7 +135,7 @@ func (f *semFile) start(ctx context.Context) { f.wchan = wchan } -func (f *semFile) Stat() (*lib9p.FileInfo, error) { +func (f *semFile) Stat() (fs.FileInfo, error) { t := uint32(time.Now().Unix()) return &lib9p.FileInfo{Stat: lib9p.Stat{ Qid: lib9p.Qid{Type: lib9p.QTFILE, Vers: 0, Path: f.path}, diff --git a/diskfs/file.go b/diskfs/file.go @@ -20,7 +20,7 @@ type File struct { } // Stat returns the *lib9p.FileInfo structure describing file. -func (f *File) Stat() (*lib9p.FileInfo, error) { +func (f *File) Stat() (fs.FileInfo, error) { return f.stat() } diff --git a/export_fs.go b/export_fs.go @@ -0,0 +1,14 @@ +package lib9p + +import ( + "io/fs" +) + +// exportFS is a wrapper of FS to export it as fs.FS. +type exportFS struct { + FS +} + +func (fsys exportFS) Open(name string) (fs.File, error) { + return fsys.OpenFile(name, OREAD, 0) +} +\ No newline at end of file diff --git a/export_fs_test.go b/export_fs_test.go @@ -0,0 +1,10 @@ +package lib9p + +import ( + "io/fs" + "testing" +) + +func TestInterface(t *testing.T) { + var _ fs.FS = exportFS{} +} +\ No newline at end of file diff --git a/file.go b/file.go @@ -2,11 +2,12 @@ package lib9p import ( "io" + "io/fs" ) // File is an open file. type File interface { - Stat() (*FileInfo, error) + Stat() (fs.FileInfo, error) Close() error io.Reader } @@ -45,5 +46,5 @@ type RemoverFile interface { // return an error. type ReadDirFile interface { File - ReadDir(n int) ([]*DirEntry, error) + ReadDir(n int) ([]fs.DirEntry, error) } diff --git a/iofs/file.go b/iofs/file.go @@ -15,7 +15,7 @@ type File struct { path string // absolute path from the root of the fs. } -func (f *File) Stat() (*lib9p.FileInfo, error) { +func (f *File) Stat() (fs.FileInfo, error) { fsfile, err := f.fs.fs.Open(f.path) if err != nil { return nil, fmt.Errorf("open: %v", err) diff --git a/server.go b/server.go @@ -367,7 +367,7 @@ func sWalk(ctx context.Context, s *Server, r *Req) { log.Printf("stat: %v", err) break } - wqids[i] = stat.Qid() + wqids[i] = stat.Sys().(*Stat).Qid n++ } newFid.File = cwdf diff --git a/stat.go b/stat.go @@ -184,9 +184,10 @@ func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime), func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&fs.ModeDir != 0 } // Sys returns *Stat func (fi *FileInfo) Sys() any { return &fi.Stat } -func (fi *FileInfo) Qid() Qid { return fi.Stat.Qid } +//func (fi *FileInfo) Qid() Qid { return fi.Stat.Qid } // DirEntry is returned by File.ReadDir. type DirEntry = FileInfo -func (de *DirEntry) Info() fs.FileInfo { return de } +func (de *DirEntry) Type() fs.FileMode { return de.Mode().Type() } +func (de *DirEntry) Info() (fs.FileInfo, error) { return de, nil } diff --git a/testfs/fs.go b/testfs/fs.go @@ -22,7 +22,7 @@ type TestFile struct { St lib9p.Stat } -func (f *TestFile) Stat() (*lib9p.FileInfo, error) { +func (f *TestFile) Stat() (fs.FileInfo, error) { return &lib9p.FileInfo{Stat: f.St}, nil } func (f *TestFile) Close() error { @@ -44,10 +44,11 @@ func (f *TestFile) ReadAt(b []byte, off int64) (n int, err error) { return f.Reader.ReadAt(b, off) } -func (f *TestFile) ReadDir(n int) ([]*lib9p.DirEntry, error) { - de := make([]*lib9p.DirEntry, len(f.Children)) +func (f *TestFile) ReadDir(n int) ([]fs.DirEntry, error) { + de := make([]fs.DirEntry, len(f.Children)) for i, c := range f.Children { - de[i], _ = c.Stat() + st, _ := c.Stat() + de[i] = st.(*lib9p.FileInfo) } return de, nil } diff --git a/uid_test.go b/uid_test.go @@ -14,7 +14,7 @@ type permFile struct { func (f permFile) Parent() (File, error) { return nil, nil } func (f permFile) Child() ([]File, error) { return nil, nil } -func (f permFile) Stat() (*FileInfo, error) { +func (f permFile) Stat() (fs.FileInfo, error) { return &FileInfo{Stat: Stat{Mode: f.mode, Uid: f.uid, Gid: f.gid}}, nil } func (f permFile) Qid() Qid { return Qid{} }