]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
fix typo (ITS#4784)
[openldap] / servers / slapd / bconfig.c
index e8fa653bfdb082dedd97908d362582dc1d8c4e89..6efd2d2df6aeacb80cdbee6ba6c32f8ddfa3cd7f 100644 (file)
@@ -3183,6 +3183,10 @@ config_find_base( CfEntryInfo *root, struct berval *dn, CfEntryInfo **last )
 typedef struct setup_cookie {
        CfBackInfo *cfb;
        ConfigArgs *ca;
+       Entry *frontend;
+       Entry *config;
+       int     got_frontend;
+       int got_config;
 } setup_cookie;
 
 static int
@@ -3192,6 +3196,56 @@ config_ldif_resp( Operation *op, SlapReply *rs )
                setup_cookie *sc = op->o_callback->sc_private;
 
                sc->cfb->cb_got_ldif = 1;
+               /* Does the frontend exist? */
+               if ( !sc->got_frontend ) {
+                       if ( !strncmp( rs->sr_entry->e_nname.bv_val,
+                               "olcDatabase", STRLENOF( "olcDatabase" ))) {
+                               if ( strncmp( rs->sr_entry->e_nname.bv_val +
+                                       STRLENOF( "olcDatabase" ), "={-1}frontend",
+                                       STRLENOF( "={-1}frontend" ))) {
+                                       struct berval rdn;
+                                       int i = op->o_noop;
+                                       sc->ca->be = frontendDB;
+                                       sc->ca->bi = frontendDB->bd_info;
+                                       frontendDB->be_cf_ocs = &CFOC_FRONTEND;
+                                       rdn.bv_val = sc->ca->log;
+                                       rdn.bv_len = snprintf(rdn.bv_val, sizeof( sc->ca->log ),
+                                               "%s=" SLAP_X_ORDERED_FMT "%s",
+                                               cfAd_database->ad_cname.bv_val, -1,
+                                               sc->ca->bi->bi_type);
+                                       op->o_noop = 1;
+                                       sc->frontend = config_build_entry( op, rs,
+                                               sc->cfb->cb_root, sc->ca, &rdn, &CFOC_DATABASE,
+                                               sc->ca->be->be_cf_ocs );
+                                       op->o_noop = i;
+                               }
+                               sc->got_frontend++;
+                       }
+               }
+               /* Does the configDB exist? */
+               if ( sc->got_frontend && !sc->got_config &&
+                       !strncmp( rs->sr_entry->e_nname.bv_val,
+                       "olcDatabase", STRLENOF( "olcDatabase" ))) {
+                       if ( strncmp( rs->sr_entry->e_nname.bv_val +
+                               STRLENOF( "olcDatabase" ), "={0}config",
+                               STRLENOF( "={0}config" ))) {
+                               struct berval rdn;
+                               int i = op->o_noop;
+                               sc->ca->be = LDAP_STAILQ_FIRST( &backendDB );
+                               sc->ca->bi = sc->ca->be->bd_info;
+                               rdn.bv_val = sc->ca->log;
+                               rdn.bv_len = snprintf(rdn.bv_val, sizeof( sc->ca->log ),
+                                       "%s=" SLAP_X_ORDERED_FMT "%s",
+                                       cfAd_database->ad_cname.bv_val, 0,
+                                       sc->ca->bi->bi_type);
+                               op->o_noop = 1;
+                               sc->config = config_build_entry( op, rs, sc->cfb->cb_root,
+                                       sc->ca, &rdn, &CFOC_DATABASE, sc->ca->be->be_cf_ocs );
+                               op->o_noop = i;
+                       }
+                       sc->got_config++;
+               }
+
                rs->sr_err = config_add_internal( sc->cfb, rs->sr_entry, sc->ca, NULL, NULL, NULL );
                if ( rs->sr_err != LDAP_SUCCESS ) {
                        Debug( LDAP_DEBUG_ANY, "config error processing %s: %s\n",
@@ -3294,6 +3348,10 @@ config_setup_ldif( BackendDB *be, const char *dir, int readit ) {
                sc.cfb = cfb;
                sc.ca = &c;
                cb.sc_private = ≻
+               sc.got_frontend = 0;
+               sc.got_config = 0;
+               sc.frontend = NULL;
+               sc.config = NULL;
 
                op->o_bd = &cfb->cb_db;
                
@@ -3306,6 +3364,15 @@ config_setup_ldif( BackendDB *be, const char *dir, int readit ) {
                /* Restore normal DN validation */
                slap_DN_strict = prev_DN_strict;
 
+               op->o_tag = LDAP_REQ_ADD;
+               if ( rc == LDAP_SUCCESS && sc.frontend ) {
+                       op->ora_e = sc.frontend;
+                       rc = op->o_bd->be_add( op, &rs );
+               }
+               if ( rc == LDAP_SUCCESS && sc.config ) {
+                       op->ora_e = sc.config;
+                       rc = op->o_bd->be_add( op, &rs );
+               }
                ldap_pvt_thread_pool_context_reset( thrctx );
        }
 
@@ -4243,7 +4310,7 @@ config_modify_internal( CfEntryInfo *ce, Operation *op, SlapReply *rs,
        
        if(rc == LDAP_SUCCESS) {
                /* check that the entry still obeys the schema */
-               rc = entry_schema_check(op, e, NULL, 0,
+               rc = entry_schema_check(op, e, NULL, 0, 0,
                        &rs->sr_text, ca->msg, sizeof(ca->msg) );
        }
        if ( rc == LDAP_SUCCESS ) {
@@ -4646,10 +4713,10 @@ config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
        }
 
        oc_at = attr_find( e->e_attrs, slap_schema.si_ad_objectClass );
-       rc = structural_class(oc_at->a_vals, &val, NULL, &text, c->msg,
-               sizeof(c->msg));
-       attr_merge_normalize_one(e, slap_schema.si_ad_structuralObjectClass, &val, NULL );
-       if ( op ) {
+       rc = structural_class(oc_at->a_vals, &oc, NULL, &text, c->msg,
+               sizeof(c->msg), op->o_tmpmemctx );
+       attr_merge_normalize_one(e, slap_schema.si_ad_structuralObjectClass, &oc->soc_cname, NULL );
+       if ( !op->o_noop ) {
                op->ora_e = e;
                op->o_bd->be_add( op, rs );
                if ( ( rs->sr_err != LDAP_SUCCESS ) 
@@ -4881,18 +4948,18 @@ config_back_db_open( BackendDB *be )
                return config_check_schema( cfb );
        }
 
-       if ( cfb->cb_use_ldif ) {
-               thrctx = ldap_pvt_thread_pool_context();
-               op = (Operation *) &opbuf;
-               connection_fake_init( &conn, op, thrctx );
+       thrctx = ldap_pvt_thread_pool_context();
+       op = (Operation *) &opbuf;
+       connection_fake_init( &conn, op, thrctx );
 
-               op->o_tag = LDAP_REQ_ADD;
-               op->o_callback = &cb;
-               op->o_bd = &cfb->cb_db;
-               op->o_dn = op->o_bd->be_rootdn;
-               op->o_ndn = op->o_bd->be_rootndn;
-       } else {
-               op = NULL;
+       op->o_tag = LDAP_REQ_ADD;
+       op->o_callback = &cb;
+       op->o_bd = &cfb->cb_db;
+       op->o_dn = op->o_bd->be_rootdn;
+       op->o_ndn = op->o_bd->be_rootndn;
+
+       if ( !cfb->cb_use_ldif ) {
+               op->o_noop = 1;
        }
 
        /* create root of tree */