diff --git a/unix/beam.go b/unix/beam.go index 88d3ea7c79..9e6dc90f1b 100644 --- a/unix/beam.go +++ b/unix/beam.go @@ -1,4 +1,4 @@ -package beam +package unix import ( "fmt" diff --git a/unix/beam_test.go b/unix/beam_test.go index 2822861a37..83bd91e0d3 100644 --- a/unix/beam_test.go +++ b/unix/beam_test.go @@ -1,4 +1,4 @@ -package beam +package unix import ( "github.com/dotcloud/docker/pkg/beam/data" diff --git a/unix/conn.go b/unix/conn.go new file mode 100644 index 0000000000..9f4df82bbd --- /dev/null +++ b/unix/conn.go @@ -0,0 +1,52 @@ +package unix + +import ( + "fmt" + + "github.com/docker/beam" + "github.com/docker/beam/data" +) + +func Pair() (*Conn, *Conn, error) { + c1, c2, err := USocketPair() + if err != nil { + return nil, nil, err + } + return &Conn{c1}, &Conn{c2}, nil +} + +type Conn struct { + *UnixConn +} + +func (c *Conn) Send(msg *beam.Message, mode int) (beam.Receiver, beam.Sender, error) { + if mode != 0 { + return nil, nil, fmt.Errorf("operation not supported") + } + parts := []string{msg.Name} + parts = append(parts, msg.Args...) + c.UnixConn.Send([]byte(data.EncodeList(parts)), nil) + return nil, nil, nil +} + +func (c *Conn) Receive(mode int) (*beam.Message, beam.Receiver, beam.Sender, error) { + if mode != 0 { + return nil, nil, nil, fmt.Errorf("operation not supported") + } + b, _, err := c.UnixConn.Receive() + if err != nil { + return nil, nil, nil, err + } + parts, n, err := data.DecodeList(string(b)) + if err != nil { + return nil, nil, nil, err + } + if n != len(b) { + return nil, nil, nil, fmt.Errorf("garbage data %#v", b[:n]) + } + if len(parts) == 0 { + return nil, nil, nil, fmt.Errorf("malformed message") + } + msg := &beam.Message{parts[0], parts[1:]} + return msg, nil, nil, nil +} diff --git a/unix/conn_test.go b/unix/conn_test.go new file mode 100644 index 0000000000..27c031d58b --- /dev/null +++ b/unix/conn_test.go @@ -0,0 +1,37 @@ +package unix + +import ( + "github.com/docker/beam" + "github.com/dotcloud/docker/pkg/testutils" + "testing" +) + +func TestPair(t *testing.T) { + r, w, err := Pair() + if err != nil { + t.Fatal("Unexpected error") + } + defer r.Close() + defer w.Close() + testutils.Timeout(t, func() { + go func() { + msg, in, out, err := r.Receive(0) + if err != nil { + t.Fatal(err) + } + if msg.Name != "print" { + t.Fatalf("%#v", *msg) + } + if msg.Args[0] != "hello world" { + t.Fatalf("%#v", *msg) + } + if in != nil && out != nil { + t.Fatal("Unexpected return value") + } + }() + _, _, err := w.Send(&beam.Message{Name: "print", Args: []string{"hello world"}}, 0) + if err != nil { + t.Fatal(err) + } + }) +} diff --git a/unix/unix.go b/unix/unix.go index b2d0d94150..594eb21b10 100644 --- a/unix/unix.go +++ b/unix/unix.go @@ -1,4 +1,4 @@ -package beam +package unix import ( "bufio" diff --git a/unix/unix_test.go b/unix/unix_test.go index 976f089c23..7f947760b3 100644 --- a/unix/unix_test.go +++ b/unix/unix_test.go @@ -1,4 +1,4 @@ -package beam +package unix import ( "fmt"