]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
slight improvements; doesn't work yet
[openldap] / servers / slapd / backend.c
index e45cf3bca82a1cf67fce535cd8e0f72543c12b30..344ba7354580f08055dcc4d09a049a4fffa79cb5 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2003 The OpenLDAP Foundation.
+ * Copyright 1998-2004 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -81,6 +81,9 @@
 #if defined(SLAPD_PERL) && !defined(SLAPD_PERL_DYNAMIC)
 #include "back-perl/external.h"
 #endif
+#if defined(SLAPD_RELAY) && !defined(SLAPD_RELAY_DYNAMIC)
+#include "back-relay/external.h"
+#endif
 #if defined(SLAPD_SHELL) && !defined(SLAPD_SHELL_DYNAMIC)
 #include "back-shell/external.h"
 #endif
@@ -125,6 +128,9 @@ static BackendInfo binfo[] = {
 #if defined(SLAPD_PERL) && !defined(SLAPD_PERL_DYNAMIC)
        {"perl",        perl_back_initialize},
 #endif
+#if defined(SLAPD_RELAY) && !defined(SLAPD_RELAY_DYNAMIC)
+       {"relay",       relay_back_initialize},
+#endif
 #if defined(SLAPD_SHELL) && !defined(SLAPD_SHELL_DYNAMIC)
        {"shell",       shell_back_initialize},
 #endif
@@ -172,6 +178,8 @@ int backend_init(void)
                binfo[nBackendInfo].bi_type != NULL;
                nBackendInfo++ )
        {
+               assert( binfo[nBackendInfo].bi_init );
+
                rc = binfo[nBackendInfo].bi_init( &binfo[nBackendInfo] );
 
                if(rc != 0) {
@@ -223,6 +231,21 @@ int backend_add(BackendInfo *aBackendInfo)
 {
    int rc = 0;
 
+   if ( aBackendInfo->bi_init == NULL ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( BACKEND, ERR, 
+                  "backend_add:  backend type \"%s\" does not have the "
+                 "(mandatory)init function\n",
+                  aBackendInfo->bi_type, 0, 0 );
+#else
+      Debug( LDAP_DEBUG_ANY,
+                  "backend_add:  backend type \"%s\" does not have the "
+                 "(mandatory)init function\n",
+                  aBackendInfo->bi_type, 0, 0 );
+#endif
+      return -1;
+   }
+
    if ((rc = aBackendInfo->bi_init(aBackendInfo)) != 0) {
 #ifdef NEW_LOGGING
                LDAP_LOG( BACKEND, ERR, 
@@ -283,11 +306,13 @@ int backend_startup(Backend *be)
 
 #ifdef NEW_LOGGING
                LDAP_LOG( BACKEND, DETAIL1, "backend_startup:  starting \"%s\"\n",
-                          be->be_suffix[0].bv_val, 0, 0 );
+                       be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)",
+                       0, 0 );
 #else
                Debug( LDAP_DEBUG_TRACE,
                        "backend_startup: starting \"%s\"\n",
-                       be->be_suffix[0].bv_val, 0, 0 );
+                       be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)",
+                       0, 0 );
 #endif
 
                if ( be->bd_info->bi_open ) {
@@ -358,6 +383,20 @@ int backend_startup(Backend *be)
 
                LDAP_TAILQ_INIT( &backendDB[i].be_pending_csn_list );
 
+               if ( backendDB[i].be_suffix == NULL ) {
+#ifdef NEW_LOGGING
+                       LDAP_LOG( BACKEND, CRIT, 
+                               "backend_startup: warning, database %d (%s) "
+                               "has no suffix\n",
+                               i, backendDB[i].bd_info->bi_type, 0 );
+#else
+                       Debug( LDAP_DEBUG_ANY,
+                               "backend_startup: warning, database %d (%s) "
+                               "has no suffix\n",
+                               i, backendDB[i].bd_info->bi_type, 0 );
+#endif
+               }
+
                if ( backendDB[i].bd_info->bi_db_open ) {
                        rc = backendDB[i].bd_info->bi_db_open(
                                &backendDB[i] );
@@ -376,6 +415,21 @@ int backend_startup(Backend *be)
 
                if ( !LDAP_STAILQ_EMPTY( &backendDB[i].be_syncinfo )) {
                        syncinfo_t *si;
+
+                       if ( !( backendDB[i].be_search && backendDB[i].be_add &&
+                               backendDB[i].be_modify && backendDB[i].be_delete )) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( BACKEND, CRIT, 
+                                       "backend_startup: database(%d) does not support "
+                                       "operations required for syncrepl", i, 0, 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                       "backend_startup: database(%d) does not support "
+                                       "operations required for syncrepl", i, 0, 0 );
+#endif
+                               continue;
+                       }
+
                        LDAP_STAILQ_FOREACH( si, &backendDB[i].be_syncinfo, si_next ) {
                                si->si_be = &backendDB[i];
                                init_syncrepl( si );
@@ -904,27 +958,19 @@ backend_check_restrictions(
                        break;
                }
 
-               {
-                       if( bvmatch( opdata, &slap_EXOP_START_TLS ) ) {
-                               session++;
-                               starttls++;
-                               break;
-                       }
+               if( bvmatch( opdata, &slap_EXOP_START_TLS ) ) {
+                       session++;
+                       starttls++;
+                       break;
                }
 
-               {
-                       if( bvmatch( opdata, &slap_EXOP_WHOAMI ) ) {
-                               break;
-                       }
+               if( bvmatch( opdata, &slap_EXOP_WHOAMI ) ) {
+                       break;
                }
 
-#ifdef LDAP_EXOP_X_CANCEL
-               {
-                       if ( bvmatch( opdata, &slap_EXOP_CANCEL ) ) {
-                               break;
-                       }
+               if ( bvmatch( opdata, &slap_EXOP_CANCEL ) ) {
+                       break;
                }
-#endif
 
                /* treat everything else as a modify */
                opflag = SLAP_RESTRICT_OP_MODIFY;
@@ -1035,9 +1081,10 @@ backend_check_restrictions(
                if( requires & SLAP_REQUIRE_STRONG ) {
                        /* should check mechanism */
                        if( ( op->o_transport_ssf < ssf->sss_transport
-                               && op->o_authtype == LDAP_AUTH_SIMPLE ) || op->o_dn.bv_len == 0 )
+                               && op->o_authtype == LDAP_AUTH_SIMPLE )
+                               || op->o_dn.bv_len == 0 )
                        {
-                               rs->sr_text = "strong authentication required";
+                               rs->sr_text = "strong(er) authentication required";
                                rs->sr_err = LDAP_STRONG_AUTH_REQUIRED;
                                return rs->sr_err;
                        }
@@ -1286,7 +1333,7 @@ backend_group(
        }
 
        if ( op->o_tag != LDAP_REQ_BIND && !op->o_do_not_cache ) {
-               g = sl_malloc(sizeof(GroupAssertion) + gr_ndn->bv_len, op->o_tmpmemctx);
+               g = op->o_tmpalloc(sizeof(GroupAssertion) + gr_ndn->bv_len, op->o_tmpmemctx);
                g->ga_be = op->o_bd;
                g->ga_oc = group_oc;
                g->ga_at = group_at;