]> git.sur5r.net Git - openldap/commitdiff
Add basic support for per-replica update referrals.
authorKurt Zeilenga <kurt@openldap.org>
Tue, 13 Jul 1999 00:12:09 +0000 (00:12 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 13 Jul 1999 00:12:09 +0000 (00:12 +0000)
servers/slapd/add.c
servers/slapd/back-ldbm/search.c
servers/slapd/config.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c
servers/slapd/slap.h

index 2c7905a046ae721d1cc90dc09322c3804389a5bd..cfff625602d4a1bae1e6c9ced059ffcb7eb45807 100644 (file)
@@ -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 );
index 7abce79feb9f1306728a6543a7345199eb40ef01..8aae226f5ab4609782ce68913b6276e05dbbd90b 100644 (file)
@@ -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;
index 6554f3cf563969d6f1d7543563004b5157e583ce..81802a8b7107660c47021c6130b37750791d3184 100644 (file)
@@ -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 <ldapurl>\" 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 ) {
index 5f13cd90f5293ee85ca67a43757a7bad4684e677..2b2d41cfaaad047528eb7a394ff88d42d1b86cf6 100644 (file)
@@ -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,
index 0d475655b86c7253bdbda00be7f7874082647f7f..340263037e9b70fa23d79c7d67b2fe5d4ba58c56 100644 (file)
@@ -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,
index a09cbb413789b1fa37a999cd260588db5b38b1a3..482a9bdd74447d17b21bfa24e274f89a0b293f93 100644 (file)
@@ -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,
index ea4b6ff4a66223b5e3a5579ca6dde92f21e2c18a..d7fd7eb4c4aa5276d63e762d7ccb4e5a66ef0700 100644 (file)
@@ -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;