Wire up the signal handlers
This commit is contained in:
parent
526a331f47
commit
99fde8723a
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user