X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconnection.c;h=c99f365624e08c395e55c09145aadb937eab8136;hb=3b2cef17eb8537b3095c78448b785995f3ea148b;hp=e1f651bd2b8aea769d8c98d741ff906fd16e596c;hpb=b0fdc08e062589b356d450dfa88e8c109cd1e78f;p=openldap diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index e1f651bd2b..c99f365624 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2009 The OpenLDAP Foundation. + * Copyright 1998-2010 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,28 +48,10 @@ static ldap_pvt_thread_mutex_t connections_mutex; static Connection *connections = NULL; static ldap_pvt_thread_mutex_t conn_nextid_mutex; -static unsigned long conn_nextid = 0; +static unsigned long conn_nextid = SLAPD_SYNC_SYNCCONN_OFFSET; static const char conn_lost_str[] = "connection lost"; -/* structure state (protected by connections_mutex) */ -enum sc_struct_state { - SLAP_C_UNINITIALIZED = 0, /* MUST BE ZERO (0) */ - SLAP_C_UNUSED, - SLAP_C_USED, - SLAP_C_PENDING -}; - -/* connection state (protected by c_mutex ) */ -enum sc_conn_state { - SLAP_C_INVALID = 0, /* MUST BE ZERO (0) */ - SLAP_C_INACTIVE, /* zero threads */ - SLAP_C_CLOSING, /* closing */ - SLAP_C_ACTIVE, /* one or more threads */ - SLAP_C_BINDING, /* binding */ - SLAP_C_CLIENT /* outbound client conn */ -}; - const char * connection_state2str( int state ) { @@ -783,7 +765,9 @@ void connection_closing( Connection *c, const char *why ) { assert( connections != NULL ); assert( c != NULL ); - assert( c->c_struct_state == SLAP_C_USED ); + + if ( c->c_struct_state != SLAP_C_USED ) return; + assert( c->c_conn_state != SLAP_C_INVALID ); /* c_mutex must be locked by caller */ @@ -816,7 +800,9 @@ connection_close( Connection *c ) { assert( connections != NULL ); assert( c != NULL ); - assert( c->c_struct_state == SLAP_C_USED ); + + if ( c->c_struct_state != SLAP_C_USED ) return; + assert( c->c_conn_state == SLAP_C_CLOSING ); /* NOTE: c_mutex should be locked by caller */ @@ -1376,6 +1362,11 @@ connection_read( ber_socket_t s, conn_readinfo *cri ) c->c_connid, (int) s, c->c_tls_ssf, c->c_ssf, 0 ); slap_sasl_external( c, c->c_tls_ssf, &authid ); if ( authid.bv_val ) free( authid.bv_val ); + } else if ( rc == 1 && ber_sockbuf_ctrl( c->c_sb, + LBER_SB_OPT_NEEDS_WRITE, NULL )) { /* need to retry */ + slapd_set_write( s, 1 ); + connection_return( c ); + return 0; } /* if success and data is ready, fall thru to data input loop */ @@ -1875,6 +1866,14 @@ int connection_write(ber_socket_t s) return -1; } +#ifdef HAVE_TLS + if ( c->c_is_tls && c->c_needs_tls_accept ) { + connection_return( c ); + connection_read_activate( s ); + return 0; + } +#endif + c->c_n_write++; Debug( LDAP_DEBUG_TRACE,