]> git.sur5r.net Git - openldap/blobdiff - libraries/libldbm/ldbm.c
Force sd close. Suggested by rajk@home.com
[openldap] / libraries / libldbm / ldbm.c
index c2f191c31f2771dcd0d0dde74ba32abce81092f6..59305bb582aef4006421884932d230a5ec1c36f7 100644 (file)
@@ -1,4 +1,9 @@
 /* ldbm.c - ldap dbm compatibility routines */
+/* $OpenLDAP$ */
+/*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
 
 /* Patched for Berkeley DB version 2.0; /KSp; 98/02/23
  *
@@ -12,7 +17,8 @@
 #ifdef SLAPD_LDBM
 
 #include <stdio.h>
-#include <stdlib.h>
+
+#include <ac/stdlib.h>
 #include <ac/string.h>
 #include <ac/errno.h>
 
@@ -26,6 +32,7 @@ ldbm_datum_free( LDBM ldbm, Datum data )
        if ( data.dptr ) {
                free( data.dptr );
                memset( &data, 0, sizeof( Datum ));
+               data.dptr = NULL;
        }
 }
 
@@ -52,13 +59,19 @@ ldbm_datum_dup( LDBM ldbm, Datum data )
 
 static int ldbm_initialized = 0;
 
-#ifndef HAVE_BERKELEY_DB2
-/* Everything but DB2 is non-reentrant */
-
+#ifndef HAVE_BERKELEY_DB2_DB_THREAD
+/* Only DB2 with DB_THREAD is thread-free */
 static ldap_pvt_thread_mutex_t ldbm_big_mutex;
 #define LDBM_LOCK      (ldap_pvt_thread_mutex_lock(&ldbm_big_mutex))
 #define LDBM_UNLOCK    (ldap_pvt_thread_mutex_unlock(&ldbm_big_mutex))
 
+#else
+#define LDBM_LOCK      ((void)0)
+#define LDBM_UNLOCK    ((void)0)
+#endif
+
+#ifndef HAVE_BERKELEY_DB2
+
 int ldbm_initialize( void )
 {
        if(ldbm_initialized++) return 1;
@@ -79,38 +92,32 @@ int ldbm_shutdown( void )
 
 #else
 
-#ifdef HAVE_SYSLOG
-#include "syslog.h"
-#else
-/* quick hack */
-#define LOG_INFO 1
-extern int syslog(int, char*, ...);
-#endif
-
 void *
 ldbm_malloc( size_t size )
 {
        return( calloc( 1, size ));
 }
 
+#ifdef LDAP_SYSLOG
+#include <ac/syslog.h>
+#endif
+
 static void
 ldbm_db_errcall( const char *prefix, char *message )
 {
+#ifdef LDAP_SYSLOG
        syslog( LOG_INFO, "ldbm_db_errcall(): %s %s", prefix, message );
+#endif
 }
 
 /*  a dbEnv for BERKELEYv2  */
 static DB_ENV    ldbm_Env_internal;
 DB_ENV           *ldbm_Env = NULL;
 
-/* Berkeley DB 2.x is reentrant */
-#define LDBM_LOCK      ((void)0)
-#define LDBM_UNLOCK    ((void)0)
-
 int ldbm_initialize( void )
 {
        int     err;
-       int     envFlags;
+       u_int32_t       envFlags;
 
        if(ldbm_initialized++) return 1;
 
@@ -120,7 +127,11 @@ int ldbm_initialize( void )
        ldbm_Env->db_errcall   = ldbm_db_errcall;
        ldbm_Env->db_errpfx    = "==>";
 
-       envFlags = DB_CREATE | DB_THREAD;
+       envFlags = DB_CREATE
+#ifdef HAVE_BERKELEY_DB2_DB_THREAD
+               | DB_THREAD
+#endif
+               ;
 
        if ( ( err = db_appinit( NULL, NULL, ldbm_Env, envFlags )) ) {
                char  error[BUFSIZ];
@@ -131,9 +142,11 @@ int ldbm_initialize( void )
                        sprintf( error, "%s\n", strerror( err ));
                }
 
+#ifdef LDAP_SYSLOG
                syslog( LOG_INFO,
                        "ldbm_initialize(): FATAL error in db_appinit() : %s\n",
                        error );
+#endif
                return( 1 );
        }
 
@@ -168,8 +181,19 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
        DB_INFO dbinfo;
 
        memset( &dbinfo, 0, sizeof( dbinfo ));
+
+#if defined( DB_VERSION_MAJOR ) && defined( DB_VERSION_MINOR ) && \
+    DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR == 4
+       /*
+        * BerkeleyDB 2.4 do not allow db_cachesize
+        * to be specified if an DB_ENV is.
+        */
+#else
+       /* set db_cachesize of MPOOL is NOT being used. */
        if (( ldbm_Env == NULL ) || ( ldbm_Env->mp_info == NULL ))
                dbinfo.db_cachesize = dbcachesize;
+#endif
+
        dbinfo.db_pagesize  = DEFAULT_DB_PAGE_SIZE;
        dbinfo.db_malloc    = ldbm_malloc;
 
@@ -297,16 +321,12 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-#ifdef HAVE_BERKELEY_DB2
-ldbm_firstkey( LDBM ldbm, DBC **dbch )
-#else
-ldbm_firstkey( LDBM ldbm )
-#endif
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbch )
 {
        Datum   key, data;
 
 #ifdef HAVE_BERKELEY_DB2
-       DBC  *dbci;
+       LDBMCursor  *dbci;
 
        ldbm_datum_init( key );
        ldbm_datum_init( data );
@@ -358,11 +378,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-#ifdef HAVE_BERKELEY_DB2
-ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp )
-#else
-ldbm_nextkey( LDBM ldbm, Datum key )
-#endif
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum   data;
 
