/* modrdn.c - ldbm backend modrdn routine */
/* $OpenLDAP$ */
/*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
char *newSuperior
)
{
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+ static AttributeDescription *children = NULL;
+#else
+ static const char *children = "children";
+#endif
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
char *p_dn = NULL, *p_ndn = NULL;
char *new_dn = NULL, *new_ndn = NULL;
struct berval *add_bvals[2]; /* Stores new rdn att */
struct berval del_bv; /* Stores old rdn att */
struct berval *del_bvals[2]; /* Stores old rdn att */
- LDAPModList mod[2]; /* Used to delete old rdn */
+ Modifications mod[2]; /* Used to delete old rdn */
int manageDSAit = get_manageDSAit( op );
Debug( LDAP_DEBUG_TRACE, "==>ldbm_back_modrdn(newSuperior=%s)\n",
if( (p = dn2entry_w( be, p_ndn, NULL )) == NULL) {
Debug( LDAP_DEBUG_TRACE, "parent does not exist\n",
0, 0, 0);
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
+ send_ldap_result( conn, op, LDAP_OTHER,
NULL, NULL, NULL, NULL );
goto return_results;
}
/* check parent for "children" acl */
if ( ! access_allowed( be, conn, op, p,
- "children", NULL, ACL_WRITE ) )
+ children, NULL, ACL_WRITE ) )
{
Debug( LDAP_DEBUG_TRACE, "no access to parent\n", 0,
0, 0 );
0, 0, 0 );
np_ndn = ch_strdup( np_dn );
- (void) dn_normalize_case( np_ndn );
+ (void) dn_normalize( np_ndn );
/* newSuperior == oldParent?, if so ==> ERROR */
/* newSuperior == entry being moved?, if so ==> ERROR */
Debug( LDAP_DEBUG_TRACE,
"ldbm_back_modrdn: newSup(ndn=%s) not here!\n",
np_ndn, 0, 0);
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
+ send_ldap_result( conn, op, LDAP_OTHER,
NULL, NULL, NULL, NULL );
goto return_results;
}
np, np->e_id, 0 );
/* check newSuperior for "children" acl */
- if ( !access_allowed( be, conn, op, np, "children", NULL,
+ if ( !access_allowed( be, conn, op, np, children, NULL,
ACL_WRITE ) )
{
Debug( LDAP_DEBUG_TRACE,
new_ndn = ch_strdup(new_dn);
- (void) dn_normalize_case( new_ndn );
+ (void) dn_normalize( new_ndn );
Debug( LDAP_DEBUG_TRACE, "ldbm_back_modrdn: new ndn=%s\n",
new_ndn, 0, 0 );
"ldbm_back_modrdn: can't figure out type of newrdn\n",
0, 0, 0 );
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ NULL, "unknown type used in RDN", NULL, NULL );
goto return_results;
}
"ldbm_back_modrdn: can't figure out val of newrdn\n",
0, 0, 0 );
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ NULL, "could not parse RDN value", NULL, NULL );
goto return_results;
}
Debug( LDAP_DEBUG_TRACE,
"ldbm_back_modrdn: can't figure out old_rdn from dn\n",
0, 0, 0 );
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "could not parse old DN", NULL, NULL );
goto return_results;
}
Debug( LDAP_DEBUG_TRACE,
"ldbm_back_modrdn: can't figure out the old_rdn type\n",
0, 0, 0 );
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "count parse RDN from old DN", NULL, NULL );
goto return_results;
}
}
-#ifdef DNS_DN
- if ( dn_type( old_rdn ) == DN_X500 ) {
-#endif
-
Debug( LDAP_DEBUG_TRACE, "ldbm_back_modrdn: DN_X500\n",
0, 0, 0 );
add_bv.bv_val = new_rdn_val;
add_bv.bv_len = strlen(new_rdn_val);
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+ /* not yet implemented */
+#else
mod[0].ml_type = new_rdn_type;
mod[0].ml_bvalues = add_bvals;
- mod[0].ml_op = LDAP_MOD_SOFTADD;
+ mod[0].ml_op = SLAP_MOD_SOFTADD;
mod[0].ml_next = NULL;
+#endif
/* Remove old rdn value if required */
Debug( LDAP_DEBUG_TRACE,
"ldbm_back_modrdn: can't figure out old_rdn_val from old_rdn\n",
0, 0, 0 );
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "cound not parse value from old RDN", NULL, NULL );
goto return_results;
}
del_bv.bv_val = old_rdn_val;
del_bv.bv_len = strlen(old_rdn_val);
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+ /* not yet implemented */
+#else
/* No need to normalize old_rdn_type, delete_values()
* does that for us
*/
mod[1].ml_bvalues = del_bvals;
mod[1].ml_op = LDAP_MOD_DELETE;
mod[1].ml_next = NULL;
+#endif
Debug( LDAP_DEBUG_TRACE,
"ldbm_back_modrdn: removing old_rdn_val=%s\n",
old_rdn_val, 0, 0 );
}
-#ifdef DNS_DN
- } else {
- Debug( LDAP_DEBUG_TRACE, "ldbm_back_modrdn: DNS DN\n",
- 0, 0, 0 );
- /* XXXV3: not sure of what to do here */
- Debug( LDAP_DEBUG_TRACE,
- "ldbm_back_modrdn: not fully implemented...\n",
- 0, 0, 0 );
-
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
- goto return_results;
-
- }
-#endif
-
/* check for abandon */
ldap_pvt_thread_mutex_lock( &op->o_abandonmutex );
if ( op->o_abandon ) {
/* delete old one */
if ( dn2id_delete( be, e->e_ndn, e->e_id ) != 0 ) {
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "DN index delete fail", NULL, NULL );
goto return_results;
}
/* add new one */
if ( dn2id_add( be, e->e_ndn, e->e_id ) != 0 ) {
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "DN index add failed", NULL, NULL );
goto return_results;
}
/* modify memory copy of entry */
- if ( ldbm_modify_internal( be, conn, op, dn, &mod[0], e )
- != 0 ) {
+ rc = ldbm_modify_internal( be, conn, op, dn, &mod[0], e );
+
+ if( rc != LDAP_SUCCESS ) {
+ if( rc != SLAPD_ABANDON ) {
+ send_ldap_result( conn, op, rc,
+ NULL, NULL, NULL, NULL );
+ }
goto return_results;
}
/* id2entry index */
if ( id2entry_add( be, e ) != 0 ) {
entry_free( e );
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "entry update failed", NULL, NULL );
goto return_results;
}