mdb->mi_flags |= MDB_RE_OPEN;
ch_free( mdb->mi_dbenv_home );
mdb->mi_dbenv_home = NULL;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
ldap_pvt_thread_pool_purgekey( mdb->mi_dbenv );
break;
case MDB_DBNOSYNC:
rc = mdb_env_set_flags( mdb->mi_dbenv, mdb_envflags[i].mask, 0 );
if ( rc ) {
mdb->mi_flags |= MDB_RE_OPEN;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
rc = 0;
}
mdb->mi_dbenv_flags ^= mdb_envflags[i].mask;
rc = mdb_env_set_flags( mdb->mi_dbenv, mdb_envflags[i].mask, 0 );
if ( rc ) {
mdb->mi_flags |= MDB_RE_OPEN;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
rc = 0;
}
mdb->mi_dbenv_flags ^= mdb_envflags[i].mask;
}
mdb->mi_defaultmask = 0;
mdb->mi_flags |= MDB_DEL_INDEX;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
} else {
struct berval bv, def = BER_BVC("default");
ai->ai_indexmask |= MDB_INDEX_DELETING;
mdb->mi_flags |= MDB_DEL_INDEX;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
}
bv.bv_val[ bv.bv_len ] = sep;
rc = 0;
if ( rc ) {
mdb->mi_flags |= MDB_RE_OPEN;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
rc = 0;
}
mdb->mi_dbenv_flags |= mdb_envflags[j].mask;
if( rc != LDAP_SUCCESS ) return 1;
if ( mdb->mi_flags & MDB_IS_OPEN ) {
mdb->mi_flags |= MDB_OPEN_INDEX;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
if ( !mdb->mi_index_task ) {
/* Start the task as soon as we finish here. Set a long
* interval (10 hours) so that it only gets scheduled once.
mdb->mi_readers = c->value_int;
if ( mdb->mi_flags & MDB_IS_OPEN ) {
mdb->mi_flags |= MDB_RE_OPEN;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
}
break;
mdb->mi_mapsize = c->value_ulong;
if ( mdb->mi_flags & MDB_IS_OPEN ) {
mdb->mi_flags |= MDB_RE_OPEN;
- c->cleanup = mdb_cf_cleanup;
+ config_push_cleanup( c, mdb_cf_cleanup );
}
break;
return rc;
}
+int
+config_push_cleanup(ConfigArgs *ca, ConfigDriver *cleanup)
+{
+ int i;
+ /* silently ignore redundant push */
+ for (i=0; i < ca->num_cleanups; i++) {
+ if ( ca->cleanups[i] == cleanup )
+ return 0;
+ }
+
+ if (ca->num_cleanups >= SLAP_CONFIG_CLEANUP_MAX)
+ return -1;
+ ca->cleanups[ca->num_cleanups++] = cleanup;
+ return 0;
+}
+
+int
+config_run_cleanup(ConfigArgs *ca)
+{
+ int i, rc = 0;
+
+ for (i=0; i < ca->num_cleanups; i++) {
+ rc = ca->cleanups[i](ca);
+ if (rc)
+ break;
+ }
+ return rc;
+}
+
int
init_config_attrs(ConfigTable *ct) {
int i, code;
BackendInfo *bi;
Entry *ca_entry; /* entry being modified */
void *ca_private; /* anything */
- ConfigDriver *cleanup;
+#ifndef SLAP_CONFIG_CLEANUP_MAX
+#define SLAP_CONFIG_CLEANUP_MAX 16
+#endif
+ ConfigDriver *cleanups[SLAP_CONFIG_CLEANUP_MAX];
ConfigType table; /* which config table did we come from */
+ int num_cleanups;
} ConfigArgs;
/* If lineno is zero, we have an actual LDAP Add request from a client.
int config_get_vals(ConfigTable *ct, ConfigArgs *c);
int config_add_vals(ConfigTable *ct, ConfigArgs *c);
+int config_push_cleanup(ConfigArgs *c, ConfigDriver *cleanup);
+int config_run_cleanup(ConfigArgs *c);
+
void init_config_argv( ConfigArgs *c );
int init_config_attrs(ConfigTable *ct);
int init_config_ocs( ConfigOCs *ocs );