diff --git a/docker/docker.go b/docker/docker.go index 1b7e322a4f..71566539d8 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -8,6 +8,7 @@ import ( "io" "log" "os" + "os/signal" ) func main() { @@ -47,12 +48,21 @@ func daemon() error { func runCommand(args []string) error { var oldState *term.State var err error - if term.IsTerminal(0) && os.Getenv("NORAW") == "" { - oldState, err = term.MakeRaw(0) + 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(0, oldState) + defer term.Restore(int(os.Stdin.Fd()), oldState) + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + go func() { + for _ = range c { + term.Restore(int(os.Stdin.Fd()), oldState) + log.Printf("\nSIGINT received\n") + os.Exit(0) + } + }() } // 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 @@ -73,7 +83,7 @@ func runCommand(args []string) error { if err := <-receiveStdout; err != nil { return err } - if !term.IsTerminal(0) { + if !term.IsTerminal(int(os.Stdin.Fd())) { if err := <-sendStdin; err != nil { return err } @@ -88,7 +98,7 @@ func runCommand(args []string) error { } } if oldState != nil { - term.Restore(0, oldState) + term.Restore(int(os.Stdin.Fd()), oldState) } return nil } diff --git a/term/termios_linux.go b/term/termios_linux.go index ef2c84c7e8..5275ba87fb 100644 --- a/term/termios_linux.go +++ b/term/termios_linux.go @@ -15,7 +15,7 @@ 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 | ISIG | IEXTEN); + t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN); t.c_cflag &= ~(CSIZE | PARENB); t.c_cflag |= CS8;