From: Kurt Zeilenga Date: Thu, 21 Sep 2000 19:11:39 +0000 (+0000) Subject: ITS#760: set nodelay and keep alive after accept() as some (broken) X-Git-Tag: OPENLDAP_REL_ENG_2_0_4~5 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=2fffee4611b83d8f19b1a9ff30929b6921b5ed49;p=openldap ITS#760: set nodelay and keep alive after accept() as some (broken) systems don't copy all properties of listening socket to the new socket. --- diff --git a/CHANGES b/CHANGES index 40908b50fc..c9fc0a5fa5 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ OpenLDAP 2.0.x Engineering Fixed slapd SASL log error (ITS#759) Fixed slapd spasswd support (ITS#751) Updated slurpd SASL support + Added slapd accept(2) sockopt workaround (ITS#760) Added slurpd TLS support Removed lint Build Environment diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index bca5aed17b..6c8ec21649 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -402,30 +402,6 @@ static Listener * open_listener( const char* url ) (long) l.sl_sd, err, sock_errstr(err) ); } #endif -#ifdef SO_KEEPALIVE - /* enable keep alives */ - tmp = 1; - rc = setsockopt( l.sl_sd, SOL_SOCKET, SO_KEEPALIVE, - (char *) &tmp, sizeof(tmp) ); - if ( rc == AC_SOCKET_ERROR ) { - int err = sock_errno(); - Debug( LDAP_DEBUG_ANY, - "slapd(%ld): setsockopt(SO_KEEPALIVE) failed errno=%d (%s)\n", - (long) l.sl_sd, err, sock_errstr(err) ); - } -#endif -#ifdef TCP_NODELAY - /* enable no delay */ - tmp = 1; - rc = setsockopt( l.sl_sd, IPPROTO_TCP, TCP_NODELAY, - (char *)&tmp, sizeof(tmp) ); - if ( rc == AC_SOCKET_ERROR ) { - int err = sock_errno(); - Debug( LDAP_DEBUG_ANY, - "slapd(%ld): setsockopt(TCP_NODELAY) failed errno=%d (%s)\n", - (long) l.sl_sd, err, sock_errstr(err) ); - } -#endif #ifdef HAVE_GETADDRINFO } /* sai->ai_family != AF_LOCAL */ @@ -666,6 +642,7 @@ slapd_daemon_task( void *ptr ) { + int rc, tmp; int l; time_t last_idle_check = slap_get_time(); time( &starttime ); @@ -881,6 +858,31 @@ slapd_daemon_task( } #endif +#ifdef SO_KEEPALIVE + /* enable keep alives */ + rc = setsockopt( s, SOL_SOCKET, SO_KEEPALIVE, + (char *) &tmp, sizeof(tmp) ); + if ( rc == AC_SOCKET_ERROR ) { + int err = sock_errno(); + Debug( LDAP_DEBUG_ANY, + "slapd(%ld): setsockopt(SO_KEEPALIVE) failed " + "errno=%d (%s)\n", (long) s, err, sock_errstr(err) ); + } +#endif +#ifdef TCP_NODELAY + /* enable no delay */ + tmp = 1; + rc = setsockopt( s, IPPROTO_TCP, TCP_NODELAY, + (char *)&tmp, sizeof(tmp) ); + if ( rc == AC_SOCKET_ERROR ) { + int err = sock_errno(); + Debug( LDAP_DEBUG_ANY, + "slapd(%ld): setsockopt(TCP_NODELAY) failed " + "errno=%d (%s)\n", (long) s, err, sock_errstr(err) ); + } +#endif + + #ifdef LDAP_DEBUG ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );