diff --git a/container.go b/container.go index 2d20ce510c..aca82d4cbe 100644 --- a/container.go +++ b/container.go @@ -40,9 +40,7 @@ type Container struct { stdin io.ReadCloser stdinPipe io.WriteCloser - ptyStdinMaster io.Closer - ptyStdoutMaster io.Closer - ptyStderrMaster io.Closer + ptyMaster io.Closer runtime *Runtime } @@ -180,40 +178,37 @@ func (container *Container) generateLXCConfig() error { } func (container *Container) startPty() error { - - stdoutMaster, stdoutSlave, err := pty.Open() + ptyMaster, ptySlave, err := pty.Open() if err != nil { return err } - container.ptyStdoutMaster = stdoutMaster - container.cmd.Stdout = stdoutSlave - container.cmd.Stderr = stdoutSlave + container.ptyMaster = ptyMaster + container.cmd.Stdout = ptySlave + container.cmd.Stderr = ptySlave // Copy the PTYs to our broadcasters go func() { defer container.stdout.CloseWriters() Debugf("[startPty] Begin of stdout pipe") - io.Copy(container.stdout, stdoutMaster) + io.Copy(container.stdout, ptyMaster) Debugf("[startPty] End of stdout pipe") }() // stdin if container.Config.OpenStdin { - container.cmd.Stdin = stdoutSlave - // FIXME: The following appears to be broken. - // "cannot set terminal process group (-1): Inappropriate ioctl for device" + container.cmd.Stdin = ptySlave container.cmd.SysProcAttr = &syscall.SysProcAttr{Setctty: true, Setsid: true} go func() { defer container.stdin.Close() Debugf("[startPty] Begin of stdin pipe") - io.Copy(stdoutMaster, container.stdin) + io.Copy(ptyMaster, container.stdin) Debugf("[startPty] End of stdin pipe") }() } if err := container.cmd.Start(); err != nil { return err } - stdoutSlave.Close() + ptySlave.Close() return nil } @@ -507,19 +502,9 @@ func (container *Container) monitor() { Debugf("%s: Error close stderr: %s", container.Id, err) } - if container.ptyStdinMaster != nil { - if err := container.ptyStdinMaster.Close(); err != nil { - Debugf("%s: Error close pty stdin master: %s", container.Id, err) - } - } - if container.ptyStdoutMaster != nil { - if err := container.ptyStdoutMaster.Close(); err != nil { - Debugf("%s: Error close pty stdout master: %s", container.Id, err) - } - } - if container.ptyStderrMaster != nil { - if err := container.ptyStderrMaster.Close(); err != nil { - Debugf("%s: Error close pty stderr master: %s", container.Id, err) + if container.ptyMaster != nil { + if err := container.ptyMaster.Close(); err != nil { + Debugf("%s: Error closing Pty master: %s", container.Id, err) } }