]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-relay/op.c
ITS#3056 partial fix - from a slurpd perspective, the updatedn
[openldap] / servers / slapd / back-relay / op.c
index 868c3810331097093132f7e63c69f1ea5b1b7d36..313c2729b71cc8b80c1419488123a896baafdae4 100644 (file)
@@ -1,7 +1,7 @@
 /* op.c - relay backend operations */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2004 The OpenLDAP Foundation.
+ * Copyright 2004 The OpenLDAP Foundation.
  * Portions Copyright 2004 Pierangelo Masarati.
  * All rights reserved.
  *
@@ -37,6 +37,16 @@ relay_back_swap_bd( struct slap_op *op, struct slap_rep *rs )
        return SLAP_CB_CONTINUE;
 }
 
+static void
+relay_back_add_cb( slap_callback *cb, struct slap_op *op )
+{
+               cb->sc_next = op->o_callback;
+               cb->sc_response = relay_back_swap_bd;
+               cb->sc_cleanup = relay_back_swap_bd;
+               cb->sc_private = op->o_bd;
+               op->o_callback = cb;
+}
+
 static BackendDB *
 relay_back_select_backend( struct slap_op *op, struct slap_rep *rs, int err )
 {
@@ -95,11 +105,18 @@ relay_back_op_bind( struct slap_op *op, struct slap_rep *rs )
 
        if ( bd->be_bind ) {
                BackendDB       *be = op->o_bd;
+               slap_callback   cb;
+
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_bind )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -125,15 +142,15 @@ relay_back_op_unbind( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_unbind )( op, rs );
                op->o_bd = be;
+
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
        }
 
        return 0;
@@ -155,16 +172,16 @@ relay_back_op_search( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_search )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -190,16 +207,16 @@ relay_back_op_compare( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_compare )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -225,16 +242,16 @@ relay_back_op_modify( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_modify )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -260,16 +277,16 @@ relay_back_op_modrdn( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_modrdn )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -295,16 +312,16 @@ relay_back_op_add( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_add )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -330,15 +347,15 @@ relay_back_op_delete( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_delete )( op, rs );
                op->o_bd = be;
+
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
        }
 
        return rc;
@@ -360,16 +377,16 @@ relay_back_op_abandon( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_abandon )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -395,16 +412,16 @@ relay_back_op_cancel( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_cancel )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -430,16 +447,16 @@ relay_back_op_extended( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_extended )( op, rs );
                op->o_bd = be;
 
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
+
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "operation not supported "
@@ -520,15 +537,15 @@ relay_back_chk_referrals( struct slap_op *op, struct slap_rep *rs )
                BackendDB       *be = op->o_bd;
                slap_callback   cb;
 
-               cb.sc_next = op->o_callback;
-               cb.sc_response = relay_back_swap_bd;
-               cb.sc_cleanup = relay_back_swap_bd;
-               cb.sc_private = op->o_bd;
-               op->o_callback = &cb;
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_chk_referrals )( op, rs );
                op->o_bd = be;
+
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
        }
 
        return rc;
@@ -553,10 +570,17 @@ relay_back_operational( struct slap_op *op, struct slap_rep *rs,
 
        if ( bd->be_operational ) {
                BackendDB       *be = op->o_bd;
+               slap_callback   cb;
+
+               relay_back_add_cb( &cb, op );
 
                op->o_bd = bd;
                rc = ( bd->be_operational )( op, rs, opattrs, ap );
                op->o_bd = be;
+
+               if ( op->o_callback == &cb ) {
+                       op->o_callback = op->o_callback->sc_next;
+               }
        }
 
        return rc;