static AttributeDescription *cfAd_backend, *cfAd_database, *cfAd_overlay,
*cfAd_include;
-static ConfigFile cf_prv, *cfn = &cf_prv;
+static ConfigFile *cfn;
static Avlnode *CfOcTree;
/* log error */
Debug( SLAPD_DEBUG_CONFIG_ERROR, "%s: (optional) %s overlay \"%s\" configuration failed"
SLAPD_CONF_UNKNOWN_IGNORED ".\n",
- c->log, c->be == frontendDB ? "global " : "", c->argv[1][1]);
+ c->log, c->be == frontendDB ? "global " : "", &c->argv[1][1]);
#ifdef SLAPD_CONF_UNKNOWN_BAILOUT
return 1;
#endif /* SLAPD_CONF_UNKNOWN_BAILOUT */
}
if ( notallowed != NULL ) {
+ char buf[ SLAP_TEXT_BUFLEN ] = { '\0' };
+
+ if ( !BER_BVISNULL( &c->value_dn ) ) {
+ snprintf( buf, sizeof( buf ), "<%s> ", c->value_dn.bv_val );
+ }
+
Debug(LDAP_DEBUG_ANY,
- "%s: suffix <%s> not allowed in %s database.\n",
- c->log, c->value_dn.bv_val, notallowed );
+ "%s: suffix %snot allowed in %s database.\n",
+ c->log, buf, notallowed );
return 1;
}
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 },
{ 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 ) {
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;
rc = read_config_file(cfname, 0, NULL, config_back_cf_table);
if ( rc == 0 )
- ber_str2bv( cfname, 0, 1, &cf_prv.c_file );
+ ber_str2bv( cfname, 0, 1, &cfb->cb_config->c_file );
/* If we got this far and failed, it may be a serious problem. In server
* mode, we should never come to this. However, it may be alright if we're
if ( ca->lineno )
return LDAP_COMPARE_TRUE;
- if ( p->ce_type == Cft_Global )
- cfn = &cf_prv;
- else
- cfn = p->ce_private;
+ cfn = p->ce_private;
ca->private = cfn;
return LDAP_SUCCESS;
}
/* This entry is hardcoded, don't re-parse it */
if ( p->ce_type == Cft_Global ) {
- cfn = &cf_prv;
+ cfn = p->ce_private;
ca->private = cfn;
return LDAP_COMPARE_TRUE;
}
*/
rc = LDAP_CONSTRAINT_VIOLATION;
if ( colst[0]->co_type == Cft_Global && !last ) {
- cfn = &cf_prv;
+ cfn = cfb->cb_config;
ca->private = cfn;
ca->be = frontendDB; /* just to get past check_vals */
rc = LDAP_SUCCESS;
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 );
}
}
}
}
+ if ( op )
+ slap_sl_mem_destroy( NULL, op->o_tmpmemctx );
return 0;
}
+static void
+cfb_free_cffile( ConfigFile *cf )
+{
+ ConfigFile *next;
+
+ for (; cf; cf=next) {
+ next = cf->c_sibs;
+ if ( cf->c_kids )
+ cfb_free_cffile( cf->c_kids );
+ ch_free( cf->c_file.bv_val );
+ ber_bvarray_free( cf->c_dseFiles );
+ ch_free( cf );
+ }
+}
+
+static void
+cfb_free_entries( CfEntryInfo *ce )
+{
+ CfEntryInfo *next;
+
+ for (; ce; ce=next) {
+ next = ce->ce_sibs;
+ if ( ce->ce_kids )
+ cfb_free_entries( ce->ce_kids );
+ ce->ce_entry->e_private = NULL;
+ entry_free( ce->ce_entry );
+ ch_free( ce );
+ }
+}
+
static int
-config_back_db_destroy( Backend *be )
+config_back_db_close( BackendDB *be )
{
+ CfBackInfo *cfb = be->be_private;
+
+ 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;
}
static int
-config_back_db_init( Backend *be )
+config_back_db_init( BackendDB *be )
{
struct berval dn;
CfBackInfo *cfb;
cfb = ch_calloc( 1, sizeof(CfBackInfo));
- cfb->cb_config = &cf_prv;
+ cfb->cb_config = ch_calloc( 1, sizeof(ConfigFile));
+ cfn = cfb->cb_config;
be->be_private = cfb;
ber_dupbv( &be->be_rootdn, &config_rdn );
bi->bi_db_init = config_back_db_init;
bi->bi_db_config = 0;
bi->bi_db_open = config_back_db_open;
- bi->bi_db_close = 0;
+ bi->bi_db_close = config_back_db_close;
bi->bi_db_destroy = config_back_db_destroy;
bi->bi_op_bind = config_back_bind;