From: Kurt Zeilenga Date: Mon, 30 Oct 2000 19:16:08 +0000 (+0000) Subject: Import: X-Git-Tag: OPENLDAP_REL_ENG_2_0_7~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aac8798af859c040347dcbd85e5011dccb027786;p=thirdparty%2Fopenldap.git Import: better manageDSAit support and root DIT support --- diff --git a/servers/slapd/add.c b/servers/slapd/add.c index e2aad2ef70..753603c8db 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -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 ); diff --git a/servers/slapd/back-ldbm/search.c b/servers/slapd/back-ldbm/search.c index 8470483817..26ea7bf9e9 100644 --- a/servers/slapd/back-ldbm/search.c +++ b/servers/slapd/back-ldbm/search.c @@ -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 ) ) { diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index bbd12cad5a..60ed9eb142 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -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; diff --git a/servers/slapd/bind.c b/servers/slapd/bind.c index f72e2be16d..460883b88e 100644 --- a/servers/slapd/bind.c +++ b/servers/slapd/bind.c @@ -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 ); diff --git a/servers/slapd/compare.c b/servers/slapd/compare.c index cb291b073d..262304a514 100644 --- a/servers/slapd/compare.c +++ b/servers/slapd/compare.c @@ -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; diff --git a/servers/slapd/config.c b/servers/slapd/config.c index c736fa7058..a48ffee07d 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -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", diff --git a/servers/slapd/delete.c b/servers/slapd/delete.c index 140e825152..c253949f7b 100644 --- a/servers/slapd/delete.c +++ b/servers/slapd/delete.c @@ -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; diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index faa0973246..99e31fe033 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -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; diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index 84808e97d9..7bcf98ecf6 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -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 */ diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index c0abb14115..043e55baa4 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -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, diff --git a/servers/slapd/search.c b/servers/slapd/search.c index 1749dede27..a0835501f1 100644 --- a/servers/slapd/search.c +++ b/servers/slapd/search.c @@ -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 ); diff --git a/servers/slapd/tools/slapadd.c b/servers/slapd/tools/slapadd.c index 8ce9f1a534..0e16f60749 100644 --- a/servers/slapd/tools/slapadd.c +++ b/servers/slapd/tools/slapadd.c @@ -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, diff --git a/servers/slapd/tools/slapcommon.c b/servers/slapd/tools/slapcommon.c index 67793bb368..9c583c964d 100644 --- a/servers/slapd/tools/slapcommon.c +++ b/servers/slapd/tools/slapcommon.c @@ -211,7 +211,7 @@ slap_tool_init( exit( EXIT_FAILURE ); } - be = select_backend( tbase ); + be = select_backend( tbase, 0 ); free( tbase ); if( be == NULL ) {