From a7fb568aff4887337c075aaaec437e49a1a382e2 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 26 Feb 2024 21:39:01 +1100 Subject: [PATCH] Fix signal handlers --- v3/pkg/application/application_linux.go | 2 + v3/pkg/application/linux_cgo.go | 59 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/v3/pkg/application/application_linux.go b/v3/pkg/application/application_linux.go index 3029b96fb..90c130b77 100644 --- a/v3/pkg/application/application_linux.go +++ b/v3/pkg/application/application_linux.go @@ -176,6 +176,8 @@ func (a *linuxApp) monitorThemeChanges() { } func newPlatformApp(parent *App) *linuxApp { + + C.install_signal_handlers() name := strings.ToLower(strings.Replace(parent.options.Name, " ", "", -1)) if name == "" { name = "undefined" diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index 2c4650764..ace51e28d 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -145,6 +145,65 @@ typedef struct Screen { bool isPrimary; } Screen; +// CREDIT: https://github.com/rainycape/magick +#include +#include +#include +#include + +static void fix_signal(int signum) { + struct sigaction st; + + if (sigaction(signum, NULL, &st) < 0) { + goto fix_signal_error; + } + st.sa_flags |= SA_ONSTACK; + if (sigaction(signum, &st, NULL) < 0) { + goto fix_signal_error; + } + return; +fix_signal_error: + fprintf(stderr, "error fixing handler for signal %d, please " + "report this issue to " + "https://github.com/wailsapp/wails: %s\n", + signum, strerror(errno)); +} + +static void install_signal_handlers() { + #if defined(SIGCHLD) + fix_signal(SIGCHLD); + #endif + #if defined(SIGHUP) + fix_signal(SIGHUP); + #endif + #if defined(SIGINT) + fix_signal(SIGINT); + #endif + #if defined(SIGQUIT) + fix_signal(SIGQUIT); + #endif + #if defined(SIGABRT) + fix_signal(SIGABRT); + #endif + #if defined(SIGFPE) + fix_signal(SIGFPE); + #endif + #if defined(SIGTERM) + fix_signal(SIGTERM); + #endif + #if defined(SIGBUS) + fix_signal(SIGBUS); + #endif + #if defined(SIGSEGV) + fix_signal(SIGSEGV); + #endif + #if defined(SIGXCPU) + fix_signal(SIGXCPU); + #endif + #if defined(SIGXFSZ) + fix_signal(SIGXFSZ); + #endif +} static int GetNumScreens(){ return 0;