commit 6c0fb5f5168ff39c12df843993303b61c1b9ace1
parent 162030d36b2f4a9de344d0bb83ddc04e5ebf548c
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 15 Sep 2023 09:17:05 +0900
change Child()
Diffstat:
3 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/diskfs/file.go b/diskfs/file.go
@@ -49,11 +49,13 @@ func getChildEntry(fsys *FS, dir *os.File) ([]*lib9p.DirEntry, error) {
}
func openFile(fsys *FS, fpath string, mode lib9p.OpenMode) (*File, error) {
+/*
fsfile, err := fsys.fs.Open(fpath)
if err != nil {
return nil, fmt.Errorf("fs open: %v", err)
}
fsfile.Close()
+*/
f := &File{
fs: fsys,
@@ -146,13 +148,15 @@ func (f *File) Child() ([]lib9p.File, error) {
files := make([]lib9p.File, len(childEntry))
for i := 0; i < len(childEntry); i++ {
cpath := path.Join(f.path, childEntry[i].Name())
- child, err := f.fs.Open(cpath)
- if err != nil {
- return files, fmt.Errorf("open child: %v", err)
+ child, e := f.fs.Open(cpath)
+ if e != nil {
+ files[i] = nil
+ err = e
+ continue
}
files[i] = child
}
- return files, nil
+ return files, err
}
func (f *File) ReadAt(p []byte, off int64) (int, error) {
diff --git a/file.go b/file.go
@@ -39,10 +39,13 @@ type RemoverFile interface {
// It returns the destination File and nil, or nil with non-nil error.
func walkfile(f File, name string) (File, error) {
children, err := f.Child()
- if err != nil {
+ if children == nil {
return nil, fmt.Errorf("get children: %v", err)
}
for _, child := range children {
+ if child == nil {
+ continue
+ }
s, err := child.Stat()
if err != nil {
return nil, fmt.Errorf("stat: %v", err)
diff --git a/server.go b/server.go
@@ -358,7 +358,7 @@ func sRead(s *Server, r *Req) {
fid, ok := s.fPool.lookup(ifcall.Fid())
if !ok {
- respond(r, fmt.Errorf("unknown fid"))
+ respond(r, ErrUnknownFid)
return
}
if fid.OMode == -1 {
@@ -367,7 +367,7 @@ func sRead(s *Server, r *Req) {
}
if fid.OMode != OREAD && fid.OMode != ORDWR && fid.OMode != OEXEC {
- respond(r, fmt.Errorf("permission denied"))
+ respond(r, ErrPerm)
return
}
@@ -388,11 +388,13 @@ func sRead(s *Server, r *Req) {
// BUG: TODO: fix offset.
for k := int(ifcall.Offset()); k < len(children); k++ {
+ if children[k] == nil {
+ continue
+ }
fi, err := children[k].Stat()
if err != nil {
log.Printf("stat: %v", err)
- respond(r, fmt.Errorf("internal error"))
- return
+ continue
}
st := fi.Sys().(*Stat)
buf := st.marshal()
@@ -531,7 +533,7 @@ func sStat(s *Server, r *Req) {
}
fileInfo, err := fidStruct.File.Stat()
if err != nil {
- log.Printf("Stat file %v: %v", fidStruct.File, err)
+ log.Printf("stat %v: %v", fidStruct.File, err)
respond(r, fmt.Errorf("internal error"))
return
}