X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapi%2Fslapi_ops.c;h=3e32409ecf40e4adf29a0995d9fdf769ab298acf;hb=173330187ef1a4139e2e4c4fb30ad23832e40f77;hp=c8e978380300b5fc1139e78deb5e7b70c02ca0bb;hpb=98dc97bcb922a4bcfe02b27b4f1282660be6059b;p=openldap diff --git a/servers/slapd/slapi/slapi_ops.c b/servers/slapd/slapi/slapi_ops.c index c8e9783803..3e32409ecf 100644 --- a/servers/slapd/slapi/slapi_ops.c +++ b/servers/slapd/slapi/slapi_ops.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2002-2004 The OpenLDAP Foundation. + * Copyright 2002-2005 The OpenLDAP Foundation. * Portions Copyright 1997,2002-2003 IBM Corporation. * All rights reserved. * @@ -450,16 +450,24 @@ slapi_int_ldapmod_to_entry( } else { int repl_user = be_isupdate_dn( op->o_bd, &op->o_bd->be_rootdn ); if ( !op->o_bd->be_update_ndn.bv_len || repl_user ) { - int update = op->o_bd->be_update_ndn.bv_len; - char textbuf[SLAP_TEXT_BUFLEN]; - size_t textlen = sizeof textbuf; + int update = !BER_BVISNULL( &op->o_bd->be_update_ndn ); + char textbuf[ SLAP_TEXT_BUFLEN ]; + size_t textlen = sizeof( textbuf ); - rc = slap_mods_check( modlist, update, &text, + rc = slap_mods_check( modlist, &text, textbuf, textlen, NULL ); if ( rc != LDAP_SUCCESS) { goto cleanup; } + if ( !update ) { + rc = slap_mods_no_update_check( modlist, + &text, textbuf, textlen ); + if ( rc != LDAP_SUCCESS) { + goto cleanup; + } + } + if ( !repl_user ) { rc = slap_mods_opattrs( op, modlist, modtail, &text, @@ -519,7 +527,7 @@ slapi_delete_internal( SlapReply rs = { REP_RESULT }; struct berval dn = BER_BVNULL; - int manageDsaIt = 0; + int manageDsaIt = SLAP_CONTROL_NONE; int isCritical; if ( ldn == NULL ) { @@ -545,10 +553,10 @@ slapi_delete_internal( if ( slapi_control_present( controls, SLAPI_CONTROL_MANAGEDSAIT_OID, NULL, &isCritical) ) { - manageDsaIt = 1; + manageDsaIt = isCritical ? SLAP_CONTROL_CRITICAL : SLAP_CONTROL_NONCRITICAL; } - op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 0 ); + op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 1 ); if ( op->o_bd == NULL ) { rs.sr_err = LDAP_PARTIAL_RESULTS; goto cleanup; @@ -599,7 +607,7 @@ slapi_int_add_entry_locked( Operation *op = NULL; Slapi_PBlock *pPB = NULL; - int manageDsaIt = 0; + int manageDsaIt = SLAP_CONTROL_NONE; int isCritical; SlapReply rs = { REP_RESULT }; @@ -610,14 +618,14 @@ slapi_int_add_entry_locked( if ( slapi_control_present( controls, LDAP_CONTROL_MANAGEDSAIT, NULL, &isCritical ) ) { - manageDsaIt = 1; + manageDsaIt = isCritical ? SLAP_CONTROL_CRITICAL : SLAP_CONTROL_NONCRITICAL; } op = (Operation *)pConn->c_pending_ops.stqh_first; pPB = (Slapi_PBlock *)op->o_pb; op->o_ctrls = controls; - op->o_bd = select_backend( &((*e)->e_nname), manageDsaIt, 0 ); + op->o_bd = select_backend( &((*e)->e_nname), manageDsaIt, 1 ); if ( op->o_bd == NULL ) { rs.sr_err = LDAP_PARTIAL_RESULTS; goto cleanup; @@ -768,7 +776,7 @@ slapi_modrdn_internal( Connection *pConn = NULL; Operation *op = NULL; Slapi_PBlock *pPB = NULL; - int manageDsaIt = 0; + int manageDsaIt = SLAP_CONTROL_NONE; int isCritical; SlapReply rs = { REP_RESULT }; @@ -784,10 +792,10 @@ slapi_modrdn_internal( if ( slapi_control_present( controls, SLAPI_CONTROL_MANAGEDSAIT_OID, NULL, &isCritical ) ) { - manageDsaIt = 1; + manageDsaIt = isCritical ? SLAP_CONTROL_CRITICAL : SLAP_CONTROL_NONCRITICAL; } - op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 0 ); + op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 1 ); if ( op->o_bd == NULL ) { rs.sr_err = LDAP_PARTIAL_RESULTS; goto cleanup; @@ -889,7 +897,7 @@ slapi_modify_internal( struct berval dn = BER_BVNULL; - int manageDsaIt = 0; + int manageDsaIt = SLAP_CONTROL_NONE; int isCritical; struct berval *bv; LDAPMod *pMod; @@ -924,10 +932,10 @@ slapi_modify_internal( if ( slapi_control_present( controls, SLAPI_CONTROL_MANAGEDSAIT_OID, NULL, &isCritical ) ) { - manageDsaIt = 1; + manageDsaIt = isCritical ? SLAP_CONTROL_CRITICAL : SLAP_CONTROL_NONCRITICAL; } - op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 0 ); + op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 1 ); if ( op->o_bd == NULL ) { rs.sr_err = LDAP_PARTIAL_RESULTS; goto cleanup; @@ -995,6 +1003,7 @@ slapi_modify_internal( /* fall through */ case LDAP_MOD_DELETE: case LDAP_MOD_REPLACE: + case LDAP_MOD_INCREMENT: break; default: @@ -1014,18 +1023,26 @@ slapi_modify_internal( if ( op->o_bd->be_modify ) { int repl_user = be_isupdate( op ); if ( !op->o_bd->be_update_ndn.bv_len || repl_user ) { - int update = op->o_bd->be_update_ndn.bv_len; - const char *text = NULL; - char textbuf[SLAP_TEXT_BUFLEN]; - size_t textlen = sizeof( textbuf ); - slap_callback cb = { NULL, slap_replog_cb, NULL, NULL }; + int update = !BER_BVISEMPTY( &op->o_bd->be_update_ndn ); + const char *text = NULL; + char textbuf[ SLAP_TEXT_BUFLEN ]; + size_t textlen = sizeof( textbuf ); + slap_callback cb = { NULL, slap_replog_cb, NULL, NULL }; - rs.sr_err = slap_mods_check( modlist, update, + rs.sr_err = slap_mods_check( modlist, &text, textbuf, textlen, NULL ); if ( rs.sr_err != LDAP_SUCCESS ) { goto cleanup; } + if ( !update ) { + rs.sr_err = slap_mods_no_update_check( modlist, + &text, textbuf, textlen ); + if ( rs.sr_err != LDAP_SUCCESS ) { + goto cleanup; + } + } + if ( !repl_user ) { rs.sr_err = slap_mods_opattrs( op, modlist, modtail, &text, textbuf, @@ -1083,7 +1100,7 @@ slapi_search_internal( AttributeName *an = NULL; const char *text = NULL; - int manageDsaIt = 0; + int manageDsaIt = SLAP_CONTROL_NONE; int isCritical; int i; @@ -1190,12 +1207,12 @@ slapi_search_internal( if ( slapi_control_present( controls, LDAP_CONTROL_MANAGEDSAIT, NULL, &isCritical ) ) { - manageDsaIt = 1; + manageDsaIt = isCritical ? SLAP_CONTROL_CRITICAL : SLAP_CONTROL_NONCRITICAL; } - op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 0 ); + op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 1 ); if ( op->o_bd == NULL ) { - if ( manageDsaIt == 1 ) { + if ( manageDsaIt > SLAP_CONTROL_NONE ) { rs.sr_err = LDAP_NO_SUCH_OBJECT; } else { rs.sr_err = LDAP_PARTIAL_RESULTS;