lib9p

Go 9P library.
Log | Files | Refs

commit b180b1b7d4cc339f31713cea5e2ffa4bc7457119
parent 95b619fdba1190fe65c98cc5b138ad114e8d772d
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Wed, 18 Oct 2023 09:46:31 +0900

update tests

Diffstat:
Mclient.go | 2+-
Mclient2.go | 19++++++++++++++++++-
Mclient_test.go | 14+++-----------
Mfile.go | 20++++++++++----------
Mserver.go | 2+-
Mserver_test.go | 7++++++-
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)