X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldbm%2Fldbm.c;h=31c845416f9702ee40d58d901d4b3fc088c5ad82;hb=3b9f4a82ee478c943a66696adf9133dc9f503e16;hp=585f8040c66b4dfe928f0ab005412773b4a60f6d;hpb=3f0917e57b9640d72672bf31ed1730b73ddef217;p=openldap diff --git a/libraries/libldbm/ldbm.c b/libraries/libldbm/ldbm.c index 585f8040c6..31c845416f 100644 --- a/libraries/libldbm/ldbm.c +++ b/libraries/libldbm/ldbm.c @@ -1,7 +1,7 @@ /* ldbm.c - ldap dbm compatibility routines */ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -120,8 +120,10 @@ ldbm_db_errcall( const char *prefix, char *message ) int ldbm_initialize( const char* home ) { +#if DB_VERSION_MAJOR < 3 int err; u_int32_t envFlags; +#endif if(ldbm_initialized++) return 1; @@ -165,8 +167,7 @@ int ldbm_initialize( const char* home ) if ( err ) { #ifdef LDAP_SYSLOG syslog( LOG_INFO, "ldbm_initialize(): " - "FATAL error in db_appinit() : %s (%d)\n", - db_strerror( err ), err ); + "FATAL error (%d) in db_appinit()\n", err ); #endif return( 1 ); } @@ -230,10 +231,9 @@ DB_ENV *ldbm_initialize_env(const char *home, int dbcachesize, int *envdirok) return NULL; } -#if DB_VERSION_MINOR >= 3 +#if DB_VERSION_MAJOR > 3 || DB_VERSION_MINOR >= 3 + /* This interface appeared in 3.3 */ env->set_alloc( env, ldbm_malloc, NULL, NULL ); -#else - env->set_malloc( env, ldbm_malloc ); #endif env->set_errcall( env, ldbm_db_errcall ); @@ -304,6 +304,9 @@ LDBM ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize ) { LDBM ret = NULL; +#ifdef HAVE_EBCDIC + char n2[2048]; +#endif #if DB_VERSION_MAJOR >= 3 int err; @@ -318,11 +321,25 @@ ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize ) return NULL; } +#if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR < 3 + ret->set_malloc( ret, ldbm_malloc ); +#endif + ret->set_pagesize( ret, DEFAULT_DB_PAGE_SIZE ); /* likely should use ber_mem* routines */ +#ifdef HAVE_EBCDIC + strncpy(n2, name, sizeof(n2)-1); + n2[sizeof(n2)-1] = '\0'; + __atoe(n2); + name = n2; +#endif +#if DB_VERSION_MAJOR >= 4 && DB_VERSION_MINOR > 0 && DB_VERSION_PATCH >= 17 + err = ret->open( ret, NULL, name, NULL, DB_TYPE, rw, mode); +#else err = ret->open( ret, name, NULL, DB_TYPE, rw, mode); +#endif if ( err != 0 ) { int tmp = errno; @@ -388,12 +405,10 @@ void ldbm_close( LDBM ldbm ) { LDBM_WLOCK; -#if DB_VERSION_MAJOR >= 3 +#if DB_VERSION_MAJOR >= 2 ldbm->close( ldbm, 0 ); -#elif DB_VERSION_MAJOR >= 2 - (*ldbm->close)( ldbm, 0 ); #else - (*ldbm->close)( ldbm ); + ldbm->close( ldbm ); #endif LDBM_WUNLOCK; } @@ -414,7 +429,7 @@ ldbm_fetch( LDBM ldbm, Datum key ) LDBM_RLOCK; -#if DB_VERSION_MAJOR >= 3 +#if DB_VERSION_MAJOR >= 2 ldbm_datum_init( data ); data.flags = DB_DBT_MALLOC; @@ -424,20 +439,8 @@ ldbm_fetch( LDBM ldbm, Datum key ) data.dptr = NULL; data.dsize = 0; } - -#elif DB_VERSION_MAJOR >= 2 - ldbm_datum_init( data ); - - data.flags = DB_DBT_MALLOC; - - if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) { - ldbm_datum_free( ldbm, data ); - data.dptr = NULL; - data.dsize = 0; - } #else - - if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) { + if ( (rc = ldbm->get( ldbm, &key, &data, 0 )) == 0 ) { /* Berkeley DB 1.85 don't malloc the data for us */ /* duplicate it for to ensure reentrancy */ data = ldbm_datum_dup( ldbm, data ); @@ -459,19 +462,15 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags ) LDBM_WLOCK; -#if DB_VERSION_MAJOR >= 3 +#if DB_VERSION_MAJOR >= 2 rc = ldbm->put( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC ); rc = (-1) * rc; - -#elif DB_VERSION_MAJOR >= 2 - rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC ); - rc = (-1) * rc; #else - rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC ); + rc = ldbm->put( ldbm, &key, &data, flags & ~LDBM_SYNC ); #endif if ( flags & LDBM_SYNC ) - (*ldbm->sync)( ldbm, 0 ); + ldbm->sync( ldbm, 0 ); LDBM_WUNLOCK; @@ -485,16 +484,13 @@ ldbm_delete( LDBM ldbm, Datum key ) LDBM_WLOCK; -#if DB_VERSION_MAJOR >= 3 +#if DB_VERSION_MAJOR >= 2 rc = ldbm->del( ldbm, NULL, &key, 0 ); rc = (-1) * rc; -#elif DB_VERSION_MAJOR >= 2 - rc = (*ldbm->del)( ldbm, NULL, &key, 0 ); - rc = (-1) * rc; #else - rc = (*ldbm->del)( ldbm, &key, 0 ); + rc = ldbm->del( ldbm, &key, 0 ); #endif - (*ldbm->sync)( ldbm, 0 ); + ldbm->sync( ldbm, 0 ); LDBM_WUNLOCK; @@ -518,20 +514,17 @@ ldbm_firstkey( LDBM ldbm, LDBMCursor **dbch ) LDBM_RLOCK; /* acquire a cursor for the DB */ -# if DB_VERSION_MAJOR >= 3 +# if DB_VERSION_MAJOR >= 3 || (DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR > 5) rc = ldbm->cursor( ldbm, NULL, &dbci, 0 ); -# elif defined( DB_VERSION_MAJOR ) && defined( DB_VERSION_MINOR ) && \ - (DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6) - rc = (*ldbm->cursor)( ldbm, NULL, &dbci ); # else - rc = (*ldbm->cursor)( ldbm, NULL, &dbci, 0 ); + rc = ldbm->cursor( ldbm, NULL, &dbci ); # endif if( rc ) { key.dptr = NULL; } else { *dbch = dbci; - if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) { + if ( dbci->c_get( dbci, &key, &data, DB_NEXT ) == 0 ) { ldbm_datum_free( ldbm, data ); } else { key.dptr = NULL; @@ -544,7 +537,7 @@ ldbm_firstkey( LDBM ldbm, LDBMCursor **dbch ) #else LDBM_RLOCK; - rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST ); + rc = ldbm->seq( ldbm, &key, &data, R_FIRST ); if ( rc == 0 ) { key = ldbm_datum_dup( ldbm, key ); @@ -573,12 +566,12 @@ ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp ) ldbm_datum_free( ldbm, key ); key.flags = data.flags = DB_DBT_MALLOC; - rc = (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ); + rc = dbcp->c_get( dbcp, &key, &data, DB_NEXT ); if ( rc == 0 ) { ldbm_datum_free( ldbm, data ); } else #else - rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT ); + rc = ldbm->seq( ldbm, &key, &data, R_NEXT ); if ( rc == 0 ) { key = ldbm_datum_dup( ldbm, key ); @@ -624,6 +617,14 @@ ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize ) #ifdef HAVE_ST_BLKSIZE struct stat st; #endif +#ifdef HAVE_EBCDIC + char n2[2048]; + + strncpy(n2, name, sizeof(n2)-1); + n2[sizeof(n2)-1] = '\0'; + __atoe(n2); + name = n2; +#endif LDBM_WLOCK;