- if ( slapi_control_present( controls,
- SLAPI_CONTROL_MANAGEDSAIT_OID, NULL, &isCritical ) ) {
- manageDsaIt = isCritical ? SLAP_CONTROL_CRITICAL : SLAP_CONTROL_NONCRITICAL;
- }
-
- op->o_bd = select_backend( &op->o_req_ndn, manageDsaIt, 1 );
- if ( op->o_bd == NULL ) {
- rs.sr_err = LDAP_PARTIAL_RESULTS;
- goto cleanup;
- }
-
- op->o_dn = pConn->c_dn = op->o_bd->be_rootdn;
- op->o_ndn = pConn->c_ndn = op->o_bd->be_rootndn;
-
- for ( i = 0, pMod = mods[0];
- rs.sr_err == LDAP_SUCCESS && pMod != NULL;
- pMod = mods[++i] )
- {
- Modifications *mod;
-
- if ( (pMod->mod_op & LDAP_MOD_BVALUES) != 0 ) {
- /*
- * attr values are in berval format
- * convert an array of pointers to bervals
- * to an array of bervals
- */
- rs.sr_err = bvptr2obj_copy( pMod->mod_bvalues, &bv );
- if ( rs.sr_err != LDAP_SUCCESS )
- goto cleanup;
- tmp.sml_type.bv_val = pMod->mod_type;
- tmp.sml_type.bv_len = strlen( pMod->mod_type );
- tmp.sml_values = bv;
- tmp.sml_nvalues = NULL;
-
- mod = (Modifications *)ch_malloc( sizeof(Modifications) );
-
- mod->sml_op = pMod->mod_op & LDAP_MOD_OP;
- mod->sml_flags = 0;
- mod->sml_next = NULL;
- mod->sml_desc = NULL;
- mod->sml_type = tmp.sml_type;
- mod->sml_values = tmp.sml_values;
- mod->sml_nvalues = tmp.sml_nvalues;
- } else {
- rs.sr_err = values2obj_copy( pMod->mod_values, &bv );
- if ( rs.sr_err != LDAP_SUCCESS )
- goto cleanup;
- tmp.sml_type.bv_val = pMod->mod_type;
- tmp.sml_type.bv_len = strlen( pMod->mod_type );
- tmp.sml_values = bv;
- tmp.sml_nvalues = NULL;
-
- mod = (Modifications *) ch_malloc( sizeof(Modifications) );
-
- mod->sml_op = pMod->mod_op & LDAP_MOD_OP;
- mod->sml_flags = 0;
- mod->sml_next = NULL;
- mod->sml_desc = NULL;
- mod->sml_type = tmp.sml_type;
- mod->sml_values = tmp.sml_values;
- mod->sml_nvalues = tmp.sml_nvalues;
- }
- *modtail = mod;
- modtail = &mod->sml_next;
-
- switch( pMod->mod_op & LDAP_MOD_OP ) {
- case LDAP_MOD_ADD:
- if ( mod->sml_values == NULL ) {
- rs.sr_err = LDAP_PROTOCOL_ERROR;
- goto cleanup;
- }
-
- /* fall through */
- case LDAP_MOD_DELETE:
- case LDAP_MOD_REPLACE:
- case LDAP_MOD_INCREMENT:
- break;
-
- default:
- rs.sr_err = LDAP_PROTOCOL_ERROR;
- goto cleanup;
- }
- }
- *modtail = NULL;
-
- if ( op->o_req_ndn.bv_len == 0 ) {
- rs.sr_err = LDAP_UNWILLING_TO_PERFORM;