Skip to content

Commit

Permalink
Merge pull request #3357 from niten94/shell-sigint-recv
Browse files Browse the repository at this point in the history
Receive SIGINT only in RunInteractiveShell
  • Loading branch information
dmaluka authored Jun 28, 2024
2 parents 882b98f + a84aa22 commit dc77592
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 18 deletions.
9 changes: 4 additions & 5 deletions cmd/micro/micro.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ var (
flagClean = flag.Bool("clean", false, "Clean configuration directory")
optionFlags map[string]*string

sigterm chan os.Signal
sighup chan os.Signal
sighup chan os.Signal

timerChan chan func()
)
Expand Down Expand Up @@ -360,9 +359,9 @@ func main() {

screen.Events = make(chan tcell.Event)

sigterm = make(chan os.Signal, 1)
util.Sigterm = make(chan os.Signal, 1)
sighup = make(chan os.Signal, 1)
signal.Notify(sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT)
signal.Notify(util.Sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT)
signal.Notify(sighup, syscall.SIGHUP)

timerChan = make(chan func())
Expand Down Expand Up @@ -437,7 +436,7 @@ func DoEvent() {
}
}
os.Exit(0)
case <-sigterm:
case <-util.Sigterm:
for _, b := range buffer.OpenBuffers {
if !b.Modified() {
b.Fini()
Expand Down
29 changes: 16 additions & 13 deletions internal/shell/shell.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

shellquote "github.com/kballard/go-shellquote"
"github.com/zyedidia/micro/v2/internal/screen"
"github.com/zyedidia/micro/v2/internal/util"
)

// ExecCommand executes a command using exec
Expand Down Expand Up @@ -95,28 +96,30 @@ func RunInteractiveShell(input string, wait bool, getOutput bool) (string, error
cmd.Stderr = os.Stderr

// This is a trap for Ctrl-C so that it doesn't kill micro
// Instead we trap Ctrl-C to kill the program we're running
// micro is killed if the signal is ignored only on Windows, so it is
// received
c := make(chan os.Signal, 1)
signal.Reset(os.Interrupt)
signal.Notify(c, os.Interrupt)
go func() {
for range c {
cmd.Process.Kill()
err = cmd.Start()
if err == nil {
err = cmd.Wait()
if wait {
// This is just so we don't return right away and let the user press enter to return
screen.TermMessage("")
}
}()

cmd.Start()
err = cmd.Wait()
} else {
screen.TermMessage(err)
}

output := outputBytes.String()

if wait {
// This is just so we don't return right away and let the user press enter to return
screen.TermMessage("")
}

// Start the screen back up
screen.TempStart(screenb)

signal.Notify(util.Sigterm, os.Interrupt)
signal.Stop(c)

return output, err
}

Expand Down
2 changes: 2 additions & 0 deletions internal/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ var (

// Stdout is a buffer that is written to stdout when micro closes
Stdout *bytes.Buffer
// Sigterm is a channel where micro exits when written
Sigterm chan os.Signal
)

func init() {
Expand Down

0 comments on commit dc77592

Please sign in to comment.