lib9p

Go 9P library.
Log | Files | Refs

commit 211c6fb66bec57aad8db1e3b9cbbebeebed94c34
parent 6a86439019a2a2a7532185a0710d667f8f36045e
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 19 Oct 2023 12:21:31 +0900

move getChildren() from file.go to fs.go

Diffstat:
Mfile.go | 38+++++---------------------------------
Mfs.go | 30++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+), 33 deletions(-)

diff --git a/file.go b/file.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "io" - "path" ) type File interface { @@ -47,33 +46,6 @@ type ReadDirFile interface { ReadDir(n int) ([]*DirEntry, error) } -func getChildren(fsys FS, dirpath string) ([]File, error) { - dir0, err := fsys.OpenFile(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.OpenFile(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 -} type ClientFile struct { name string @@ -92,7 +64,6 @@ func (cf *ClientFile) Stat() (*FileInfo, error) { return &FileInfo{*st}, nil } - // Don't use closed file. func (cf *ClientFile) Close() error { err := cf.client.Clunk(context.TODO(), cf.fid.fid) @@ -102,11 +73,14 @@ func (cf *ClientFile) Close() error { } func (cf *ClientFile) Read(b []byte) (int, error) { + if len(b) == 0 { + return 0, nil + } if cf.fid.omode == -1 { return 0, fmt.Errorf("not open") } if cf.fid.omode&3 != OREAD && cf.fid.omode&3 != ORDWR { - return 0, fmt.Errorf("permission denied") + return 0, ErrPerm } count := uint32(len(b)) cur := 0 @@ -127,13 +101,11 @@ func (cf *ClientFile) Read(b []byte) (int, error) { if err != nil { return cur, err } - count -= c } - if cur == 0 { return 0, io.EOF } else { - return int(cur), nil + return cur, nil } } diff --git a/fs.go b/fs.go @@ -1,13 +1,43 @@ package lib9p import ( + "fmt" "io/fs" + "path" ) type FS interface { OpenFile(name string, omode OpenMode, perm fs.FileMode) (File, error) } +func getChildren(fsys FS, dirpath string) ([]File, error) { + dir0, err := fsys.OpenFile(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.OpenFile(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 +} + func FSModeToQidType(fm fs.FileMode) QidType { var qt QidType if fm&fs.ModeDir != 0 {