signal.c.patch   [plain text]


--- signal.c.orig	2009-11-07 14:51:38.000000000 -0800
+++ signal.c	2009-11-07 14:51:40.000000000 -0800
@@ -43,10 +43,13 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/sig
 
 sigset_t _sigintr;		/* shared with siginterrupt */
 
-sig_t
-signal(s, a)
+extern int _sigaction_nobind (int sig, const struct sigaction *nsv, struct sigaction *osv);
+
+static sig_t
+signal__(s, a, bind)
 	int s;
 	sig_t a;
+	int bind;
 {
 	struct sigaction sa, osa;
 
@@ -55,7 +58,34 @@ signal(s, a)
 	sa.sa_flags = 0;
 	if (!sigismember(&_sigintr, s))
 		sa.sa_flags |= SA_RESTART;
+#if defined(__DYNAMIC__)
+	if (bind) {
+#endif /* __DYNAMIC__ */
 	if (_sigaction(s, &sa, &osa) < 0)
 		return (SIG_ERR);
+#if defined(__DYNAMIC__)
+	} else {
+	    if (_sigaction_nobind(s, &sa, &osa) < 0)
+		return (SIG_ERR);
+	}
+#endif /* __DYNAMIC__ */
 	return (osa.sa_handler);
 }
+
+sig_t
+signal(s, a)
+        int s;
+        sig_t a;
+{
+    return signal__(s, a, 1);
+}
+
+#if defined(__DYNAMIC__)
+sig_t
+_signal_nobind(s, a)
+        int s;
+        sig_t a;
+{
+    return signal__(s, a, 0);
+}
+#endif /* __DYNAMIC__ */