if( e->e_ndn == NULL || *e->e_ndn == '\0' ) {
/* protocolError may be a more appropriate error */
send_ldap_result( conn, op, rc = LDAP_ALREADY_EXISTS,
- NULL, "root DSE exists", NULL, NULL );
+ NULL, "root DSE already exists",
+ NULL, NULL );
goto done;
+
+#if defined( SLAPD_SCHEMA_DN )
+ } else if ( strcasecmp( ndn, SLAPD_SCHEMA_DN ) == 0 ) {
+ /* protocolError may be a more appropriate error */
+ send_ldap_result( conn, op, rc = LDAP_ALREADY_EXISTS,
+ NULL, "subschema subentry already exists",
+ NULL, NULL );
+ goto done;
+#endif
}
- manageDSAit = get_manageDSAit( op ) &&
- is_entry_referral( e );
+ manageDSAit = get_manageDSAit( op );
/*
* We could be serving multiple database backends. Select the
*/
be = select_backend( e->e_ndn, manageDSAit );
if ( be == NULL ) {
+ struct berval **ref = referral_rewrite( default_referral,
+ NULL, e->e_dn, LDAP_SCOPE_DEFAULT );
+
send_ldap_result( conn, op, rc = LDAP_REFERRAL,
- NULL, NULL, default_referral, NULL );
+ NULL, NULL, ref ? ref : default_referral, NULL );
+
+ ber_bvecfree( ref );
goto done;
}
*/
if ( be->be_add ) {
/* do the update here */
- int repl_user = (be->be_update_ndn != NULL &&
- strcmp( be->be_update_ndn, op->o_ndn ) == 0);
+ int repl_user = be_isupdate(be, op->o_ndn );
#ifndef SLAPD_MULTIMASTER
if ( be->be_update_ndn == NULL || repl_user )
#endif
#ifndef SLAPD_MULTIMASTER
} else {
+ struct berval **defref = be->be_update_refs
+ ? be->be_update_refs : default_referral;
+ struct berval **ref = referral_rewrite( defref,
+ NULL, e->e_dn, LDAP_SCOPE_DEFAULT );
+
send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
- be->be_update_refs ? be->be_update_refs : default_referral, NULL );
+ ref ? ref : defref, NULL );
+
+ ber_bvecfree( ref );
#endif
}
} else {
return LDAP_SUCCESS;
}
-