lib9p

Go 9P library.
Log | Files | Refs

commit 7f2fed2a291394f89383635ca93345ecd214bde9
parent e25685ead0f79fc26f623f97037967abd41f7213
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri,  1 Sep 2023 10:27:57 +0900

implement numfs

Diffstat:
Mcmd/numfs.go | 139++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Mfile.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