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, }, }