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:
| M | file.go | | | 38 | +++++--------------------------------- |
| M | fs.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 {