lib9p

Go 9P library.
Log | Files | Refs

commit 6c0fb5f5168ff39c12df843993303b61c1b9ace1
parent 162030d36b2f4a9de344d0bb83ddc04e5ebf548c
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 15 Sep 2023 09:17:05 +0900

change Child()

Diffstat:
Mdiskfs/file.go | 12++++++++----
Mfile.go | 5++++-
Mserver.go | 12+++++++-----
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 }