inttostr: aesthetics and improved (compile-time) safety
[gnulib.git] / tests / test-sigaction.c
index 81abe89..2269b69 100644 (file)
@@ -1,5 +1,5 @@
 /* Test of sigaction() function.
-   Copyright (C) 2008 Free Software Foundation, Inc.
+   Copyright (C) 2008, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
     }                                                                       \
   while (0)
 
+#ifndef SA_NOCLDSTOP
+# define SA_NOCLDSTOP 0
+#endif
+#ifndef SA_ONSTACK
+# define SA_ONSTACK 0
+#endif
 #ifndef SA_SIGINFO
 # define SA_SIGINFO 0
 #endif
+#ifndef SA_NOCLDWAIT
+# define SA_NOCLDWAIT 0
+#endif
+
+/* 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 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
@@ -61,7 +76,12 @@ handler (int sig)
       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);
@@ -69,29 +89,36 @@ handler (int sig)
 }
 
 int
-main (int argc, char *argv[])
+main (void)
 {
   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 == 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;
 }