-#ifdef HAVE_EBCDIC
- strcpy( path, bdb->bi_dbenv_home );
- __atoe( path );
- rc = bdb->bi_dbenv->open( bdb->bi_dbenv,
- path,
- flags,
- bdb->bi_dbenv_mode );
-#else
- rc = bdb->bi_dbenv->open( bdb->bi_dbenv,
- bdb->bi_dbenv_home,
- flags,
- bdb->bi_dbenv_mode );
-#endif
- if( rc != 0 ) {
+ flags = DB_INIT_MPOOL | DB_CREATE | DB_THREAD;
+
+ if ( !quick )
+ flags |= BDB_TXN_FLAGS;
+
+ /* If a key was set, use shared memory for the BDB environment */
+ if ( bdb->bi_shm_key ) {
+ bdb->bi_dbenv->set_shm_key( bdb->bi_dbenv, bdb->bi_shm_key );
+ flags |= DB_SYSTEM_MEM;
+ }
+ rc = bdb->bi_dbenv->open( bdb->bi_dbenv, dbhome,
+ flags | do_recover, bdb->bi_dbenv_mode );
+
+ if ( rc ) {
+ /* Regular open faied, probably a missing shm environment.
+ * Start over, do a recovery.
+ */
+ if ( !do_recover && bdb->bi_shm_key ) {
+ bdb->bi_dbenv->close( bdb->bi_dbenv, 0 );
+ rc = db_env_create( &bdb->bi_dbenv, 0 );
+ if( rc == 0 ) {
+ Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(bdb_db_open)
+ ": Shared memory env open failed, assuming stale env\n",
+ 0, 0, 0 );
+ goto shm_retry;
+ }
+ }