-int ldbm_errno( LDBM ldbm );
-LDBM ldbm_open( char *name, int rw, int mode, int dbcachesize );
-void ldbm_close( LDBM ldbm );
-void ldbm_sync( LDBM ldbm );
-void ldbm_datum_free( LDBM ldbm, Datum data );
-Datum ldbm_datum_dup( LDBM ldbm, Datum data );
-Datum ldbm_fetch( LDBM ldbm, Datum key );
-int ldbm_store( LDBM ldbm, Datum key, Datum data, int flags );
-int ldbm_delete( LDBM ldbm, Datum key );
-
-#if HAVE_BERKELEY_DB2
- void *ldbm_malloc( size_t size );
- Datum ldbm_firstkey( LDBM ldbm, DBC **dbch );
- Datum ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp );
+LDAP_BEGIN_DECL
+
+LDAP_LDBM_F (int) ldbm_initialize( const char * );
+LDAP_LDBM_F (int) ldbm_shutdown( void );
+
+LDAP_LDBM_F (DB_ENV*) ldbm_initialize_env(const char *, int dbcachesize, int *envdirok);
+LDAP_LDBM_F (void) ldbm_shutdown_env(DB_ENV *);
+
+LDAP_LDBM_F (int) ldbm_errno( LDBM ldbm );
+LDAP_LDBM_F (LDBM) ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize );
+LDAP_LDBM_F (void) ldbm_close( LDBM ldbm );
+LDAP_LDBM_F (void) ldbm_sync( LDBM ldbm );
+LDAP_LDBM_F (void) ldbm_datum_free( LDBM ldbm, Datum data );
+LDAP_LDBM_F (Datum) ldbm_datum_dup( LDBM ldbm, Datum data );
+LDAP_LDBM_F (Datum) ldbm_fetch( LDBM ldbm, Datum key );
+LDAP_LDBM_F (int) ldbm_store( LDBM ldbm, Datum key, Datum data, int flags );
+LDAP_LDBM_F (int) ldbm_delete( LDBM ldbm, Datum key );
+
+LDAP_LDBM_F (Datum) ldbm_firstkey( LDBM ldbm, LDBMCursor **cursor );
+LDAP_LDBM_F (Datum) ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *cursor );
+
+/* initialization of Datum structures */
+#if defined( HAVE_BERKELEY_DB ) && (DB_VERSION_MAJOR >= 2)
+ LDAP_LDBM_F (void *) ldbm_malloc( size_t size );
+# define ldbm_datum_init(d) ((void)memset(&(d), '\0', sizeof(Datum)))