int i;
char **attrs = NULL;
int dontfreetext = 0;
- int freeconn = 0;
int do_retry = 1;
LDAPControl **ctrls = NULL;
- lc = ldap_back_getconn( op, rs );
+ lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR );
if ( !lc ) {
- return -1;
+ return rs->sr_err;
}
/*
* FIXME: in case of values return filter, we might want
* to map attrs and maybe rewrite value
*/
- if ( !ldap_back_dobind( lc, op, rs ) ) {
- return -1;
+ if ( !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) {
+ return rs->sr_err;
}
/* should we check return values? */
}
ctrls = op->o_ctrls;
-#ifdef LDAP_BACK_PROXY_AUTHZ
rc = ldap_back_proxy_authz_ctrl( lc, op, rs, &ctrls );
if ( rc != LDAP_SUCCESS ) {
dontfreetext = 1;
goto finish;
}
-#endif /* LDAP_BACK_PROXY_AUTHZ */
retry:
rs->sr_err = ldap_search_ext( lc->lc_ld, op->o_req_ndn.bv_val,
if ( rs->sr_err != LDAP_SUCCESS ) {
fail:;
- rc = ldap_back_op_result( lc, op, rs, msgid, 0 );
- if ( freeconn ) {
+ if ( rs->sr_err == LDAP_SERVER_DOWN ) {
+ if ( do_retry ) {
+ do_retry = 0;
+ if ( ldap_back_retry( lc, op, rs, LDAP_BACK_DONTSEND ) ) {
+ goto retry;
+ }
+ }
+ rc = ldap_back_op_result( lc, op, rs, msgid, LDAP_BACK_DONTSEND );
ldap_back_freeconn( op, lc );
lc = NULL;
+ goto finish;
}
- goto finish;
}
/* We pull apart the ber result, stuff it into a slapd entry, and
/* check for abandon */
if ( op->o_abandon ) {
ldap_abandon_ext( lc->lc_ld, msgid, NULL, NULL );
- rc = 0;
+ rc = SLAPD_ABANDON;
goto finish;
}
}
} else {
+ char **references = NULL;
+
rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
&match.bv_val, (char **)&rs->sr_text,
- NULL, &rs->sr_ctrls, 1 );
- if (rc != LDAP_SUCCESS ) {
+ &references, &rs->sr_ctrls, 1 );
+ if ( rc != LDAP_SUCCESS ) {
rs->sr_err = rc;
}
rs->sr_err = slap_map_api2result( rs );
+
+ if ( references ) {
+ int cnt;
+
+ for ( cnt = 0; references[ cnt ]; cnt++ )
+ /* NO OP */ ;
+
+ rs->sr_ref = ch_calloc( cnt + 1, sizeof( struct berval ) );
+
+ for ( cnt = 0; references[ cnt ]; cnt++ ) {
+ ber_str2bv( references[ cnt ], 0, 1, &rs->sr_ref[ cnt ] );
+ }
+
+ /* cleanup */
+ if ( references ) {
+ ldap_value_free( references );
+ }
+ }
+
rc = 0;
break;
}
if ( rc == -1 ) {
if ( do_retry ) {
do_retry = 0;
- if ( ldap_back_retry( lc, op, rs ) ) {
+ if ( ldap_back_retry( lc, op, rs, LDAP_BACK_SENDERR ) ) {
goto retry;
}
}
- /* FIXME: invalidate the connection? */
rs->sr_err = LDAP_SERVER_DOWN;
- freeconn = 1;
goto fail;
}
}
finish:;
- send_ldap_result( op, rs );
+ if ( rc != SLAPD_ABANDON ) {
+ send_ldap_result( op, rs );
+ }
-#ifdef LDAP_BACK_PROXY_AUTHZ
(void)ldap_back_proxy_authz_ctrl_free( op, &ctrls );
-#endif /* LDAP_BACK_PROXY_AUTHZ */
if ( rs->sr_ctrls ) {
ldap_controls_free( rs->sr_ctrls );
rs->sr_matched = NULL;
LDAP_FREE( match.bv_val );
}
+
if ( rs->sr_text ) {
if ( !dontfreetext ) {
LDAP_FREE( (char *)rs->sr_text );
}
rs->sr_text = NULL;
}
+
+ if ( rs->sr_ref ) {
+ ber_bvarray_free( rs->sr_ref );
+ rs->sr_ref = NULL;
+ }
+
if ( attrs ) {
ch_free( attrs );
}
{
struct ldapconn *lc;
int rc = 1,
- is_oc,
do_not_cache;
struct berval bdn;
LDAPMessage *result = NULL,
*e = NULL;
char *gattr[3];
char *filter = NULL;
- Connection *oconn;
SlapReply rs;
int do_retry = 1;
+ LDAPControl **ctrls = NULL;
/* Tell getconn this is a privileged op */
do_not_cache = op->o_do_not_cache;
op->o_do_not_cache = 1;
- lc = ldap_back_getconn( op, &rs );
- oconn = op->o_conn;
- op->o_conn = NULL;
- if ( !lc || !ldap_back_dobind( lc, op, &rs ) ) {
+ lc = ldap_back_getconn( op, &rs, LDAP_BACK_DONTSEND );
+ if ( !lc || !ldap_back_dobind( lc, op, &rs, LDAP_BACK_DONTSEND ) ) {
op->o_do_not_cache = do_not_cache;
- op->o_conn = oconn;
- return 1;
+ return rs.sr_err;
}
op->o_do_not_cache = do_not_cache;
- op->o_conn = oconn;
if ( at ) {
- is_oc = ( strcasecmp( "objectclass", at->ad_cname.bv_val ) == 0 );
- if ( oc && !is_oc ) {
- gattr[0] = "objectclass";
+ if ( oc && at != slap_schema.si_ad_objectClass ) {
+ gattr[0] = slap_schema.si_ad_objectClass->ad_cname.bv_val;
gattr[1] = at->ad_cname.bv_val;
gattr[2] = NULL;
*ptr++ = '\0';
}
+ ctrls = op->o_ctrls;
+ rc = ldap_back_proxy_authz_ctrl( lc, op, &rs, &ctrls );
+ if ( rc != LDAP_SUCCESS ) {
+ goto cleanup;
+ }
+
retry:
rc = ldap_search_ext_s( lc->lc_ld, ndn->bv_val, LDAP_SCOPE_BASE, filter,
- at ? gattr : NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
- LDAP_NO_LIMIT, &result );
+ at ? gattr : NULL, 0, ctrls, NULL,
+ LDAP_NO_LIMIT, LDAP_NO_LIMIT, &result );
if ( rc != LDAP_SUCCESS ) {
if ( rc == LDAP_SERVER_DOWN && do_retry ) {
do_retry = 0;
- if ( ldap_back_retry( lc, op, &rs ) ) {
+ if ( ldap_back_retry( lc, op, &rs, LDAP_BACK_DONTSEND ) ) {
goto retry;
}
}
}
cleanup:
+ (void)ldap_back_proxy_authz_ctrl_free( op, &ctrls );
+
if ( result ) {
ldap_msgfree( result );
}