]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-meta/candidates.c
Drop unnecessary memset()s
[openldap] / servers / slapd / back-meta / candidates.c
index 1cc8d83a87a38e46f49892ada7463ca6f6511ba1..e0c0116af62cad98a419ea7624fb0285df40ab7e 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2005 The OpenLDAP Foundation.
+ * Copyright 1999-2006 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * Portions Copyright 1999-2003 Howard Chu.
  * All rights reserved.
  */
 int 
 meta_back_is_candidate(
-       struct berval   *nsuffix,
-       int             suffixscope,
+       metatarget_t    *mt,
        struct berval   *ndn,
        int             scope )
 {
-       if ( dnIsSuffix( ndn, nsuffix ) ) {
-               switch ( suffixscope ) {
+       if ( dnIsSuffix( ndn, &mt->mt_nsuffix ) ) {
+               if ( mt->mt_subtree_exclude ) {
+                       int     i;
+
+                       for ( i = 0; !BER_BVISNULL( &mt->mt_subtree_exclude[ i ] ); i++ ) {
+                               if ( dnIsSuffix( ndn, &mt->mt_subtree_exclude[ i ] ) ) {
+                                       return META_NOT_CANDIDATE;
+                               }
+                       }
+               }
+
+               switch ( mt->mt_scope ) {
                case LDAP_SCOPE_SUBTREE:
                default:
                        return META_CANDIDATE;
 
-#ifdef LDAP_SCOPE_SUBORDINATE
                case LDAP_SCOPE_SUBORDINATE:
-                       if ( ndn->bv_len > nsuffix->bv_len ) {
+                       if ( ndn->bv_len > mt->mt_nsuffix.bv_len ) {
                                return META_CANDIDATE;
                        }
                        break;
-#endif /* LDAP_SCOPE_SUBORDINATE */
 
                /* nearly useless; not allowed by config */
                case LDAP_SCOPE_ONELEVEL:
-                       if ( ndn->bv_len > nsuffix->bv_len ) {
+                       if ( ndn->bv_len > mt->mt_nsuffix.bv_len ) {
                                struct berval   rdn = *ndn;
 
-                               rdn.bv_len -= nsuffix->bv_len
+                               rdn.bv_len -= mt->mt_nsuffix.bv_len
                                        + STRLENOF( "," );
                                if ( dnIsOneLevelRDN( &rdn ) ) {
                                        return META_CANDIDATE;
@@ -93,7 +100,7 @@ meta_back_is_candidate(
 
                /* nearly useless; not allowed by config */
                case LDAP_SCOPE_BASE:
-                       if ( ndn->bv_len == nsuffix->bv_len ) {
+                       if ( ndn->bv_len == mt->mt_nsuffix.bv_len ) {
                                return META_CANDIDATE;
                        }
                        break;
@@ -102,7 +109,7 @@ meta_back_is_candidate(
                return META_NOT_CANDIDATE;
        }
 
-       if ( scope == LDAP_SCOPE_SUBTREE && dnIsSuffix( nsuffix, ndn ) ) {
+       if ( scope == LDAP_SCOPE_SUBTREE && dnIsSuffix( &mt->mt_nsuffix, ndn ) ) {
                /*
                 * suffix longer than dn, but common part matches
                 */
@@ -127,11 +134,10 @@ meta_back_select_unique_candidate(
 {
        int     i, candidate = META_TARGET_NONE;
 
-       for ( i = 0; i < mi->mi_ntargets; ++i ) {
-               if ( meta_back_is_candidate( &mi->mi_targets[ i ].mt_nsuffix,
-                               mi->mi_targets[ i ].mt_scope,
-                               ndn, LDAP_SCOPE_BASE ) )
-               {
+       for ( i = 0; i < mi->mi_ntargets; i++ ) {
+               metatarget_t    *mt = mi->mi_targets[ i ];
+
+               if ( meta_back_is_candidate( mt, ndn, LDAP_SCOPE_BASE ) ) {
                        if ( candidate == META_TARGET_NONE ) {
                                candidate = i;
 
@@ -162,7 +168,7 @@ meta_clear_unused_candidates(
                if ( i == candidate ) {
                        continue;
                }
-               candidates[ i ].sr_tag = META_NOT_CANDIDATE;
+               META_CANDIDATE_RESET( &candidates[ i ] );
        }
 
        return 0;
@@ -175,9 +181,23 @@ meta_clear_unused_candidates(
  */
 int
 meta_clear_one_candidate(
-       metasingleconn_t        *msc )
+       Operation       *op,
+       metaconn_t      *mc,
+       int             candidate )
 {
-       if ( msc->msc_ld ) {
+       metasingleconn_t        *msc = &mc->mc_conns[ candidate ];
+
+       if ( msc->msc_ld != NULL ) {
+
+#ifdef DEBUG_205
+               char    buf[ BUFSIZ ];
+
+               snprintf( buf, sizeof( buf ), "meta_clear_one_candidate ldap_unbind_ext[%d] mc=%p ld=%p",
+                       candidate, (void *)mc, (void *)msc->msc_ld );
+               Debug( LDAP_DEBUG_ANY, "### %s %s\n",
+                       op ? op->o_log_prefix : "", buf, 0 );
+#endif /* DEBUG_205 */
+
                ldap_unbind_ext( msc->msc_ld, NULL, NULL );
                msc->msc_ld = NULL;
        }
@@ -193,6 +213,8 @@ meta_clear_one_candidate(
                BER_BVZERO( &msc->msc_cred );
        }
 
+       msc->msc_mscflags = 0;
+
        return 0;
 }