From d0e12df421b2da872a598edd3c0c4988fdaba41c Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 13 Jul 1999 00:12:09 +0000 Subject: [PATCH] Add basic support for per-replica update referrals. --- servers/slapd/add.c | 4 ++-- servers/slapd/back-ldbm/search.c | 2 +- servers/slapd/config.c | 21 +++++++++++++++++++++ servers/slapd/delete.c | 4 ++-- servers/slapd/modify.c | 4 ++-- servers/slapd/modrdn.c | 4 ++-- servers/slapd/slap.h | 1 + 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/servers/slapd/add.c b/servers/slapd/add.c index 2c7905a046..cfff625602 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -155,8 +155,8 @@ do_add( Connection *conn, Operation *op ) } else { entry_free( e ); - send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, - NULL, default_referral, NULL ); + send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, + be->be_update_refs ? be->be_update_refs : default_referral, NULL ); } } else { Debug( LDAP_DEBUG_ARGS, " do_add: HHH\n", 0, 0, 0 ); diff --git a/servers/slapd/back-ldbm/search.c b/servers/slapd/back-ldbm/search.c index 7abce79feb..8aae226f5a 100644 --- a/servers/slapd/back-ldbm/search.c +++ b/servers/slapd/back-ldbm/search.c @@ -361,7 +361,7 @@ search_candidates( af = NULL; #endif - if ( scope == LDAP_SCOPE_SUBTREE && !be_issuffix( be, e->e_ndn ) ) { + if ( scope == LDAP_SCOPE_SUBTREE ) { lf = (Filter *) ch_malloc( sizeof(Filter) ); lf->f_next = NULL; lf->f_choice = LDAP_FILTER_AND; diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 6554f3cf56..81802a8b71 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -466,6 +466,27 @@ read_config( char *fname ) (void) dn_normalize_case( be->be_update_ndn ); } + } else if ( strcasecmp( cargv[0], "updateref" ) == 0 ) { + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing dn in \"updateref \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + if ( be == NULL ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: updateref line must appear inside a database definition (ignored)\n", + fname, lineno, 0 ); + } else if ( be->be_update_ndn == NULL ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: updateref line must after updatedn (ignored)\n", + fname, lineno, 0 ); + } else { + vals[0]->bv_val = cargv[1]; + vals[0]->bv_len = strlen( vals[0]->bv_val ); + value_add( &be->be_update_refs, vals ); + } + /* replication log file to which changes are appended */ } else if ( strcasecmp( cargv[0], "replogfile" ) == 0 ) { if ( cargc < 2 ) { diff --git a/servers/slapd/delete.c b/servers/slapd/delete.c index 5f13cd90f5..2b2d41cfaa 100644 --- a/servers/slapd/delete.c +++ b/servers/slapd/delete.c @@ -91,8 +91,8 @@ do_delete( replog( be, LDAP_REQ_DELETE, ndn, NULL, 0 ); } } else { - send_ldap_result( conn, op, rc = LDAP_REFERRAL, - NULL, NULL, default_referral, NULL ); + send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, + be->be_update_refs ? be->be_update_refs : default_referral, NULL ); } } else { send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM, diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index 0d475655b8..340263037e 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -183,8 +183,8 @@ do_modify( /* send a referral */ } else { - send_ldap_result( conn, op, rc = LDAP_REFERRAL, - NULL, NULL, default_referral, NULL ); + send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, + be->be_update_refs ? be->be_update_refs : default_referral, NULL ); } } else { send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM, diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index a09cbb4137..482a9bdd74 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -227,8 +227,8 @@ do_modrdn( deloldrdn ); } } else { - send_ldap_result( conn, op, rc = LDAP_REFERRAL, - NULL, NULL, default_referral, NULL ); + send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, + be->be_update_refs ? be->be_update_refs : default_referral, NULL ); } } else { send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM, diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index ea4b6ff4a6..d7fd7eb4c4 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -406,6 +406,7 @@ struct backend_db { char **be_replica; /* replicas of this backend (in master) */ char *be_replogfile; /* replication log file (in master) */ char *be_update_ndn; /* allowed to make changes (in replicas) */ + struct berval **be_update_refs; /* where to refer modifying clients to */ int be_lastmod; /* keep track of lastmodified{by,time} */ char *be_realm; -- 2.39.5