qulogic/libgnt

Merged in strangeways/main/trac-16680 (pull request #269)
release-2.x.y
2017-09-29, Gary Kramlich
ae40ebbc9091
Merged in strangeways/main/trac-16680 (pull request #269)

Respect the original SIGWINCH's handler SA_SIGINFO field

Approved-by: Gary Kramlich
Approved-by: dx
  • +25 -7
    gntmain.c
  • --- a/gntmain.c Tue Sep 26 04:08:29 2017 +0000
    +++ b/gntmain.c Fri Sep 29 01:38:29 2017 +0000
    @@ -407,10 +407,11 @@
    #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 @@
    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 @@
    {
    char *filename;
    const char *locale;
    + struct sigaction act;
    +#ifdef SIGWINCH
    + struct sigaction oact;
    +#endif
    if (channel)
    return;
    @@ -501,11 +505,25 @@
    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)