From: Jim Meyering Date: Tue, 20 Apr 2004 15:08:57 +0000 (+0000) Subject: (main): Rewrite signal-catching code to make it X-Git-Tag: v5.3.0~1700 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b6892c3dfd51e3bc34b7223100f8ad22d5f1ace;p=thirdparty%2Fcoreutils.git (main): Rewrite signal-catching code to make it similar to other coreutils programs. When processing signals, block all signals that we catch, but do not block signals that we don't catch. Avoid problems with unsigned int warnings. (sighandler) [defined SA_NOCLDSTOP]: Use simpler "signal (sig, SIG_DFL)" rather than sigaction equivalent. --- diff --git a/src/sort.c b/src/sort.c index b67582a038..942de4fff9 100644 --- a/src/sort.c +++ b/src/sort.c @@ -2133,19 +2133,7 @@ sighandler (int sig) cleanup (); -#ifdef SA_NOCLDSTOP - { - struct sigaction sigact; - - sigact.sa_handler = SIG_DFL; - sigemptyset (&sigact.sa_mask); - sigact.sa_flags = 0; - sigaction (sig, &sigact, NULL); - } -#else signal (sig, SIG_DFL); -#endif - raise (sig); } @@ -2225,11 +2213,6 @@ main (int argc, char **argv) : COMMON_SHORT_OPTIONS "y:"); char *minus = "-", **files; char const *outfile = minus; - static int const sigs[] = { SIGHUP, SIGINT, SIGPIPE, SIGTERM }; - unsigned int nsigs = sizeof sigs / sizeof *sigs; -#ifdef SA_NOCLDSTOP - struct sigaction oldact, newact; -#endif initialize_main (&argc, &argv); program_name = argv[0]; @@ -2269,32 +2252,34 @@ main (int argc, char **argv) have_read_stdin = false; inittables (); -#ifdef SA_NOCLDSTOP { - unsigned int i; + int i; + static int const sig[] = { SIGHUP, SIGINT, SIGPIPE, SIGTERM }; + enum { nsigs = sizeof sig / sizeof sig[0] }; + +#ifdef SA_NOCLDSTOP + struct sigaction act; + sigemptyset (&caught_signals); for (i = 0; i < nsigs; i++) - sigaddset (&caught_signals, sigs[i]); - newact.sa_handler = sighandler; - newact.sa_mask = caught_signals; - newact.sa_flags = 0; - } -#endif + { + sigaction (sig[i], NULL, &act); + if (act.sa_handler != SIG_IGN) + sigaddset (&caught_signals, sig[i]); + } + + act.sa_handler = sighandler; + act.sa_mask = caught_signals; + act.sa_flags = 0; - { - unsigned int i; for (i = 0; i < nsigs; i++) - { - int sig = sigs[i]; -#ifdef SA_NOCLDSTOP - sigaction (sig, NULL, &oldact); - if (oldact.sa_handler != SIG_IGN) - sigaction (sig, &newact, NULL); + if (sigismember (&caught_signals, sig[i])) + sigaction (sig[i], &act, NULL); #else - if (signal (sig, SIG_IGN) != SIG_IGN) - signal (sig, sighandler); + for (i = 0; i < nsigs; i++) + if (signal (sig[i], SIG_IGN) != SIG_IGN) + signal (sig[i], sighandler); #endif - } } gkey.sword = gkey.eword = SIZE_MAX;