From e806808e1acf1cc9784832cd98d171b887f4f018 Mon Sep 17 00:00:00 2001
From: Peter S. Mazinger <ps.m@gmx.net>
Date: Sun, 24 Apr 2011 00:21:30 +0200
Subject: [PATCH 355/396] sigpause.c: provide the X/Open variant, since the BSD version is deprecated

Do not export __sigpause.
Provide __bsd_sigpause (unprototyped) if anyone may need it.
Adapt cancellation to use cancel.h.

Signed-off-by: Peter S. Mazinger <ps.m@gmx.net>
---
 include/signal.h       |   11 +++++++----
 libc/signal/sigpause.c |   38 ++++++++++++--------------------------
 2 files changed, 19 insertions(+), 30 deletions(-)

diff --git a/include/signal.h b/include/signal.h
index 2273750..33cada6 100644
--- a/include/signal.h
+++ b/include/signal.h
@@ -190,17 +190,20 @@ extern void psignal (int __sig, __const char *__s);
 
    This function is a cancellation point and therefore not marked with
    __THROW.  */
-extern int __sigpause (int __sig_or_mask, int __is_sig);
+/*extern int __sigpause (int __sig_or_mask, int __is_sig);*/
 
 #ifdef __FAVOR_BSD
 /* Set the mask of blocked signals to MASK,
    wait for a signal to arrive, and then restore the mask.  */
-extern int sigpause (int __mask) __THROW __attribute_deprecated__;
-# define sigpause(mask) __sigpause ((mask), 0)
+/*extern int sigpause (int __mask) __THROW __attribute_deprecated__;
+# define sigpause(mask) __sigpause ((mask), 0)*/
+/* uClibc note: BSD sigpause is available as __bsd_sigpause.
+ * It is intentionally not prototyped */
 #else
 # ifdef __USE_XOPEN
 /* Remove a signal from the signal mask and suspend the process.  */
-#  define sigpause(sig) __sigpause ((sig), 1)
+extern int sigpause(int __sig);
+/*#  define sigpause(sig) __sigpause ((sig), 1)*/
 # endif
 #endif
 #endif /* __UCLIBC_SUSV4_LEGACY__ */
diff --git a/libc/signal/sigpause.c b/libc/signal/sigpause.c
index ebd7af3..63afeea 100644
--- a/libc/signal/sigpause.c
+++ b/libc/signal/sigpause.c
@@ -17,22 +17,16 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#define __UCLIBC_HIDE_DEPRECATED__
-/* psm: need the BSD version of sigpause here */
-#include <errno.h>
-#define __FAVOR_BSD
 #include <signal.h>
 #define __need_NULL
 #include <stddef.h>
-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
-#include <sysdep-cancel.h>
-#endif
+#include <cancel.h>
 
 #include "sigset-cvt-mask.h"
 
 /* Set the mask of blocked signals to MASK,
    wait for a signal to arrive, and then restore the mask.  */
-static int __internal_sigpause (int sig_or_mask, int is_sig)
+static int __sigpause (int sig_or_mask, int is_sig)
 {
   sigset_t set;
 
@@ -50,29 +44,21 @@ static int __internal_sigpause (int sig_or_mask, int is_sig)
   /* Note the sigpause() is a cancellation point.  But since we call
      sigsuspend() which itself is a cancellation point we do not have
      to do anything here.  */
-  return sigsuspend (&set);
+  /* uClibc note: not true on uClibc, we call the non-cancellable version */
+  return __NC(sigsuspend)(&set);
 }
-strong_alias(__internal_sigpause,__sigpause)
 
-#undef sigpause
+int __bsd_sigpause(int mask);
+int __bsd_sigpause(int mask)
+{
+	return __sigpause(mask, 0);
+}
 
 /* We have to provide a default version of this function since the
    standards demand it.  The version which is a bit more reasonable is
    the BSD version.  So make this the default.  */
-int sigpause (int mask)
+static int __NC(sigpause)(int sig)
 {
-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
-  if (SINGLE_THREAD_P)
-    return __internal_sigpause (mask, 0);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = __internal_sigpause (mask, 0);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-#else
-  return __internal_sigpause (mask, 0);
-#endif
+	return __sigpause(sig, 1);
 }
+CANCELLABLE_SYSCALL(int, sigpause, (int sig), (sig))
-- 
1.7.0.4

