]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
update for new backend types
[openldap] / servers / slapd / bconfig.c
index 430ef92831fcba17ee0c477bc108c5819bac59ec..042d4b0d586f68adb943f4cf9eb16e1e9e876f4b 100644 (file)
@@ -1854,11 +1854,12 @@ config_requires(ConfigArgs *c) {
        return(0);
 }
 
+static slap_verbmasks  *loglevel_ops;
+
 static int
-config_loglevel(ConfigArgs *c) {
-       int i;
-       char *next;
-       slap_verbmasks loglevel_ops[] = {
+loglevel_init( void )
+{
+       slap_verbmasks  lo[] = {
                { BER_BVC("Any"),       -1 },
                { BER_BVC("Trace"),     LDAP_DEBUG_TRACE },
                { BER_BVC("Packets"),   LDAP_DEBUG_PACKETS },
@@ -1878,6 +1879,39 @@ config_loglevel(ConfigArgs *c) {
                { BER_BVNULL,   0 }
        };
 
+       return slap_verbmasks_init( &loglevel_ops, lo );
+}
+
+static slap_mask_t     loglevel_ignore[] = { -1, 0 };
+
+int
+slap_loglevel_register( slap_mask_t m, struct berval *s )
+{
+       int     rc;
+
+       if ( loglevel_ops == NULL ) {
+               loglevel_init();
+       }
+
+       rc = slap_verbmasks_append( &loglevel_ops, m, s, loglevel_ignore );
+
+       if ( rc != 0 ) {
+               Debug( LDAP_DEBUG_ANY, "slap_loglevel_register(%d, \"%s\") failed\n",
+                       m, s->bv_val, 0 );
+       }
+
+       return rc;
+}
+
+static int
+config_loglevel(ConfigArgs *c) {
+       int i;
+       char *next;
+
+       if ( loglevel_ops == NULL ) {
+               loglevel_init();
+       }
+
        if (c->op == SLAP_CONFIG_EMIT) {
                return mask_to_verbs( loglevel_ops, ldap_syslog, &c->rvalue_vals );
        } else if ( c->op == LDAP_MOD_DELETE ) {
@@ -2541,6 +2575,8 @@ config_setup_ldif( BackendDB *be, const char *dir, int readit ) {
 
                op->o_bd = &cfb->cb_db;
                rc = op->o_bd->be_search( op, &rs );
+
+               slap_sl_mem_destroy( NULL, op->o_tmpmemctx );
        }
 
        cfb->cb_use_ldif = 1;
@@ -3218,7 +3254,7 @@ ok:
 leave:
        if ( rc ) {
                if ( (colst[0]->co_type == Cft_Database) && ca->be ) {
-                       backend_destroy_one( ca->be );
+                       backend_destroy_one( ca->be, 1 );
                } else if ( (colst[0]->co_type == Cft_Overlay) && ca->bi ) {
                        overlay_destroy_one( ca->be, (slap_overinst *)ca->bi );
                }
@@ -4005,6 +4041,8 @@ config_back_db_open( BackendDB *be )
                        }
                }
        }
+       if ( op )
+               slap_sl_mem_destroy( NULL, op->o_tmpmemctx );
 
        return 0;
 }
@@ -4044,22 +4082,38 @@ config_back_db_close( BackendDB *be )
 {
        CfBackInfo *cfb = be->be_private;
 
-       /* Note - this is asymmetric; cfb->cb_config was allocated in db_init
-        * not db_open. We cannot re-open this DB after a close. (Not that we
-        * ever could anyway.)
-        */
-       cfb_free_cffile( cfb->cb_config );
-       cfb->cb_config = NULL;
-
        cfb_free_entries( cfb->cb_root );
        cfb->cb_root = NULL;
+
+       if ( cfb->cb_db.bd_info ) {
+               backend_shutdown( &cfb->cb_db );
+       }
+
        return 0;
 }
 
 static int
 config_back_db_destroy( BackendDB *be )
 {
+       CfBackInfo *cfb = be->be_private;
+
+       cfb_free_cffile( cfb->cb_config );
+
+       ch_free( cfdir.bv_val );
+
+       avl_free( CfOcTree, NULL );
+
+       if ( cfb->cb_db.bd_info ) {
+               cfb->cb_db.be_suffix = NULL;
+               cfb->cb_db.be_nsuffix = NULL;
+               BER_BVZERO( &cfb->cb_db.be_rootdn );
+               BER_BVZERO( &cfb->cb_db.be_rootndn );
+
+               backend_destroy_one( &cfb->cb_db, 0 );
+       }
+
        free( be->be_private );
+
        return 0;
 }
 
@@ -4071,6 +4125,7 @@ config_back_db_init( BackendDB *be )
 
        cfb = ch_calloc( 1, sizeof(CfBackInfo));
        cfb->cb_config = ch_calloc( 1, sizeof(ConfigFile));
+       cfn = cfb->cb_config;
        be->be_private = cfb;
 
        ber_dupbv( &be->be_rootdn, &config_rdn );