]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
fix Release configuration
[openldap] / servers / slapd / backend.c
index 8680ff8cf8d6cfbae4c99f375fb2c2ca53df358f..cac82703390e3f06f4984a4f7fcc2fcc621e95ea 100644 (file)
 #include <sys/stat.h>
 
 #include "slap.h"
+#include "lutil.h"
 
 #ifdef SLAPD_LDBM
 #include "back-ldbm/external.h"
 #endif
+#ifdef SLAPD_BDB2
+#include "back-bdb2/external.h"
+#endif
 #ifdef SLAPD_PASSWD
 #include "back-passwd/external.h"
 #endif
 #ifdef SLAPD_SHELL
 #include "back-shell/external.h"
 #endif
+#ifdef SLAPD_TCL
+#include "back-tcl/external.h"
+#endif
 
 static BackendInfo binfo[] = {
 #ifdef SLAPD_LDBM
        {"ldbm",        ldbm_back_initialize},
 #endif
+#ifdef SLAPD_BDB2
+       {"bdb2",        bdb2_back_initialize},
+#endif
 #ifdef SLAPD_PASSWD
        {"passwd",      passwd_back_initialize},
 #endif
@@ -37,6 +47,9 @@ static BackendInfo binfo[] = {
 #endif
 #ifdef SLAPD_SHELL
        {"shell",       shell_back_initialize},
+#endif
+#ifdef SLAPD_TCL
+       {"tcl",         tcl_back_initialize},
 #endif
        {NULL}
 };
@@ -49,7 +62,7 @@ BackendDB     *backendDB = NULL;
 
 int backend_init(void)
 {
-       int rc = 0;
+       int rc = -1;
 
        if((nBackendInfo != 0) || (backendInfo != NULL)) {
                /* already initialized */
@@ -93,7 +106,7 @@ int backend_init(void)
                "backend_init: failed\n",
                0, 0, 0 );
 
-       return rc ? rc : -1;
+       return rc;
 }
 
 int backend_startup(int n)
@@ -115,13 +128,22 @@ int backend_startup(int n)
                        "backend_startup: starting database %d\n",
                        n, 0, 0 );
 
+               /* make sure, n does not exceed the number of backend databases */
+               if ( n >= nbackends ) {
+
+                       Debug( LDAP_DEBUG_ANY,
+                               "backend_startup: database number %d exceeding maximum (%d)\n",
+                               n, nbackends, 0 );
+                       return 1;
+               }
+
                if ( backendDB[n].bd_info->bi_open ) {
                        rc = backendDB[n].bd_info->bi_open(
                                backendDB[n].bd_info );
                }
 
                if(rc != 0) {
-                       Debug( LDAP_DEBUG_TRACE,
+                       Debug( LDAP_DEBUG_ANY,
                                "backend_startup: bi_open failed!\n",
                                0, 0, 0 );
                        return rc;
@@ -133,7 +155,7 @@ int backend_startup(int n)
                }
 
                if(rc != 0) {
-                       Debug( LDAP_DEBUG_TRACE,
+                       Debug( LDAP_DEBUG_ANY,
                                "backend_startup: bi_db_open failed!\n",
                                0, 0, 0 );
                        return rc;
@@ -144,13 +166,18 @@ int backend_startup(int n)
 
        /* open each backend type */
        for( i = 0; i < nBackendInfo; i++ ) {
+               if( backendInfo[i].bi_nDB == 0) {
+                       /* no database of this type, don't open */
+                       continue;
+               }
+
                if( backendInfo[i].bi_open ) {
                        rc = backendInfo[i].bi_open(
                                &backendInfo[i] );
                }
 
                if(rc != 0) {
-                       Debug( LDAP_DEBUG_TRACE,
+                       Debug( LDAP_DEBUG_ANY,
                                "backend_startup: bi_open %d failed!\n",
                                i, 0, 0 );
                        return rc;
@@ -165,7 +192,7 @@ int backend_startup(int n)
                }
 
                if(rc != 0) {
-                       Debug( LDAP_DEBUG_TRACE,
+                       Debug( LDAP_DEBUG_ANY,
                                "backend_startup: bi_db_open %d failed!\n",
                                i, 0, 0 );
                        return rc;
@@ -178,10 +205,25 @@ int backend_startup(int n)
 int backend_shutdown(int n)
 {
        int i;
+       int rc = 0;
 
        if(n >= 0) {
                /* shutdown a specific backend database */
 
+               /* make sure, n does not exceed the number of backend databases */
+               if ( n >= nbackends ) {
+
+                       Debug( LDAP_DEBUG_ANY,
+                               "backend_startup: database number %d exceeding maximum (%d)\n",
+                               n, nbackends, 0 );
+                       return 1;
+               }
+
+               if ( backendDB[n].bd_info->bi_nDB == 0 ) {
+                       /* no database of this type, we never opened it */
+                       return 0;
+               }
+
                if ( backendDB[n].bd_info->bi_db_close ) {
                        backendDB[n].bd_info->bi_db_close(
                                &backendDB[n] );
@@ -197,14 +239,27 @@ int backend_shutdown(int n)
 
        /* close each backend database */
        for( i = 0; i < nBackendDB; i++ ) {
+               BackendInfo  *bi;
+
                if ( backendDB[i].bd_info->bi_db_close ) {
                        backendDB[i].bd_info->bi_db_close(
                                &backendDB[i] );
                }
+
+               if(rc != 0) {
+                       Debug( LDAP_DEBUG_ANY,
+                               "backend_close: bi_close %s failed!\n",
+                               bi->bi_type, 0, 0 );
+               }
        }
 
        /* close each backend type */
        for( i = 0; i < nBackendInfo; i++ ) {
+               if( backendInfo[i].bi_nDB == 0 ) {
+                       /* no database of this type */
+                       continue;
+               }
+
                if( backendInfo[i].bi_close ) {
                        backendInfo[i].bi_close(
                                &backendInfo[i] );
@@ -288,6 +343,7 @@ backend_db_init(
                return NULL;
        }
 
+       bi->bi_nDB++;
        return( be );
 }
 
@@ -297,7 +353,7 @@ be_db_close( void )
        int     i;
 
        for ( i = 0; i < nbackends; i++ ) {
-               if ( backends[i].bd_info->bi_db_close != NULL ) {
+               if ( backends[i].bd_info->bi_db_close ) {
                        (*backends[i].bd_info->bi_db_close)( &backends[i] );
                }
        }
@@ -397,8 +453,6 @@ be_isroot( Backend *be, char *ndn )
 char *
 be_root_dn( Backend *be )
 {
-       int rc;
-
        if ( be->be_root_dn == NULL ) {
                return( "" );
        }
@@ -428,6 +482,19 @@ be_isroot_pw( Backend *be, char *ndn, struct berval *cred )
        return result == 0;
 }
 
+int
+be_entry_release_rw( Backend *be, Entry *e, int rw )
+{
+       if ( be->be_release ) {
+               /* free and release entry from backend */
+               return be->be_release( be, e, rw );
+       } else {
+               /* free entry */
+               entry_free( e );
+               return 0;
+       }
+}
+
 int
 backend_unbind(
        Connection   *conn,
@@ -437,7 +504,7 @@ backend_unbind(
        int     i;
 
        for ( i = 0; i < nbackends; i++ ) {
-               if ( backends[i].be_unbind != NULL ) {
+               if ( backends[i].be_unbind ) {
                        (*backends[i].be_unbind)( &backends[i], conn, op );
                }
        }