diff options
author | Daniel Kamil Kozar <dkk089@gmail.com> | 2017-09-25 00:35:58 +0200 |
---|---|---|
committer | Daniel Kamil Kozar <dkk089@gmail.com> | 2017-09-25 00:35:58 +0200 |
commit | 096f645f5276c84fdc2a628653667decb592f34b (patch) | |
tree | 8a0c046e88777112aae60f1ec116cd8de3a3bc70 | |
parent | 48414b384b20d26fde67106777fa377092d56db3 (diff) | |
download | pidgin-096f645f5276c84fdc2a628653667decb592f34b.tar.gz |
Respect the original SIGWINCH's handler SA_SIGINFO field
Imported from https://developer.pidgin.im/ticket/16680 , authored by
marcus. When chaining the original SIGWINCH, make sure to optionally
call it with the extra arguments that are available when it was
installed with SA_SIGINFO.
-rw-r--r-- | finch/libgnt/gntmain.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/finch/libgnt/gntmain.c b/finch/libgnt/gntmain.c index 71548df9b5..bccf021c02 100644 --- a/finch/libgnt/gntmain.c +++ b/finch/libgnt/gntmain.c @@ -407,10 +407,11 @@ raise: #ifdef SIGWINCH static void (*org_winch_handler)(int); +static void (*org_winch_handler_sa)(int, siginfo_t *, void *); #endif static void -sighandler(int sig) +sighandler(int sig, siginfo_t *info, void *data) { switch (sig) { #ifdef SIGWINCH @@ -419,16 +420,15 @@ sighandler(int sig) g_idle_add((GSourceFunc)refresh_screen, NULL); if (org_winch_handler) org_winch_handler(sig); - signal(SIGWINCH, sighandler); + if (org_winch_handler_sa) + org_winch_handler_sa(sig, info, data); break; #endif case SIGCHLD: clean_pid(); - signal(SIGCHLD, sighandler); break; case SIGINT: ask_before_exit(); - signal(SIGINT, sighandler); break; } } @@ -456,6 +456,10 @@ void gnt_init() { char *filename; const char *locale; + struct sigaction act; +#ifdef SIGWINCH + struct sigaction oact; +#endif if (channel) return; @@ -501,11 +505,25 @@ void gnt_init() werase(stdscr); wrefresh(stdscr); + act.sa_sigaction = sighandler; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; + #ifdef SIGWINCH - org_winch_handler = signal(SIGWINCH, sighandler); + org_winch_handler = NULL; + org_winch_handler_sa = NULL; + sigaction(SIGWINCH, &act, &oact); + if (oact.sa_flags & SA_SIGINFO) + { + org_winch_handler_sa = oact.sa_sigaction; + } + else if (oact.sa_handler != SIG_DFL && oact.sa_handler != SIG_IGN) + { + org_winch_handler = oact.sa_handler; + } #endif - signal(SIGCHLD, sighandler); - signal(SIGINT, sighandler); + sigaction(SIGCHLD, &act, NULL); + sigaction(SIGINT, &act, NULL); signal(SIGPIPE, SIG_IGN); #if !GLIB_CHECK_VERSION(2, 36, 0) |