X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=f8a45f357b72c9a56b2bf9108b92dee8c67bc9bd;hb=e2b5b211558ee778f07954d3843b914f19f6c6b5;hp=32cdf25d292d252d1e829faebddd27964006a169;hpb=b0aea66d1dd3deec393c373ef53ee9adfaed761e;p=openldap diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 32cdf25d29..f8a45f357b 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1,5 +1,4 @@ #include "portable.h" -//#include "portable_err.h" #include @@ -22,12 +21,13 @@ int deny_severity = LOG_NOTICE; #endif /* TCP Wrappers */ /* globals */ -int dtblsize; -static int tcps; +ber_socket_t dtblsize; +static ber_socket_t tcps; #ifdef HAVE_WINSOCK2 -// in nt_main.c +/* in nt_main.c */ extern ldap_pvt_thread_cond_t started_event; + /* forward reference */ void hit_socket(); /* In wsa_err.c */ @@ -79,7 +79,7 @@ struct slap_daemon { /* * Add a descriptor to daemon control */ -static void slapd_add(int s) { +static void slapd_add(ber_socket_t s) { ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex ); assert( !FD_ISSET( s, &slap_daemon.sd_actives )); @@ -92,10 +92,11 @@ static void slapd_add(int s) { } #endif - FD_SET( (unsigned) s, &slap_daemon.sd_actives ); - FD_SET( (unsigned) s, &slap_daemon.sd_readers ); + FD_SET( s, &slap_daemon.sd_actives ); + FD_SET( s, &slap_daemon.sd_readers ); - Debug( LDAP_DEBUG_CONNS, "daemon: added %d%s%s\n", s, + Debug( LDAP_DEBUG_CONNS, "daemon: added %ld%s%s\n", + (long) s, FD_ISSET(s, &slap_daemon.sd_readers) ? "r" : "", FD_ISSET(s, &slap_daemon.sd_writers) ? "w" : "" ); @@ -105,27 +106,28 @@ static void slapd_add(int s) { /* * Remove the descriptor from daemon control */ -void slapd_remove(int s, int wake) { +void slapd_remove(ber_socket_t s, int wake) { ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex ); WAKE_LISTENER(wake); - Debug( LDAP_DEBUG_CONNS, "daemon: removing %d%s%s\n", s, + Debug( LDAP_DEBUG_CONNS, "daemon: removing %ld%s%s\n", + (long) s, FD_ISSET(s, &slap_daemon.sd_readers) ? "r" : "", FD_ISSET(s, &slap_daemon.sd_writers) ? "w" : "" ); - FD_CLR( (unsigned) s, &slap_daemon.sd_actives ); - FD_CLR( (unsigned) s, &slap_daemon.sd_readers ); - FD_CLR( (unsigned) s, &slap_daemon.sd_writers ); + FD_CLR( s, &slap_daemon.sd_actives ); + FD_CLR( s, &slap_daemon.sd_readers ); + FD_CLR( s, &slap_daemon.sd_writers ); ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex ); } -void slapd_clr_write(int s, int wake) { +void slapd_clr_write(ber_socket_t s, int wake) { ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex ); WAKE_LISTENER(wake); - assert( FD_ISSET( (unsigned) s, &slap_daemon.sd_actives) ); - FD_CLR( (unsigned) s, &slap_daemon.sd_writers ); + assert( FD_ISSET( s, &slap_daemon.sd_actives) ); + FD_CLR( s, &slap_daemon.sd_writers ); ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex ); @@ -134,7 +136,7 @@ void slapd_clr_write(int s, int wake) { } } -void slapd_set_write(int s, int wake) { +void slapd_set_write(ber_socket_t s, int wake) { ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex ); WAKE_LISTENER(wake); @@ -148,12 +150,12 @@ void slapd_set_write(int s, int wake) { } } -void slapd_clr_read(int s, int wake) { +void slapd_clr_read(ber_socket_t s, int wake) { ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex ); WAKE_LISTENER(wake); assert( FD_ISSET( s, &slap_daemon.sd_actives) ); - FD_CLR( (unsigned) s, &slap_daemon.sd_readers ); + FD_CLR( s, &slap_daemon.sd_readers ); ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex ); @@ -162,12 +164,12 @@ void slapd_clr_read(int s, int wake) { } } -void slapd_set_read(int s, int wake) { +void slapd_set_read(ber_socket_t s, int wake) { ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex ); WAKE_LISTENER(wake); assert( FD_ISSET( s, &slap_daemon.sd_actives) ); - FD_SET( (unsigned) s, &slap_daemon.sd_readers ); + FD_SET( s, &slap_daemon.sd_readers ); ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex ); @@ -176,8 +178,9 @@ void slapd_set_read(int s, int wake) { } } -static void slapd_close(int s) { - Debug( LDAP_DEBUG_CONNS, "daemon: closing %d\n", s, 0, 0 ); +static void slapd_close(ber_socket_t s) { + Debug( LDAP_DEBUG_CONNS, "daemon: closing %ld\n", + (long) s, 0, 0 ); tcp_close(s); } @@ -186,7 +189,8 @@ static void slapd_close(int s) { int set_socket( struct sockaddr_in *addr ) { - int tcps = -1; + ber_socket_t tcps = AC_SOCKET_INVALID; + if ( !daemon_initialized ) sockinit(); #ifdef HAVE_SYSCONF @@ -206,7 +210,7 @@ set_socket( struct sockaddr_in *addr ) if( addr != NULL ) { int tmp; - if ( (tcps = socket( AF_INET, SOCK_STREAM, 0 )) == -1 ) { + if ( (tcps = socket( AF_INET, SOCK_STREAM, 0 )) == AC_SOCKET_INVALID ) { #ifndef HAVE_WINSOCK int err = errno; Debug( LDAP_DEBUG_ANY, @@ -219,15 +223,15 @@ set_socket( struct sockaddr_in *addr ) WSAGetLastError(), WSAGetLastErrorString(), 0 ); #endif - exit( 1 ); + return( -1 ); } #ifndef HAVE_WINSOCK if ( tcps >= dtblsize ) { Debug( LDAP_DEBUG_ANY, - "daemon: listener descriptor %d is too great\n", - tcps, dtblsize, 0 ); - exit( 1 ); + "daemon: listener descriptor %ld is too great %ld\n", + (long) tcps, (long) dtblsize, 0 ); + return( -1); } #endif @@ -238,8 +242,8 @@ set_socket( struct sockaddr_in *addr ) { int err = errno; Debug( LDAP_DEBUG_ANY, - "slapd(%d): setsockopt() failed errno %d (%s)\n", - tcps, err, + "slapd(%ld): setsockopt() failed errno %d (%s)\n", + (long) tcps, err, err > -1 && err < sys_nerr ? sys_errlist[err] : "unknown" ); } @@ -251,8 +255,8 @@ set_socket( struct sockaddr_in *addr ) { int err = errno; Debug( LDAP_DEBUG_ANY, - "slapd(%d): setsockopt(KEEPALIVE) failed errno %d (%s)\n", - tcps, err, + "slapd(%ld): setsockopt(KEEPALIVE) failed errno %d (%s)\n", + (long) tcps, err, err > -1 && err < sys_nerr ? sys_errlist[err] : "unknown" ); } @@ -261,11 +265,11 @@ set_socket( struct sockaddr_in *addr ) if ( bind( tcps, (struct sockaddr *) addr, sizeof(*addr) ) == -1 ) { int err = errno; - Debug( LDAP_DEBUG_ANY, "daemon: bind(%d) failed errno %d (%s)\n", - tcps, err, + Debug( LDAP_DEBUG_ANY, "daemon: bind(%ld) failed errno %d (%s)\n", + (long) tcps, err, err > -1 && err < sys_nerr ? sys_errlist[err] : "unknown" ); - exit( 1 ); + return -1; } } @@ -282,7 +286,6 @@ slapd_daemon_task( struct sockaddr_in *slapd_addr = args->addr; tcps = args->tcps; - free( ptr ); inetd = ( slapd_addr == NULL); if ( !daemon_initialized ) sockinit(); @@ -297,22 +300,21 @@ slapd_daemon_task( if ( listen( tcps, 5 ) == -1 ) { int err = errno; Debug( LDAP_DEBUG_ANY, - "daemon: listen(%d, 5) failed errno %d (%s)\n", - tcps, err, + "daemon: listen(%ld, 5) failed errno %d (%s)\n", + (long) tcps, err, err > -1 && err < sys_nerr ? sys_errlist[err] : "unknown" ); - exit( 1 ); + return( (void*)-1 ); } slapd_add( tcps ); } else { - if( connection_init( 0, NULL, NULL ) ) { + if( connection_init( (ber_socket_t) 0, NULL, NULL ) ) { Debug( LDAP_DEBUG_ANY, "connection_init(%d) failed.\n", 0, 0, 0 ); - - exit( 1 ); + return( (void*)-1 ); } slapd_add( 0 ); @@ -322,12 +324,20 @@ slapd_daemon_task( if ( started_event != NULL ) ldap_pvt_thread_cond_signal( &started_event ); #endif - // initialization complete. Here comes the loop. + /* initialization complete. Here comes the loop. */ + while ( !slapd_shutdown ) { - unsigned int i; - int ns, nfds; - int ebadf = 0; + ber_socket_t i; + int ns; + int at; + ber_socket_t nfds; #define SLAPD_EBADF_LIMIT 10 + int ebadf = 0; + +#define SLAPD_IDLE_CHECK_LIMIT 4 + time_t last_idle_check = slap_get_time(); + time_t now; + fd_set readfds; fd_set writefds; @@ -342,6 +352,13 @@ slapd_daemon_task( char *client_name; char *client_addr; + if( global_idletimeout > 0 && difftime( + last_idle_check+global_idletimeout/SLAPD_IDLE_CHECK_LIMIT, + now ) < 0 ) + { + connections_timeout_idle(now); + } + FD_ZERO( &writefds ); FD_ZERO( &readfds ); @@ -375,21 +392,31 @@ slapd_daemon_task( ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex ); ldap_pvt_thread_mutex_lock( &active_threads_mutex ); + at = active_threads; + ldap_pvt_thread_mutex_unlock( &active_threads_mutex ); + #if defined( HAVE_YIELDING_SELECT ) || defined( NO_THREADS ) tvp = NULL; #else - tvp = active_threads ? &zero : NULL; + tvp = at ? &zero : NULL; #endif Debug( LDAP_DEBUG_CONNS, "daemon: select: tcps=%d active_threads=%d tvp=%s\n", - tcps, active_threads, + tcps, at, tvp == NULL ? "NULL" : "zero" ); - ldap_pvt_thread_mutex_unlock( &active_threads_mutex ); - switch(ns = select( nfds, &readfds, &writefds, 0, tvp )) { + switch(ns = select( nfds, &readfds, +#ifdef HAVE_WINSOCK + /* don't pass empty fd_set */ + ( writefds.fd_count > 0 ? &writefds : NULL ), +#else + &writefds, +#endif + NULL, tvp )) + { case -1: { /* failure - try again */ #ifdef HAVE_WINSOCK int err = WSAGetLastError(); @@ -430,17 +457,17 @@ slapd_daemon_task( } if ( FD_ISSET( tcps, &readfds ) ) { - int s; + ber_int_t s; int len = sizeof(from); long id; if ( (s = accept( tcps, - (struct sockaddr *) &from, &len )) == -1 ) + (struct sockaddr *) &from, &len )) == AC_SOCKET_INVALID ) { int err = errno; Debug( LDAP_DEBUG_ANY, - "daemon: accept(%d) failed errno %d (%s)\n", err, - tcps, err >= 0 && err < sys_nerr ? + "daemon: accept(%ld) failed errno %d (%s)\n", err, + (long) tcps, err >= 0 && err < sys_nerr ? sys_errlist[err] : "unknown"); continue; } @@ -461,15 +488,15 @@ slapd_daemon_task( /* make sure descriptor number isn't too great */ if ( s >= dtblsize ) { Debug( LDAP_DEBUG_ANY, - "daemon: %d beyond descriptor table size %d\n", - s, dtblsize, 0 ); + "daemon: %ld beyond descriptor table size %ld\n", + (long) s, (long) dtblsize, 0 ); slapd_close(s); continue; } #endif - Debug( LDAP_DEBUG_CONNS, "daemon: new connection on %d\n", - s, 0, 0 ); + Debug( LDAP_DEBUG_CONNS, "daemon: new connection on %ld\n", + (long) s, 0, 0 ); len = sizeof(from); if ( getpeername( s, (struct sockaddr *) &from, &len ) == 0 ) { @@ -509,8 +536,8 @@ slapd_daemon_task( { /* DENY ACCESS */ Statslog( LDAP_DEBUG_ANY, - "fd=%d connection from %s (%s) denied.\n", - s, + "fd=%ld connection from %s (%s) denied.\n", + (long) s, client_name == NULL ? "unknown" : client_name, client_addr == NULL ? "unknown" : client_addr, 0, 0 ); @@ -522,8 +549,8 @@ slapd_daemon_task( if( (id = connection_init(s, client_name, client_addr)) < 0 ) { Debug( LDAP_DEBUG_ANY, - "daemon: connection_init(%d, %s, %s) failed.\n", - s, + "daemon: connection_init(%ld, %s, %s) failed.\n", + (long) s, client_name == NULL ? "unknown" : client_name, client_addr == NULL ? "unknown" : client_addr); slapd_close(s); @@ -531,8 +558,8 @@ slapd_daemon_task( } Statslog( LDAP_DEBUG_STATS, - "daemon: conn=%d fd=%d connection from %s (%s) accepted.\n", - id, s, + "daemon: conn=%d fd=%ld connection from %s (%s) accepted.\n", + id, (long) s, client_name == NULL ? "unknown" : client_name, client_addr == NULL ? "unknown" : client_addr, 0 ); @@ -545,10 +572,12 @@ slapd_daemon_task( Debug( LDAP_DEBUG_CONNS, "daemon: activity on:", 0, 0, 0 ); #ifdef HAVE_WINSOCK for ( i = 0; i < readfds.fd_count; i++ ) { - Debug( LDAP_DEBUG_CONNS, " %d%s", readfds.fd_array[i], "r" ); + Debug( LDAP_DEBUG_CONNS, " %d%s", + readfds.fd_array[i], "r", 0 ); } for ( i = 0; i < writefds.fd_count; i++ ) { - Debug( LDAP_DEBUG_CONNS, " %d%s", writefds.fd_array[i], "w" ); + Debug( LDAP_DEBUG_CONNS, " %d%s", + writefds.fd_array[i], "w", 0 ); } #else for ( i = 0; i < nfds; i++ ) { @@ -572,7 +601,7 @@ slapd_daemon_task( for ( i = 0; i < nfds; i++ ) #endif { - int wd; + ber_socket_t wd; #ifdef HAVE_WINSOCK wd = writefds.fd_array[i]; @@ -609,7 +638,7 @@ slapd_daemon_task( for ( i = 0; i < nfds; i++ ) #endif { - int rd; + ber_socket_t rd; #ifdef HAVE_WINSOCK rd = readfds.fd_array[i]; @@ -749,11 +778,12 @@ void sockinit() void hit_socket() { - int s, on = 1; + ber_socket_t s; + int on = 1; extern struct sockaddr_in bind_addr; /* throw something at the socket to terminate the select() in the daemon thread. */ - if (( s = socket( AF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET ) + if (( s = socket( AF_INET, SOCK_STREAM, 0 )) == AC_SOCKET_INVALID ) Debug( LDAP_DEBUG_ANY, "slap_set_shutdown: socket failed\n\tWSAGetLastError=%d (%s)\n", WSAGetLastError(), WSAGetLastErrorString(), 0 ); @@ -767,7 +797,8 @@ void hit_socket() if ( connect( s, (struct sockaddr *)&bind_addr, sizeof( struct sockaddr_in )) == SOCKET_ERROR ) { Debug( LDAP_DEBUG_ANY, - "hit_socket: error on connect: %d\n", WSAGetLastError(), 0 ); + "hit_socket: error on connect: %d\n", + WSAGetLastError(), 0, 0 ); /* we can probably expect some error to occur here, mostly WSAEWOULDBLOCK */ } @@ -786,7 +817,6 @@ void sockinit() void sockinit() { daemon_initialized = 1; - return; } #endif @@ -799,10 +829,10 @@ slap_set_shutdown( int sig ) ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 ); } #else - Debug( LDAP_DEBUG_TRACE, "Shutdown %d ordered", sig, 0 ); - // trying to "hit" the socket seems to always get a - // EWOULDBLOCK error, so just close the listen socket to - // break out of the select since we're shutting down anyway + Debug( LDAP_DEBUG_TRACE, "Shutdown %d ordered", sig, 0, 0 ); + /* trying to "hit" the socket seems to always get a */ + /* EWOULDBLOCK error, so just close the listen socket to */ + /* break out of the select since we're shutting down anyway */ tcp_close( tcps ); #endif /* reinstall self */