13 transport roundTripper
16 // NewSession returns a session using the connection. The Context ctx provides
17 // a context for out of bad messages, such as flushes, that may be sent by the
18 // session. The session can effectively shutdown with this context.
19 func NewSession(ctx context.Context, conn net.Conn) (Session, error) {
20 ch := newChannel(conn, codec9p{}, DefaultMSize) // sets msize, effectively.
22 // negotiate the protocol version
23 version, err := clientnegotiate(ctx, ch, DefaultVersion)
32 transport: newTransport(ctx, ch),
36 var _ Session = &client{}
38 func (c *client) Version() (int, string) {
39 return c.msize, c.version
42 func (c *client) Auth(ctx context.Context, afid Fid, uname, aname string) (Qid, error) {
49 resp, err := c.transport.send(ctx, m)
54 rauth, ok := resp.(MessageRauth)
56 return Qid{}, ErrUnexpectedMsg
62 func (c *client) Attach(ctx context.Context, fid, afid Fid, uname, aname string) (Qid, error) {
70 resp, err := c.transport.send(ctx, m)
75 rattach, ok := resp.(MessageRattach)
77 return Qid{}, ErrUnexpectedMsg
80 return rattach.Qid, nil
83 func (c *client) Clunk(ctx context.Context, fid Fid) error {
84 resp, err := c.transport.send(ctx, MessageTclunk{
91 _, ok := resp.(MessageRclunk)
93 return ErrUnexpectedMsg
99 func (c *client) Remove(ctx context.Context, fid Fid) error {
100 resp, err := c.transport.send(ctx, MessageTremove{
107 _, ok := resp.(MessageRremove)
109 return ErrUnexpectedMsg
115 func (c *client) Walk(ctx context.Context, fid Fid, newfid Fid, names ...string) ([]Qid, error) {
117 return nil, ErrWalkLimit
120 resp, err := c.transport.send(ctx, MessageTwalk{
129 rwalk, ok := resp.(MessageRwalk)
131 return nil, ErrUnexpectedMsg
134 return rwalk.Qids, nil
137 func (c *client) Read(ctx context.Context, fid Fid, p []byte, offset int64) (n int, err error) {
138 resp, err := c.transport.send(ctx, MessageTread{
140 Offset: uint64(offset),
141 Count: uint32(len(p)),
147 rread, ok := resp.(MessageRread)
149 return 0, ErrUnexpectedMsg
152 return copy(p, rread.Data), nil
155 func (c *client) Write(ctx context.Context, fid Fid, p []byte, offset int64) (n int, err error) {
156 resp, err := c.transport.send(ctx, MessageTwrite{
158 Offset: uint64(offset),
165 rwrite, ok := resp.(MessageRwrite)
167 return 0, ErrUnexpectedMsg
170 return int(rwrite.Count), nil
173 func (c *client) Open(ctx context.Context, fid Fid, mode Flag) (Qid, uint32, error) {
174 resp, err := c.transport.send(ctx, MessageTopen{
182 ropen, ok := resp.(MessageRopen)
184 return Qid{}, 0, ErrUnexpectedMsg
187 return ropen.Qid, ropen.IOUnit, nil
190 func (c *client) Create(ctx context.Context, parent Fid, name string, perm uint32, mode Flag) (Qid, uint32, error) {
191 resp, err := c.transport.send(ctx, MessageTcreate{
201 rcreate, ok := resp.(MessageRcreate)
203 return Qid{}, 0, ErrUnexpectedMsg
206 return rcreate.Qid, rcreate.IOUnit, nil
209 func (c *client) Stat(ctx context.Context, fid Fid) (Dir, error) {
210 resp, err := c.transport.send(ctx, MessageTstat{Fid: fid})
215 rstat, ok := resp.(MessageRstat)
217 return Dir{}, ErrUnexpectedMsg
220 return rstat.Stat, nil
223 func (c *client) WStat(ctx context.Context, fid Fid, dir Dir) error {
224 resp, err := c.transport.send(ctx, MessageTwstat{
232 _, ok := resp.(MessageRwstat)
234 return ErrUnexpectedMsg