/* modify.c - ldap backend modify function */
/* $OpenLDAP$ */
/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/* This is an altered version */
LDAPMod **modv = NULL;
LDAPMod *mods;
Modifications *ml;
- int i, j;
+ int i, j, rc;
struct berval mapped;
struct berval mdn = { 0, NULL };
+ ber_int_t msgid;
lc = ldap_back_getconn(li, conn, op);
- if ( !lc || !ldap_back_dobind( lc, op ) ) {
+ if ( !lc || !ldap_back_dobind( li, lc, conn, op ) ) {
return( -1 );
}
case REWRITE_REGEXEC_UNWILLING:
send_ldap_result( conn, op, LDAP_UNWILLING_TO_PERFORM,
- NULL, "Unwilling to perform", NULL, NULL );
+ NULL, "Operation not allowed", NULL, NULL );
return( -1 );
case REWRITE_REGEXEC_ERR:
send_ldap_result( conn, op, LDAP_OTHER,
- NULL, "Operations error", NULL, NULL );
+ NULL, "Rewrite error", NULL, NULL );
return( -1 );
}
#else /* !ENABLE_REWRITE */
mods = (LDAPMod *)ch_malloc(i*sizeof(LDAPMod));
if (mods == NULL) {
+ rc = LDAP_NO_MEMORY;
goto cleanup;
}
modv = (LDAPMod **)ch_malloc((i+1)*sizeof(LDAPMod *));
if (modv == NULL) {
+ rc = LDAP_NO_MEMORY;
goto cleanup;
}
for (i=0, ml=modlist; ml; ml=ml->sml_next) {
- ldap_back_map(&li->at_map, &ml->sml_desc->ad_cname, &mapped, 0);
- if (mapped.bv_val == NULL) {
+ if ( ml->sml_desc->ad_type->sat_no_user_mod ) {
+ continue;
+ }
+
+ ldap_back_map(&li->at_map, &ml->sml_desc->ad_cname, &mapped,
+ BACKLDAP_MAP);
+ if (mapped.bv_val == NULL || mapped.bv_val[0] == '\0') {
continue;
}
ml->sml_bvalues, conn );
}
#endif /* ENABLE_REWRITE */
-
- for (j = 0; ml->sml_bvalues[j].bv_val; j++);
- mods[i].mod_bvalues = (struct berval **)ch_malloc((j+1) *
- sizeof(struct berval *));
- for (j = 0; ml->sml_bvalues[j].bv_val; j++)
- mods[i].mod_bvalues[j] = &ml->sml_bvalues[j];
- mods[i].mod_bvalues[j] = NULL;
+
+ if ( ml->sml_bvalues != NULL ) {
+ for (j = 0; ml->sml_bvalues[j].bv_val; j++);
+ mods[i].mod_bvalues = (struct berval **)ch_malloc((j+1) *
+ sizeof(struct berval *));
+ for (j = 0; ml->sml_bvalues[j].bv_val; j++)
+ mods[i].mod_bvalues[j] = &ml->sml_bvalues[j];
+ mods[i].mod_bvalues[j] = NULL;
+ } else {
+ mods[i].mod_bvalues = NULL;
+ }
+
i++;
}
modv[i] = 0;
- ldap_modify_s( lc->ld, mdn.bv_val, modv );
+ rc = ldap_modify_ext( lc->ld, mdn.bv_val, modv, op->o_ctrls, NULL, &msgid );
cleanup:;
-#ifdef ENABLE_REWRITE
if ( mdn.bv_val != dn->bv_val ) {
-#endif /* ENABLE_REWRITE */
free( mdn.bv_val );
-#ifdef ENABLE_REWRITE
}
-#endif /* ENABLE_REWRITE */
- for (i=0; modv[i]; i++)
+ for (i=0; modv[i]; i++) {
ch_free(modv[i]->mod_bvalues);
- ch_free(mods);
- ch_free(modv);
- return( ldap_back_op_result( lc, op ));
+ }
+ ch_free( mods );
+ ch_free( modv );
+
+ return ldap_back_op_result( li, lc, conn, op, msgid, rc, 1 );
}