]> git.sur5r.net Git - openldap/commitdiff
Use sigaction to set SA_RESTART (if appropriate).
authorKurt Zeilenga <kurt@openldap.org>
Sat, 22 Jul 2000 00:37:51 +0000 (00:37 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sat, 22 Jul 2000 00:37:51 +0000 (00:37 +0000)
Portability of this code needs to tested.

clients/gopher/go500.c
clients/gopher/go500gw.c
clients/ud/main.c
include/ac/signal.h
libraries/liblutil/Makefile.in
libraries/liblutil/signal.c [new file with mode: 0644]
servers/slapd/daemon.c
servers/slapd/main.c
servers/slurpd/admin.c
servers/slurpd/fm.c

index 51a3dbb9032a7ef2dfa9ae8aa7f25af5579d234d..2b7c4ed6752af712cff475b8d0cdf4caf5c51fd2 100644 (file)
@@ -345,7 +345,7 @@ wait4child( int sig )
                ;       /* NULL */
 #endif
 
-       (void) SIGNAL( SIGCHLD, wait4child );
+       (void) SIGNAL_REINSTALL ( SIGCHLD, wait4child );
 }
 
 static void
index 4943f97a8d7ae28ddd78a8000ed40467e8423935..efe5054d811d97c2bcb67c7e32d0f6f0c11fe69b 100644 (file)
@@ -371,7 +371,7 @@ wait4child( int sig )
                ;       /* NULL */
 #endif
 
-       (void) SIGNAL( SIGCHLD, wait4child );
+       (void) SIGNAL_REINSTALL ( SIGCHLD, wait4child );
 }
 
 static void
index 97d138fa388579cc4ace035339af77635699ad8d..aebf89c4dc83e8919d70e27f696cdd5fbe48b4be 100644 (file)
@@ -727,7 +727,7 @@ attn( int sig )
        fflush(stdout);
        printf("\n\n  INTERRUPTED!\n");
 
-       (void) SIGNAL (SIGINT, attn);
+       (void) SIGNAL_REINSTALL (SIGINT, attn);
 
        longjmp(env, 1);
 }
@@ -746,6 +746,6 @@ chwinsz( int sig )
                        col_size = win.ws_col;
        }
 
-       (void) SIGNAL (SIGWINCH, chwinsz);
+       (void) SIGNAL_REINSTALL (SIGWINCH, chwinsz);
 }
 #endif
index faca4c66ad285b732f7f35649bd58df88d9c153b..a026014921fb1a5d49bf0fd7b923c2fc533203cf 100644 (file)
 #include <signal.h>
 
 #undef SIGNAL
-#ifdef HAVE_SIGSET
+
+#if defined( HAVE_SIGACTION )
+#define SIGNAL lutil_sigaction
+typedef void (*lutil_sig_t)(int);
+LDAP_LUTIL_F(lutil_sig_t) lutil_sigaction( int sig, sig_t func );
+#define SIGNAL_REINSTALL(sig,act)      (void)0
+#elif defined( HAVE_SIGSET )
 #define SIGNAL sigset
+#define SIGNAL_REINSTALL sigset
 #else
 #define SIGNAL signal
+#define SIGNAL_REINSTALL signal
 #endif
 
 #if !defined( LDAP_SIGUSR1 ) || !defined( LDAP_SIGUSR2 )
index 7baa43eb98bfd501c447ef86de9ecb7853b25399..bb85c616c9f77de6076f56e81d899563c72d3560 100644 (file)
@@ -13,11 +13,11 @@ NT_OBJS = ntservice.o slapdmsg.res
 UNIX_SRCS = detach.c
 UNIX_OBJS = detach.o
 
-SRCS   = base64.c debug.c entropy.c sasl.c \
+SRCS   = base64.c debug.c entropy.c sasl.c signal.c \
        md5.c passwd.c sha1.c getpass.c lockf.c utils.c sockpair.c \
        @LIBSRCS@ $(@PLAT@_SRCS)
 
