From: Kurt Zeilenga Date: Sun, 7 Feb 1999 19:42:24 +0000 (+0000) Subject: Import fix from devel to handle signals in all threads. X-Git-Tag: OPENLDAP_REL_ENG_1_2_0~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cbfbb7fb3b6090698368b558f96a3988a05774c6;p=thirdparty%2Fopenldap.git Import fix from devel to handle signals in all threads. --- diff --git a/CHANGES b/CHANGES index 731882db7b..d578d545c3 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ OpenLDAP Change Log Changes included in OpenLDAP 1.2 CVS Tag: OPENLDAP_REL_ENG_1_2 Fixed slapd/back-ldbm/cache entry lock assert bugs + Fixed slapd uncaught signals in main thread problem Build environment Fixed build/man.mk "ln -sf" bug diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 2b030598ad..d5a9410a6d 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -37,8 +37,6 @@ int dtblsize; Connection *c; static int slapd_shutdown = 0; -static void set_shutdown(int sig); -static void do_nothing (int sig); /* a link to the slapd.conf configuration parameters */ extern char *slapd_pid_file; @@ -129,13 +127,6 @@ slapd_daemon( exit( 1 ); } - (void) SIGNAL( SIGPIPE, SIG_IGN ); - (void) SIGNAL( LDAP_SIGUSR1, do_nothing ); - (void) SIGNAL( LDAP_SIGUSR2, set_shutdown ); - (void) SIGNAL( SIGTERM, set_shutdown ); - (void) SIGNAL( SIGINT, set_shutdown ); - (void) SIGNAL( SIGHUP, set_shutdown ); - Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 ); if (( slapd_pid_file != NULL ) && @@ -392,24 +383,26 @@ slapd_daemon( 0 ); be_close(); Debug( LDAP_DEBUG_ANY, "slapd stopping\n", 0, 0, 0 ); + return NULL; } -static void -set_shutdown( int sig ) +void +slap_set_shutdown( int sig ) { Debug( LDAP_DEBUG_ANY, "slapd got shutdown signal %d\n", sig, 0, 0 ); slapd_shutdown = 1; ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 ); - (void) SIGNAL( LDAP_SIGUSR2, set_shutdown ); - (void) SIGNAL( SIGTERM, set_shutdown ); - (void) SIGNAL( SIGINT, set_shutdown ); - (void) SIGNAL( SIGHUP, set_shutdown ); + + /* reinstall self */ + (void) SIGNAL( sig, slap_set_shutdown ); } -static void -do_nothing( int sig ) +void +slap_do_nothing( int sig ) { Debug( LDAP_DEBUG_TRACE, "slapd got do_nothing signal %d\n", sig, 0, 0 ); - (void) SIGNAL( LDAP_SIGUSR1, do_nothing ); + + /* reinstall self */ + (void) SIGNAL( sig, slap_do_nothing ); } diff --git a/servers/slapd/main.c b/servers/slapd/main.c index c0c474e4bf..d49513055c 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -189,6 +190,13 @@ main( int argc, char **argv ) if ( ! inetd ) { int status; + (void) SIGNAL( SIGPIPE, SIG_IGN ); + (void) SIGNAL( LDAP_SIGUSR1, slap_do_nothing ); + (void) SIGNAL( LDAP_SIGUSR2, slap_set_shutdown ); + (void) SIGNAL( SIGTERM, slap_set_shutdown ); + (void) SIGNAL( SIGINT, slap_set_shutdown ); + (void) SIGNAL( SIGHUP, slap_set_shutdown ); + time( &starttime ); if ( status = ldap_pvt_thread_create( &listener_tid, 0, diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 03f00e2f70..7a766f78c9 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -269,6 +269,11 @@ extern int be_group LDAP_P((Backend *be, Entry *target, char *objectclassValue, char *groupattrName)); extern void init LDAP_P((void)); extern void be_unbind LDAP_P((Connection *conn, Operation *op)); + +extern void * slapd_daemon LDAP_P((void *port)); +extern void slap_set_shutdown LDAP_P((int sig)); +extern void slap_do_nothing LDAP_P((int sig)); + extern void config_info LDAP_P((Connection *conn, Operation *op)); extern void do_abandon LDAP_P((Connection *conn, Operation *op)); extern void do_add LDAP_P((Connection *conn, Operation *op));