diff --git a/stdlib/call.go b/stdlib/call.go index 95e2050..c158979 100644 --- a/stdlib/call.go +++ b/stdlib/call.go @@ -30,6 +30,8 @@ import ( var bgProcs = make([]*exec.Cmd, 0) var LastExitCode int +var sigs = []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGTSTP, syscall.SIGTTIN, syscall.SIGTTOU, syscall.SIGCONT} + func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { if in == nil { @@ -63,7 +65,7 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stdin = os.Stdin signalChan := make(chan os.Signal, 2) - signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + signal.Notify(signalChan, sigs...) go func() { sig := <-signalChan cmd.Process.Signal(sig) @@ -71,7 +73,7 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { err = cmd.Run() close(signalChan) - signal.Reset(os.Interrupt, syscall.SIGTERM) + signal.Reset(sigs...) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { LastExitCode = exitError.ExitCode() @@ -113,7 +115,12 @@ func bgcall(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stderr = os.Stderr bgProcs = append(bgProcs, cmd) + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + cmd.Start() + cmd.Process.Signal(syscall.SIGTSTP) return nil } @@ -125,19 +132,17 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd := bgProcs[0] bgProcs = bgProcs[1:] - cmd.Stdout = os.Stdout - cmd.Stdin = os.Stdin - signalChan := make(chan os.Signal, 2) - signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + signal.Notify(signalChan, sigs...) go func() { sig := <-signalChan cmd.Process.Signal(sig) }() + cmd.Process.Signal(syscall.SIGCONT) err := cmd.Wait() close(signalChan) - signal.Reset(os.Interrupt, syscall.SIGTERM) + signal.Reset(sigs...) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { LastExitCode = exitError.ExitCode() @@ -182,7 +187,7 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stdin = os.Stdin signalChan := make(chan os.Signal, 2) - signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + signal.Notify(signalChan, sigs...) go func() { sig := <-signalChan cmd.Process.Signal(sig) @@ -190,7 +195,7 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { err = cmd.Run() close(signalChan) - signal.Reset(os.Interrupt, syscall.SIGTERM) + signal.Reset(sigs...) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { LastExitCode = exitError.ExitCode()