]> git.sur5r.net Git - openldap/commitdiff
First-cut at manageDSAit-aware backend selection.
authorKurt Zeilenga <kurt@openldap.org>
Sat, 21 Oct 2000 03:29:02 +0000 (03:29 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sat, 21 Oct 2000 03:29:02 +0000 (03:29 +0000)
13 files changed:
servers/slapd/add.c
servers/slapd/backend.c
servers/slapd/bind.c
servers/slapd/compare.c
servers/slapd/config.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c
servers/slapd/proto-slap.h
servers/slapd/saslauthz.c
servers/slapd/search.c
servers/slapd/tools/slapadd.c
servers/slapd/tools/slapcommon.c

index 86030d638e2e95f52482476162639cd58fe5ad5d..c0c5a920a13005feeeefe8099946d952bea6edc9 100644 (file)
@@ -44,6 +44,7 @@ do_add( Connection *conn, Operation *op )
        Modifications *mods = NULL;
        const char *text;
        int                     rc = LDAP_SUCCESS;
+       int     manageDSAit;
 
        Debug( LDAP_DEBUG_TRACE, "do_add\n", 0, 0, 0 );
 
@@ -149,12 +150,15 @@ do_add( Connection *conn, Operation *op )
                goto done;
        }
 
+       manageDSAit = get_manageDSAit( op ) &&
+               is_entry_referral( e );
+
        /*
         * We could be serving multiple database backends.  Select the
         * appropriate one, or send a referral to our "referral server"
         * if we don't hold it.
         */
-       be = select_backend( e->e_ndn );
+       be = select_backend( e->e_ndn, manageDSAit );
        if ( be == NULL ) {
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        NULL, NULL, default_referral, NULL );
index 8aca7e0e1eb36e34501206db1d0871124ae82a82..d05df370751cacf6fbea63c59f02fed5652021f8 100644 (file)
@@ -433,9 +433,12 @@ be_db_close( void )
 }
 
 Backend *
-select_backend( const char * dn )
+select_backend(
+       const char * dn,
+       int manageDSAit )
 {
        int     i, j, len, dnlen;
+       Backend *be = NULL;
 
        dnlen = strlen( dn );
        for ( i = 0; i < nbackends; i++ ) {
@@ -449,13 +452,23 @@ select_backend( const char * dn )
                        }
 
                        if ( strcmp( backends[i].be_nsuffix[j],
-                           dn + (dnlen - len) ) == 0 ) {
-                               return( &backends[i] );
+                           dn + (dnlen - len) ) == 0 )
+                       {
+                               if( be == NULL ) {
+                                       be = &backends[i];
+
+                                       if( manageDSAit && len == dnlen ) {
+                                               continue;
+                                       }
+                               } else {
+                                       be = &backends[i];
+                               }
+                               return be;
                        }
                }
        }
 
-       return( NULL );
+       return be;
 }
 
 int
