commit 2eae6f9e900538a9772e1aa257667df20e56ac1d
parent 3cceefb8a5379b67319a7c61118f335e8028f828
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 16 Oct 2023 07:59:42 +0900
fix buf
Diffstat:
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
}