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 n = copy(p, rread.Data)
154 case len(rread.Data) == 0:
157 // TODO(stevvooe): Technically, we should treat this as an io.EOF.
158 // However, we cannot tell if the short read was due to EOF or due to
165 func (c *client) Write(ctx context.Context, fid Fid, p []byte, offset int64) (n int, err error) {
166 resp, err := c.transport.send(ctx, MessageTwrite{
168 Offset: uint64(offset),
175 rwrite, ok := resp.(MessageRwrite)
177 return 0, ErrUnexpectedMsg
180 if int(rwrite.Count) < len(p) {
181 err = io.ErrShortWrite
184 return int(rwrite.Count), err
187 func (c *client) Open(ctx context.Context, fid Fid, mode Flag) (Qid, uint32, error) {
188 resp, err := c.transport.send(ctx, MessageTopen{
196 ropen, ok := resp.(MessageRopen)
198 return Qid{}, 0, ErrUnexpectedMsg
201 return ropen.Qid, ropen.IOUnit, nil
204 func (c *client) Create(ctx context.Context, parent Fid, name string, perm uint32, mode Flag) (Qid, uint32, error) {
205 resp, err := c.transport.send(ctx, MessageTcreate{
215 rcreate, ok := resp.(MessageRcreate)
217 return Qid{}, 0, ErrUnexpectedMsg
220 return rcreate.Qid, rcreate.IOUnit, nil
223 func (c *client) Stat(ctx context.Context, fid Fid) (Dir, error) {
224 resp, err := c.transport.send(ctx, MessageTstat{Fid: fid})
229 rstat, ok := resp.(MessageRstat)
231 return Dir{}, ErrUnexpectedMsg
234 return rstat.Stat, nil
237 func (c *client) WStat(ctx context.Context, fid Fid, dir Dir) error {
238 resp, err := c.transport.send(ctx, MessageTwstat{
246 _, ok := resp.(MessageRwstat)
248 return ErrUnexpectedMsg