diff --git a/docker/docker.go b/docker/docker.go index 1b1c21990d..7e1dfd00ea 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -56,6 +56,15 @@ func daemon() error { } func runCommand(args []string) error { + var oldState *term.State + var err error + if term.IsTerminal(int(os.Stdin.Fd())) && os.Getenv("NORAW") == "" { + oldState, err = term.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + return err + } + defer term.Restore(int(os.Stdin.Fd()), oldState) + } // FIXME: we want to use unix sockets here, but net.UnixConn doesn't expose // CloseWrite(), which we need to cleanly signal that stdin is closed without // closing the connection. diff --git a/term/termios_linux.go b/term/termios_linux.go index 5275ba87fb..92f21edde2 100644 --- a/term/termios_linux.go +++ b/term/termios_linux.go @@ -15,7 +15,8 @@ void MakeRaw(int fd) { ioctl(fd, TCGETS, &t); t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); - t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN); + t.c_oflag &= ~OPOST; + t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); t.c_cflag &= ~(CSIZE | PARENB); t.c_cflag |= CS8;