mirror of https://github.com/docker/docs.git
Start to move unix implementation to new beam interface.
Nested streams not yet supported, only supporting mode 0. [Signed-off-by: Solomon Hykes <solomon@docker.com>] [Signed-off-by: Paul Nasrat <pnasrat@gmail.com>]
This commit is contained in:
parent
c2c078952c
commit
78dcbe03d2
|
@ -1,4 +1,4 @@
|
|||
package beam
|
||||
package unix
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package beam
|
||||
package unix
|
||||
|
||||
import (
|
||||
"github.com/dotcloud/docker/pkg/beam/data"
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package beam
|
||||
package unix
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package beam
|
||||
package unix
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
|
Loading…
Reference in New Issue