diff --git a/vendor/github.com/crosbymichael/go-runc/console.go b/vendor/github.com/crosbymichael/go-runc/console.go new file mode 100644 index 000000000..63a77711e --- /dev/null +++ b/vendor/github.com/crosbymichael/go-runc/console.go @@ -0,0 +1,99 @@ +package runc + +import ( + "fmt" + "net" + "os" + + "github.com/docker/docker/pkg/term" + "github.com/opencontainers/runc/libcontainer/utils" +) + +// NewConsoleSocket creates a new unix socket at the provided path to accept a +// pty master created by runc for use by the container +func NewConsoleSocket(path string) (*ConsoleSocket, error) { + l, err := net.Listen("unix", path) + if err != nil { + return nil, err + } + return &ConsoleSocket{ + l: l, + path: path, + }, nil +} + +// ConsoleSocket is a unix socket that accepts the pty master created by runc +type ConsoleSocket struct { + path string + l net.Listener +} + +// Path returns the path to the unix socket on disk +func (c *ConsoleSocket) Path() string { + return c.path +} + +// ReceiveMaster blocks until the socket receives the pty master +func (c *ConsoleSocket) ReceiveMaster() (*Console, error) { + conn, err := c.l.Accept() + if err != nil { + return nil, err + } + defer conn.Close() + unix, ok := conn.(*net.UnixConn) + if !ok { + return nil, fmt.Errorf("received connection which was not a unix socket") + } + sock, err := unix.File() + if err != nil { + return nil, err + } + f, err := utils.RecvFd(sock) + if err != nil { + return nil, err + } + return &Console{ + master: f, + }, nil +} + +// Close closes the unix socket +func (c *ConsoleSocket) Close() error { + return c.l.Close() +} + +// WinSize specifies the console size +type WinSize struct { + // Width of the console + Width uint16 + // Height of the console + Height uint16 +} + +// Console is a pty master +type Console struct { + master *os.File +} + +// Read from the console +func (c *Console) Read(b []byte) (int, error) { + return c.master.Read(b) +} + +// Write writes to the console +func (c *Console) Write(b []byte) (int, error) { + return c.master.Write(b) +} + +// Resize the console +func (c *Console) Resize(ws WinSize) error { + return term.SetWinsize(c.master.Fd(), &term.Winsize{ + Width: ws.Width, + Height: ws.Height, + }) +} + +// Close the console +func (c *Console) Close() error { + return c.master.Close() +} diff --git a/vendor/github.com/crosbymichael/go-runc/runc.go b/vendor/github.com/crosbymichael/go-runc/runc.go index 5e23ab0cb..bb551f487 100644 --- a/vendor/github.com/crosbymichael/go-runc/runc.go +++ b/vendor/github.com/crosbymichael/go-runc/runc.go @@ -67,7 +67,7 @@ type CreateOpts struct { IO // PidFile is a path to where a pid file should be created PidFile string - ConsoleSocket string + ConsoleSocket *ConsoleSocket Detach bool NoPivot bool NoNewKeyring bool @@ -107,8 +107,8 @@ func (o *CreateOpts) args() (out []string) { if o.PidFile != "" { out = append(out, "--pid-file", o.PidFile) } - if o.ConsoleSocket != "" { - out = append(out, "--console-socket", o.ConsoleSocket) + if o.ConsoleSocket != nil { + out = append(out, "--console-socket", o.ConsoleSocket.Path()) } if o.NoPivot { out = append(out, "--no-pivot") @@ -147,7 +147,7 @@ type ExecOpts struct { Gid int Cwd string Tty bool - ConsoleSocket string + ConsoleSocket *ConsoleSocket Detach bool } @@ -156,8 +156,8 @@ func (o *ExecOpts) args() (out []string) { if o.Tty { out = append(out, "--tty") } - if o.ConsoleSocket != "" { - out = append(out, "--console-socket", o.ConsoleSocket) + if o.ConsoleSocket != nil { + out = append(out, "--console-socket", o.ConsoleSocket.Path()) } if o.Cwd != "" { out = append(out, "--cwd", o.Cwd)