lib9p

Go 9P library.
Log | Files | Refs

commit 2eae6f9e900538a9772e1aa257667df20e56ac1d
parent 3cceefb8a5379b67319a7c61118f335e8028f828
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Mon, 16 Oct 2023 07:59:42 +0900

fix buf

Diffstat:
Mclient.go | 2+-
Mclient2.go | 75+++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mclient_test.go | 26++++++++++++++++++++++----
Mfile.go | 13++++++++++---
4 files changed, 84 insertions(+), 32 deletions(-)

diff --git a/client.go b/client.go @@ -16,7 +16,7 @@ type Client struct { txc chan<- *clientReq errc chan error cancel context.CancelFunc - root *ClientFile + rootFid *clientFid } type LibErr string diff --git a/client2.go b/client2.go @@ -1,23 +1,65 @@ package lib9p import ( - "io" "context" "fmt" + "io" + "path" + "strings" ) func (c *Client) Root() File { - return c.root + f, err := c.walkFile(".") + if err != nil { + panic(fmt.Errorf("can't walk to root: %v", err)) + } + return f +} + +func (c *Client) walkFile(name string) (*ClientFile, error) { + fid, err := c.fPool.add() + if err != nil { + return nil, fmt.Errorf("add fid: %v", err) + } + var wname []string + if name != "." { + wname = strings.Split(path.Clean(name), "/") + } + wqid, err := c.Walk(context.TODO(), c.rootFid.fid, fid.fid, wname) + if err != nil { + return nil, fmt.Errorf("walk: %v", err) + } + var qid Qid + if name == "." { + qid = Qid{} + } else if len(wqid) > 0 { + qid = wqid[len(wqid)-1] + } else { + return nil, fmt.Errorf("invalid wqid: %v", wqid) + } + f := &ClientFile{ + name: path.Base(name), + path: name, + fid: fid, + qid: qid, + client: c, + } + fid.file = f + return f, nil } func Mount(r io.Reader, w io.Writer, uname, aname string) (fs *Client, err error) { var ( - mSize uint32 = 8192 - version = "9P2000" - ctx = context.TODO() + mSize uint32 = 8192 + version = "9P2000" + ctx = context.TODO() ) c := NewClient(mSize, uname, r, w) - defer func() { if err != nil { c.Stop() } }() + defer func() { + if err != nil { + c.Stop() + } + }() rmSize, rver, err := c.Version(ctx, mSize, version) if err != nil { return nil, fmt.Errorf("version: %v", err) @@ -34,25 +76,11 @@ func Mount(r io.Reader, w io.Writer, uname, aname string) (fs *Client, err error if err != nil { return nil, fmt.Errorf("add fid: %v", err) } - qid, err := c.Attach(ctx, fid.fid, NOFID, uname, aname) + _, err = c.Attach(ctx, fid.fid, NOFID, uname, aname) if err != nil { return nil, fmt.Errorf("attach: %v", err) } - c.root = &ClientFile{ - name: "/", - path: ".", - fid: fid, - qid: qid, - client: c, - } - fid.file = c.root + + c.rootFid = fid return c, nil } - -func (c *Client) walk(name string) (*ClientFile, error) { - f, err := walkfile(c.root, name) - if err != nil { - return nil, err - } - return f.(*ClientFile), nil -} -\ No newline at end of file diff --git a/client_test.go b/client_test.go @@ -131,14 +131,32 @@ func TestClient2(t *testing.T) { if err != nil { t.Errorf("mount: %v", err) } - t.Log(fs) - f := fs.Root() - t.Log(f) + root := fs.Root() + t.Log(root) - c, err := f.Child() + c, err := root.Child() if err != nil { t.Errorf("child: %v", err) } t.Log(c) + + a, err := fs.walkFile("a") + if err != nil { + t.Errorf("walkfile: %v", err) + } + t.Log(a) + + err = a.Open(OREAD) + if err != nil { + t.Errorf("open: %v", err) + } + t.Log(a) + + b := make([]byte, a.iounit) + n, err := a.Read(b) + if err != nil { + t.Errorf("read: %v", err) + } + t.Log(string(b[:n])) } \ No newline at end of file diff --git a/file.go b/file.go @@ -98,7 +98,7 @@ type ClientFile struct { func (cf *ClientFile) Parent() (File, error) { parentPath := path.Dir(cf.path) - return walkfile(cf.client.root, parentPath) + return cf.client.walkFile(parentPath) } func (cf *ClientFile) Child() ([]File, error) { @@ -106,6 +106,9 @@ func (cf *ClientFile) Child() ([]File, error) { if err := cf.Open(OREAD); err != nil { return nil, fmt.Errorf("open: %v", err) } + if cf.fid != nil { + defer cf.Open(cf.fid.omode) + } defer cf.Close() } if cf.qid.Type&QTDIR == 0 { @@ -167,8 +170,11 @@ func (cf *ClientFile) Open(mode OpenMode) error { if err != nil { return fmt.Errorf("add fid: %v", err) } - wname := strings.Split(cf.path, "/") - _, err = cf.client.Walk(context.TODO(), cf.client.root.fid.fid, fid.fid, wname) + var wname []string + if cf.path != "." { + wname = strings.Split(path.Clean(cf.path), "/") + } + _, err = cf.client.Walk(context.TODO(), cf.client.rootFid.fid, fid.fid, wname) if err != nil { return fmt.Errorf("walk: %v", err) } @@ -186,6 +192,7 @@ func (cf *ClientFile) Open(mode OpenMode) error { func (cf *ClientFile) Close() error { err := cf.client.Clunk(context.TODO(), cf.fid.fid) + cf.client.fPool.delete(cf.fid.fid) cf.fid = nil return err }