static void connection_abandon( Connection *conn );
static void connection_destroy( Connection *c );
+static ldap_pvt_thread_start_t connection_operation;
+
struct co_arg {
Connection *co_conn;
Operation *co_op;
long connection_init(
ber_socket_t s,
- const char* url,
+ Listener *listener,
const char* dnsname,
const char* peername,
- const char* sockname,
int tls_udp_option,
slap_ssf_t ssf,
const char *authid )
assert( connections != NULL );
+ assert( listener != NULL );
assert( dnsname != NULL );
assert( peername != NULL );
- assert( sockname != NULL );
#ifndef HAVE_TLS
assert( tls_udp_option != 1 );
if( c == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG( CONNECTION, INFO,
- "connection_init: skt %d connection table full (%d/%d)\n",
- s, i, dtblsize );
+ "connection_init: skt %d connection table full "
+ "(%d/%d)\n", s, i, dtblsize );
#else
Debug( LDAP_DEBUG_ANY,
- "connection_init(%d): connection table full (%d/%d)\n",
- s, i, dtblsize);
+ "connection_init(%d): connection table full "
+ "(%d/%d)\n", s, i, dtblsize);
#endif
ldap_pvt_thread_mutex_unlock( &connections_mutex );
return -1;
}
- }
+ }
#endif
- assert( c != NULL );
+ assert( c != NULL );
if( c->c_struct_state == SLAP_C_UNINITIALIZED ) {
+ c->c_send_ldap_result = slap_send_ldap_result;
+ c->c_send_search_entry = slap_send_search_entry;
+ c->c_send_search_result = slap_send_search_result;
+ c->c_send_search_reference = slap_send_search_reference;
+ c->c_send_ldap_extended = slap_send_ldap_extended;
+
c->c_authmech.bv_val = NULL;
c->c_authmech.bv_len = 0;
c->c_dn.bv_val = NULL;
c->c_ndn.bv_len = 0;
c->c_groups = NULL;
- c->c_listener_url.bv_val = NULL;
- c->c_listener_url.bv_len = 0;
+ c->c_listener = NULL;
c->c_peer_domain.bv_val = NULL;
c->c_peer_domain.bv_len = 0;
c->c_peer_name.bv_val = NULL;
c->c_peer_name.bv_len = 0;
- c->c_sock_name.bv_val = NULL;
- c->c_sock_name.bv_len = 0;
LDAP_STAILQ_INIT(&c->c_ops);
LDAP_STAILQ_INIT(&c->c_pending_ops);
c->c_sasl_bind_mech.bv_len = 0;
c->c_sasl_context = NULL;
c->c_sasl_extra = NULL;
+ c->c_sasl_bindop = NULL;
c->c_sb = ber_sockbuf_alloc( );
assert( c->c_dn.bv_val == NULL );
assert( c->c_ndn.bv_val == NULL );
assert( c->c_groups == NULL );
- assert( c->c_listener_url.bv_val == NULL );
+ assert( c->c_listener == NULL );
assert( c->c_peer_domain.bv_val == NULL );
assert( c->c_peer_name.bv_val == NULL );
- assert( c->c_sock_name.bv_val == NULL );
assert( LDAP_STAILQ_EMPTY(&c->c_ops) );
assert( LDAP_STAILQ_EMPTY(&c->c_pending_ops) );
assert( c->c_sasl_bind_mech.bv_val == NULL );
assert( c->c_sasl_context == NULL );
assert( c->c_sasl_extra == NULL );
+ assert( c->c_sasl_bindop == NULL );
assert( c->c_currentber == NULL );
- ber_str2bv( url, 0, 1, &c->c_listener_url );
+ c->c_listener = listener;
ber_str2bv( dnsname, 0, 1, &c->c_peer_domain );
ber_str2bv( peername, 0, 1, &c->c_peer_name );
- ber_str2bv( sockname, 0, 1, &c->c_sock_name );
c->c_n_ops_received = 0;
c->c_n_ops_executing = 0;
#ifdef LDAP_CONNECTIONLESS
c->c_is_udp = 0;
- if (tls_udp_option == 2)
- {
+ if( tls_udp_option == 2 ) {
c->c_is_udp = 1;
#ifdef LDAP_DEBUG
- ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_debug,
- LBER_SBIOD_LEVEL_PROVIDER, (void*)"udp_" );
+ ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_debug,
+ LBER_SBIOD_LEVEL_PROVIDER, (void*)"udp_" );
#endif
- ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_udp,
- LBER_SBIOD_LEVEL_PROVIDER, (void *)&s );
- ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_readahead,
- LBER_SBIOD_LEVEL_PROVIDER, NULL );
+ ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_udp,
+ LBER_SBIOD_LEVEL_PROVIDER, (void *)&s );
+ ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_readahead,
+ LBER_SBIOD_LEVEL_PROVIDER, NULL );
} else
#endif
{
#ifdef LDAP_DEBUG
- ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_debug,
- LBER_SBIOD_LEVEL_PROVIDER, (void*)"tcp_" );
+ ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_debug,
+ LBER_SBIOD_LEVEL_PROVIDER, (void*)"tcp_" );
#endif
- ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_tcp,
- LBER_SBIOD_LEVEL_PROVIDER, (void *)&s );
+ ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_tcp,
+ LBER_SBIOD_LEVEL_PROVIDER, (void *)&s );
}
#ifdef LDAP_DEBUG
c->c_activitytime = c->c_starttime = 0;
connection2anonymous( c );
-
- if(c->c_listener_url.bv_val != NULL) {
- free(c->c_listener_url.bv_val);
- c->c_listener_url.bv_val = NULL;
- }
- c->c_listener_url.bv_len = 0;
+ c->c_listener = NULL;
if(c->c_peer_domain.bv_val != NULL) {
free(c->c_peer_domain.bv_val);
}
c->c_peer_domain.bv_len = 0;
if(c->c_peer_name.bv_val != NULL) {
-#ifdef LDAP_PF_LOCAL
- /*
- * If peer was a domain socket, unlink. Mind you,
- * they may be un-named. Should we leave this to
- * the client?
- */
- if (strncmp(c->c_peer_name.bv_val, "PATH=",
- sizeof("PATH=") - 1) == 0) {
- char *path = c->c_peer_name.bv_val
- + sizeof("PATH=") - 1;
- if (path[0] != '\0') {
- (void)unlink(path);
- }
- }
-#endif /* LDAP_PF_LOCAL */
-
free(c->c_peer_name.bv_val);
c->c_peer_name.bv_val = NULL;
}
c->c_peer_name.bv_len = 0;
- if(c->c_sock_name.bv_val != NULL) {
- free(c->c_sock_name.bv_val);
- c->c_sock_name.bv_val = NULL;
- }
- c->c_sock_name.bv_len = 0;
c->c_sasl_bind_in_progress = 0;
if(c->c_sasl_bind_mech.bv_val != NULL) {
#endif /* !SLAPD_MONITOR */
static void *
-connection_operation( void *arg_v )
+connection_operation( void *ctx, void *arg_v )
{
int rc;
struct co_arg *arg = arg_v;
num_ops_initiated++;
ldap_pvt_thread_mutex_unlock( &num_ops_mutex );
+ arg->co_op->o_threadctx = ctx;
+
if( conn->c_sasl_bind_in_progress && tag != LDAP_REQ_BIND ) {
#ifdef NEW_LOGGING
LDAP_LOG( CONNECTION, ERR,
LDAP_STAILQ_REMOVE( &conn->c_ops, arg->co_op, slap_op, o_next);
LDAP_STAILQ_NEXT(arg->co_op, o_next) = NULL;
- slap_op_free( arg->co_op );
+#ifdef LDAP_CLIENT_UPDATE
+ if ( !( arg->co_op->o_clientupdate_type & SLAP_LCUP_PERSIST ) )
+#endif /* LDAP_CLIENT_UPDATE */
+ {
+ slap_op_free( arg->co_op );
+ }
arg->co_op = NULL;
arg->co_conn = NULL;
free( (char *) arg );
char *cdn = NULL;
#endif
- if ( conn->c_currentber == NULL && (conn->c_currentber = ber_alloc())
- == NULL ) {
+ if ( conn->c_currentber == NULL &&
+ ( conn->c_currentber = ber_alloc()) == NULL )
+ {
#ifdef NEW_LOGGING
LDAP_LOG( CONNECTION, ERR,
"connection_input: conn %lu ber_alloc failed.\n",
errno = 0;
#ifdef LDAP_CONNECTIONLESS
- if (conn->c_is_udp)
- {
+ if ( conn->c_is_udp ) {
char peername[sizeof("IP=255.255.255.255:65336")];
len = ber_int_sb_read(conn->c_sb, &peeraddr,
sizeof(struct sockaddr));
}
#ifdef LDAP_CONNECTIONLESS
- if (conn->c_is_udp) {
- if (tag == LBER_OCTETSTRING) {
+ if( conn->c_is_udp ) {
+ if( tag == LBER_OCTETSTRING ) {
ber_get_stringa( ber, &cdn );
tag = ber_peek_tag(ber, &len);
}
- if (tag != LDAP_REQ_ABANDON && tag != LDAP_REQ_SEARCH) {
+ if( tag != LDAP_REQ_ABANDON && tag != LDAP_REQ_SEARCH ) {
#ifdef NEW_LOGGING
LDAP_LOG( CONNECTION, ERR,
"connection_input: conn %lu invalid req for UDP 0x%lx.\n",
op = slap_op_alloc( ber, msgid, tag, conn->c_n_ops_received++ );
+ op->o_conn = conn;
op->vrFilter = NULL;
-
op->o_pagedresults_state = conn->c_pagedresults_state;
-
#ifdef LDAP_CONNECTIONLESS
op->o_peeraddr = peeraddr;
- if (cdn) {
+ if (cdn ) {
ber_str2bv( cdn, 0, 1, &op->o_dn );
op->o_protocol = LDAP_VERSION2;
}
#endif
+
if ( conn->c_conn_state == SLAP_C_BINDING
|| conn->c_conn_state == SLAP_C_CLOSING )
{