From b1a45c2aee3344aa0adfcb5412fb037681a78734 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Tue, 30 May 2017 16:56:46 -0700 Subject: [PATCH] Fix windows build for client Move io copy logic from ctr utils to io_windows.go. Fix compilation errors on Windows. Signed-off-by: Derek McGowan --- client_unix.go | 2 + io.go | 63 -------------------------------- io_unix.go | 71 ++++++++++++++++++++++++++++++++++++ io_windows.go | 93 +++++++++++++++++++++++++++++++++++++++++++++++ spec_unix.go | 2 + spec_unix_test.go | 2 + spec_windows.go | 7 ++-- 7 files changed, 173 insertions(+), 67 deletions(-) create mode 100644 io_unix.go create mode 100644 io_windows.go diff --git a/client_unix.go b/client_unix.go index b2ba75270..d5a9f63ec 100644 --- a/client_unix.go +++ b/client_unix.go @@ -1,3 +1,5 @@ +// +build !windows + package containerd import ( diff --git a/io.go b/io.go index 10d040516..ea3325967 100644 --- a/io.go +++ b/io.go @@ -2,15 +2,11 @@ package containerd import ( "bytes" - "context" "io" "io/ioutil" "os" "path/filepath" "sync" - "syscall" - - "github.com/containerd/fifo" ) type IO struct { @@ -111,65 +107,6 @@ type ioSet struct { out, err io.Writer } -func copyIO(fifos *fifoSet, ioset *ioSet, tty bool) (closer io.Closer, err error) { - var ( - f io.ReadWriteCloser - ctx = context.Background() - wg = &sync.WaitGroup{} - ) - - if f, err = fifo.OpenFifo(ctx, fifos.in, syscall.O_WRONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil { - return nil, err - } - defer func(c io.Closer) { - if err != nil { - c.Close() - } - }(f) - go func(w io.WriteCloser) { - io.Copy(w, ioset.in) - w.Close() - }(f) - - if f, err = fifo.OpenFifo(ctx, fifos.out, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil { - return nil, err - } - defer func(c io.Closer) { - if err != nil { - c.Close() - } - }(f) - wg.Add(1) - go func(r io.ReadCloser) { - io.Copy(ioset.out, r) - r.Close() - wg.Done() - }(f) - - if f, err = fifo.OpenFifo(ctx, fifos.err, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil { - return nil, err - } - defer func(c io.Closer) { - if err != nil { - c.Close() - } - }(f) - - if !tty { - wg.Add(1) - go func(r io.ReadCloser) { - io.Copy(ioset.err, r) - r.Close() - wg.Done() - }(f) - } - - return &wgCloser{ - wg: wg, - dir: fifos.dir, - }, nil -} - type wgCloser struct { wg *sync.WaitGroup dir string diff --git a/io_unix.go b/io_unix.go new file mode 100644 index 000000000..a243c3a52 --- /dev/null +++ b/io_unix.go @@ -0,0 +1,71 @@ +// +build !windows + +package containerd + +import ( + "context" + "io" + "sync" + "syscall" + + "github.com/containerd/fifo" +) + +func copyIO(fifos *fifoSet, ioset *ioSet, tty bool) (closer io.Closer, err error) { + var ( + f io.ReadWriteCloser + ctx = context.Background() + wg = &sync.WaitGroup{} + ) + + if f, err = fifo.OpenFifo(ctx, fifos.in, syscall.O_WRONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil { + return nil, err + } + defer func(c io.Closer) { + if err != nil { + c.Close() + } + }(f) + go func(w io.WriteCloser) { + io.Copy(w, ioset.in) + w.Close() + }(f) + + if f, err = fifo.OpenFifo(ctx, fifos.out, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil { + return nil, err + } + defer func(c io.Closer) { + if err != nil { + c.Close() + } + }(f) + wg.Add(1) + go func(r io.ReadCloser) { + io.Copy(ioset.out, r) + r.Close() + wg.Done() + }(f) + + if f, err = fifo.OpenFifo(ctx, fifos.err, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil { + return nil, err + } + defer func(c io.Closer) { + if err != nil { + c.Close() + } + }(f) + + if !tty { + wg.Add(1) + go func(r io.ReadCloser) { + io.Copy(ioset.err, r) + r.Close() + wg.Done() + }(f) + } + + return &wgCloser{ + wg: wg, + dir: fifos.dir, + }, nil +} diff --git a/io_windows.go b/io_windows.go new file mode 100644 index 000000000..4aa2ed5aa --- /dev/null +++ b/io_windows.go @@ -0,0 +1,93 @@ +package containerd + +import ( + "io" + "net" + "sync" + + winio "github.com/Microsoft/go-winio" + "github.com/containerd/containerd/log" + "github.com/pkg/errors" +) + +func copyIO(fifos *fifoSet, ioset *ioSet, tty bool) (closer io.Closer, err error) { + var wg sync.WaitGroup + + if fifos.in != "" { + l, err := winio.ListenPipe(fifos.in, nil) + if err != nil { + return nil, errors.Wrapf(err, "failed to create stdin pipe %s", fifos.in) + } + defer func(l net.Listener) { + if err != nil { + l.Close() + } + }(l) + + go func() { + c, err := l.Accept() + if err != nil { + log.L.WithError(err).Errorf("failed to accept stdin connection on %s", fifos.in) + return + } + io.Copy(c, ioset.in) + c.Close() + l.Close() + }() + } + + if fifos.out != "" { + l, err := winio.ListenPipe(fifos.out, nil) + if err != nil { + return nil, errors.Wrapf(err, "failed to create stdin pipe %s", fifos.out) + } + defer func(l net.Listener) { + if err != nil { + l.Close() + } + }(l) + + wg.Add(1) + go func() { + defer wg.Done() + c, err := l.Accept() + if err != nil { + log.L.WithError(err).Errorf("failed to accept stdout connection on %s", fifos.out) + return + } + io.Copy(ioset.out, c) + c.Close() + l.Close() + }() + } + + if !tty && fifos.err != "" { + l, err := winio.ListenPipe(fifos.err, nil) + if err != nil { + return nil, errors.Wrapf(err, "failed to create stderr pipe %s", fifos.err) + } + defer func(l net.Listener) { + if err != nil { + l.Close() + } + }(l) + + wg.Add(1) + go func() { + defer wg.Done() + c, err := l.Accept() + if err != nil { + log.L.WithError(err).Errorf("failed to accept stderr connection on %s", fifos.err) + return + } + io.Copy(ioset.err, c) + c.Close() + l.Close() + }() + } + + return &wgCloser{ + wg: &wg, + dir: fifos.dir, + }, nil +} diff --git a/spec_unix.go b/spec_unix.go index ee9c26b1c..393c96135 100644 --- a/spec_unix.go +++ b/spec_unix.go @@ -1,3 +1,5 @@ +// +build !windows + package containerd import ( diff --git a/spec_unix_test.go b/spec_unix_test.go index e98f9ae8b..74fe49179 100644 --- a/spec_unix_test.go +++ b/spec_unix_test.go @@ -1,3 +1,5 @@ +// +build !windows + package containerd import "testing" diff --git a/spec_windows.go b/spec_windows.go index a5110cf8e..61fba1e59 100644 --- a/spec_windows.go +++ b/spec_windows.go @@ -22,7 +22,6 @@ func createDefaultSpec() (*specs.Spec, error) { }, Root: specs.Root{}, Process: specs.Process{ - Env: config.Env, ConsoleSize: specs.Box{ Width: 80, Height: 20, @@ -70,10 +69,10 @@ func WithImageConfig(ctx context.Context, i Image) SpecOpts { } func WithTTY(width, height int) SpecOpts { - func(s *specs.Spec) error { + return func(s *specs.Spec) error { s.Process.Terminal = true - s.Process.ConsoleSize.Width = width - s.Process.ConsoleSize.Height = height + s.Process.ConsoleSize.Width = uint(width) + s.Process.ConsoleSize.Height = uint(height) return nil } }