#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
#endif
#ifdef SLAPD_SHELL
{"shell", shell_back_initialize},
+#endif
+#ifdef SLAPD_TCL
+ {"tcl", tcl_back_initialize},
#endif
{NULL}
};
int backend_init(void)
{
- int rc = 0;
+ int rc = -1;
if((nBackendInfo != 0) || (backendInfo != NULL)) {
/* already initialized */
"backend_init: failed\n",
0, 0, 0 );
- return rc ? rc : -1;
+ return rc;
}
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;
}
if(rc != 0) {
- Debug( LDAP_DEBUG_TRACE,
+ Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_db_open failed!\n",
0, 0, 0 );
return rc;
/* 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;
}
if(rc != 0) {
- Debug( LDAP_DEBUG_TRACE,
+ Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_db_open %d failed!\n",
i, 0, 0 );
return rc;
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] );
/* 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] );
return NULL;
}
+ bi->bi_nDB++;
return( be );
}
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] );
}
}
char *
be_root_dn( Backend *be )
{
- int rc;
-
if ( be->be_root_dn == NULL ) {
return( "" );
}
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,
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 );
}
}