/* 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 );
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 );
+
+ 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;
}
int rc = LDAP_SUCCESS;
long bytes;
- if (op->o_callback) {
- slap_callback *sc = op->o_callback;
- rc = SLAP_CB_CONTINUE;
- for ( ; op->o_callback; ) {
- if ( op->o_callback->sc_response ) {
- rc = op->o_callback->sc_response( op, rs );
- if ( rc != SLAP_CB_CONTINUE ) break;
- }
- op->o_callback = op->o_callback->sc_next;
- }
+ if ( op->o_callback ) {
+ slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
+ *sc_next;
+
+ rc = SLAP_CB_CONTINUE;
+ for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
+ sc_next = op->o_callback->sc_next;
+ if ( op->o_callback->sc_response ) {
+ rc = op->o_callback->sc_response( op, rs );
+ if ( op->o_callback != *sc_prev ) {
+ *sc_prev = op->o_callback;
+ }
+ if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
+ }
+ sc_prev = &op->o_callback->sc_next;
+ }
+
op->o_callback = sc;
if ( rc != SLAP_CB_CONTINUE ) goto clean2;
}
clean2:;
if ( op->o_callback ) {
- int first = 1;
- slap_callback *sc = op->o_callback, *sc_next;
+ slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
+ *sc_next;
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
sc_next = op->o_callback->sc_next;
if ( op->o_callback->sc_cleanup ) {
(void)op->o_callback->sc_cleanup( op, rs );
- if ( first && op->o_callback != sc ) {
- sc = op->o_callback;
+ if ( op->o_callback != *sc_prev ) {
+ *sc_prev = op->o_callback;
}
+ if ( !op->o_callback ) break;
}
- first = 0;
+ sc_prev = &op->o_callback->sc_next;
}
op->o_callback = sc;
}
rs->sr_type = REP_SEARCH;
if (op->o_callback) {
- slap_callback *sc = op->o_callback;
+ slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
+ *sc_next;
rc = SLAP_CB_CONTINUE;
- for ( ; op->o_callback; ) {
- if ( op->o_callback->sc_response ) {
- rc = op->o_callback->sc_response( op, rs );
- if ( rc != SLAP_CB_CONTINUE ) break;
- }
- op->o_callback = op->o_callback->sc_next;
- }
+ for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
+ sc_next = op->o_callback->sc_next;
+ if ( op->o_callback->sc_response ) {
+ rc = op->o_callback->sc_response( op, rs );
+ if ( op->o_callback != *sc_prev ) {
+ *sc_prev = op->o_callback;
+ }
+ if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
+ }
+ sc_prev = &op->o_callback->sc_next;
+ }
+
op->o_callback = sc;
if ( rc != SLAP_CB_CONTINUE ) goto error_return;
}
error_return:;
if ( op->o_callback ) {
- int first = 1;
- slap_callback *sc = op->o_callback, *sc_next;
+ slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
+ *sc_next;
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
sc_next = op->o_callback->sc_next;
if ( op->o_callback->sc_cleanup ) {
(void)op->o_callback->sc_cleanup( op, rs );
- if ( first && op->o_callback != sc ) {
- sc = op->o_callback;
+ if ( op->o_callback != *sc_prev ) {
+ *sc_prev = op->o_callback;
}
+ if ( !op->o_callback ) break;
}
- first = 0;
+ sc_prev = &op->o_callback->sc_next;
}
op->o_callback = sc;
}
AttributeDescription *ad_entry = slap_schema.si_ad_entry;
rs->sr_type = REP_SEARCHREF;
- if (op->o_callback) {
- slap_callback *sc = op->o_callback;
- rc = SLAP_CB_CONTINUE;
- for ( ; op->o_callback; ) {
- if ( op->o_callback->sc_response ) {
- rc = op->o_callback->sc_response( op, rs );
- if ( rc != SLAP_CB_CONTINUE ) break;
- }
- op->o_callback = op->o_callback->sc_next;
- }
+ if ( op->o_callback ) {
+ slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
+ *sc_next;
+
+ rc = SLAP_CB_CONTINUE;
+ for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
+ sc_next = op->o_callback->sc_next;
+ if ( op->o_callback->sc_response ) {
+ rc = op->o_callback->sc_response( op, rs );
+ if ( op->o_callback != *sc_prev ) {
+ *sc_prev = op->o_callback;
+ }
+ if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
+ }
+ sc_prev = &op->o_callback->sc_next;
+ }
+
op->o_callback = sc;
if ( rc != SLAP_CB_CONTINUE ) goto rel;
}
rel:
if ( op->o_callback ) {
- int first = 1;
- slap_callback *sc = op->o_callback, *sc_next;
-
- for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next ) {
- sc_next = op->o_callback->sc_next;
- if ( op->o_callback->sc_cleanup ) {
- (void)op->o_callback->sc_cleanup( op, rs );
- if ( first && op->o_callback != sc ) {
- sc = op->o_callback;
- }
- }
- first = 0;
+ slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
+ *sc_next;
+
+ for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
+ sc_next = op->o_callback->sc_next;
+ if ( op->o_callback->sc_cleanup ) {
+ (void)op->o_callback->sc_cleanup( op, rs );
+ if ( op->o_callback != *sc_prev ) {
+ *sc_prev = op->o_callback;
+ }
+ if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
+ }
+ sc_prev = &op->o_callback->sc_next;
}
op->o_callback = sc;
}