X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Freferral.c;h=64ee0caace11298c54673f799a01f1586556da7a;hb=2c94c7915a52f8df4323c8193ec424df568f0fc1;hp=92fac4277932d23d05b5f41f91ac332472e8db9b;hpb=67a595b3284ba3f4b5e780dd90cbe38884093af9;p=openldap diff --git a/servers/slapd/back-bdb/referral.c b/servers/slapd/back-bdb/referral.c index 92fac42779..64ee0caace 100644 --- a/servers/slapd/back-bdb/referral.c +++ b/servers/slapd/back-bdb/referral.c @@ -1,7 +1,7 @@ /* referral.c - BDB backend referral handler */ /* $OpenLDAP$ */ /* - * Copyright 2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 2000-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -17,8 +17,8 @@ bdb_referrals( BackendDB *be, Connection *conn, Operation *op, - const char *dn, - const char *ndn, + struct berval *dn, + struct berval *ndn, const char **text ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; @@ -40,6 +40,7 @@ bdb_referrals( switch(rc) { case DB_NOTFOUND: + rc = 0; case 0: break; default: @@ -53,54 +54,63 @@ bdb_referrals( if ( e == NULL ) { char *matched_dn = NULL; - struct berval **refs = default_referral; + BerVarray refs = NULL; if ( matched != NULL ) { matched_dn = ch_strdup( matched->e_dn ); Debug( LDAP_DEBUG_TRACE, "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n", - op->o_tag, dn, matched_dn ); + (long) op->o_tag, dn->bv_val, matched_dn ); - refs = is_entry_referral( matched ) - ? get_entry_referrals( be, conn, op, matched ) - : NULL; + if( is_entry_referral( matched ) ) { + rc = LDAP_OTHER; + refs = get_entry_referrals( be, conn, op, matched ); + } bdb_entry_return( be, matched ); matched = NULL; + } else if ( default_referral != NULL ) { + rc = LDAP_OTHER; + refs = referral_rewrite( default_referral, + NULL, dn, LDAP_SCOPE_DEFAULT ); } if( refs != NULL ) { /* send referrals */ send_ldap_result( conn, op, rc = LDAP_REFERRAL, matched_dn, NULL, refs, NULL ); - } else { - rc = LDAP_SUCCESS; - } - - if( matched != NULL ) { - ber_bvecfree( refs ); - free( matched_dn ); + ber_bvarray_free( refs ); + } else if ( rc != LDAP_SUCCESS ) { + send_ldap_result( conn, op, rc, matched_dn, + matched_dn ? "bad referral object" : NULL, + NULL, NULL ); } + free( matched_dn ); return rc; } if ( is_entry_referral( e ) ) { /* entry is a referral */ - struct berval **refs = get_entry_referrals( be, - conn, op, e ); + BerVarray refs = get_entry_referrals( be, conn, op, e ); + BerVarray rrefs = referral_rewrite( + refs, &e->e_name, dn, LDAP_SCOPE_DEFAULT ); Debug( LDAP_DEBUG_TRACE, "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n", - op->o_tag, dn, e->e_dn ); + (long) op->o_tag, dn->bv_val, e->e_dn ); - if( refs != NULL ) { + if( rrefs != NULL ) { send_ldap_result( conn, op, rc = LDAP_REFERRAL, - e->e_dn, NULL, refs, NULL ); + e->e_dn, NULL, rrefs, NULL ); + ber_bvarray_free( rrefs ); + } else { + send_ldap_result( conn, op, rc = LDAP_OTHER, e->e_dn, + "bad referral object", NULL, NULL ); } - ber_bvecfree( refs ); + ber_bvarray_free( refs ); } bdb_entry_return( be, e );