]> git.sur5r.net Git - openldap/commitdiff
Import:
authorKurt Zeilenga <kurt@openldap.org>
Mon, 30 Oct 2000 19:16:08 +0000 (19:16 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Mon, 30 Oct 2000 19:16:08 +0000 (19:16 +0000)
better manageDSAit support and root DIT support

13 files changed:
servers/slapd/add.c
servers/slapd/back-ldbm/search.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/search.c
servers/slapd/tools/slapadd.c
servers/slapd/tools/slapcommon.c

index e2aad2ef7058d4c3898b176f018f73d5115656a7..753603c8db1e9ec26e4069a3c05ca49c03b3f11b 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 8470483817bf0fbe20b69d80947e508cf47de4a9..26ea7bf9e9477a6c1fa4a352cb19ba0bf7ebdb48 100644 (file)
@@ -55,11 +55,25 @@ ldbm_back_search(
 
        Debug(LDAP_DEBUG_TRACE, "=> ldbm_back_search\n", 0, 0, 0);
 
-       /* get entry with reader lock */
-       if ( deref & LDAP_DEREF_FINDING ) {
+       if ( *nbase == '\0' ) {
+               /* DIT root special case */
+               static const Entry root = { NOID, "", "", NULL, NULL };
+               e = (Entry *) &root;
+
+               /* need normalized dn below */
+               realbase = ch_strdup( e->e_ndn );
+
+               candidates = search_candidates( be, e, filter,
+                   scope, deref, manageDSAit );
+
+               goto searchit;
+               
+       } else if ( deref & LDAP_DEREF_FINDING ) {
+               /* deref dn and get entry with reader lock */
                e = deref_dn_r( be, nbase, &err, &matched, &text );
 
        } else {
+               /* get entry with reader lock */
                e = dn2entry_r( be, nbase, &matched );
                err = e != NULL ? LDAP_SUCCESS : LDAP_REFERRAL;
                text = NULL;
@@ -118,21 +132,6 @@ ldbm_back_search(
                deref = LDAP_DEREF_NEVER;
        }
 
-       if ( tlimit == 0 && be_isroot( be, op->o_ndn ) ) {
-               tlimit = -1;    /* allow root to set no limit */
-       } else {
-               tlimit = (tlimit > be->be_timelimit || tlimit < 1) ?
-                   be->be_timelimit : tlimit;
-               stoptime = op->o_time + tlimit;
-       }
-
-       if ( slimit == 0 && be_isroot( be, op->o_ndn ) ) {
-               slimit = -1;    /* allow root to set no limit */
-       } else {
-               slimit = (slimit > be->be_sizelimit || slimit < 1) ?
-                   be->be_sizelimit : slimit;
-       }
-
        if ( scope == LDAP_SCOPE_BASE ) {
                candidates = base_candidate( be, e );
 
@@ -146,6 +145,7 @@ ldbm_back_search(
 
        cache_return_entry_r( &li->li_cache, e );
 
+searchit:
        if ( candidates == NULL ) {
                /* no candidates */
                Debug( LDAP_DEBUG_TRACE, "ldbm_search: no candidates\n",
@@ -159,6 +159,21 @@ ldbm_back_search(
                goto done;
        }
 
+       if ( tlimit == 0 && be_isroot( be, op->o_ndn ) ) {
+               tlimit = -1;    /* allow root to set no limit */
+       } else {
+               tlimit = (tlimit > be->be_timelimit || tlimit < 1) ?
+                   be->be_timelimit : tlimit;
+               stoptime = op->o_time + tlimit;
+       }
+
+       if ( slimit == 0 && be_isroot( be, op->o_ndn ) ) {
+               slimit = -1;    /* allow root to set no limit */
+       } else {
+               slimit = (slimit > be->be_sizelimit || slimit < 1) ?
+                   be->be_sizelimit : slimit;
+       }
+
        for ( id = idl_firstid( candidates, &cursor ); id != NOID;
            id = idl_nextid( candidates, &cursor ) )
        {
index bbd12cad5a4211389fdadbba2df029362ee12049..60ed9eb142f90b196f262aceab67647fc17e1f11 100644 (file)
@@ -427,9 +427,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++ ) {
@@ -443,13 +446,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
@@ -835,7 +848,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;
@@ -864,7 +877,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 f72e2be16d6bc086c9e5c0afe36fa52393e2d223..460883b88ecd271bd898d2e540fd0cf2ccc54f09 100644 (file)
@@ -348,7 +348,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 c736fa70583e830d61ac51d8d235235019a604d2..a48ffee07da660b0e4983f87b2510f9cc4f5c936 100644 (file)
@@ -373,7 +373,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 );
@@ -425,13 +425,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 c0abb14115fdedbdd406b7e2230e3454cb790320..043e55baa4c125e73fbc584793f2a415253f4460 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 ));
@@ -607,8 +609,8 @@ LDAP_SLAPD_F (int) register_syntax LDAP_P((
        char *desc,
        unsigned flags,
        slap_syntax_validate_func *validate,
-       slap_syntax_transform_func *ber2str,
-       slap_syntax_transform_func *str2ber ));
+       slap_syntax_transform_func *normalize,
+       slap_syntax_transform_func *pretty ));
 
 LDAP_SLAPD_F (int) register_matching_rule LDAP_P((
        char * desc,
index 1749dede2778a7e9418b0abac8ee0c62706a8fd7..a0835501f19f9212508946632ba29fec09de7b25 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 );
 
@@ -209,12 +210,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 ) {