]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
Listener commit broke test048, skip listener check on Hidden DBs
[openldap] / servers / slapd / bconfig.c
index d9862ed9ac59cf4ca3f95bddcc68519538d900fa..408f513f0c300faf717b8ab2875d2436fe070251 100644 (file)
@@ -3702,7 +3702,7 @@ config_rename_one( Operation *op, SlapReply *rs, Entry *e,
        if ( use_ldif ) {
                CfBackInfo *cfb = (CfBackInfo *)op->o_bd->be_private;
                BackendDB *be = op->o_bd;
-               slap_callback sc = { NULL, slap_null_cb, NULL, NULL };
+               slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
                struct berval dn, ndn, xdn, xndn;
 
                op->o_bd = &cfb->cb_db;
@@ -3717,18 +3717,19 @@ config_rename_one( Operation *op, SlapReply *rs, Entry *e,
                op->o_req_dn = odn;
                op->o_req_ndn = ondn;
 
-               sc.sc_next = op->o_callback;
+               scp = op->o_callback;
                op->o_callback = ≻
                op->orr_newrdn = *newrdn;
                op->orr_nnewrdn = *nnewrdn;
                op->orr_deleteoldrdn = 1;
                op->orr_modlist = NULL;
                slap_modrdn2mods( op, rs );
+               slap_mods_opattrs( op, &op->orr_modlist, 1 );
                rc = op->o_bd->be_modrdn( op, rs );
                slap_mods_free( op->orr_modlist, 1 );
 
                op->o_bd = be;
-               op->o_callback = sc.sc_next;
+               op->o_callback = scp;
                op->o_dn = dn;
                op->o_ndn = ndn;
                op->o_req_dn = xdn;
@@ -3838,9 +3839,6 @@ check_name_index( CfEntryInfo *parent, ConfigType ce_type, Entry *e,
                }
        }
 
-       if ( !isfrontend && index == -1 )
-               index = 0;
-
        /* count related kids */
        for (nsibs=0, ce=parent->ce_kids; ce; ce=ce->ce_sibs) {
                if ( ce->ce_type == ce_type ) nsibs++;
@@ -3851,9 +3849,13 @@ check_name_index( CfEntryInfo *parent, ConfigType ce_type, Entry *e,
                        if ( index < nsibs ) {
                                if ( tailindex ) return LDAP_NAMING_VIOLATION;
                                /* Siblings need to be renumbered */
-                               renumber = 1;
+                               if ( index != -1 || !isfrontend )
+                                       renumber = 1;
                        }
                }
+               if ( !isfrontend && index == -1 )
+                       index = nsibs;
+
                /* just make index = nsibs */
                if ( !renumber ) {
                        rc = config_renumber_one( NULL, rs, parent, e, index, tailindex, 0 );
@@ -3978,12 +3980,16 @@ config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs,
        char *ptr;
 
        /* Make sure parent exists and entry does not. But allow
-        * Databases and Overlays to be inserted.
+        * Databases and Overlays to be inserted. Don't do any
+        * auto-renumbering if manageDSAit control is present.
         */
        ce = config_find_base( cfb->cb_root, &e->e_nname, &last );
-       if ( ce && ce->ce_type != Cft_Database &&
-               ce->ce_type != Cft_Overlay )
+       if ( ce ) {
+               if (( op && op->o_managedsait ) ||
+                       ( ce->ce_type != Cft_Database && ce->ce_type != Cft_Overlay &&
+                         ce->ce_type != Cft_Module ))
                return LDAP_ALREADY_EXISTS;
+       }
 
        dnParent( &e->e_nname, &pdn );
 
@@ -4171,7 +4177,7 @@ ok:
 
                /* Advance to first of this type */
                cprev = &last->ce_kids;
-               for ( c2 = *cprev; c2 && c2->ce_type != ce->ce_type; ) {
+               for ( c2 = *cprev; c2 && c2->ce_type < ce->ce_type; ) {
                        cprev = &c2->ce_sibs;
                        c2 = c2->ce_sibs;
                }
@@ -4305,6 +4311,23 @@ config_back_add( Operation *op, SlapReply *rs )
 
        cfb = (CfBackInfo *)op->o_bd->be_private;
 
+       /* add opattrs for syncprov */
+       {
+               char textbuf[SLAP_TEXT_BUFLEN];
+               size_t textlen = sizeof textbuf;
+               rs->sr_err = entry_schema_check(op, op->ora_e, NULL, 0, 1,
+                       &rs->sr_text, textbuf, sizeof( textbuf ) );
+               if ( rs->sr_err != LDAP_SUCCESS )
+                       goto out;
+               rs->sr_err = slap_add_opattrs( op, &rs->sr_text, textbuf, textlen, 1 );
+               if ( rs->sr_err != LDAP_SUCCESS ) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               LDAP_XSTRING(config_back_add) ": entry failed op attrs add: "
+                               "%s (%d)\n", rs->sr_text, rs->sr_err, 0 );
+                       goto out;
+               }
+       }
+
        ldap_pvt_thread_pool_pause( &connection_pool );
 
        /* Strategy:
@@ -4334,7 +4357,7 @@ config_back_add( Operation *op, SlapReply *rs )
 
        if ( cfb->cb_use_ldif ) {
                BackendDB *be = op->o_bd;
-               slap_callback sc = { NULL, slap_null_cb, NULL, NULL };
+               slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
                struct berval dn, ndn;
 
                op->o_bd = &cfb->cb_db;
@@ -4345,11 +4368,11 @@ config_back_add( Operation *op, SlapReply *rs )
                op->o_dn = op->o_bd->be_rootdn;
                op->o_ndn = op->o_bd->be_rootndn;
 
-               sc.sc_next = op->o_callback;
+               scp = op->o_callback;
                op->o_callback = &sc;
                op->o_bd->be_add( op, rs );
                op->o_bd = be;
-               op->o_callback = sc.sc_next;
+               op->o_callback = scp;
                op->o_dn = dn;
                op->o_ndn = ndn;
        }
@@ -4359,6 +4382,7 @@ out2:;
 
 out:;
        send_ldap_result( op, rs );
+       slap_graduate_commit_csn( op );
        return rs->sr_err;
 }
 
@@ -4673,7 +4697,10 @@ config_back_modify( Operation *op, SlapReply *rs )
                }
        }
 
-       ldap_pvt_thread_pool_pause( &connection_pool );
+       slap_mods_opattrs( op, &op->orm_modlist, 1 );
+
+       if ( !slapd_shutdown )
+               ldap_pvt_thread_pool_pause( &connection_pool );
 
        /* Strategy:
         * 1) perform the Modify on the cached Entry.
@@ -4686,7 +4713,7 @@ config_back_modify( Operation *op, SlapReply *rs )
                rs->sr_text = ca.msg;
        } else if ( cfb->cb_use_ldif ) {
                BackendDB *be = op->o_bd;
-               slap_callback sc = { NULL, slap_null_cb, NULL, NULL };
+               slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
                struct berval dn, ndn;
 
                op->o_bd = &cfb->cb_db;
@@ -4696,18 +4723,20 @@ config_back_modify( Operation *op, SlapReply *rs )
                op->o_dn = op->o_bd->be_rootdn;
                op->o_ndn = op->o_bd->be_rootndn;
 
-               sc.sc_next = op->o_callback;
+               scp = op->o_callback;
                op->o_callback = &sc;
                op->o_bd->be_modify( op, rs );
                op->o_bd = be;
-               op->o_callback = sc.sc_next;
+               op->o_callback = scp;
                op->o_dn = dn;
                op->o_ndn = ndn;
        }
 
-       ldap_pvt_thread_pool_resume( &connection_pool );
+       if ( !slapd_shutdown )
+               ldap_pvt_thread_pool_resume( &connection_pool );
 out:
        send_ldap_result( op, rs );
+       slap_graduate_commit_csn( op );
        return rs->sr_err;
 }
 
@@ -5011,17 +5040,18 @@ config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
        Debug( LDAP_DEBUG_TRACE, "config_build_entry: \"%s\"\n", rdn->bv_val, 0, 0);
        e->e_private = ce;
        ce->ce_entry = e;
+       ce->ce_type = main->co_type;
        ce->ce_parent = parent;
        if ( parent ) {
                pdn = parent->ce_entry->e_nname;
-               if ( parent->ce_kids )
-                       for ( ceprev = parent->ce_kids; ceprev->ce_sibs;
+               if ( parent->ce_kids && parent->ce_kids->ce_type < ce->ce_type )
+                       for ( ceprev = parent->ce_kids; ceprev->ce_sibs &&
+                               ceprev->ce_type < ce->ce_type;
                                ceprev = ceprev->ce_sibs );
        } else {
                BER_BVZERO( &pdn );
        }
 
-       ce->ce_type = main->co_type;
        ce->ce_private = c->private;
        ce->ce_be = c->be;
        ce->ce_bi = c->bi;
@@ -5074,8 +5104,10 @@ config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
                }
        }
        if ( ceprev ) {
+               ce->ce_sibs = ceprev->ce_sibs;
                ceprev->ce_sibs = ce;
        } else if ( parent ) {
+               ce->ce_sibs = parent->ce_kids;
                parent->ce_kids = ce;
        }