commit e30188740f264f2efb22933054fd87310a8a7924
parent 0c0ec6f266b6c3653fcdbfcc887ee4684711e102
Author: Matsuda Kenji <info@mtkn.jp>
Date: Tue, 17 Oct 2023 07:57:28 +0900
delete File.Child()
Diffstat:
3 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/diskfs/file.go b/diskfs/file.go
@@ -170,6 +170,24 @@ func (f *File) Read(b []byte) (int, error) {
return f.file.Read(b)
}
+func (f *File) ReadDir(n int) ([]*lib9p.DirEntry, error) {
+ ospath := filepath.Join(f.fs.rootPath, f.path)
+ osde, err := os.ReadDir(ospath)
+ if err != nil {
+ return nil, fmt.Errorf("readdir: %v", err)
+ }
+ de := make([]*lib9p.DirEntry, len(osde))
+ for i, e := range osde {
+ fi, err := e.Info()
+ if err != nil {
+ return nil, fmt.Errorf("info: %v", err)
+ }
+ id := idFromInfo(fi)
+ de[i] = &lib9p.DirEntry{Stat: *fiStat(f.fs.qidPool, id, fi)}
+ }
+ return de, nil
+}
+
func (f *File) Parent() (lib9p.File, error) {
parentPath := filepath.Dir(f.path)
parent, err := os.Open(filepath.Join(f.fs.rootPath, parentPath))
diff --git a/file.go b/file.go
@@ -10,7 +10,7 @@ import (
type File interface {
// Parent() (File, error)
- Child() ([]File, error) // Children
+// Child() ([]File, error) // Children
Stat() (*FileInfo, error)
Qid() Qid
@@ -50,8 +50,37 @@ type RemoverFile interface {
type ReadDirFile interface {
File
- ReadDir(n int) ([]DirEntry, error)
+ ReadDir(n int) ([]*DirEntry, error)
}
+
+func getChildren(fsys FS, dirpath string) ([]File, error) {
+ dir0, err := fsys.Open(dirpath, OREAD, 0)
+ if err != nil {
+ return nil, fmt.Errorf("open dir: %v", err)
+ }
+ defer dir0.Close()
+ dir, ok := dir0.(ReadDirFile)
+ if !ok {
+ return nil, fmt.Errorf("not a directory")
+ }
+ des, err := dir.ReadDir(-1)
+ if err != nil {
+ return nil, fmt.Errorf("readdir: %v", err)
+ }
+ children := make([]File, len(des))
+ for i, de := range des {
+ f, err := fsys.Open(path.Join(dirpath, de.Name()), OREAD, 0)
+ if err != nil {
+ for j := 0; j < i; j++ {
+ children[j].Close()
+ }
+ return nil, fmt.Errorf("open child: %v", err)
+ }
+ children[i] = f
+ }
+ return children, nil
+}
+
/*
// Walkfile1 walks file tree one step down from f to the child specified by name.
// It returns the destination File.
diff --git a/server.go b/server.go
@@ -525,7 +525,7 @@ func sRead(s *Server, r *Req) {
return
}
if fi.IsDir() {
- children, err := r.fid.File.Child()
+ children, err := getChildren(s.fs, r.fid.path)
if err != nil {
log.Printf("get children: %v", err)
}
@@ -760,7 +760,7 @@ func sWStat(s *Server, r *Req) {
respond(r, ErrPerm)
return
}
- children, err := parent.Child()
+ children, err := getChildren(s.fs, parentPath)
if err != nil {
respond(r, fmt.Errorf("get children: %v", err))
return