]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/connection.c
SLAPI - Netscape plugin API for slapd - based on patch contributed by Steve Omrani...
[openldap] / servers / slapd / connection.c
index 04cc49eaefa8608ff2313910057381029e470e82..8dbf0e63d7522d1ef93108993acec5a7e46e0b00 100644 (file)
@@ -139,7 +139,6 @@ int connections_destroy(void)
                        ber_sockbuf_free( connections[i].c_sb );
                        ldap_pvt_thread_mutex_destroy( &connections[i].c_mutex );
                        ldap_pvt_thread_mutex_destroy( &connections[i].c_write_mutex );
-                       ldap_pvt_thread_mutex_destroy( &connections[i].c_sasl_bindmutex );
                        ldap_pvt_thread_cond_destroy( &connections[i].c_write_cv );
                }
        }
@@ -321,10 +320,9 @@ static void connection_return( Connection *c )
 
 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 )
@@ -334,9 +332,9 @@ long connection_init(
 
        assert( connections != NULL );
 
+       assert( listener != NULL );
        assert( dnsname != NULL );
        assert( peername != NULL );
-       assert( sockname != NULL );
 
 #ifndef HAVE_TLS
        assert( tls_udp_option != 1 );
@@ -397,22 +395,28 @@ long connection_init(
        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;
@@ -421,14 +425,11 @@ long connection_init(
                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);
@@ -451,7 +452,6 @@ long connection_init(
                /* should check status of thread calls */
                ldap_pvt_thread_mutex_init( &c->c_mutex );
                ldap_pvt_thread_mutex_init( &c->c_write_mutex );
-               ldap_pvt_thread_mutex_init( &c->c_sasl_bindmutex );
                ldap_pvt_thread_cond_init( &c->c_write_cv );
 
                c->c_struct_state = SLAP_C_UNUSED;
@@ -464,10 +464,9 @@ long connection_init(
     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 );
@@ -476,10 +475,9 @@ long connection_init(
        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;
@@ -503,26 +501,25 @@ long connection_init(
 
 #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
@@ -636,12 +633,7 @@ connection_destroy( Connection *c )
     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);
@@ -649,31 +641,10 @@ connection_destroy( Connection *c )
        }
        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) {
@@ -1060,7 +1031,12 @@ operations_error:
 
        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 );
@@ -1309,8 +1285,9 @@ connection_input(
        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", 
@@ -1324,8 +1301,7 @@ connection_input(
        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));
@@ -1398,12 +1374,12 @@ connection_input(
        }
 
 #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",
@@ -1424,17 +1400,17 @@ connection_input(
 
        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 )
        {