lib9p

Go 9P library.
Log | Files | Refs

commit d1423eba1a6eaf2a21adbeb790bac705da77133c
parent a01ba18d836802a85e2fd0f2a1043a3d27456237
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Wed, 18 Oct 2023 10:54:31 +0900

update numfs

Diffstat:
Mcmd/numfs.go | 108++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 68 insertions(+), 40 deletions(-)

diff --git a/cmd/numfs.go b/cmd/numfs.go @@ -5,34 +5,57 @@ import ( "flag" "fmt" "io" + "io/fs" "log" "net" "os" + "strings" "lib9p" ) -var root *numFile -func init() { - fsys := new(numFS) - root = &numFile{ - fs: fsys, - id: -1, - reader: nil, - children: []*numFile{ - &numFile{fsys, 0, bytes.NewReader([]byte("0\n")), nil}, - &numFile{fsys, 1, bytes.NewReader([]byte("1\n")), nil}, - &numFile{fsys, 2, bytes.NewReader([]byte("2\n")), nil}, - &numFile{fsys, 3, bytes.NewReader([]byte("3\n")), nil}, - }, +type numFS struct{ + root *numFile +} + + +func (fsys *numFS) String() string { + if fsys.root == nil { + return "<empty>" } + return fsysString(fsys.root) } -type numFS struct{} +func fsysString(f *numFile) string { + s := fmt.Sprintf("%d\n", f.id) + for _, c := range f.children { + cs := fsysString(c) + ln := strings.Split(cs, "\n") + for _, l := range ln { + s += "\t" + l + "\n" + } + } + return s +} -func (fsys *numFS) Root() lib9p.File { - return root +func (fsys *numFS) OpenFile(name string, omode lib9p.OpenMode, perm fs.FileMode) (lib9p.File, error) { + if name == "." || name == "" { + return fsys.root, nil + } + wname := strings.Split(name, "/") + cwd := fsys.root +L: + for _, wn := range wname { + for _, c := range cwd.children { + if fmt.Sprintf("%d", c.id) == wn { + cwd = c + continue L + } + } + return nil, fmt.Errorf("not found") + } + return cwd, nil } type numFile struct { @@ -115,34 +138,26 @@ func (f *numFile) ReadAt(p []byte, off int64) (n int, err error) { return f.reader.ReadAt(p, off) } -func (f *numFile) Open(mode lib9p.OpenMode) error { - return nil -} - -func (f *numFile) Close() error { - f.reader.Seek(0, io.SeekStart) - return nil -} - -func (f *numFile) PathName() string { - if f.id == -1 { - return "." - } - return fmt.Sprintf("%d", f.id) -} - - -func (f *numFile) Parent() (lib9p.File, error) { return root, nil } - -func (f *numFile) Child() ([]lib9p.File, error) { +func (f *numFile) ReadDir(n int) ([]*lib9p.DirEntry, error) { if f.id != -1 { return nil, fmt.Errorf("not a directory") } - children := make([]lib9p.File, len(f.children)) + de := make([]*lib9p.DirEntry, len(f.children)) for i, c := range f.children { - children[i] = c + s, err := c.Stat() + if err != nil { + return nil, fmt.Errorf("stat: %v", err) + } + de[i] = s + } + return de, nil +} + +func (f *numFile) Close() error { + if f.reader != nil { + f.reader.Seek(0, io.SeekStart) } - return children, nil + return nil } var dFlag = flag.Bool("D", false, "Prints chatty message to the stderr.") @@ -155,6 +170,19 @@ func main() { os.Exit(1) } + fsys := new(numFS) + fsys.root = &numFile{ + fs: fsys, + id: -1, + reader: nil, + children: []*numFile{ + &numFile{fsys, 0, bytes.NewReader([]byte("0\n")), nil}, + &numFile{fsys, 1, bytes.NewReader([]byte("1\n")), nil}, + &numFile{fsys, 2, bytes.NewReader([]byte("2\n")), nil}, + &numFile{fsys, 3, bytes.NewReader([]byte("3\n")), nil}, + }, + } + listener, err := net.Listen("tcp", "127.0.0.1:5640") if err != nil { log.Fatalf("listen tcp: %v", err) @@ -167,7 +195,7 @@ func main() { continue } - go handle(conn, &numFS{}) + go handle(conn, fsys) } }