commit 80811e8de92f50d1abf0b841e95da2d94cebb71f
parent 46230cb1709aaa193d16ad2a725e034735e46899
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 19 Aug 2023 12:25:21 +0900
douga mireta
Diffstat:
4 files changed, 20 insertions(+), 26 deletions(-)
diff --git a/file.go b/file.go
@@ -154,7 +154,7 @@ type File struct {
file fs.File // underlying file
path string // absolute path from the root of the fs.
- // System-modified data. Not in use.
+ // System-modified data. I don't know how to use.
Type uint16
Dev uint32
@@ -170,7 +170,6 @@ type File struct {
Muid string // last modifier name
}
-
func openFile(fsys *FS, fpath string) (*File, error) {
file, err := fsys.fs.Open(fpath)
if err != nil {
@@ -190,9 +189,9 @@ func openFile(fsys *FS, fpath string) (*File, error) {
Atime: uint32(fsfi.ModTime().Unix()),
Mtime: uint32(fsfi.ModTime().Unix()),
Length: fsfi.Size(),
- Uid: "kenji",
+ Uid: "kenji", // TODO: use syscall.Stat_t's Uid
Gid: "kenji",
- Muid: "kenji",
+ Muid: "",
}
qtype := fsModeToQidType(fsfi.Mode())
diff --git a/fs.go b/fs.go
@@ -12,20 +12,10 @@ type FS struct {
}
func (fsys *FS) Open(name string) (*File, error) {
- f, err := fsys.fs.Open(name) // fs.File
- if err != nil {
- return nil, fmt.Errorf("open file %s: %v", name, err)
- }
-
file, err := openFile(fsys, name)
if err != nil {
return nil, fmt.Errorf("openFile(%v, %s): %v", fsys, name, err)
}
- fi, err := f.Stat()
- if err != nil {
- return nil, fmt.Errorf("stat file %s: %v", name, err)
- }
- file.Qid.SetType(fsModeToQidType(fi.Mode()))
return file, nil
}
diff --git a/server.go b/server.go
@@ -6,8 +6,8 @@ import (
"io/fs"
"log"
"os"
- "strings"
"path"
+ "strings"
)
var chatty9P = false
@@ -30,7 +30,7 @@ type Server struct {
func NewServer(fsys fs.FS, mSize uint32, r io.Reader, w io.Writer) *Server {
s := new(Server)
s.fs = &FS{
- fs: fsys,
+ fs: fsys,
qidPool: allocQidPool(),
}
s.MSize = mSize
@@ -181,6 +181,8 @@ func sWalk(s *Server, r *Req) {
wqids, err := s.fs.walk(oldFid.File.path, ifcall.WName())
if err != nil {
+ log.Printf("unko\n")
+ s.fPool.removeFid(ifcall.NewFid())
log.Printf("walk fs: %v", err)
respond(r, fmt.Errorf("walk error"))
return
@@ -212,7 +214,8 @@ func sWalk(s *Server, r *Req) {
respond(r, nil)
}
-func rWalk(r *Req, err error) {}
+func rWalk(r *Req, err error) {
+}
func sOpen(s *Server, r *Req) {
ifcall, ok := r.ifcall.(*TOpen)
@@ -264,10 +267,10 @@ func sOpen(s *Server, r *Req) {
return
}
/*
- if !ok {
- respond(r, fmt.Errorf("permission denied"))
- return
- }
+ if !ok {
+ respond(r, fmt.Errorf("permission denied"))
+ return
+ }
*/
if ifcall.Mode()&ORCLOSE != 0 {
@@ -285,10 +288,7 @@ func sOpen(s *Server, r *Req) {
func rOpen(r *Req, err error) {}
func sRead(s *Server, r *Req) {
- ifcall, ok := r.ifcall.(*TRead)
- if !ok {
- panic("not TRead")
- }
+ ifcall := r.ifcall.(*TRead)
fid, ok := s.fPool.lookupFid(ifcall.Fid())
if !ok {
@@ -321,7 +321,8 @@ func sRead(s *Server, r *Req) {
respond(r, err)
return
}
- for _, e := range de {
+ for k := int(ifcall.Offset()); k < len(de); k++ {
+ e := de[k]
info, err := e.Info()
if err != nil {
respond(r, err)
@@ -332,6 +333,9 @@ func sRead(s *Server, r *Req) {
panic("not stat")
}
buf := st.marshal()
+ if n+len(buf) > len(data) {
+ break
+ }
for i := 0; i < len(buf); i++ {
data[n+i] = buf[i]
}
diff --git a/testdir/a b/testdir/a
@@ -0,0 +1 @@
+unko