@@ -848,7 +861,7 @@ backend_group(
        if( strcmp( target->e_ndn, gr_ndn ) != 0 ) {
                /* we won't attempt to send it to a different backend */
                
-               be = select_backend(gr_ndn);
+               be = select_backend(gr_ndn, 0);
 
                if (be == NULL) {
                        return LDAP_NO_SUCH_OBJECT;
@@ -878,7 +891,7 @@ backend_attribute(
        if( target == NULL || strcmp( target->e_ndn, e_ndn ) != 0 ) {
                /* we won't attempt to send it to a different backend */
                
-               be = select_backend(e_ndn);
+               be = select_backend(e_ndn, 0);
 
                if (be == NULL) {
                        return LDAP_NO_SUCH_OBJECT;
index b22de77f7c6dc50e3737a5bc6a37f555ffe04901..9f3f5427b2c648f76a7db957d13da9cb0422b408 100644 (file)
@@ -336,7 +336,7 @@ do_bind(
         * if we don't hold it.
         */
 
-       if ( (be = select_backend( ndn )) == NULL ) {
+       if ( (be = select_backend( ndn, 0 )) == NULL ) {
                if ( default_referral ) {
                        send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                                NULL, NULL, default_referral, NULL );
index cb291b073d45ccdb0f8665a587f7eff95503a15c..262304a514770b265a6c4e134c09bb862caaaef3 100644 (file)
@@ -37,6 +37,7 @@ do_compare(
        Backend *be;
        int rc = LDAP_SUCCESS;
        const char *text = NULL;
+       int manageDSAit;
 
        ava.aa_desc = NULL;
        desc.bv_val = NULL;
@@ -100,12 +101,14 @@ do_compare(
                goto cleanup;
        }
 
+       manageDSAit = get_manageDSAit( op );
+
        /*
         * We could be serving multiple database backends.  Select the
         * appropriate one, or send a referral to our "referral server"
         * if we don't hold it.
         */
-       if ( (be = select_backend( ndn )) == NULL ) {
+       if ( (be = select_backend( ndn, manageDSAit )) == NULL ) {
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        NULL, NULL, default_referral, NULL );
                rc = 1;
index 41088400ec0b5390981ddd92f1f76e3c643a921f..51fef27f4560e88e132df0f2a9088044585da9b0 100644 (file)
@@ -412,7 +412,7 @@ read_config( const char *fname )
                                Debug( LDAP_DEBUG_ANY,
 "%s: line %d: suffix line must appear inside a database definition (ignored)\n",
                                    fname, lineno, 0 );
-                       } else if ( ( tmp_be = select_backend( cargv[1] ) ) == be ) {
+                       } else if ( ( tmp_be = select_backend( cargv[1], 0 ) ) == be ) {
                                Debug( LDAP_DEBUG_ANY,
 "%s: line %d: suffix already served by this backend (ignored)\n",
                                    fname, lineno, 0 );
@@ -464,13 +464,13 @@ read_config( const char *fname )
                                        "%s: line %d: suffixAlias line"
                                        " must appear inside a database definition (ignored)\n",
                                        fname, lineno, 0 );
-                       } else if ( (tmp_be = select_backend( cargv[1] )) != NULL ) {
+                       } else if ( (tmp_be = select_backend( cargv[1], 0 )) != NULL ) {
                                Debug( LDAP_DEBUG_ANY,
                                        "%s: line %d: suffixAlias served by"
                                        "  a preceeding backend \"%s\" (ignored)\n",
                                        fname, lineno, tmp_be->be_suffix[0] );
 
-                       } else if ( (tmp_be = select_backend( cargv[2] )) != NULL ) {
+                       } else if ( (tmp_be = select_backend( cargv[2], 0 )) != NULL ) {
                                Debug( LDAP_DEBUG_ANY,
                                        "%s: line %d: suffixAlias derefs to differnet backend"
                                        "  a preceeding backend \"%s\" (ignored)\n",
index 140e8251521d08722500aa39e98035fb5572b6a3..c253949f7b5b08af03bb68fc1dd1a11222132dd5 100644 (file)
@@ -35,6 +35,7 @@ do_delete(
        const char *text;
        Backend *be;
        int rc;
+       int manageDSAit;
 
        Debug( LDAP_DEBUG_TRACE, "do_delete\n", 0, 0, 0 );
 
@@ -76,12 +77,14 @@ do_delete(
        Statslog( LDAP_DEBUG_STATS, "conn=%ld op=%d DEL dn=\"%s\"\n",
                op->o_connid, op->o_opid, dn, 0, 0 );
 
+       manageDSAit = get_manageDSAit( op );
+
        /*
         * We could be serving multiple database backends.  Select the
         * appropriate one, or send a referral to our "referral server"
         * if we don't hold it.
         */
-       if ( (be = select_backend( ndn )) == NULL ) {
+       if ( (be = select_backend( ndn, manageDSAit )) == NULL ) {
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        NULL, NULL, default_referral, NULL );
                goto cleanup;
index faa0973246acf572b2208b6f81079c99fe2451f9..99e31fe033bec6a696287ce17a0da2fbde2dbb05 100644 (file)
@@ -45,6 +45,7 @@ do_modify(
        Backend         *be;
        int rc;
        const char      *text;
+       int manageDSAit;
 
        Debug( LDAP_DEBUG_TRACE, "do_modify\n", 0, 0, 0 );
 
@@ -165,12 +166,14 @@ do_modify(
        Statslog( LDAP_DEBUG_STATS, "conn=%ld op=%d MOD dn=\"%s\"\n",
            op->o_connid, op->o_opid, dn, 0, 0 );
 
+       manageDSAit = get_manageDSAit( op );
+
        /*
         * We could be serving multiple database backends.  Select the
         * appropriate one, or send a referral to our "referral server"
         * if we don't hold it.
         */
-       if ( (be = select_backend( ndn )) == NULL ) {
+       if ( (be = select_backend( ndn, manageDSAit )) == NULL ) {
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        NULL, NULL, default_referral, NULL );
                goto cleanup;
index 84808e97d943764f5205325b6eb441824023b31a..7bcf98ecf63bf35daa8d821dc38252ffeeba6475 100644 (file)
@@ -54,6 +54,7 @@ do_modrdn(
        ber_len_t       length;
        int rc;
        const char *text;
+       int manageDSAit;
 
        Debug( LDAP_DEBUG_TRACE, "do_modrdn\n", 0, 0, 0 );
 
@@ -160,13 +161,14 @@ do_modrdn(
        Statslog( LDAP_DEBUG_STATS, "conn=%ld op=%d MODRDN dn=\"%s\"\n",
            op->o_connid, op->o_opid, dn, 0, 0 );
 
+       manageDSAit = get_manageDSAit( op );
+
        /*
         * We could be serving multiple database backends.  Select the
         * appropriate one, or send a referral to our "referral server"
         * if we don't hold it.
         */
-
-       if ( (be = select_backend( ndn )) == NULL ) {
+       if ( (be = select_backend( ndn, manageDSAit )) == NULL ) {
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        NULL, NULL, default_referral, NULL );
                goto cleanup;
@@ -190,7 +192,7 @@ do_modrdn(
         * the same backend, otherwise we return an error.
         */
        if( newSuperior != NULL ) {
-               newSuperior_be = select_backend( nnewSuperior );
+               newSuperior_be = select_backend( nnewSuperior, 0 );
 
                if ( newSuperior_be != be ) {
                        /* newSuperior is in same backend */
index 84498e24b991a1321c3cc4b9234f039d3a4a714c..f97adc54822c106ca573aa62760f07ed350a36aa 100644 (file)
@@ -147,7 +147,9 @@ LDAP_SLAPD_F (int) backend_destroy LDAP_P((void));
 LDAP_SLAPD_F (BackendInfo *) backend_info LDAP_P(( const char *type ));
 LDAP_SLAPD_F (BackendDB *) backend_db_init LDAP_P(( const char *type ));
 
-LDAP_SLAPD_F (BackendDB *) select_backend LDAP_P(( const char * dn ));
+LDAP_SLAPD_F (BackendDB *) select_backend LDAP_P((
+       const char * dn,
+       int manageDSAit ));
 
 LDAP_SLAPD_F (int) be_issuffix LDAP_P(( Backend *be, const char *suffix ));
 LDAP_SLAPD_F (int) be_isroot LDAP_P(( Backend *be, const char *ndn ));
index 9599f8a97319599a569c28fd0331c0f21d59d97f..e4bcdb7c0e58d8e90f394e287159857a6e9475d6 100644 (file)
@@ -295,7 +295,7 @@ char *slap_sasl2dn( char *saslname )
           "slap_sasl2dn: performing internal search (base=%s, scope=%d)\n",
           searchbase, scope, 0 );
 
-       be = select_backend( searchbase );
+       be = select_backend( searchbase, 0 );
        if(( be == NULL ) || ( be->be_search == NULL))
                goto FINISHED;
        searchbase = suffix_alias( be, searchbase );
@@ -383,7 +383,7 @@ int slap_sasl_match( char *rule, char *assertDN, char *authc )
           "slap_sasl_match: performing internal search (base=%s, scope=%d)\n",
           searchbase, scope, 0 );
 
-       be = select_backend( searchbase );
+       be = select_backend( searchbase, 0 );
        if(( be == NULL ) || ( be->be_search == NULL)) {
                rc = LDAP_INAPPROPRIATE_AUTH;
                goto CONCLUDED;
index 5ae5439ab007c004bb9a876d16af7b1695726b04..e197f28ffdfb938b4dc7b028c0eb1dcf821ac84a 100644 (file)
@@ -39,6 +39,7 @@ do_search(
        Backend         *be;
        int                     rc;
        const char              *text;
+       int                     manageDSAit;
 
        Debug( LDAP_DEBUG_TRACE, "do_search\n", 0, 0, 0 );
        LDAP_LOG(( "operation", LDAP_LEVEL_ENTRY, "conn: %d do_search\n",
@@ -210,12 +211,14 @@ do_search(
                nbase = ch_strdup( default_search_nbase );
        }
 
+       manageDSAit = get_manageDSAit( op );
+
        /*
         * We could be serving multiple database backends.  Select the
         * appropriate one, or send a referral to our "referral server"
         * if we don't hold it.
         */
-       if ( (be = select_backend( nbase )) == NULL ) {
+       if ( (be = select_backend( nbase, manageDSAit )) == NULL ) {
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        NULL, NULL, default_referral, NULL );
 
index 8ce9f1a5345235062d87f9afd651c663661c1f22..0e16f60749c742244c304f455ec238ca547b139a 100644 (file)
@@ -78,7 +78,8 @@ main( int argc, char **argv )
                }
 
                /* check backend */
-               if( select_backend( e->e_ndn ) != be ) {
+               if( select_backend( e->e_ndn, is_entry_referral(e) ) != be )
+               {
                        fprintf( stderr, "%s: database (%s) not configured to "
                                "hold dn=\"%s\" (line=%d)\n",
                                progname,
index 67793bb3685fe41d0b7ff829ae41f8548d80ac59..9c583c964d28902221c6a5c520ae6fdd6eefb466 100644 (file)
@@ -211,7 +211,7 @@ slap_tool_init(
                        exit( EXIT_FAILURE );
                }
 
-               be = select_backend( tbase );
+               be = select_backend( tbase, 0 );
                free( tbase );
 
                if( be == NULL ) {