From 108acc0511fde98a8b5035d9ea7256d5449bb034 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Wed, 27 Mar 2013 23:54:53 -0700 Subject: [PATCH 1/2] #214 Better signal handling --- docker/docker.go | 10 ++++++++++ term/termios_linux.go | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docker/docker.go b/docker/docker.go index 686cd2181a..092e9ba2d0 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -8,6 +8,7 @@ import ( "io" "log" "os" + "os/signal" ) func main() { @@ -53,6 +54,15 @@ func runCommand(args []string) error { return err } defer term.Restore(0, oldState) + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + go func() { + for _ = range c { + term.Restore(0, 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 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; From 6a236184af6ae57e2f7475e9ab279b0684a869d4 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Wed, 27 Mar 2013 23:56:36 -0700 Subject: [PATCH 2/2] Change hardcoded "0" onto os.Stdin.Fd() --- docker/docker.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker/docker.go b/docker/docker.go index 092e9ba2d0..7a7c5ccad1 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -48,17 +48,17 @@ 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(0, oldState) + term.Restore(int(os.Stdin.Fd()), oldState) log.Printf("\nSIGINT received\n") os.Exit(0) } @@ -83,7 +83,7 @@ func runCommand(args []string) error { if err := <-receive_stdout; err != nil { return err } - if !term.IsTerminal(0) { + if !term.IsTerminal(int(os.Stdin.Fd())) { if err := <-send_stdin; err != nil { return err } @@ -98,7 +98,7 @@ func runCommand(args []string) error { } } if oldState != nil { - term.Restore(0, oldState) + term.Restore(int(os.Stdin.Fd()), oldState) } return nil }