Browse Source

Merged Ctrl-C interception by @creack

Solomon Hykes 12 years ago
parent
commit
c937e237ad
2 changed files with 16 additions and 6 deletions
  1. 15 5
      docker/docker.go
  2. 1 1
      term/termios_linux.go

+ 15 - 5
docker/docker.go

@@ -8,6 +8,7 @@ import (
 	"io"
 	"io"
 	"log"
 	"log"
 	"os"
 	"os"
+	"os/signal"
 )
 )
 
 
 func main() {
 func main() {
@@ -47,12 +48,21 @@ func daemon() error {
 func runCommand(args []string) error {
 func runCommand(args []string) error {
 	var oldState *term.State
 	var oldState *term.State
 	var err error
 	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 {
 		if err != nil {
 			return err
 			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
 	// 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
 	// 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 {
 		if err := <-receiveStdout; err != nil {
 			return err
 			return err
 		}
 		}
-		if !term.IsTerminal(0) {
+		if !term.IsTerminal(int(os.Stdin.Fd())) {
 			if err := <-sendStdin; err != nil {
 			if err := <-sendStdin; err != nil {
 				return err
 				return err
 			}
 			}
@@ -88,7 +98,7 @@ func runCommand(args []string) error {
 		}
 		}
 	}
 	}
 	if oldState != nil {
 	if oldState != nil {
-		term.Restore(0, oldState)
+		term.Restore(int(os.Stdin.Fd()), oldState)
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 1 - 1
term/termios_linux.go

@@ -15,7 +15,7 @@ void MakeRaw(int fd) {
   ioctl(fd, TCGETS, &t);
   ioctl(fd, TCGETS, &t);
 
 
   t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
   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 &= ~(CSIZE | PARENB);
   t.c_cflag |= CS8;
   t.c_cflag |= CS8;