From b8a89628339dd63b5f2ff3d28715a5431412b65a Mon Sep 17 00:00:00 2001 From: David Calavera Date: Sat, 17 Aug 2013 21:29:37 -0700 Subject: [PATCH] Simplify term signal handler. --- commands.go | 5 +++-- term/term.go | 25 ++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/commands.go b/commands.go index b58a2e360d..3dbcc41cf6 100644 --- a/commands.go +++ b/commands.go @@ -299,7 +299,8 @@ func (cli *DockerCli) CmdLogin(args ...string) error { oldState, _ := term.SaveState(cli.terminalFd) fmt.Fprintf(cli.out, "Password: ") - term.DisableEcho(cli.terminalFd, cli.out, oldState) + term.DisableEcho(cli.terminalFd, oldState) + password = readInput(cli.in, cli.out) fmt.Fprint(cli.out, "\n") @@ -1647,7 +1648,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea } if in != nil && setRawTerminal && cli.isTerminal && os.Getenv("NORAW") == "" { - oldState, err := term.SetRawTerminal(cli.terminalFd, cli.out) + oldState, err := term.SetRawTerminal(cli.terminalFd) if err != nil { return err } diff --git a/term/term.go b/term/term.go index 2c78d6806e..d8d4d1a655 100644 --- a/term/term.go +++ b/term/term.go @@ -54,34 +54,33 @@ func SaveState(fd uintptr) (*State, error) { return &oldState, nil } -func DisableEcho(fd uintptr, out io.Writer, state *State) error { +func DisableEcho(fd uintptr, state *State) error { newState := state.termios newState.Lflag &^= syscall.ECHO - HandleInterrupt(fd, out, state) if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { return err } + handleInterrupt(fd, state) return nil } -func HandleInterrupt(fd uintptr, out io.Writer, state *State) { +func SetRawTerminal(fd uintptr) (*State, error) { + oldState, err := MakeRaw(fd) + if err != nil { + return nil, err + } + handleInterrupt(fd, oldState) + return oldState, err +} + +func handleInterrupt(fd uintptr, state *State) { sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, os.Interrupt) go func() { _ = <-sigchan - fmt.Fprint(out, "\n") RestoreTerminal(fd, state) os.Exit(0) }() } - -func SetRawTerminal(fd uintptr, out io.Writer) (*State, error) { - oldState, err := MakeRaw(fd) - if err != nil { - return nil, err - } - HandleInterrupt(fd, out, oldState) - return oldState, err -}