]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/connection.c
Free bind callback
[openldap] / servers / slapd / connection.c
index d7a87ee02725d06a39163bd85e0298830e617aee..65141327004c1b06ca533dac8bfe52357949f42d 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2004 The OpenLDAP Foundation.
+ * Copyright 1998-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -774,7 +774,7 @@ static void connection_abandon( Connection *c )
 
        Operation *o;
 
-       LDAP_STAILQ_FOREACH(o, &c->c_ops, o_next) {
+       LDAP_STAILQ_FOREACH( o, &c->c_ops, o_next ) {
                o->o_abandon = 1;
        }
 
@@ -1133,8 +1133,8 @@ operations_error:
                num_ops_completed_[SLAP_OP_EXTENDED]++;
                break;
        default:
-               /* not reachable */
-               assert( 0 );
+               /* this is reachable */
+               break;
        }
 #endif /* SLAPD_MONITOR */
        ldap_pvt_thread_mutex_unlock( &num_ops_mutex );
@@ -1178,14 +1178,6 @@ operations_error:
                /* c_mutex is locked */
                connection_closing( conn );
                break;
-
-       case LDAP_REQ_BIND:
-               conn->c_sasl_bind_in_progress =
-                       rc == LDAP_SASL_BIND_IN_PROGRESS ? 1 : 0;
-
-               if( conn->c_conn_state == SLAP_C_BINDING) {
-                       conn->c_conn_state = SLAP_C_ACTIVE;
-               }
        }
 
        connection_resched( conn );
@@ -1788,12 +1780,29 @@ connection_resched( Connection *conn )
        return 0;
 }
 
+static int connection_bind_cb( Operation *op, SlapReply *rs )
+{
+       slap_callback *cb = op->o_callback;
+       op->o_callback = cb->sc_next;
+
+       ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
+       op->o_conn->c_conn_state = SLAP_C_ACTIVE;
+       ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
+
+       ch_free( cb );
+       return SLAP_CB_CONTINUE;
+}
+
 static int connection_op_activate( Operation *op )
 {
        int status;
        ber_tag_t tag = op->o_tag;
 
        if(tag == LDAP_REQ_BIND) {
+               slap_callback *sc = ch_calloc( 1, sizeof( slap_callback ));
+               sc->sc_response = connection_bind_cb;
+               sc->sc_next = op->o_callback;
+               op->o_callback = sc;
                op->o_conn->c_conn_state = SLAP_C_BINDING;
        }