diff options
author | Matthew Heon <matthew.heon@gmail.com> | 2018-04-11 14:44:11 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-04-13 18:43:44 +0000 |
commit | 6609d555f75568bb4f1394736a3e3b31e5f0d355 (patch) | |
tree | 92cfca059a58882d205acd2c575b587850ae1798 | |
parent | 5e03cec7ec83f8ff8b31a89a6180dda203b04d9c (diff) | |
download | podman-6609d555f75568bb4f1394736a3e3b31e5f0d355.tar.gz podman-6609d555f75568bb4f1394736a3e3b31e5f0d355.tar.bz2 podman-6609d555f75568bb4f1394736a3e3b31e5f0d355.zip |
Fix terminal attach
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Closes: #608
Approved by: baude
-rw-r--r-- | cmd/podman/attach.go | 6 | ||||
-rw-r--r-- | cmd/podman/run.go | 13 | ||||
-rw-r--r-- | cmd/podman/start.go | 13 | ||||
-rw-r--r-- | cmd/podman/utils.go | 28 |
4 files changed, 27 insertions, 33 deletions
diff --git a/cmd/podman/attach.go b/cmd/podman/attach.go index 4b16d013c..041cc0388 100644 --- a/cmd/podman/attach.go +++ b/cmd/podman/attach.go @@ -69,16 +69,12 @@ func attachCmd(c *cli.Context) error { return errors.Errorf("you can only attach to running containers") } - if c.BoolT("sig-proxy") { - ProxySignals(ctr) - } - inputStream := os.Stdin if c.Bool("no-stdin") { inputStream = nil } - if err := attachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.String("detach-keys")); err != nil { + if err := attachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.String("detach-keys"), c.BoolT("sig-proxy")); err != nil { return errors.Wrapf(err, "error attaching to container %s", ctr.ID()) } diff --git a/cmd/podman/run.go b/cmd/podman/run.go index b8d6e0968..cafb16d9d 100644 --- a/cmd/podman/run.go +++ b/cmd/podman/run.go @@ -179,8 +179,7 @@ func runCmd(c *cli.Context) error { } } - attachChan, err := startAttachCtr(ctr, outputStream, errorStream, inputStream, c.String("detach-keys")) - if err != nil { + if err := startAttachCtr(ctr, outputStream, errorStream, inputStream, c.String("detach-keys"), c.BoolT("sig-proxy")); err != nil { // This means the command did not exist exitCode = 127 if strings.Index(err.Error(), "permission denied") > -1 { @@ -189,16 +188,6 @@ func runCmd(c *cli.Context) error { return err } - if c.BoolT("sig-proxy") { - ProxySignals(ctr) - } - - // Wait for attach to complete - err = <-attachChan - if err != nil { - return errors.Wrapf(err, "error attaching to container %s", ctr.ID()) - } - if ecode, err := ctr.ExitCode(); err != nil { logrus.Errorf("unable to get exit code of container %s: %q", ctr.ID(), err) } else { diff --git a/cmd/podman/start.go b/cmd/podman/start.go index 14b03ac7c..597ed29ae 100644 --- a/cmd/podman/start.go +++ b/cmd/podman/start.go @@ -110,21 +110,10 @@ func startCmd(c *cli.Context) error { inputStream = nil } - attachChan, err := startAttachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.String("detach-keys")) - if err != nil { + if err := startAttachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.String("detach-keys"), c.Bool("sig-proxy")); err != nil { return errors.Wrapf(err, "unable to start container %s", ctr.ID()) } - if c.Bool("sig-proxy") { - ProxySignals(ctr) - } - - // Wait for attach to complete - err = <-attachChan - if err != nil { - return errors.Wrapf(err, "error attaching to container %s", ctr.ID()) - } - if ecode, err := ctr.ExitCode(); err != nil { logrus.Errorf("unable to get exit code of container %s: %q", ctr.ID(), err) } else { diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go index 502424403..0238fc9c2 100644 --- a/cmd/podman/utils.go +++ b/cmd/podman/utils.go @@ -65,8 +65,9 @@ func getRuntime(c *cli.Context) (*libpod.Runtime, error) { } // Attach to a container -func attachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys string) error { +func attachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys string, sigProxy bool) error { resize := make(chan remotecommand.TerminalSize) + defer close(resize) haveTerminal := terminal.IsTerminal(int(os.Stdin.Fd())) @@ -87,12 +88,17 @@ func attachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys defer term.RestoreTerminal(os.Stdin.Fd(), oldTermState) } + if sigProxy { + ProxySignals(ctr) + } + return ctr.Attach(stdout, stderr, stdin, detachKeys, resize) } // Start and attach to a container -func startAttachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys string) (<-chan error, error) { +func startAttachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys string, sigProxy bool) error { resize := make(chan remotecommand.TerminalSize) + defer close(resize) haveTerminal := terminal.IsTerminal(int(os.Stdin.Fd())) @@ -105,7 +111,7 @@ func startAttachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detac oldTermState, err := term.SaveState(os.Stdin.Fd()) if err != nil { - return nil, errors.Wrapf(err, "unable to save terminal state") + return errors.Wrapf(err, "unable to save terminal state") } term.SetRawTerminal(os.Stdin.Fd()) @@ -113,7 +119,21 @@ func startAttachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detac defer term.RestoreTerminal(os.Stdin.Fd(), oldTermState) } - return ctr.StartAndAttach(stdout, stderr, stdin, detachKeys, resize) + attachChan, err := ctr.StartAndAttach(stdout, stderr, stdin, detachKeys, resize) + if err != nil { + return err + } + + if sigProxy { + ProxySignals(ctr) + } + + err = <-attachChan + if err != nil { + return errors.Wrapf(err, "error attaching to container %s", ctr.ID()) + } + + return nil } // Helper for prepareAttach - set up a goroutine to generate terminal resize events |