@@ -405,7 +421,9 @@ ldbm_errno( LDBM ldbm )
 
 #elif defined( HAVE_GDBM )
 
+#ifdef HAVE_ST_BLKSIZE
 #include <sys/stat.h>
+#endif
 
 /*****************************************************************
  *                                                               *
@@ -417,7 +435,9 @@ LDBM
 ldbm_open( char *name, int rw, int mode, int dbcachesize )
 {
        LDBM            db;
-       struct stat     st;
+#ifdef HAVE_ST_BLKSIZE
+               struct stat     st;
+#endif
 
        LDBM_LOCK;
 
@@ -425,10 +445,20 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
                LDBM_UNLOCK;
                return( NULL );
        }
+
+#ifdef HAVE_ST_BLKSIZE
        if ( dbcachesize > 0 && stat( name, &st ) == 0 ) {
-               dbcachesize = (dbcachesize / st.st_blksize);
+               dbcachesize /= st.st_blksize;
+               if( dbcachesize == 0 ) dbcachesize = 1;
+               gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
+       }
+#else
+       if ( dbcachesize > 0 ) {
+               dbcachesize /= 4096;
+               if( dbcachesize == 0 ) dbcachesize = 1;
                gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
        }
+#endif
 
        LDBM_UNLOCK;
 
@@ -491,7 +521,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
        Datum d;
 
@@ -503,7 +533,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum d;
 
@@ -530,8 +560,7 @@ ldbm_errno( LDBM ldbm )
 
 /* MMAPED DBM HASHING DATABASE */
 
-#include <alloca.h>
-#include <string.h>
+#include <ac/string.h>
 
 /* #define MDBM_DEBUG */
 
@@ -603,7 +632,7 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 
        return( db );
 
-}/* LDBM ldbm_open() */
+}
 
 
 
@@ -629,7 +658,7 @@ ldbm_close( LDBM ldbm )
        fflush( stdout );
 #endif
 
-}/* void ldbm_close() */
+}
 
 
 
@@ -646,7 +675,7 @@ ldbm_sync( LDBM ldbm )
        mdbm_sync( ldbm );
         LDBM_UNLOCK;
 