-OBJS   = base64.o debug.o entropy.o sasl.o \
+OBJS   = base64.o debug.o entropy.o sasl.o signal.o \
        md5.o passwd.o sha1.o getpass.o lockf.o utils.o sockpair.o \
        @LIBOBJS@ $(@PLAT@_OBJS)
 
diff --git a/libraries/liblutil/signal.c b/libraries/liblutil/signal.c
new file mode 100644 (file)
index 0000000..230a265
--- /dev/null
@@ -0,0 +1,33 @@
+/* $OpenLDAP$ */
+/*
+ * Copyright 2000 The OpenLDAP Foundation
+ * COPYING RESTRICTIONS APPLY.  See COPYRIGHT File in top level directory
+ * of this package for details.
+ */
+
+#include "portable.h"
+
+#ifdef HAVE_SIGACTION
+#include <ac/signal.h>
+
+lutil_sig_t
+lutil_sigaction(int sig, lutil_sig_t func)
+{
+       int rc;
+       struct sigaction action, oaction;
+
+       memset( &action, '\0', sizeof(action) );
+
+       action.sa_handler = func;
+       sigemptyset( &action.sa_mask );
+#ifdef SA_RESTART
+       action.sa_flags != SA_RESTART;
+#endif
+       
+       if( sigaction( sig, &action, &oaction ) != 0 ) {
+               return NULL;
+       }
+
+       return oaction.sa_handler;
+}
+#endif
index 8f50d623d160a28f087058f2857704d635c3be5c..671648a5bd195a555640496efe8d8e71ec0f19f9 100644 (file)
@@ -1276,7 +1276,7 @@ slap_sig_shutdown( int sig )
        WAKE_LISTENER(1);
 
        /* reinstall self */
-       (void) SIGNAL( sig, slap_sig_shutdown );
+       (void) SIGNAL_REINSTALL( sig, slap_sig_shutdown );
 }
 
 RETSIGTYPE
@@ -1285,5 +1285,5 @@ slap_sig_wake( int sig )
        WAKE_LISTENER(1);
 
        /* reinstall self */
-       (void) SIGNAL( sig, slap_sig_wake );
+       (void) SIGNAL_REINSTALL( sig, slap_sig_wake );
 }
index d1cde5e9593402a622aecfc8e3ce987661a40ce8..c9d765b0c838e5c84a31fa7712080141c26f09b0 100644 (file)
@@ -515,7 +515,7 @@ wait4child( int sig )
 #else
     (void) wait( NULL );
 #endif
-    (void) SIGNAL( sig, wait4child );
+    (void) SIGNAL_REINSTALL( sig, wait4child );
     errno = save_errno;
 }
 
index d3017932e12c19b190bba068ed031082b4ca3cc9..5425258fad277df46670337ebf8da66074212cd7 100644 (file)
@@ -40,5 +40,5 @@ RETSIGTYPE
 do_admin( int sig )
 {
     sglob->rq->rq_dump( sglob->rq );
-    (void) SIGNAL( sig, do_admin );
+    (void) SIGNAL_REINSTALL( sig, do_admin );
 }
index 75c1afed027b74da2036f8bc638b748c3adeab35..90b89bbe1c258df4165e6674c50de21739ceb847 100644 (file)
@@ -144,7 +144,7 @@ set_shutdown(int sig)
        (sglob->replicas[ i ])->ri_wake( sglob->replicas[ i ]);
     }
     sglob->rq->rq_unlock( sglob->rq );                 /* unlock queue */
-    (void) SIGNAL( sig, set_shutdown );        /* reinstall handlers */
+    (void) SIGNAL_REINSTALL( sig, set_shutdown );      /* reinstall handlers */
 }
 
 
@@ -156,7 +156,7 @@ set_shutdown(int sig)
 RETSIGTYPE
 do_nothing(int sig)
 {
-    (void) SIGNAL( sig, do_nothing );
+    (void) SIGNAL_REINSTALL( sig, do_nothing );
 }