X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=e6b5e157cb15da24fc61717b9c864d0980152b31;hb=543c588772b22a029b60e72e45e68032935ecd54;hp=4adc2345ed268cd401b72100deab9c5a7d3a5e8c;hpb=e131aa424b2b9945c771c68228e8acacf7462eb4;p=openldap diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 4adc2345ed..e6b5e157cb 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -81,10 +81,9 @@ Listener **slap_listeners = NULL; static ber_socket_t wake_sds[2]; static int emfile; -static int waking; +static volatile int waking; #define WAKE_LISTENER(w) do { \ - if ((w) && waking < 5) { \ - waking++; \ + if ((w) && ++waking < 5) { \ tcp_write( wake_sds[1], "0", 1 ); \ } \ } while(0) @@ -95,6 +94,9 @@ volatile sig_atomic_t slapd_abrupt_shutdown = 0; static struct slap_daemon { ldap_pvt_thread_mutex_t sd_mutex; +#ifdef HAVE_TCPD + ldap_pvt_thread_mutex_t tcpd_mutex; +#endif ber_socket_t sd_nactives; int sd_nwriters; @@ -213,7 +215,7 @@ static struct slap_daemon { # define SLAP_EVENT_IS_READ(i) SLAP_CHK_EVENT((i), EPOLLIN) # define SLAP_EVENT_IS_WRITE(i) SLAP_CHK_EVENT((i), EPOLLOUT) # define SLAP_EVENT_IS_LISTENER(i) SLAP_EV_LISTENER(revents[(i)].data.ptr) -# define SLAP_EVENT_LISTENER(i) (revents[(i)].data.ptr) +# define SLAP_EVENT_LISTENER(i) ((Listener *)(revents[(i)].data.ptr)) # define SLAP_EVENT_FD(i) SLAP_EV_PTRFD(revents[(i)].data.ptr) @@ -280,7 +282,7 @@ static struct slap_daemon { if (!SLAP_SOCK_IS_WRITE(fd)) { FD_SET((fd), &slap_daemon.sd_writers); } \ } while(0) -# define SLAP_ADDTEST(s) do { } while 0 +# define SLAP_ADDTEST(s) # define SLAP_EVENT_MAX dtblsize # else # define SLAP_SOCK_SET_READ(fd) FD_SET((fd), &slap_daemon.sd_readers) @@ -1096,21 +1098,6 @@ static int slap_open_listener( return -1; } -#ifdef LDAP_CONNECTIONLESS - if( l.sl_is_udp ) { - long id = connection_init( l.sl_sd, &l, "", "", CONN_IS_UDP, - (slap_ssf_t) 0, NULL ); - - if( id < 0 ) { - Debug( LDAP_DEBUG_TRACE, - "slap_open_listener: connectionless init failed on %s (%d)\n", - url, l.sl_sd, 0 ); - return -1; - } - l.sl_is_udp++; - } -#endif - Debug( LDAP_DEBUG_TRACE, "daemon: listener initialized %s\n", l.sl_url.bv_val, 0, 0 ); return 0; @@ -1197,6 +1184,10 @@ int slapd_daemon_init( const char *urls ) ldap_charray_free( u ); ldap_pvt_thread_mutex_init( &slap_daemon.sd_mutex ); +#ifdef HAVE_TCPD + ldap_pvt_thread_mutex_init( &slap_daemon.tcpd_mutex ); +#endif + return !i; } @@ -1216,6 +1207,11 @@ slapd_daemon_destroy(void) } #endif +#ifdef HAVE_TCPD + ldap_pvt_thread_mutex_destroy( &slap_daemon.tcpd_mutex ); +#endif + + ldap_pvt_thread_mutex_destroy( &slap_daemon.sd_mutex ); return 0; } @@ -1472,20 +1468,25 @@ slap_listener( #endif /* SLAPD_RLOOKUPS */ #ifdef HAVE_TCPD - if ( !hosts_ctl("slapd", - dnsname != NULL ? dnsname : SLAP_STRING_UNKNOWN, - peeraddr != NULL ? peeraddr : SLAP_STRING_UNKNOWN, - SLAP_STRING_UNKNOWN )) { - /* DENY ACCESS */ - Statslog( LDAP_DEBUG_STATS, - "fd=%ld DENIED from %s (%s)\n", - (long) s, + int rc; + ldap_pvt_thread_mutex_lock( &slap_daemon.tcpd_mutex ); + rc = hosts_ctl("slapd", dnsname != NULL ? dnsname : SLAP_STRING_UNKNOWN, peeraddr != NULL ? peeraddr : SLAP_STRING_UNKNOWN, - 0, 0 ); - slapd_close(s); - return 0; + SLAP_STRING_UNKNOWN ); + ldap_pvt_thread_mutex_unlock( &slap_daemon.tcpd_mutex ); + if ( !rc ) { + /* DENY ACCESS */ + Statslog( LDAP_DEBUG_STATS, + "fd=%ld DENIED from %s (%s)\n", + (long) s, + dnsname != NULL ? dnsname : SLAP_STRING_UNKNOWN, + peeraddr != NULL ? peeraddr : SLAP_STRING_UNKNOWN, + 0, 0 ); + slapd_close(s); + return 0; + } } #endif /* HAVE_TCPD */ } @@ -1596,10 +1597,8 @@ slapd_daemon_task( * listening port. The listen() and accept() calls * are unnecessary. */ - if ( slap_listeners[l]->sl_is_udp ) { - slapd_add( slap_listeners[l]->sl_sd, 1, slap_listeners[l] ); + if ( slap_listeners[l]->sl_is_udp ) continue; - } #endif if ( listen( slap_listeners[l]->sl_sd, SLAPD_LISTEN_BACKLOG ) == -1 ) { @@ -1662,7 +1661,7 @@ slapd_daemon_task( } #ifdef HAVE_NT_SERVICE_MANAGER - if ( started_event != NULL ) } + if ( started_event != NULL ) { ldap_pvt_thread_cond_signal( &started_event ); } #endif @@ -1713,9 +1712,13 @@ slapd_daemon_task( ber_socket_t active; if( slapd_gentle_shutdown == 1 ) { + BackendDB *be; Debug( LDAP_DEBUG_ANY, "slapd gentle shutdown\n", 0, 0, 0 ); close_listeners( 1 ); frontendDB->be_restrictops |= SLAP_RESTRICT_OP_WRITES; + LDAP_STAILQ_FOREACH(be, &backendDB, be_next) { + be->be_restrictops |= SLAP_RESTRICT_OP_WRITES; + } slapd_gentle_shutdown = 2; } @@ -1723,7 +1726,7 @@ slapd_daemon_task( active = slap_daemon.sd_nactives; ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex ); if( active == 0 ) { - slapd_shutdown = 2; + slapd_shutdown = 1; break; } } @@ -1739,7 +1742,12 @@ slapd_daemon_task( if ( lr->sl_sd == AC_SOCKET_INVALID ) continue; - if ( lr->sl_mute || lr->sl_busy ) { +#ifdef SLAP_LIGHTWEIGHT_DISPATCHER + if ( lr->sl_mute || lr->sl_busy ) +#else + if ( lr->sl_mute ) +#endif + { SLAP_SOCK_CLR_READ( lr->sl_sd ); } else { SLAP_SOCK_SET_READ( lr->sl_sd ); @@ -1806,12 +1814,14 @@ slapd_daemon_task( continue; } +#ifdef SLAP_LIGHTWEIGHT_DISPATCHER if ( lr->sl_busy ) { Debug( LDAP_DEBUG_CONNS, "daemon: select: listen=%d busy\n", lr->sl_sd, 0, 0 ); continue; } +#endif Debug( LDAP_DEBUG_CONNS, "daemon: select: listen=%d active_threads=%d tvp=%s\n", @@ -1863,14 +1873,11 @@ slapd_daemon_task( #if SLAP_EVENTS_ARE_INDEXED if ( SLAP_EVENT_IS_READ( wake_sds[0] )) { + char c[BUFSIZ]; SLAP_EVENT_CLR_READ( wake_sds[0] ); - ns--; - { - char c[BUFSIZ]; - tcp_read( wake_sds[0], c, sizeof(c) ); - } - Debug( LDAP_DEBUG_CONNS, "daemon: waked\n", 0, 0, 0 ); waking = 0; + tcp_read( wake_sds[0], c, sizeof(c) ); + Debug( LDAP_DEBUG_CONNS, "daemon: waked\n", 0, 0, 0 ); continue; } @@ -2025,18 +2032,10 @@ slapd_daemon_task( * an event, so we could use pointers to the listener structure * instead of just the file descriptor. For /dev/poll we have to * search the listeners array for a matching descriptor. + * + * We now handle wake events when we see them; they are not given + * higher priority. */ - /* if waking is set and we woke up, we'll read whatever - * we can. - */ - if ( waking ) { - char c[BUFSIZ]; - tcp_read( wake_sds[0], c, sizeof(c) ); - waking = 0; - ns--; - continue; - } - #ifdef LDAP_DEBUG Debug( LDAP_DEBUG_CONNS, "daemon: activity on:", 0, 0, 0 ); @@ -2084,8 +2083,13 @@ slapd_daemon_task( if ( rc ) { fd = SLAP_EVENT_FD( i ); - /* Ignore wake events, they were handled above */ - if ( fd == wake_sds[0] ) continue; + /* Handle wake events */ + if ( fd == wake_sds[0] ) { + char c[BUFSIZ]; + waking = 0; + tcp_read( wake_sds[0], c, sizeof(c) ); + break; + } if( SLAP_EVENT_IS_WRITE( i ) ) { Debug( LDAP_DEBUG_CONNS, @@ -2173,11 +2177,41 @@ slapd_daemon_task( } +#ifdef LDAP_CONNECTIONLESS +static int connectionless_init(void) +{ + int l; + + for ( l = 0; slap_listeners[l] != NULL; l++ ) { + Listener *lr = slap_listeners[l]; + long id; + + if( !lr->sl_is_udp ) { + continue; + } + + id = connection_init( lr->sl_sd, lr, "", "", CONN_IS_UDP, (slap_ssf_t) 0, NULL ); + + if( id < 0 ) { + Debug( LDAP_DEBUG_TRACE, + "connectionless_init: failed on %s (%d)\n", lr->sl_url, lr->sl_sd, 0 ); + return -1; + } + lr->sl_is_udp++; + } + + return 0; +} +#endif /* LDAP_CONNECTIONLESS */ + int slapd_daemon( void ) { int rc; connections_init(); +#ifdef LDAP_CONNECTIONLESS + connectionless_init(); +#endif #define SLAPD_LISTENER_THREAD 1 #if defined( SLAPD_LISTENER_THREAD )