X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-relay%2Fop.c;h=313c2729b71cc8b80c1419488123a896baafdae4;hb=158e5727b4f330e1c17c242153eb8a821295286b;hp=82d0492a56774c90225309ccc4c24cadadc78bb3;hpb=e9c8fd5ee66446f98b00c1c3e5a1731d67701a83;p=openldap diff --git a/servers/slapd/back-relay/op.c b/servers/slapd/back-relay/op.c index 82d0492a56..313c2729b7 100644 --- a/servers/slapd/back-relay/op.c +++ b/servers/slapd/back-relay/op.c @@ -1,7 +1,7 @@ /* op.c - relay backend operations */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2004 The OpenLDAP Foundation. + * Copyright 2004 The OpenLDAP Foundation. * Portions Copyright 2004 Pierangelo Masarati. * All rights reserved. * @@ -22,12 +22,31 @@ #include -#include -#include - #include "slap.h" #include "back-relay.h" +static int +relay_back_swap_bd( struct slap_op *op, struct slap_rep *rs ) +{ + slap_callback *cb = op->o_callback; + BackendDB *be = op->o_bd; + + op->o_bd = cb->sc_private; + cb->sc_private = be; + + 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 ) { @@ -36,20 +55,28 @@ relay_back_select_backend( struct slap_op *op, struct slap_rep *rs, int err ) if ( bd == NULL ) { bd = select_backend( &op->o_req_ndn, 0, 1 ); + if ( bd == op->o_bd ) { + if ( err != LDAP_SUCCESS ) { + send_ldap_error( op, rs, + LDAP_UNWILLING_TO_PERFORM, + "would call self" ); + } + return NULL; + } } if ( bd == NULL ) { if ( default_referral ) { rs->sr_ref = referral_rewrite( default_referral, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); - if (!rs->sr_ref) { + if ( !rs->sr_ref ) { rs->sr_ref = default_referral; } rs->sr_err = LDAP_REFERRAL; send_ldap_result( op, rs ); - if (rs->sr_ref != default_referral) { + if ( rs->sr_ref != default_referral ) { ber_bvarray_free( rs->sr_ref ); } @@ -78,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 " @@ -95,28 +129,31 @@ relay_back_op_bind( struct slap_op *op, struct slap_rep *rs ) int relay_back_op_unbind( struct slap_op *op, struct slap_rep *rs ) { + relay_back_info *ri = (relay_back_info *)op->o_bd->be_private; BackendDB *bd; int rc = 1; - bd = relay_back_select_backend( op, rs, LDAP_NO_SUCH_OBJECT ); + bd = ri->ri_bd; if ( bd == NULL ) { - return 1; + bd = select_backend( &op->o_req_ndn, 0, 1 ); } - if ( bd->be_unbind ) { + if ( bd && bd->be_unbind ) { BackendDB *be = op->o_bd; + slap_callback cb; + + relay_back_add_cb( &cb, op ); op->o_bd = bd; rc = ( bd->be_unbind )( op, rs ); op->o_bd = be; - } else { - send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, - "operation not supported " - "within naming context" ); + if ( op->o_callback == &cb ) { + op->o_callback = op->o_callback->sc_next; + } } - return rc; + return 0; } @@ -133,11 +170,18 @@ relay_back_op_search( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_search ) { BackendDB *be = op->o_bd; + slap_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 " @@ -161,11 +205,18 @@ relay_back_op_compare( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_compare ) { BackendDB *be = op->o_bd; + slap_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 " @@ -189,11 +240,18 @@ relay_back_op_modify( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_modify ) { BackendDB *be = op->o_bd; + slap_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 " @@ -217,11 +275,18 @@ relay_back_op_modrdn( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_modrdn ) { BackendDB *be = op->o_bd; + slap_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 " @@ -245,11 +310,18 @@ relay_back_op_add( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_add ) { BackendDB *be = op->o_bd; + slap_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 " @@ -273,10 +345,17 @@ relay_back_op_delete( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_delete ) { BackendDB *be = op->o_bd; + slap_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; @@ -296,11 +375,18 @@ relay_back_op_abandon( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_abandon ) { BackendDB *be = op->o_bd; + slap_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 " @@ -324,11 +410,18 @@ relay_back_op_cancel( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_cancel ) { BackendDB *be = op->o_bd; + slap_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 " @@ -352,11 +445,18 @@ relay_back_op_extended( struct slap_op *op, struct slap_rep *rs ) if ( bd->be_extended ) { BackendDB *be = op->o_bd; + slap_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 " @@ -425,24 +525,27 @@ relay_back_entry_get_rw( struct slap_op *op, struct berval *ndn, int relay_back_chk_referrals( struct slap_op *op, struct slap_rep *rs ) { - relay_back_info *ri = (relay_back_info *)op->o_bd->be_private; BackendDB *bd; - int rc = 1; + int rc = 0; - bd = ri->ri_bd; - if ( bd == NULL) { - bd = select_backend( &op->o_req_ndn, 0, 1 ); - if ( bd == NULL ) { - return 1; - } + bd = relay_back_select_backend( op, rs, LDAP_SUCCESS ); + if ( bd == NULL ) { + return 0; } if ( bd->be_chk_referrals ) { BackendDB *be = op->o_bd; + slap_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; @@ -467,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; @@ -509,12 +619,16 @@ relay_back_connection_init( BackendDB *bd, struct slap_conn *c ) { relay_back_info *ri = (relay_back_info *)bd->be_private; - if ( ri->ri_bd->be_connection_init ) { - return ( ri->ri_bd->be_connection_init )( ri->ri_bd, c ); + bd = ri->ri_bd; + if ( bd == NULL ) { + return 0; } - return 1; + if ( bd->be_connection_init ) { + return ( bd->be_connection_init )( bd, c ); + } + return 0; } int @@ -522,11 +636,16 @@ relay_back_connection_destroy( BackendDB *bd, struct slap_conn *c ) { relay_back_info *ri = (relay_back_info *)bd->be_private; - if ( ri->ri_bd->be_connection_destroy ) { - return ( ri->ri_bd->be_connection_destroy )( ri->ri_bd, c ); + bd = ri->ri_bd; + if ( bd == NULL) { + return 0; + } + + if ( bd->be_connection_destroy ) { + return ( bd->be_connection_destroy )( bd, c ); } - return 1; + return 0; }