X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackend.c;h=cac82703390e3f06f4984a4f7fcc2fcc621e95ea;hb=af423fd393488947252da5fd6cd927edfd1bf110;hp=8680ff8cf8d6cfbae4c99f375fb2c2ca53df358f;hpb=36a06168c50a630cdc130727f34b32df0aca38b0;p=openldap diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 8680ff8cf8..cac8270339 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -11,10 +11,14 @@ #include #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 @@ -24,11 +28,17 @@ #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 ); } }