commit b180b1b7d4cc339f31713cea5e2ffa4bc7457119
parent 95b619fdba1190fe65c98cc5b138ad114e8d772d
Author: Matsuda Kenji <info@mtkn.jp>
Date: Wed, 18 Oct 2023 09:46:31 +0900
update tests
Diffstat:
6 files changed, 39 insertions(+), 25 deletions(-)
diff --git a/client.go b/client.go
@@ -252,7 +252,7 @@ func (c *Client) Walk(ctx context.Context, fid, newFid uint32, wname []string) (
return nil, fmt.Errorf("invalid reply: %v", rmsg)
}
}
-func (c *Client) Open(ctx context.Context, fid uint32, mode OpenMode) (Qid, uint32, error) {
+func (c *Client) Open(ctx context.Context, fid uint32, mode OpenMode) (qid Qid, iounit uint32, err error) {
tmsg := &TOpen{fid: fid, mode: mode}
rmsg, err := c.transact(ctx, tmsg)
if err != nil {
diff --git a/client2.go b/client2.go
@@ -4,10 +4,11 @@ import (
"context"
"fmt"
"io"
+ "io/fs"
"path"
"strings"
)
-
+/*
func (c *Client) Root() File {
f, err := c.walkFile(".")
if err != nil {
@@ -15,6 +16,22 @@ func (c *Client) Root() File {
}
return f
}
+*/
+func (c *Client) OpenFile(name string, omode OpenMode, perm fs.FileMode) (File, error) {
+ f, err := c.walkFile(name)
+ if err != nil {
+ return nil, fmt.Errorf("walkFile: %v", err)
+ }
+ qid, iounit, err := c.Open(context.TODO(), f.fid.fid, omode)
+ if err != nil {
+ f.Close()
+ return nil, fmt.Errorf("open: %v", err)
+ }
+ f.fid.omode = omode
+ f.qid = qid
+ f.iounit = iounit
+ return f, nil
+}
func (c *Client) walkFile(name string) (*ClientFile, error) {
fid, err := c.fPool.add()
diff --git a/client_test.go b/client_test.go
@@ -132,20 +132,12 @@ func TestClient2(t *testing.T) {
t.Errorf("mount: %v", err)
}
- root := fs.Root()
- t.Log(root)
-
- a, err := fs.walkFile("a")
- if err != nil {
- t.Errorf("walkfile: %v", err)
- }
- t.Log(a)
-
- err = a.Open(OREAD)
+ a0, err := fs.OpenFile("a", OREAD, 0)
if err != nil {
t.Errorf("open: %v", err)
}
- t.Log(a)
+ t.Log(a0)
+ a := a0.(*ClientFile)
b := make([]byte, a.iounit)
n, err := a.Read(b)
diff --git a/file.go b/file.go
@@ -5,7 +5,7 @@ import (
"fmt"
"io"
"path"
- "strings"
+// "strings"
)
type File interface {
@@ -129,7 +129,7 @@ type ClientFile struct {
iounit uint32
client *Client
}
-
+/*
func (cf *ClientFile) Parent() (File, error) {
parentPath := path.Dir(cf.path)
return cf.client.walkFile(parentPath)
@@ -175,21 +175,16 @@ func (cf *ClientFile) Child() ([]File, error) {
}
return files, nil
}
+*/
func (cf *ClientFile) Stat() (*FileInfo, error) {
- if cf.fid == nil {
- if err := cf.Open(OREAD); err != nil {
- return nil, fmt.Errorf("open: %v", err)
- }
- defer cf.Close()
- }
st, err := cf.client.Stat(context.TODO(), cf.fid.fid)
if err != nil {
return nil, err
}
return &FileInfo{*st}, nil
}
-
+/*
func (cf *ClientFile) Qid() Qid {
if cf.fid == nil {
cf.Open(OREAD)
@@ -223,7 +218,9 @@ func (cf *ClientFile) Open(mode OpenMode) error {
cf.fid.omode = mode
return nil
}
+*/
+// Don't use closed file.
func (cf *ClientFile) Close() error {
err := cf.client.Clunk(context.TODO(), cf.fid.fid)
cf.client.fPool.delete(cf.fid.fid)
@@ -232,9 +229,12 @@ func (cf *ClientFile) Close() error {
}
func (cf *ClientFile) Read(b []byte) (int, error) {
- if cf.fid == nil {
+ if cf.fid.omode == -1 {
return 0, fmt.Errorf("not open")
}
+ if cf.fid.omode&3 != OREAD && cf.fid.omode&3 != ORDWR {
+ return 0, fmt.Errorf("permission denied")
+ }
count := uint32(len(b))
cur := 0
for count > 0 {
diff --git a/server.go b/server.go
@@ -287,7 +287,7 @@ func sWalk(s *Server, r *Req) {
}
oldst, err := oldFid.File.Stat()
if err != nil {
- respond(r, fmt.Errorf("stat: %v"))
+ respond(r, fmt.Errorf("stat: %v", err))
return
}
if ifcall.NWName() > 0 && oldst.Sys().(*Stat).Qid.Type&QTDIR == 0 {
diff --git a/server_test.go b/server_test.go
@@ -249,7 +249,12 @@ func TestServer(t *testing.T) {
if !ok {
t.Fatalf("lookup fid %d", m.(*TRead).Fid())
}
- if fid.File.Qid().Type&QTDIR != 0 {
+ st, err := fid.File.Stat()
+ if err != nil {
+ t.Errorf("stat: %v", err)
+ continue
+ }
+ if st.Sys().(*Stat).Qid.Type&QTDIR != 0 {
for i := 0; i < len(data); {
stat := newStat(data[i:])
t.Logf("stat: %v", stat)