diff --git a/cmd/ctr/exec.go b/cmd/ctr/exec.go index 62833e8..b4762d1 100644 --- a/cmd/ctr/exec.go +++ b/cmd/ctr/exec.go @@ -64,7 +64,7 @@ var execCommand = cli.Command{ Console: context.Bool("tty"), } - fwg, err := prepareStdio(sOpts.Stdin, sOpts.Stdout, sOpts.Stderr) + fwg, err := prepareStdio(sOpts.Stdin, sOpts.Stdout, sOpts.Stderr, sOpts.Console) if err != nil { return err } diff --git a/cmd/ctr/run.go b/cmd/ctr/run.go index 2d1a9cb..d6b4b30 100644 --- a/cmd/ctr/run.go +++ b/cmd/ctr/run.go @@ -98,7 +98,7 @@ var runCommand = cli.Command{ Stderr: filepath.Join(tmpDir, "stderr"), } - fwg, err := prepareStdio(crOpts.Stdin, crOpts.Stdout, crOpts.Stderr) + fwg, err := prepareStdio(crOpts.Stdin, crOpts.Stdout, crOpts.Stderr, crOpts.Console) if err != nil { return err } diff --git a/cmd/ctr/utils.go b/cmd/ctr/utils.go index 8e23c2f..aaa3134 100644 --- a/cmd/ctr/utils.go +++ b/cmd/ctr/utils.go @@ -23,54 +23,56 @@ import ( var grpcConn *grpc.ClientConn -func prepareStdio(in, out, err string) (*sync.WaitGroup, error) { - var ( - wg sync.WaitGroup +func prepareStdio(stdin, stdout, stderr string, console bool) (*sync.WaitGroup, error) { + var wg sync.WaitGroup + ctx := gocontext.Background() - dst io.Writer - src io.Reader - close func() - ) - - for _, f := range []struct { - name string - flags int - src bool - reader io.Reader - writer io.Writer - }{ - {in, syscall.O_WRONLY | syscall.O_CREAT | syscall.O_NONBLOCK, false, os.Stdin, nil}, - {out, syscall.O_RDONLY | syscall.O_CREAT | syscall.O_NONBLOCK, true, nil, os.Stdout}, - {err, syscall.O_RDONLY | syscall.O_CREAT | syscall.O_NONBLOCK, true, nil, os.Stderr}, - } { - ff, err := fifo.OpenFifo(gocontext.Background(), f.name, f.flags, 0700) + f, err := fifo.OpenFifo(ctx, stdin, syscall.O_WRONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700) + if err != nil { + return nil, err + } + defer func(c io.Closer) { if err != nil { - return nil, err + c.Close() } - defer func(c io.Closer) { - if err != nil { - c.Close() - } - }(ff) + }(f) + go func(w io.Writer) { + io.Copy(w, os.Stdin) + f.Close() + }(f) - if f.src { - src = ff - dst = f.writer - close = func() { - ff.Close() - wg.Done() - } - wg.Add(1) - } else { - src = f.reader - dst = ff - close = func() { ff.Close() } + f, err = fifo.OpenFifo(ctx, stdout, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700) + if err != nil { + return nil, err + } + defer func(c io.Closer) { + if err != nil { + c.Close() } + }(f) + wg.Add(1) + go func(r io.Reader) { + io.Copy(os.Stdout, r) + f.Close() + wg.Done() + }(f) - go func(dst io.Writer, src io.Reader, close func()) { - io.Copy(dst, src) - close() - }(dst, src, close) + f, err = fifo.OpenFifo(ctx, stderr, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700) + if err != nil { + return nil, err + } + defer func(c io.Closer) { + if err != nil { + c.Close() + } + }(f) + if !console { + wg.Add(1) + go func(r io.Reader) { + io.Copy(os.Stderr, r) + f.Close() + wg.Done() + }(f) } return &wg, nil