commit - 3bf22e5860ff26ad641dc222b8121a2bcae316c7
commit + dce371f63bd86f69e7164ea19cc60540efce050f
blob - a1b80f10d12ed6dc1acfecf66b41eb22345519e2
blob + 452188d9186f024575da5ff0019c5a295a5dfa61
--- client.go
+++ client.go
type client struct {
version string
- msize uint32
+ msize int
ctx context.Context
transport roundTripper
}
// a context for out of bad messages, such as flushes, that may be sent by the
// session. The session can effectively shutdown with this context.
func NewSession(ctx context.Context, conn net.Conn) (Session, error) {
- const msize = 64 << 10
- const vers = "9P2000"
+ ch := newChannel(conn, codec9p{}, DefaultMSize) // sets msize, effectively.
- ch := newChannel(conn, codec9p{}, msize) // sets msize, effectively.
-
// negotiate the protocol version
- _, err := clientnegotiate(ctx, ch, vers)
+ version, err := clientnegotiate(ctx, ch, DefaultVersion)
if err != nil {
return nil, err
}
return &client{
- version: vers,
- msize: msize,
+ version: version,
+ msize: ch.MSize(),
ctx: ctx,
transport: newTransport(ctx, ch),
}, nil
var _ Session = &client{}
-func (c *client) Version() (uint32, string) {
+func (c *client) Version() (int, string) {
return c.msize, c.version
}
blob - /dev/null
blob + ca01956c2100164871d21be450d44c152bb88edb (mode 644)
--- /dev/null
+++ context.go
+package p9pnew
+
+import (
+ "golang.org/x/net/context"
+)
+
+type contextKey string
+
+const (
+ versionKey contextKey = "9p.version"
+)
+
+func withVersion(ctx context.Context, version string) context.Context {
+ return context.WithValue(ctx, versionKey, version)
+}
+
+// GetVersion returns the protocol version from the context. If the version is
+// not known, an empty string is returned. This is typically set on the
+// context passed into function calls in a server implementation.
+func GetVersion(ctx context.Context) string {
+ v, ok := ctx.Value(versionKey).(string)
+ if !ok {
+ return ""
+ }
+ return v
+}
blob - 1c2cb5811dd66ef98bf1501ca06ad8ce6b6f6d8a
blob + bcb9d3529472a2cb92f44025dfeca20de9d5876d
--- server.go
+++ server.go
// Serve the 9p session over the provided network connection.
func Serve(ctx context.Context, conn net.Conn, session Session) {
- const msize = 64 << 10
- const vers = "9P2000"
-
+ msize, version := session.Version()
ch := newChannel(conn, codec9p{}, msize)
-
negctx, cancel := context.WithTimeout(ctx, 1*time.Second)
defer cancel()
// do this outside of this function and then pass in a ready made channel.
// We are not really ready to export the channel type yet.
- if err := servernegotiate(negctx, ch, vers); err != nil {
+ if err := servernegotiate(negctx, ch, version); err != nil {
// TODO(stevvooe): Need better error handling and retry support here.
// For now, we silently ignore the failure.
log.Println("error negotiating version:", err)
return
}
+ ctx = withVersion(ctx, version)
+
s := &server{
ctx: ctx,
ch: ch,
blob - 91e26ec436170573317f400b7da56a6a2971d62b
blob + 975a0aad7cfa145559b902deb64d7dfc36c64140
--- session.go
+++ session.go
// Version returns the supported version and msize of the session. This
// can be affected by negotiating or the level of support provided by the
// session implementation.
- Version() (msize uint32, version string)
+ Version() (msize int, version string)
}
func Dial(ctx context.Context, addr string) (Session, error) {
blob - 3eb82c83c1cc430459f85eda47c9ceefcff1f5d6
blob + 61918a21255f3ab026be2362a5ccebb7a78d1780
--- types.go
+++ types.go
)
const (
+ DefaultMSize = 64 << 10
+ DefaultVersion = "9P2000"
+)
+
+const (
NOFID = ^Fid(0)
NOTAG = ^Tag(0)
)