-}/* void ldbm_sync() */
+}
 
 
 #define MAX_MDBM_RETRY 5
@@ -667,7 +696,7 @@ ldbm_fetch( LDBM ldbm, Datum key )
 
 #ifdef NO_NULL_KEY
        k.key.dsize = key.dsize + 1;                    
-       k.key.dptr = alloca(k.key.dsize);
+       k.key.dptr = malloc(k.key.dsize);
        *(k.key.dptr) = 'l';
        memcpy( (void *)(k.key.dptr + 1), key.dptr, key.dsize );        
 #else
@@ -707,9 +736,13 @@ ldbm_fetch( LDBM ldbm, Datum key )
 
        /* LDBM_UNLOCK; */
 
+#ifdef NO_NULL_KEY
+       free(k.key.dptr);
+#endif
+
        return d;
 
-}/* Datum ldbm_fetch() */
+}
 
 
 
@@ -731,7 +764,7 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
 
 #ifdef NO_NULL_KEY
        int_key.dsize = key.dsize + 1;
-       int_key.dptr = alloca( int_key.dsize );
+       int_key.dptr = malloc( int_key.dsize );
        *(int_key.dptr) = 'l';  /* Must not be NULL !*/
        memcpy( (void *)(int_key.dptr + 1), key.dptr, key.dsize );
 #else
@@ -750,10 +783,13 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
        fflush( stdout );
 #endif
 
-       return( rc );
+#ifdef NO_NULL_KEY
+       free(int_key.dptr);
+#endif
 
-}/* int ldbm_store() */
+       return( rc );
 
+}
 
 
 
@@ -767,7 +803,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 
 #ifdef NO_NULL_KEY
        int_key.dsize = key.dsize + 1;
-       int_key.dptr = alloca(int_key.dsize);
+       int_key.dptr = malloc(int_key.dsize);
        *(int_key.dptr) = 'l';
        memcpy( (void *)(int_key.dptr + 1), key.dptr, key.dsize );      
 #else
@@ -777,10 +813,13 @@ ldbm_delete( LDBM ldbm, Datum key )
        rc = mdbm_delete( ldbm, int_key );
 
        /* LDBM_UNLOCK; */
+#ifdef NO_NULL_KEY
+       free(int_key.dptr);
+#endif
 
        return( rc );
 
-}/* int ldbm_delete() */
+}
 
 
 
@@ -802,7 +841,7 @@ ldbm_get_next( LDBM ldbm, kvpair (*fptr)(MDBM *, kvpair) )
        /* LDBM_LOCK; */
 
        in.key.dsize = sz;      /* Assume first key in one pg */
-       in.key.dptr = alloca(sz);
+       in.key.dptr = malloc(sz);
        
        in.val.dptr = NULL;     /* Don't need data just key */ 
        in.val.dsize = 0;
@@ -830,27 +869,29 @@ ldbm_get_next( LDBM ldbm, kvpair (*fptr)(MDBM *, kvpair) )
        }
 
        /* LDBM_UNLOCK; */
+       
+       free(in.key.dptr);
 
        return ret;
 
-}/* static Datum ldbm_get_next() */
+}
 
 
 
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
 
        return ldbm_get_next( ldbm, mdbm_first );
 
-}/* Datum ldbm_firstkey() */
+}
 
 
 
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
 
        /* XXX:
@@ -860,7 +901,7 @@ ldbm_nextkey( LDBM ldbm, Datum key )
 
        return ldbm_get_next( ldbm, mdbm_next );
 
-}/* Datum ldbm_nextkey() */
+}
 
 int
 ldbm_errno( LDBM ldbm )
@@ -868,7 +909,7 @@ ldbm_errno( LDBM ldbm )
        /* XXX: best we can do with current  mdbm interface */
        return( errno );
 
-}/* int ldbm_errno() */
+}
 
 
 
@@ -946,7 +987,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
        Datum d;
 
@@ -958,7 +999,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum d;