/* Define a mask of flags required by POSIX. Some implementations
provide other flags as extensions, such as SA_RESTORER, that we
must ignore in this test. */
-#define SA_MASK (SA_NOCLDSTOP | SA_ONSTACK | SA_RESETHAND | SA_RESTART \
- SA_SIGINFO | SA_NOCLDWAIT | SA_NODEFER)
+#define MASK_SA_FLAGS (SA_NOCLDSTOP | SA_ONSTACK | SA_RESETHAND | SA_RESTART \
+ | SA_SIGINFO | SA_NOCLDWAIT | SA_NODEFER)
/* This test is unsafe in the presence of an asynchronous SIGABRT,
because we install a signal-handler that is intentionally not
ASSERT (sa.sa_handler == handler);
break;
case 1:
+ /* This assertion fails on glibc-2.3.6 systems with LinuxThreads,
+ when this program is linked with -lpthread, due to the sigaction()
+ override in libpthread.so. */
+#if !defined __GLIBC__
ASSERT (sa.sa_handler == SIG_DFL);
+#endif
break;
default:
ASSERT (0);
struct sigaction sa;
struct sigaction old_sa;
sa.sa_handler = handler;
+
sa.sa_flags = 0;
ASSERT (sigemptyset (&sa.sa_mask) == 0);
ASSERT (sigaction (SIGABRT, &sa, NULL) == 0);
ASSERT (raise (SIGABRT) == 0);
+
sa.sa_flags = SA_RESETHAND | SA_NODEFER;
ASSERT (sigaction (SIGABRT, &sa, &old_sa) == 0);
- ASSERT ((old_sa.sa_flags & SA_MASK) == 0);
+ ASSERT ((old_sa.sa_flags & MASK_SA_FLAGS) == 0);
ASSERT (old_sa.sa_handler == handler);
ASSERT (raise (SIGABRT) == 0);
+
sa.sa_handler = SIG_DFL;
ASSERT (sigaction (SIGABRT, &sa, &old_sa) == 0);
ASSERT ((old_sa.sa_flags & SA_SIGINFO) == 0);
+#if !defined __GLIBC__ /* see above */
ASSERT (old_sa.sa_handler == SIG_DFL);
+#endif
+
sa.sa_handler = SIG_IGN;
ASSERT (sigaction (SIGABRT, &sa, NULL) == 0);
ASSERT (raise (SIGABRT) == 0);
ASSERT (sigaction (SIGABRT, NULL, &old_sa) == 0);
ASSERT (old_sa.sa_handler == SIG_IGN);
ASSERT (raise (SIGABRT) == 0);
+
return 0;
}