commit d1423eba1a6eaf2a21adbeb790bac705da77133c
parent a01ba18d836802a85e2fd0f2a1043a3d27456237
Author: Matsuda Kenji <info@mtkn.jp>
Date: Wed, 18 Oct 2023 10:54:31 +0900
update numfs
Diffstat:
| M | cmd/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)
}
}