diff options
author | baude <bbaude@redhat.com> | 2017-11-08 15:14:33 -0600 |
---|---|---|
committer | baude <bbaude@redhat.com> | 2017-11-15 16:27:57 -0600 |
commit | acd9c668647d273488772bfcb06a0f1a44dfb411 (patch) | |
tree | 5ff634e00c700b16f1ae4369df4ea021a4888073 /libpod/container_attach.go | |
parent | 5cfd7a313fcae7c748b5bae84de779b28d4ea01b (diff) | |
download | podman-acd9c668647d273488772bfcb06a0f1a44dfb411.tar.gz podman-acd9c668647d273488772bfcb06a0f1a44dfb411.tar.bz2 podman-acd9c668647d273488772bfcb06a0f1a44dfb411.zip |
Fix terminal attach
Re-order the startup of a new container via run from
initialize > start > attach to initialize > attach > start.
This fixes output when running:
kpod run -i -t IMAGE command
and
kpod run IMAGE command
Signed-off-by: baude <bbaude@redhat.com>
Diffstat (limited to 'libpod/container_attach.go')
-rw-r--r-- | libpod/container_attach.go | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libpod/container_attach.go b/libpod/container_attach.go index e308df4a4..8c1c98fe5 100644 --- a/libpod/container_attach.go +++ b/libpod/container_attach.go @@ -2,6 +2,7 @@ package libpod import ( "fmt" + "golang.org/x/crypto/ssh/terminal" "io" "net" "os" @@ -25,7 +26,7 @@ const ( ) // attachContainerSocket connects to the container's attach socket and deals with the IO -func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSize, noStdIn bool, detachKeys []byte) error { +func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSize, noStdIn bool, detachKeys []byte, attached chan<- bool) error { inputStream := os.Stdin outputStream := os.Stdout errorStream := os.Stderr @@ -38,12 +39,14 @@ func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSi return errors.Errorf("no tty available for %s", c.ID()) } - oldTermState, err := term.SaveState(inputStream.Fd()) - if err != nil { - return errors.Wrapf(err, "unable to save terminal state") - } + if terminal.IsTerminal(int(inputStream.Fd())) { + oldTermState, err := term.SaveState(inputStream.Fd()) + if err != nil { + return errors.Wrapf(err, "unable to save terminal state") + } - defer term.RestoreTerminal(inputStream.Fd(), oldTermState) + defer term.RestoreTerminal(inputStream.Fd(), oldTermState) + } // Put both input and output into raw if !noStdIn { @@ -71,6 +74,9 @@ func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSi } defer conn.Close() + // signal back that the connection was made + attached <- true + receiveStdoutError := make(chan error) if outputStream != nil || errorStream != nil { go func() { |