~sircmpwn/aerc

c06a2e61fc32051d429dbbaf4dc3cc0019f4a69c — Reto Brunner 3 years ago 8ecf0b7
aerc: try to recover from a panic

As of now we crash fairly often. The problem is that we didn't run the cleanup
routine of the ui in this case, leaving the pty in a bad state.
Instead, recover from a panic and at least try to run the ui deinit.
1 files changed, 19 insertions(+), 0 deletions(-)

M aerc.go
M aerc.go => aerc.go +19 -0
@@ 6,6 6,7 @@ import (
	"io/ioutil"
	"log"
	"os"
	"runtime/debug"
	"sort"
	"time"



@@ 153,6 154,8 @@ func main() {
		ui   *libui.UI
	)

	defer PanicTermFix(ui) // recover upon panic and try restoring the pty

	aerc = widgets.NewAerc(conf, logger, func(cmd []string) error {
		return execCommand(aerc, ui, cmd)
	}, func(cmd string) []string {


@@ 198,3 201,19 @@ func main() {
	}
	aerc.CloseBackends()
}

//FatalTermFix prints the stacktrace upon panic and tries to recover the term
// not doing that leaves the terminal in a broken state
func PanicTermFix(ui *libui.UI) {
	var err interface{}
	if err = recover(); err == nil {
		return
	}
	debug.PrintStack()
	if ui != nil {
		ui.Close()
	}
	fmt.Fprintf(os.Stderr, "aerc crashed: %v\n", err)
	os.Exit(1)

}