1 /* referral.c - BDB backend referral handler */
4 * Copyright 2000-2003 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 #include <ac/string.h>
16 bdb_referrals( Operation *op, SlapReply *rs )
18 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
21 int rc = LDAP_SUCCESS;
26 if( op->o_tag == LDAP_REQ_SEARCH ) {
27 /* let search take care of itself */
31 if( get_manageDSAit( op ) ) {
32 /* let op take care of DSA management */
36 rc = LOCK_ID(bdb->bi_dbenv, &locker);
46 rc = bdb_dn2entry( op, NULL, &op->o_req_ndn, &ei, 1, locker, &lock );
54 send_ldap_error( op, rs, LDAP_BUSY, "ldap server busy" );
55 LOCK_ID_FREE ( bdb->bi_dbenv, locker );
57 case DB_LOCK_DEADLOCK:
58 case DB_LOCK_NOTGRANTED:
62 LDAP_LOG ( OPERATION, ERR,
63 "bdb_referrals: dn2entry failed: %s (%d)\n",
64 db_strerror(rc), rc, 0 );
66 Debug( LDAP_DEBUG_TRACE,
67 "bdb_referrals: dn2entry failed: %s (%d)\n",
68 db_strerror(rc), rc, 0 );
70 send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
71 LOCK_ID_FREE ( bdb->bi_dbenv, locker );
75 if ( rc == DB_NOTFOUND ) {
77 rs->sr_matched = NULL;
80 LDAP_LOG ( OPERATION, DETAIL1,
81 "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",
82 (long) op->o_tag, op->o_req_dn.bv_val, e->e_name.bv_val );
84 Debug( LDAP_DEBUG_TRACE,
85 "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",
86 (long) op->o_tag, op->o_req_dn.bv_val, e->e_name.bv_val );
89 if( is_entry_referral( e ) ) {
91 rs->sr_ref = get_entry_referrals( op, e );
93 rs->sr_matched = ber_strdup_x(
94 e->e_name.bv_val, op->o_tmpmemctx );
98 bdb_cache_return_entry_r (bdb->bi_dbenv, &bdb->bi_cache, e, &lock);
100 } else if ( default_referral != NULL ) {
102 rs->sr_ref = referral_rewrite( default_referral,
103 NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
106 if( rs->sr_ref != NULL ) {
108 rs->sr_err = LDAP_REFERRAL;
109 send_ldap_result( op, rs );
110 ber_bvarray_free( rs->sr_ref );
112 } else if ( rc != LDAP_SUCCESS ) {
114 rs->sr_text = rs->sr_matched ? "bad referral object" : NULL;
115 send_ldap_result( op, rs );
118 LOCK_ID_FREE ( bdb->bi_dbenv, locker );
119 if (rs->sr_matched) {
120 op->o_tmpfree( (char *)rs->sr_matched, op->o_tmpmemctx );
121 rs->sr_matched = NULL;
126 if ( is_entry_referral( e ) ) {
127 /* entry is a referral */
128 BerVarray refs = get_entry_referrals( op, e );
129 rs->sr_ref = referral_rewrite(
130 refs, &e->e_name, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
133 LDAP_LOG ( OPERATION, DETAIL1,
134 "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",
135 (long) op->o_tag, op->o_req_dn.bv_val, e->e_name.bv_val );
137 Debug( LDAP_DEBUG_TRACE,
138 "bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",
139 (long) op->o_tag, op->o_req_dn.bv_val, e->e_name.bv_val );
142 rs->sr_matched = e->e_name.bv_val;
143 if( rs->sr_ref != NULL ) {
144 rs->sr_err = LDAP_REFERRAL;
145 send_ldap_result( op, rs );
146 ber_bvarray_free( rs->sr_ref );
149 send_ldap_error( op, rs, LDAP_OTHER, "bad referral object" );
153 rs->sr_matched = NULL;
154 ber_bvarray_free( refs );
157 bdb_cache_return_entry_r(bdb->bi_dbenv, &bdb->bi_cache, e, &lock);
158 LOCK_ID_FREE ( bdb->bi_dbenv, locker );