From 99fde8723a3fb82b76b1ad149656d3965a951049 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 23 Aug 2022 20:31:12 +0530 Subject: [PATCH] Wire up the signal handlers --- tools/tui/loop.go | 37 ++++++++++++++++++++++++++- tools/tui/signal.go | 33 ++++++++++++++++++++++++ tools/utils/select_without_pselect.go | 1 - 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/tools/tui/loop.go b/tools/tui/loop.go index 11a0f7bd5..8be9c0fb1 100644 --- a/tools/tui/loop.go +++ b/tools/tui/loop.go @@ -16,6 +16,8 @@ type Loop struct { escape_code_parser utils.EscapeCodeParser keep_going bool flush_write_buf bool + death_signal Signal + exit_code int write_buf []byte } @@ -47,6 +49,29 @@ func (self *Loop) handle_rune(raw rune) error { return nil } +func (self *Loop) on_SIGINT() error { + self.death_signal = SIGINT + self.keep_going = false + return nil +} + +func (self *Loop) on_SIGTERM() error { + self.death_signal = SIGTERM + self.keep_going = false + return nil +} + +func (self *Loop) on_SIGTSTP() error { + return nil +} + +func (self *Loop) on_SIGHUP() error { + self.flush_write_buf = false + self.death_signal = SIGHUP + self.keep_going = false + return nil +} + func CreateLoop() (*Loop, error) { l := Loop{controlling_term: nil} l.escape_code_parser.HandleCSI = l.handle_csi @@ -115,7 +140,10 @@ func (self *Loop) Run() (err error) { }() read_buf := make([]byte, utils.DEFAULT_IO_BUFFER_SIZE) + signal_buf := make([]byte, 256) + self.death_signal = SIGNULL self.escape_code_parser.Reset() + self.exit_code = 0 for self.keep_going { if len(self.write_buf) > 0 { selector.RegisterWrite(tty_fd) @@ -130,7 +158,7 @@ func (self *Loop) Run() (err error) { continue } if len(self.write_buf) > 0 && selector.IsReadyToWrite(tty_fd) { - err := self.write_to_tty() + err = self.write_to_tty() if err != nil { return err } @@ -149,6 +177,13 @@ func (self *Loop) Run() (err error) { return err } } + if selector.IsReadyToRead(int(signal_read_file.Fd())) { + signal_buf = signal_buf[:cap(signal_buf)] + err = self.read_signals(signal_read_file, signal_buf) + if err != nil { + return err + } + } } return nil diff --git a/tools/tui/signal.go b/tools/tui/signal.go index 1c40d1471..8bdbff0e2 100644 --- a/tools/tui/signal.go +++ b/tools/tui/signal.go @@ -94,3 +94,36 @@ func notify_signals(c chan os.Signal, signals ...Signal) func() { signal.Notify(c, s...) return func() { signal.Reset(s...) } } + +func (self *Loop) read_signals(f *os.File, buf []byte) error { + n, err := f.Read(buf) + if err != nil { + return err + } + buf = buf[:n] + for _, s := range buf { + switch Signal(s) { + case SIGINT: + err := self.on_SIGINT() + if err != nil { + return err + } + case SIGTERM: + err := self.on_SIGTERM() + if err != nil { + return err + } + case SIGHUP: + err := self.on_SIGHUP() + if err != nil { + return err + } + case SIGTSTP: + err := self.on_SIGTSTP() + if err != nil { + return err + } + } + } + return nil +} diff --git a/tools/utils/select_without_pselect.go b/tools/utils/select_without_pselect.go index decccd5d1..811278826 100644 --- a/tools/utils/select_without_pselect.go +++ b/tools/utils/select_without_pselect.go @@ -3,7 +3,6 @@ package utils import ( - "os" "time" "golang.org/x/sys/unix"