X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Freferral.c;h=64ee0caace11298c54673f799a01f1586556da7a;hb=2c94c7915a52f8df4323c8193ec424df568f0fc1;hp=f4e2a08c70266c2f45e995fd6ff684cab109ca7e;hpb=ddb1124e42df2f5a71d93d986c806f4ee4783964;p=openldap diff --git a/servers/slapd/back-bdb/referral.c b/servers/slapd/back-bdb/referral.c index f4e2a08c70..64ee0caace 100644 --- a/servers/slapd/back-bdb/referral.c +++ b/servers/slapd/back-bdb/referral.c @@ -1,7 +1,7 @@ -/* referral.c - LDBM backend referral handler */ +/* 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,13 +17,13 @@ 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; int rc = LDAP_SUCCESS; - Entry *e, *matched; + Entry *e = NULL, *matched; if( op->o_tag == LDAP_REQ_SEARCH ) { /* let search take care of itself */ @@ -40,9 +40,13 @@ bdb_referrals( switch(rc) { case DB_NOTFOUND: + rc = 0; case 0: break; default: + Debug( LDAP_DEBUG_TRACE, + "bdb_referrals: dn2entry failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); send_ldap_result( conn, op, rc=LDAP_OTHER, NULL, "internal error", NULL, NULL ); return rc; @@ -50,51 +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, - "ldbm_referrals: op=%ld target=\"%s\" matched=\"%s\"\n", - op->o_tag, dn, matched_dn ); + "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n", + (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 ); + 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 ); } - if( matched != NULL ) { - ber_bvecfree( refs ); - free( matched_dn ); - } - + 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, - "ldbm_referrals: op=%ld target=\"%s\" matched=\"%s\"\n", - op->o_tag, dn, e->e_dn ); + "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n", + (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 );