]> git.sur5r.net Git - openldap/blobdiff - libraries/libldbm/ldbm.c
update CDB support
[openldap] / libraries / libldbm / ldbm.c
index 4b5f76f4fb1d47213435106264d5cb41b8c75cbf..baaa1c7922947898822e3c3d75ecf18b641fbeb5 100644 (file)
@@ -106,6 +106,29 @@ int ldbm_initialize( const char* home )
 
        if(ldbm_initialized++) return 1;
 
+       {
+               char *version;
+               int major, minor, patch;
+               version = db_version( &major, &minor, &patch );
+
+               if( major != DB_VERSION_MAJOR ||
+                       minor < DB_VERSION_MINOR )
+               {
+#ifdef LDAP_SYSLOG
+                       char error[BUFSIZ];
+
+                       sprintf( error, "%s (%d)\n", STRERROR( err ), err );
+
+                       syslog( LOG_INFO,
+                               "ldbm_initialize(): version mismatch\nexpected: %s\ngot: %s\n",
+                               DB_VERSION_STRING,
+                               version );
+#endif
+
+                       return 1;
+               }
+       }
+
 #ifndef HAVE_BERKELEY_DB_THREAD
        ldap_pvt_thread_mutex_init( &ldbm_big_mutex );
 #endif
@@ -252,6 +275,8 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
        err = db_create( &ret, ldbm_Env, 0 );
        if ( err != 0 ) {
                (void)ret->close(ret, 0);
+               LDBM_UNLOCK;
+
                return NULL;
        }
 
@@ -260,12 +285,16 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 
        err = ret->open( ret, name, NULL, DB_TYPE, rw, mode);
 
-       LDBM_UNLOCK;
-
        if ( err != 0 ) {
+               int tmp = errno;
                (void)ret->close(ret, 0);
+               errno = tmp;
+
+               LDBM_UNLOCK;
                return NULL;
        }
+
+       LDBM_UNLOCK;
  
 #elif DB_VERSION_MAJOR >= 2
        DB_INFO dbinfo;
@@ -313,7 +342,7 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
        LDBM_UNLOCK;
 #endif
 
-       return( ret );
+       return ret;
 }
 
 void