lib9p

Go 9P library.
Log | Files | Refs

commit e30188740f264f2efb22933054fd87310a8a7924
parent 0c0ec6f266b6c3653fcdbfcc887ee4684711e102
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 17 Oct 2023 07:57:28 +0900

delete File.Child()

Diffstat:
Mdiskfs/file.go | 18++++++++++++++++++
Mfile.go | 33+++++++++++++++++++++++++++++++--
Mserver.go | 4++--
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