From d17e975cc812ddf0529376a5d9625aefb7663d6e Mon Sep 17 00:00:00 2001 From: Aidan Date: Sat, 27 Jun 2020 21:54:14 -0700 Subject: [PATCH] catch SIGTERM meant for running process --- cmd/{repl.go => shs_repl.go} | 0 stdlib/call.go | 32 +++++++++++++++++++++++++++++++- stdlib/stdlib.go | 9 +++++---- 3 files changed, 36 insertions(+), 5 deletions(-) rename cmd/{repl.go => shs_repl.go} (100%) diff --git a/cmd/repl.go b/cmd/shs_repl.go similarity index 100% rename from cmd/repl.go rename to cmd/shs_repl.go diff --git a/stdlib/call.go b/stdlib/call.go index 6c63873..c7b8bb0 100644 --- a/stdlib/call.go +++ b/stdlib/call.go @@ -22,6 +22,8 @@ import ( "fmt" "bytes" "os/exec" + "syscall" + "os/signal" "git.callpipe.com/aidan/shs/ast" "git.callpipe.com/aidan/shs/log" ) @@ -58,9 +60,18 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin - exit := 0 + + signalChan := make(chan os.Signal, 2) + signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + go func() { + sig := <-signalChan + cmd.Process.Signal(sig) + }() + err = cmd.Run() + close(signalChan) + signal.Reset(os.Interrupt, syscall.SIGTERM) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { exit = exitError.ExitCode() @@ -117,7 +128,17 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin exit := 0 + + signalChan := make(chan os.Signal, 2) + signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + go func() { + sig := <-signalChan + cmd.Process.Signal(sig) + }() + err := cmd.Wait() + close(signalChan) + signal.Reset(os.Interrupt, syscall.SIGTERM) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { exit = exitError.ExitCode() @@ -161,7 +182,16 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin + signalChan := make(chan os.Signal, 2) + signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + go func() { + sig := <-signalChan + cmd.Process.Signal(sig) + }() + err = cmd.Run() + close(signalChan) + signal.Reset(os.Interrupt, syscall.SIGTERM) if err != nil { log.Log(log.ERR, err.Error(), "$") } diff --git a/stdlib/stdlib.go b/stdlib/stdlib.go index 30b20fc..e16b843 100644 --- a/stdlib/stdlib.go +++ b/stdlib/stdlib.go @@ -18,6 +18,7 @@ package stdlib import ( + "os" "git.callpipe.com/aidan/shs/ast" ) @@ -116,10 +117,10 @@ func GenFuncTable() ast.FuncTable { }, "exit": &ast.Function{ - Function: exit, - Name: "exit", - TimesCalled 0, - Args: 0, + Function: exit_shell, + Name: "exit", + TimesCalled: 0, + Args: 0, }, }