commit 7f2fed2a291394f89383635ca93345ecd214bde9
parent e25685ead0f79fc26f623f97037967abd41f7213
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 1 Sep 2023 10:27:57 +0900
implement numfs
Diffstat:
| M | cmd/numfs.go | | | 139 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
| M | file.go | | | 1 | - |
2 files changed, 135 insertions(+), 5 deletions(-)
diff --git a/cmd/numfs.go b/cmd/numfs.go
@@ -1,41 +1,172 @@
package main
import (
+ "bytes"
"flag"
"fmt"
"io/fs"
"log"
"net"
"os"
+ "strconv"
+ "time"
"lib9p"
)
+var root *numFile
+
+func init() {
+ root = &numFile{
+ id: -1,
+ text: "",
+ children: []*numFile{
+ &numFile{0, "0", nil},
+ &numFile{1, "1", nil},
+ &numFile{2, "2", nil},
+ &numFile{3, "3", nil},
+ },
+ }
+}
+
type numFS struct{}
func (fsys *numFS) Open(name string) (lib9p.File, error) {
- if name != "." {
+ switch name {
+ case ".":
+ return root, nil
+ case "0", "1", "2", "3":
+ d, err := strconv.Atoi(name)
+ if err != nil {
+ return nil, &fs.PathError{
+ Op: "open",
+ Path: name,
+ Err: fmt.Errorf("invalid number %s", name),
+ }
+ }
+ return root.children[d], nil
+ default:
return nil, &fs.PathError{
Op: "open",
Path: name,
Err: fmt.Errorf("not found"),
}
}
- return &numRoot{}, nil
}
type numFile struct {
id int
text string
+ children []*numFile
}
func (f *numFile) Stat() (fs.FileInfo, error) {
+ qid := f.Qid()
+ return &FileInfo{
+ Stat: &lib9p.Stat{
+ Type: f.Type(),
+ Dev: f.Dev(),
+ Qid: &qid,
+ Mode: f.Mode(),
+ Atime: f.Atime(),
+ Mtime: f.Mtime(),
+ Length: f.Length(),
+ Name: f.Name(),
+ Uid: f.Uid(),
+ Gid: f.Gid(),
+ Muid: f.Muid(),
+ }}, nil
+}
+func (f *numFile) Read(p []byte) (int, error) {
+ if f.id == -1 {
+ return 0, fmt.Errorf("is a directory")
+ }
+ var n int
+ for n = 0; n < len(p) && n < len(f.text); n++ {
+ p[n] = f.text[n]
+ }
+ return n, nil
+}
+func (f *numFile) Close() error { return nil }
+func (f *numFile) PathName() string {
+ if f.id == -1 {
+ return "."
+ }
+ return f.text
+}
+func (f *numFile) Type() uint16 { return 0 }
+func (f *numFile) Dev() uint32 { return 0 }
+func (f *numFile) Qid() lib9p.Qid {
+ if f.id == -1 {
+ return lib9p.Qid{
+ Type: lib9p.QTDIR,
+ Vers: 0,
+ Path: ^uint64(0),
+ }
+ }
+ return lib9p.Qid{
+ Type: lib9p.QTFILE,
+ Vers: 0,
+ Path: uint64(f.id),
+ }
+}
+func (f *numFile) Mode() lib9p.FileMode {
+ var mode lib9p.FileMode
+ if f.id == -1 {
+ mode |= lib9p.DMDIR
+ }
+ mode |= 0444
+ return mode
+}
+func (f *numFile) Atime() uint32 { return 0 }
+func (f *numFile) Mtime() uint32 { return 0 }
+func (f *numFile) Length() int64 {
+ if f.id == -1 {
+ return 0
+ } else {
+ return int64(len(f.text))
+ }
+}
+func (f *numFile) Name() string { return fmt.Sprintf("%d", f.id) }
+func (f *numFile) Uid() string { return "kenji" }
+func (f *numFile) Gid() string { return "kenji" }
+func (f *numFile) Muid() string { return "kenji" }
+func (f *numFile) ReadAt(p []byte, off int64) (n int, err error) {
+ return bytes.NewReader([]byte(f.text)).ReadAt(p, off)
+}
+
+
+
+func (f *numFile) ReadDir(n int) ([]*lib9p.DirEntry, error) {
+ if f.id != -1 {
+ return nil, fmt.Errorf("not a directory")
+ }
+ if n < 0 {
+ n = len(root.children)
+ }
+ de := make([]*lib9p.DirEntry, n)
+ for i := 0; i < len(root.children) && i < n; i++ {
+ stat, err := root.children[i].Stat()
+ if err != nil {
+ return de, err
+ }
+ de[i] = &lib9p.DirEntry{stat}
+ }
+ return de, nil
}
-type numRoot numFile
+type FileInfo struct {
+ Stat *lib9p.Stat
+}
-func (root *numRoot) ReadDir() {}
+func (fi *FileInfo) Name() string { return fi.Stat.Name }
+func (fi *FileInfo) Size() int64 { return fi.Stat.Length }
+func (fi *FileInfo) Mode() fs.FileMode { return lib9p.Mode9ToFSMode(fi.Stat.Mode) }
+func (fi *FileInfo) ModTime() time.Time { return time.Unix(int64(fi.Stat.Mtime), 0) }
+func (fi *FileInfo) IsDir() bool { return fi.Stat.Mode&lib9p.DMDIR != 0 }
+func (fi *FileInfo) Sys() any { return fi.Stat }
+func (fi *FileInfo) Qid() *lib9p.Qid { return fi.Stat.Qid }
var dFlag = flag.Bool("D", false, "Prints chatty message to the stderr.")
diff --git a/file.go b/file.go
@@ -3,7 +3,6 @@ package lib9p
import (
"fmt"
"io/fs"
-// "time"
)
type FileMode uint32