]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backglue.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_5
[openldap] / servers / slapd / backglue.c
index 7c6de8fd6afb5f9ee106f0f99725580b4d56f28d..623d4492d08e0d5334fe001ae83e1725cb031e87 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2001-2009 The OpenLDAP Foundation.
+ * Copyright 2001-2014 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -225,8 +225,7 @@ glue_op_func ( Operation *op, SlapReply *rs )
 {
        slap_overinst   *on = (slap_overinst *)op->o_bd->bd_info;
        BackendDB *b0 = op->o_bd;
-       BackendInfo *bi0 = op->o_bd->bd_info;
-       BI_op_modify **func;
+       BackendInfo *bi0 = op->o_bd->bd_info, *bi1;
        slap_operation_t which = op_bind;
        int rc;
 
@@ -247,17 +246,39 @@ glue_op_func ( Operation *op, SlapReply *rs )
        default: assert( 0 ); break;
        }
 
-       func = &op->o_bd->bd_info->bi_op_bind;
-       if ( func[which] )
-               rc = func[which]( op, rs );
-       else
-               rc = SLAP_CB_BYPASS;
+       bi1 = op->o_bd->bd_info;
+       rc = (&bi1->bi_op_bind)[ which ] ?
+               (&bi1->bi_op_bind)[ which ]( op, rs ) : SLAP_CB_BYPASS;
 
        op->o_bd = b0;
        op->o_bd->bd_info = bi0;
        return rc;
 }
 
+static int
+glue_op_abandon( Operation *op, SlapReply *rs )
+{
+       slap_overinst   *on = (slap_overinst *)op->o_bd->bd_info;
+       glueinfo                *gi = (glueinfo *)on->on_bi.bi_private;
+       BackendDB *b0 = op->o_bd;
+       BackendInfo *bi0 = op->o_bd->bd_info;
+       int i;
+
+       b0->bd_info = on->on_info->oi_orig;
+
+       for (i = gi->gi_nodes-1; i >= 0; i--) {
+               assert( gi->gi_n[i].gn_be->be_nsuffix != NULL );
+               op->o_bd = gi->gi_n[i].gn_be;
+               if ( op->o_bd == b0 )
+                       continue;
+               if ( op->o_bd->bd_info->bi_op_abandon )
+                       op->o_bd->bd_info->bi_op_abandon( op, rs );
+       }
+       op->o_bd = b0;
+       op->o_bd->bd_info = bi0;
+       return SLAP_CB_CONTINUE;
+}
+
 static int
 glue_response ( Operation *op, SlapReply *rs )
 {
@@ -419,9 +440,10 @@ glue_op_search ( Operation *op, SlapReply *rs )
                if ( op->o_bd == b0 )
                        return SLAP_CB_CONTINUE;
 
-               rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
                if (op->o_bd && op->o_bd->be_search) {
                        rs->sr_err = op->o_bd->be_search( op, rs );
+               } else {
+                       rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
                }
                return rs->sr_err;
 
@@ -1509,6 +1531,7 @@ glue_sub_init()
        glue.on_bi.bi_op_modrdn = glue_op_func;
        glue.on_bi.bi_op_add = glue_op_func;
        glue.on_bi.bi_op_delete = glue_op_func;
+       glue.on_bi.bi_op_abandon = glue_op_abandon;
        glue.on_bi.bi_extended = glue_op_func;
 
        glue.on_bi.bi_chk_referrals = glue_chk_referrals;