lib9p

Go 9P library.
Log | Files | Refs

commit 3041961b3a5e57f9d179e29fe45abdf7d717a5cc
parent c35de20d746e80a7dcc398b588ac1286b4765ea4
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 19 Oct 2023 10:25:59 +0900

mv commands

Diffstat:
Acmd/diskfs/main.go | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Acmd/iofs/main.go | 48++++++++++++++++++++++++++++++++++++++++++++++++
Acmd/numfs/main.go | 208+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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() +}