commit 3041961b3a5e57f9d179e29fe45abdf7d717a5cc
parent c35de20d746e80a7dcc398b588ac1286b4765ea4
Author: Matsuda Kenji <info@mtkn.jp>
Date: Thu, 19 Oct 2023 10:25:59 +0900
mv commands
Diffstat:
3 files changed, 306 insertions(+), 0 deletions(-)
diff --git a/cmd/diskfs/main.go b/cmd/diskfs/main.go
@@ -0,0 +1,50 @@
+// Disk exports the file system on the disk.
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "lib9p"
+ "lib9p/diskfs"
+)
+
+var dFlag = flag.Bool("D", false, "Prints chatty message to the stderr.")
+
+func main() {
+ flag.Parse()
+
+ if flag.NArg() != 1 {
+ fmt.Fprintf(os.Stderr, "usage: %s [-D] <root>\n", os.Args[0])
+ os.Exit(1)
+ }
+
+ listener, err := net.Listen("tcp", "127.0.0.1:5640")
+ if err != nil {
+ log.Fatalf("listen tcp: %v", err)
+ }
+
+ for {
+ conn, err := listener.Accept()
+ if err != nil {
+ log.Printf("accept connection: %v", err)
+ continue
+ }
+ disk, err := diskfs.Open(flag.Arg(0))
+ if err != nil {
+ log.Fatalf("open file tree.")
+ }
+ go handle(conn, disk)
+ }
+}
+
+func handle(conn net.Conn, disk *diskfs.FS) {
+ srv := lib9p.NewServer(disk, 8*1024, conn, conn)
+ if *dFlag {
+ srv.Chatty()
+ }
+ srv.Serve()
+}
diff --git a/cmd/iofs/main.go b/cmd/iofs/main.go
@@ -0,0 +1,48 @@
+// Disk exports the file system on the disk.
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "lib9p"
+ "lib9p/iofs"
+)
+
+var dFlag = flag.Bool("D", false, "Prints chatty message to the stderr.")
+
+func main() {
+ flag.Parse()
+
+ if flag.NArg() != 1 {
+ fmt.Fprintf(os.Stderr, "usage: %s [-D] <root>\n", os.Args[0])
+ os.Exit(1)
+ }
+
+ listener, err := net.Listen("tcp", "127.0.0.1:5640")
+ if err != nil {
+ log.Fatalf("listen tcp: %v", err)
+ }
+
+ for {
+ conn, err := listener.Accept()
+ if err != nil {
+ log.Printf("accept connection: %v", err)
+ continue
+ }
+ dir := os.DirFS(flag.Arg(0))
+ fsys := iofs.NewFS(dir)
+ go handle(conn, fsys)
+ }
+}
+
+func handle(conn net.Conn, disk *iofs.FS) {
+ srv := lib9p.NewServer(disk, 8*1024, conn, conn)
+ if *dFlag {
+ srv.Chatty()
+ }
+ srv.Serve()
+}
diff --git a/cmd/numfs/main.go b/cmd/numfs/main.go
@@ -0,0 +1,208 @@
+package main
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "io"
+ "io/fs"
+ "log"
+ "net"
+ "os"
+ "strings"
+
+ "lib9p"
+)
+
+
+type numFS struct{
+ root *numFile
+}
+
+
+func (fsys *numFS) String() string {
+ if fsys.root == nil {
+ return "<empty>"
+ }
+ return fsysString(fsys.root)
+}
+
+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) 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 {
+ fs *numFS
+ id int
+ reader *bytes.Reader
+ children []*numFile
+}
+
+func (f *numFile) Fsys() lib9p.FS { return f.fs }
+
+func (f *numFile) Stat() (*lib9p.FileInfo, error) {
+ var stat lib9p.Stat
+ stat.Type = 0
+ stat.Dev = 0
+ if f.id == -1 {
+ stat.Qid = lib9p.Qid{
+ Type: lib9p.QTDIR,
+ Vers: 0,
+ Path: ^uint64(0),
+ }
+ } else {
+ stat.Qid = lib9p.Qid{
+ Type: lib9p.QTFILE,
+ Vers: 0,
+ Path: uint64(f.id),
+ }
+ }
+ var mode lib9p.FileMode
+ if f.id == -1 {
+ mode |= lib9p.DMDIR
+ }
+ mode |= 0444
+ stat.Mode = mode
+ stat.Atime = 0
+ stat.Mtime = 0
+ var length int64
+ if f.id == -1 {
+ length = 0
+ } else {
+ length = f.reader.Size()
+ }
+ stat.Length = length
+ stat.Name = fmt.Sprintf("%d", f.id)
+ stat.Uid = "kenji"
+ stat.Gid = "kenji"
+ stat.Muid = "kenji"
+ return &lib9p.FileInfo{stat}, nil
+}
+
+func (f *numFile) Qid() lib9p.Qid {
+ var qid lib9p.Qid
+ if f.id == -1 {
+ qid = lib9p.Qid{
+ Type: lib9p.QTDIR,
+ Vers: 0,
+ Path: ^uint64(0),
+ }
+ } else {
+ qid = lib9p.Qid{
+ Type: lib9p.QTFILE,
+ Vers: 0,
+ Path: uint64(f.id),
+ }
+ }
+ return qid
+}
+
+func (f *numFile) Read(p []byte) (int, error) {
+ if f.id == -1 {
+ return 0, fmt.Errorf("is a directory")
+ }
+ return f.reader.Read(p)
+}
+
+func (f *numFile) ReadAt(p []byte, off int64) (n int, err error) {
+ if f.id == -1 {
+ return 0, fmt.Errorf("is a directory")
+ }
+ return f.reader.ReadAt(p, off)
+}
+
+func (f *numFile) ReadDir(n int) ([]*lib9p.DirEntry, error) {
+ if f.id != -1 {
+ return nil, fmt.Errorf("not a directory")
+ }
+ de := make([]*lib9p.DirEntry, len(f.children))
+ for i, c := range f.children {
+ 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 nil
+}
+
+var dFlag = flag.Bool("D", false, "Prints chatty message to the stderr.")
+
+func main() {
+ flag.Parse()
+
+ if flag.NArg() != 0 {
+ fmt.Fprintf(os.Stderr, "usage: %s [-D]\n", os.Args[0])
+ 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)
+ }
+
+ for {
+ conn, err := listener.Accept()
+ if err != nil {
+ log.Printf("accept connection: %v", err)
+ continue
+ }
+
+ go handle(conn, fsys)
+ }
+}
+
+func handle(conn net.Conn, fs *numFS) {
+ srv := lib9p.NewServer(fs, 8*1024, conn, conn)
+ if *dFlag {
+ srv.Chatty()
+ }
+ srv.Serve()
+}