diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-05-27 19:40:29 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-05-27 19:40:29 +0800 |
commit | e13f413ef54ca84d3dfb999e18d64b361b98b60a (patch) | |
tree | 18ebfecc6e5029a68c1968c69abbf052e28c6320 /cmd/geth | |
parent | 69f7a1da5a92b81e2dc6a0a8493a8a456e093623 (diff) | |
parent | 9253fc337e4f36029f90f31b1b4e116d0a77ae05 (diff) | |
download | dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.tar dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.tar.gz dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.tar.bz2 dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.tar.lz dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.tar.xz dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.tar.zst dexon-e13f413ef54ca84d3dfb999e18d64b361b98b60a.zip |
Merge pull request #1112 from fjl/fix-console-exit
cmd/geth: exit the console cleanly when interrupted
Diffstat (limited to 'cmd/geth')
-rw-r--r-- | cmd/geth/js.go | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/cmd/geth/js.go b/cmd/geth/js.go index 0fb234d45..706bc6554 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/js.go @@ -22,6 +22,7 @@ import ( "fmt" "math/big" "os" + "os/signal" "path/filepath" "strings" @@ -47,7 +48,8 @@ type dumbterm struct{ r *bufio.Reader } func (r dumbterm) Prompt(p string) (string, error) { fmt.Print(p) - return r.r.ReadString('\n') + line, err := r.r.ReadString('\n') + return strings.TrimSuffix(line, "\n"), err } func (r dumbterm) PasswordPrompt(p string) (string, error) { @@ -182,30 +184,52 @@ func (self *jsre) exec(filename string) error { } func (self *jsre) interactive() { - for { - input, err := self.Prompt(self.ps1) - if err != nil { - break + // Read input lines. + prompt := make(chan string) + inputln := make(chan string) + go func() { + defer close(inputln) + for { + line, err := self.Prompt(<-prompt) + if err != nil { + return + } + inputln <- line } - if input == "" { - continue + }() + // Wait for Ctrl-C, too. + sig := make(chan os.Signal, 1) + signal.Notify(sig, os.Interrupt) + + defer func() { + if self.atexit != nil { + self.atexit() } - str += input + "\n" - self.setIndent() - if indentCount <= 0 { - if input == "exit" { - break + self.re.Stop(false) + }() + for { + prompt <- self.ps1 + select { + case <-sig: + fmt.Println("caught interrupt, exiting") + return + case input, ok := <-inputln: + if !ok || indentCount <= 0 && input == "exit" { + return + } + if input == "" { + continue + } + str += input + "\n" + self.setIndent() + if indentCount <= 0 { + hist := str[:len(str)-1] + self.AppendHistory(hist) + self.parseInput(str) + str = "" } - hist := str[:len(str)-1] - self.AppendHistory(hist) - self.parseInput(str) - str = "" } } - if self.atexit != nil { - self.atexit() - } - self.re.Stop(false) } func (self *jsre) withHistory(op func(*os.File)) { |