commit 82a33ec72fb94fa6d53665e95fb8e94f1715534a
parent 056923bfd62772d83e9adccbc914224a081d3322
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 4 Nov 2023 13:28:16 +0900
export fs
Diffstat:
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{} }