-#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 failed, 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)
+ ": database \"%s\": "
+ "shared memory env open failed, assuming stale env.\n",
+ be->be_suffix[0].bv_val, 0, 0 );
+ goto shm_retry;
+ }
+ }
+ Debug( LDAP_DEBUG_ANY,
+ LDAP_XSTRING(bdb_db_open) ": database \"%s\" cannot be %s, err %d. "
+ "Restore from backup!\n",
+ be->be_suffix[0].bv_val, do_recover ? "recovered" : "opened", rc );
+ goto fail;
+ }
+
+ if ( do_alock_recover && alock_recover (&bdb->bi_alock_info) != 0 ) {