lib9p

Go 9P library.
Log | Files | Refs

commit 825c0b5de9a56096a364e94ee499ed241fc21bd0
parent a82c7920022ddc0ecd89da50152f1d1383f91511
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 12 Oct 2023 17:57:52 +0900

change API

Diffstat:
Mclient.go | 165++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 143 insertions(+), 22 deletions(-)

diff --git a/client.go b/client.go @@ -205,48 +205,169 @@ func (c *Client) Auth(ctx context.Context, afid uint32, uname, aname string) (Qi } } -func (c *Client) Attach(ctx context.Context, fid, afid uint32, uname, aname string) (Msg, error) { +func (c *Client) Attach(ctx context.Context, fid, afid uint32, uname, aname string) (Qid, error) { tmsg := &TAttach{fid: fid, afid: afid, uname: uname, aname: aname} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return Qid{}, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RAttach: + return rmsg.qid, nil + case *RError: + return Qid{}, rmsg.ename + default: + return Qid{}, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Flush(ctx context.Context, oldtag uint16) (Msg, error) { +func (c *Client) Flush(ctx context.Context, oldtag uint16) error { tmsg := &TFlush{oldtag: oldtag} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RFlush: + return nil + case *RError: + return rmsg.ename + default: + return fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Walk(ctx context.Context, fid, newFid uint32, wname []string) (Msg, error) { +func (c *Client) Walk(ctx context.Context, fid, newFid uint32, wname []string) (wqid []Qid, err error) { tmsg := &TWalk{fid: fid, newFid: newFid, wname: wname} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return nil, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RWalk: + return rmsg.qid, nil + case *RError: + return nil, rmsg.ename + default: + return nil, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Open(ctx context.Context, fid uint32, mode OpenMode) (Msg, error) { +func (c *Client) Open(ctx context.Context, fid uint32, mode OpenMode) (Qid, uint32, error) { tmsg := &TOpen{fid: fid, mode: mode} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return Qid{}, 0, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *ROpen: + return rmsg.qid, rmsg.iounit, nil + case *RError: + return Qid{}, 0, rmsg.ename + default: + return Qid{}, 0, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Create(ctx context.Context, fid uint32, name string, perm FileMode, mode OpenMode) (Msg, error) { +func (c *Client) Create(ctx context.Context, fid uint32, name string, perm FileMode, mode OpenMode) (Qid, uint32, error) { tmsg := &TCreate{fid: fid, name: name, perm: perm, mode: mode} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return Qid{}, 0, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RCreate: + return rmsg.qid, rmsg.iounit, nil + case *RError: + return Qid{}, 0, rmsg.ename + default: + return Qid{}, 0, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Read(ctx context.Context, fid uint32, offset uint64, count uint32) (Msg, error) { +func (c *Client) Read(ctx context.Context, fid uint32, offset uint64, count uint32) (data []byte, err error) { tmsg := &TRead{fid: fid, offset: offset, count: count} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return nil, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RRead: + return rmsg.data, nil + case *RError: + return nil, rmsg.ename + default: + return nil, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Write(ctx context.Context, fid uint32, offset uint64, count uint32, data []byte) (Msg, error) { +func (c *Client) Write(ctx context.Context, fid uint32, offset uint64, count uint32, data []byte) (uint32, error) { tmsg := &TWrite{fid: fid, offset: offset, count: count, data: data} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return 0, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RWrite: + return rmsg.count, nil + case *RError: + return 0, rmsg.ename + default: + return 0, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Clunk(ctx context.Context, fid uint32) (Msg, error) { +func (c *Client) Clunk(ctx context.Context, fid uint32) error { tmsg := &TClunk{fid: fid} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RClunk: + return nil + case *RError: + return rmsg.ename + default: + return fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Remove(ctx context.Context, fid uint32) (Msg, error) { +func (c *Client) Remove(ctx context.Context, fid uint32) error { tmsg := &TRemove{fid: fid} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RRemove: + return nil + case *RError: + return rmsg.ename + default: + return fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Stat(ctx context.Context, fid uint32) (Msg, error) { +func (c *Client) Stat(ctx context.Context, fid uint32) (*Stat, error) { tmsg := &TStat{fid: fid} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return nil, fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RStat: + return rmsg.stat, nil + case *RError: + return nil, rmsg.ename + default: + return nil, fmt.Errorf("invalid reply: %v", rmsg) + } } -func (c *Client) Wstat(ctx context.Context, fid uint32, stat *Stat) (Msg, error) { +func (c *Client) Wstat(ctx context.Context, fid uint32, stat *Stat) error { tmsg := &TWStat{fid: fid, stat: stat} - return c.transact(ctx, tmsg) + rmsg, err := c.transact(ctx, tmsg) + if err != nil { + return fmt.Errorf("transact: %v", err) + } + switch rmsg := rmsg.(type) { + case *RWStat: + return nil + case *RError: + return rmsg.ename + default: + return fmt.Errorf("invalid reply: %v", rmsg) + } }