version 1.99.2.25, 2008/07/07 16:52:30
|
version 1.100, 2005/01/01 19:49:44
|
Line 1
|
Line 1
|
/* result.c - wait for an ldap result */ |
/* result.c - wait for an ldap result */ |
/* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.99.2.24 2008/02/11 23:24:12 kurt Exp $ */ |
/* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.99 2004/11/28 21:17:52 kurt Exp $ */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 1998-2008 The OpenLDAP Foundation. |
* Copyright 1998-2005 The OpenLDAP Foundation. |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
Line 73 static int ldap_mark_abandoned LDAP_P((
|
Line 73 static int ldap_mark_abandoned LDAP_P((
|
static int wait4msg LDAP_P(( LDAP *ld, ber_int_t msgid, int all, struct timeval *timeout, |
static int wait4msg LDAP_P(( LDAP *ld, ber_int_t msgid, int all, struct timeval *timeout, |
LDAPMessage **result )); |
LDAPMessage **result )); |
static ber_tag_t try_read1msg LDAP_P(( LDAP *ld, ber_int_t msgid, |
static ber_tag_t try_read1msg LDAP_P(( LDAP *ld, ber_int_t msgid, |
int all, LDAPConn **lc, LDAPMessage **result )); |
int all, Sockbuf *sb, LDAPConn **lc, LDAPMessage **result )); |
static ber_tag_t build_result_ber LDAP_P(( LDAP *ld, BerElement **bp, LDAPRequest *lr )); |
static ber_tag_t build_result_ber LDAP_P(( LDAP *ld, BerElement **bp, LDAPRequest *lr )); |
static void merge_error_info LDAP_P(( LDAP *ld, LDAPRequest *parentr, LDAPRequest *lr )); |
static void merge_error_info LDAP_P(( LDAP *ld, LDAPRequest *parentr, LDAPRequest *lr )); |
static LDAPMessage * chkResponseList LDAP_P(( LDAP *ld, int msgid, int all)); |
static LDAPMessage * chkResponseList LDAP_P(( LDAP *ld, int msgid, int all)); |
|
|
#define LDAP_MSG_X_KEEP_LOOKING (-2) |
|
|
|
|
|
/* |
/* |
* ldap_result - wait for an ldap result response to a message from the |
* ldap_result - wait for an ldap result response to a message from the |
Line 113 ldap_result(
|
Line 111 ldap_result(
|
assert( ld != NULL ); |
assert( ld != NULL ); |
assert( result != NULL ); |
assert( result != NULL ); |
|
|
Debug( LDAP_DEBUG_TRACE, "ldap_result ld %p msgid %d\n", (void *)ld, msgid, 0 ); |
Debug( LDAP_DEBUG_TRACE, "ldap_result msgid %d\n", msgid, 0, 0 ); |
|
|
#ifdef LDAP_R_COMPILE |
#ifdef LDAP_R_COMPILE |
ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex ); |
ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex ); |
Line 139 chkResponseList(
|
Line 137 chkResponseList(
|
int msgid, |
int msgid, |
int all) |
int all) |
{ |
{ |
LDAPMessage *lm, **lastlm, *nextlm; |
LDAPMessage *lm, *lastlm, *nextlm; |
/* |
/* |
* Look through the list of responses we have received on |
* Look through the list of responses we have received on |
* this association and see if the response we're interested in |
* this association and see if the response we're interested in |
Line 148 chkResponseList(
|
Line 146 chkResponseList(
|
*/ |
*/ |
|
|
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"ldap_chkResponseList ld %p msgid %d all %d\n", |
"ldap_chkResponseList for msgid=%d, all=%d\n", |
(void *)ld, msgid, all ); |
msgid, all, 0 ); |
lastlm = &ld->ld_responses; |
lastlm = NULL; |
for ( lm = ld->ld_responses; lm != NULL; lm = nextlm ) { |
for ( lm = ld->ld_responses; lm != NULL; lm = nextlm ) { |
nextlm = lm->lm_next; |
nextlm = lm->lm_next; |
|
|
Line 160 chkResponseList(
|
Line 158 chkResponseList(
|
msgid, 0, 0 ); |
msgid, 0, 0 ); |
ldap_mark_abandoned( ld, lm->lm_msgid ); |
ldap_mark_abandoned( ld, lm->lm_msgid ); |
|
|
/* Remove this entry from list */ |
if ( lastlm == NULL ) { |
*lastlm = nextlm; |
/* Remove first entry in list */ |
|
ld->ld_responses = lm->lm_next; |
|
} else { |
|
lastlm->lm_next = nextlm; |
|
} |
|
|
ldap_msgfree( lm ); |
ldap_msgfree( lm ); |
|
|
Line 171 chkResponseList(
|
Line 173 chkResponseList(
|
if ( msgid == LDAP_RES_ANY || lm->lm_msgid == msgid ) { |
if ( msgid == LDAP_RES_ANY || lm->lm_msgid == msgid ) { |
LDAPMessage *tmp; |
LDAPMessage *tmp; |
|
|
if ( all == LDAP_MSG_ONE || all == LDAP_MSG_RECEIVED || |
if ( all == LDAP_MSG_ONE || msgid == LDAP_RES_UNSOLICITED ) { |
msgid == LDAP_RES_UNSOLICITED ) { |
|
break; |
break; |
} |
} |
|
|
tmp = lm->lm_chain_tail; |
if ( lm->lm_chain == NULL ) { |
if ((tmp->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || |
if ((lm->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || |
(tmp->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || |
(lm->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || |
(tmp->lm_msgtype == LDAP_RES_INTERMEDIATE)) { |
(lm->lm_msgtype == LDAP_RES_INTERMEDIATE)) { |
tmp = NULL; |
tmp = NULL; |
|
} else { |
|
tmp = lm; |
|
} |
|
} else { |
|
if ((lm->lm_chain_tail->lm_chain->lm_msgtype |
|
== LDAP_RES_SEARCH_ENTRY) || |
|
(lm->lm_chain_tail->lm_chain->lm_msgtype |
|
== LDAP_RES_SEARCH_REFERENCE) || |
|
(lm->lm_chain_tail->lm_chain->lm_msgtype |
|
== LDAP_RES_INTERMEDIATE)) { |
|
tmp = NULL; |
|
} else { |
|
tmp = lm->lm_chain_tail->lm_chain; |
|
} |
} |
} |
|
|
if ( tmp == NULL ) { |
if ( tmp == NULL ) { |
Line 189 chkResponseList(
|
Line 204 chkResponseList(
|
|
|
break; |
break; |
} |
} |
lastlm = &lm->lm_next; |
lastlm = lm; |
} |
} |
|
|
if ( lm != NULL ) { |
if ( lm != NULL ) { |
/* Found an entry, remove it from the list */ |
/* Found an entry, remove it from the list */ |
if ( all == LDAP_MSG_ONE && lm->lm_chain != NULL ) { |
if ( lastlm == NULL ) { |
*lastlm = lm->lm_chain; |
ld->ld_responses = (all == LDAP_MSG_ONE && lm->lm_chain != NULL |
lm->lm_chain->lm_next = lm->lm_next; |
? lm->lm_chain : lm->lm_next); |
lm->lm_chain->lm_chain_tail = ( lm->lm_chain_tail != lm ) ? lm->lm_chain_tail : lm->lm_chain; |
|
lm->lm_chain = NULL; |
|
lm->lm_chain_tail = NULL; |
|
} else { |
} else { |
*lastlm = lm->lm_next; |
lastlm->lm_next = (all == LDAP_MSG_ONE && lm->lm_chain != NULL |
} |
? lm->lm_chain : lm->lm_next); |
|
} |
|
if ( all == LDAP_MSG_ONE && lm->lm_chain != NULL ) { |
|
lm->lm_chain->lm_next = lm->lm_next; |
|
lm->lm_chain = NULL; |
|
} |
lm->lm_next = NULL; |
lm->lm_next = NULL; |
} |
} |
|
|
#ifdef LDAP_DEBUG |
#ifdef LDAP_DEBUG |
if( lm == NULL) { |
if( lm == NULL) { |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"ldap_chkResponseList returns ld %p NULL\n", (void *)ld, 0, 0); |
"ldap_chkResponseList returns NULL\n", 0, 0, 0); |
} else { |
} else { |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"ldap_chkResponseList returns ld %p msgid %d, type 0x%02lu\n", |
"ldap_chkResponseList returns msgid %d, type 0x%02lu\n", |
(void *)ld, lm->lm_msgid, (unsigned long) lm->lm_msgtype); |
lm->lm_msgid, (unsigned long) lm->lm_msgtype, 0); |
} |
} |
#endif |
#endif |
return lm; |
return lm; |
Line 228 wait4msg(
|
Line 245 wait4msg(
|
LDAPMessage **result ) |
LDAPMessage **result ) |
{ |
{ |
int rc; |
int rc; |
struct timeval tv = { 0 }, |
struct timeval tv, *tvp; |
tv0 = { 0 }, |
|
*tvp; |
|
time_t start_time = 0; |
time_t start_time = 0; |
time_t tmp_time; |
time_t tmp_time; |
LDAPConn *lc; |
LDAPConn *lc, *nextlc; |
|
|
assert( ld != NULL ); |
assert( ld != NULL ); |
assert( result != NULL ); |
assert( result != NULL ); |
|
|
#ifdef LDAP_DEBUG |
#ifdef LDAP_DEBUG |
if ( timeout == NULL ) { |
if ( timeout == NULL ) { |
Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p msgid %d (infinite timeout)\n", |
Debug( LDAP_DEBUG_TRACE, "wait4msg (infinite timeout), msgid %d\n", |
(void *)ld, msgid, 0 ); |
msgid, 0, 0 ); |
} else { |
} else { |
Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p msgid %d (timeout %ld usec)\n", |
Debug( LDAP_DEBUG_TRACE, "wait4msg (timeout %ld sec, %ld usec), msgid %d\n", |
(void *)ld, msgid, (long)timeout->tv_sec * 1000000 + timeout->tv_usec ); |
(long) timeout->tv_sec, (long) timeout->tv_usec, msgid ); |
} |
} |
#endif /* LDAP_DEBUG */ |
#endif /* LDAP_DEBUG */ |
|
|
if ( timeout == NULL ) { |
if ( timeout == NULL ) { |
tvp = NULL; |
tvp = NULL; |
} else { |
} else { |
tv0 = *timeout; |
|
tv = *timeout; |
tv = *timeout; |
tvp = &tv; |
tvp = &tv; |
start_time = time( NULL ); |
start_time = time( NULL ); |
} |
} |
|
|
rc = LDAP_MSG_X_KEEP_LOOKING; |
rc = -2; |
while ( rc == LDAP_MSG_X_KEEP_LOOKING ) { |
while ( rc == -2 ) { |
#ifdef LDAP_DEBUG |
#ifdef LDAP_DEBUG |
|
Debug( LDAP_DEBUG_TRACE, "wait4msg continue, msgid %d, all %d\n", |
|
msgid, all, 0 ); |
if ( ldap_debug & LDAP_DEBUG_TRACE ) { |
if ( ldap_debug & LDAP_DEBUG_TRACE ) { |
Debug( LDAP_DEBUG_TRACE, "wait4msg continue ld %p msgid %d all %d\n", |
|
(void *)ld, msgid, all ); |
|
ldap_dump_connection( ld, ld->ld_conns, 1 ); |
ldap_dump_connection( ld, ld->ld_conns, 1 ); |
ldap_dump_requests_and_responses( ld ); |
ldap_dump_requests_and_responses( ld ); |
} |
} |
#endif /* LDAP_DEBUG */ |
#endif /* LDAP_DEBUG */ |
|
|
if ( (*result = chkResponseList(ld, msgid, all)) != NULL ) { |
if( (*result = chkResponseList(ld, msgid, all)) != NULL ) { |
rc = (*result)->lm_msgtype; |
rc = (*result)->lm_msgtype; |
|
} else { |
} else { |
|
int lc_ready = 0; |
int lc_ready = 0; |
|
|
#ifdef LDAP_R_COMPILE |
for ( lc = ld->ld_conns; lc != NULL; lc = nextlc ) { |
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex ); |
nextlc = lc->lconn_next; |
#endif |
|
for ( lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next ) { |
|
if ( ber_sockbuf_ctrl( lc->lconn_sb, |
if ( ber_sockbuf_ctrl( lc->lconn_sb, |
LBER_SB_OPT_DATA_READY, NULL ) ) { |
LBER_SB_OPT_DATA_READY, NULL ) ) { |
#ifdef LDAP_R_COMPILE |
rc = try_read1msg( ld, msgid, all, lc->lconn_sb, |
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex ); |
&lc, result ); |
#endif |
|
rc = try_read1msg( ld, msgid, all, &lc, result ); |
|
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex ); |
|
#endif |
|
lc_ready = 1; |
lc_ready = 1; |
break; |
break; |
} |
} |
} |
} |
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex ); |
|
#endif |
|
|
|
if ( !lc_ready ) { |
if ( !lc_ready ) { |
int err; |
rc = ldap_int_select( ld, tvp ); |
rc = ldap_int_select( ld, tvp ); |
|
if ( rc == -1 ) { |
|
err = sock_errno(); |
|
#ifdef LDAP_DEBUG |
#ifdef LDAP_DEBUG |
Debug( LDAP_DEBUG_TRACE, |
if ( rc == -1 ) { |
"ldap_int_select returned -1: errno %d\n", |
Debug( LDAP_DEBUG_TRACE, |
err, 0, 0 ); |
"ldap_int_select returned -1: errno %d\n", |
#endif |
errno, 0, 0 ); |
} |
} |
|
#endif |
if ( rc == 0 || ( rc == -1 && ( |
|
!LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART) |
if ( rc == 0 || ( rc == -1 && ( |
|| err != EINTR ))) |
!LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART) |
{ |
|| errno != EINTR ))) |
ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN : |
{ |
LDAP_TIMEOUT); |
ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN : |
return( rc ); |
LDAP_TIMEOUT); |
} |
return( rc ); |
|
} |
if ( rc == -1 ) { |
|
rc = LDAP_MSG_X_KEEP_LOOKING; /* select interrupted: loop */ |
if ( rc == -1 ) { |
} else { |
rc = -2; /* select interrupted: loop */ |
rc = LDAP_MSG_X_KEEP_LOOKING; |
} else { |
|
rc = -2; |
#ifdef LDAP_R_COMPILE |
#ifdef LDAP_R_COMPILE |
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); |
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); |
#endif |
#endif |
if ( ld->ld_requests && |
if ( ld->ld_requests && |
ld->ld_requests->lr_status == LDAP_REQST_WRITING && |
ld->ld_requests->lr_status == LDAP_REQST_WRITING && |
ldap_is_write_ready( ld, |
ldap_is_write_ready( ld, |
ld->ld_requests->lr_conn->lconn_sb ) ) |
ld->ld_requests->lr_conn->lconn_sb ) ) { |
{ |
|
ldap_int_flush_request( ld, ld->ld_requests ); |
ldap_int_flush_request( ld, ld->ld_requests ); |
} |
} |
#ifdef LDAP_R_COMPILE |
#ifdef LDAP_R_COMPILE |
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); |
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); |
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex ); |
|
#endif |
|
for ( lc = ld->ld_conns; |
|
rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL; ) |
|
{ |
|
if ( lc->lconn_status == LDAP_CONNST_CONNECTED && |
|
ldap_is_read_ready( ld, lc->lconn_sb )) |
|
{ |
|
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex ); |
|
#endif |
|
rc = try_read1msg( ld, msgid, all, &lc, result ); |
|
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex ); |
|
#endif |
|
if ( lc == NULL ) { |
|
/* if lc gets free()'d, |
|
* there's no guarantee |
|
* lc->lconn_next is still |
|
* sane; better restart |
|
* (ITS#4405) */ |
|
lc = ld->ld_conns; |
|
|
|
/* don't get to next conn! */ |
|
break; |
|
} |
|
} |
|
|
|
/* next conn */ |
|
lc = lc->lconn_next; |
|
} |
|
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex ); |
|
#endif |
#endif |
} |
for ( lc = ld->ld_conns; rc == -2 && lc != NULL; |
} |
lc = nextlc ) { |
|
nextlc = lc->lconn_next; |
|
if ( lc->lconn_status == |
|
LDAP_CONNST_CONNECTED && |
|
ldap_is_read_ready( ld, |
|
lc->lconn_sb )) { |
|
rc = try_read1msg( ld, msgid, all, |
|
lc->lconn_sb, &lc, result ); |
|
if ( lc == NULL ) lc = nextlc; |
|
} |
|
} |
|
} |
|
} |
} |
} |
|
|
if ( rc == LDAP_MSG_X_KEEP_LOOKING && tvp != NULL ) { |
if ( rc == -2 && tvp != NULL ) { |
time_t delta_time; |
|
|
|
tmp_time = time( NULL ); |
tmp_time = time( NULL ); |
delta_time = tmp_time - start_time; |
if (( tv.tv_sec -= ( tmp_time - start_time )) <= 0 ) { |
|
|
/* do not assume time_t is signed */ |
|
if ( tv0.tv_sec <= delta_time ) { |
|
rc = 0; /* timed out */ |
rc = 0; /* timed out */ |
ld->ld_errno = LDAP_TIMEOUT; |
ld->ld_errno = LDAP_TIMEOUT; |
break; |
break; |
} |
} |
tv0.tv_sec -= delta_time; |
|
tv.tv_sec = tv0.tv_sec; |
|
|
|
Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p %ld secs to go\n", |
Debug( LDAP_DEBUG_TRACE, "wait4msg: %ld secs to go\n", |
(void *)ld, (long) tv.tv_sec, 0 ); |
(long) tv.tv_sec, 0, 0 ); |
start_time = tmp_time; |
start_time = tmp_time; |
} |
} |
} |
} |
Line 400 try_read1msg(
|
Line 372 try_read1msg(
|
LDAP *ld, |
LDAP *ld, |
ber_int_t msgid, |
ber_int_t msgid, |
int all, |
int all, |
|
Sockbuf *sb, |
LDAPConn **lcp, |
LDAPConn **lcp, |
LDAPMessage **result ) |
LDAPMessage **result ) |
{ |
{ |
BerElement *ber; |
BerElement *ber; |
LDAPMessage *newmsg, *l, *prev; |
LDAPMessage *new, *l, *prev, *tmp, *chain_head; |
ber_int_t id; |
ber_int_t id; |
ber_tag_t tag; |
ber_tag_t tag; |
ber_len_t len; |
ber_len_t len; |
Line 412 try_read1msg(
|
Line 385 try_read1msg(
|
LDAPRequest *lr, *tmplr; |
LDAPRequest *lr, *tmplr; |
LDAPConn *lc; |
LDAPConn *lc; |
BerElement tmpber; |
BerElement tmpber; |
int rc, refer_cnt, hadref, simple_request, err; |
int rc, refer_cnt, hadref, simple_request; |
ber_int_t lderr; |
ber_int_t lderr; |
|
|
#ifdef LDAP_CONNECTIONLESS |
#ifdef LDAP_CONNECTIONLESS |
LDAPMessage *tmp = NULL, *chain_head = NULL; |
int firstmsg = 1, moremsgs = 0, isv2 = 0; |
int moremsgs = 0, isv2 = 0; |
|
#endif |
#endif |
|
|
/* |
/* |
* v3ref = flag for V3 referral / search reference |
* v3ref = flag for V3 referral / search reference |
* 0 = not a ref, 1 = sucessfully chased ref, -1 = pass ref to application |
* 0 = not a ref, 1 = sucessfully chased ref, -1 = pass ref to application |
*/ |
*/ |
enum { |
int v3ref; |
V3REF_NOREF = 0, |
|
V3REF_SUCCESS = 1, |
|
V3REF_TOAPP = -1 |
|
} v3ref; |
|
|
|
assert( ld != NULL ); |
assert( ld != NULL ); |
assert( lcp != NULL ); |
assert( lcp != NULL ); |
assert( *lcp != NULL ); |
assert( *lcp != NULL ); |
|
|
Debug( LDAP_DEBUG_TRACE, "read1msg: ld %p msgid %d all %d\n", |
Debug( LDAP_DEBUG_TRACE, "read1msg: msgid %d, all %d\n", msgid, all, 0 ); |
(void *)ld, msgid, all ); |
|
|
|
lc = *lcp; |
lc = *lcp; |
|
|
Line 452 retry:
|
Line 417 retry:
|
assert( LBER_VALID (ber) ); |
assert( LBER_VALID (ber) ); |
|
|
/* get the next message */ |
/* get the next message */ |
sock_errset(0); |
errno = 0; |
#ifdef LDAP_CONNECTIONLESS |
#ifdef LDAP_CONNECTIONLESS |
if ( LDAP_IS_UDP(ld) ) { |
if ( LDAP_IS_UDP(ld) ) { |
struct sockaddr from; |
struct sockaddr from; |
ber_int_sb_read( lc->lconn_sb, &from, sizeof(struct sockaddr) ); |
ber_int_sb_read(sb, &from, sizeof(struct sockaddr)); |
if (ld->ld_options.ldo_version == LDAP_VERSION2) isv2=1; |
if (ld->ld_options.ldo_version == LDAP_VERSION2) isv2=1; |
} |
} |
nextresp3: |
nextresp3: |
#endif |
#endif |
tag = ber_get_next( lc->lconn_sb, &len, ber ); |
tag = ber_get_next( sb, &len, ber ); |
if ( tag == LDAP_TAG_MESSAGE ) { |
if ( tag == LDAP_TAG_MESSAGE ) { |
/* |
/* |
* We read a complete message. |
* We read a complete message. |
Line 471 nextresp3:
|
Line 436 nextresp3:
|
} |
} |
if ( tag != LDAP_TAG_MESSAGE ) { |
if ( tag != LDAP_TAG_MESSAGE ) { |
if ( tag == LBER_DEFAULT) { |
if ( tag == LBER_DEFAULT) { |
err = sock_errno(); |
|
#ifdef LDAP_DEBUG |
#ifdef LDAP_DEBUG |
Debug( LDAP_DEBUG_CONNS, |
Debug( LDAP_DEBUG_CONNS, |
"ber_get_next failed.\n", 0, 0, 0 ); |
"ber_get_next failed.\n", 0, 0, 0 ); |
#endif |
#endif |
#ifdef EWOULDBLOCK |
#ifdef EWOULDBLOCK |
if ( err == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING; |
if (errno==EWOULDBLOCK) return -2; |
#endif |
#endif |
#ifdef EAGAIN |
#ifdef EAGAIN |
if ( err == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING; |
if (errno == EAGAIN) return -2; |
#endif |
#endif |
ld->ld_errno = LDAP_SERVER_DOWN; |
ld->ld_errno = LDAP_SERVER_DOWN; |
return -1; |
return -1; |
Line 498 nextresp3:
|
Line 462 nextresp3:
|
|
|
/* if it's been abandoned, toss it */ |
/* if it's been abandoned, toss it */ |
if ( ldap_abandoned( ld, id ) ) { |
if ( ldap_abandoned( ld, id ) ) { |
Debug( LDAP_DEBUG_ANY, "abandoned ld %p msgid %ld\n", |
Debug( LDAP_DEBUG_ANY, "abandoned\n", 0, 0, 0); |
(void *)ld, (long) id, 0); |
|
retry_ber: |
retry_ber: |
ber_free( ber, 1 ); |
ber_free( ber, 1 ); |
if ( ber_sockbuf_ctrl( lc->lconn_sb, LBER_SB_OPT_DATA_READY, NULL ) ) { |
if ( ber_sockbuf_ctrl( sb, LBER_SB_OPT_DATA_READY, NULL ) ) { |
goto retry; |
goto retry; |
} |
} |
return( LDAP_MSG_X_KEEP_LOOKING ); /* continue looking */ |
return( -2 ); /* continue looking */ |
} |
} |
|
|
lr = ldap_find_request_by_msgid( ld, id ); |
if (( lr = ldap_find_request_by_msgid( ld, id )) == NULL ) { |
if ( lr == NULL ) { |
|
Debug( LDAP_DEBUG_ANY, |
Debug( LDAP_DEBUG_ANY, |
"no request for response on ld %p msgid %ld (tossing)\n", |
"no request for response with msgid %ld (tossing)\n", |
(void *)ld, (long) id, 0 ); |
(long) id, 0, 0 ); |
goto retry_ber; |
goto retry_ber; |
} |
} |
#ifdef LDAP_CONNECTIONLESS |
#ifdef LDAP_CONNECTIONLESS |
Line 529 nextresp2:
|
Line 491 nextresp2:
|
} |
} |
|
|
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: ld %p msgid %ld message type %s\n", |
"ldap_read: message type %s msgid %ld, original id %ld\n", |
(void *)ld, (long) lr->lr_msgid, ldap_int_msgtype2str( tag )); |
ldap_int_msgtype2str( tag ), |
|
(long) lr->lr_msgid, (long) lr->lr_origid ); |
|
|
id = lr->lr_origid; |
id = lr->lr_origid; |
refer_cnt = 0; |
refer_cnt = 0; |
hadref = simple_request = 0; |
hadref = simple_request = 0; |
rc = LDAP_MSG_X_KEEP_LOOKING; /* default is to keep looking (no response found) */ |
rc = -2; /* default is to keep looking (no response found) */ |
lr->lr_res_msgtype = tag; |
lr->lr_res_msgtype = tag; |
|
|
/* |
/* |
* This code figures out if we are going to chase a |
* This code figures out if we are going to chase a |
* referral / search reference, or pass it back to the application |
* referral / search reference, or pass it back to the application |
*/ |
*/ |
v3ref = V3REF_NOREF; /* Assume not a V3 search reference/referral */ |
v3ref = 0; /* Assume not a V3 search reference or referral */ |
if( (tag != LDAP_RES_SEARCH_ENTRY) && (ld->ld_version > LDAP_VERSION2) ) { |
if( (tag != LDAP_RES_SEARCH_ENTRY) && (ld->ld_version > LDAP_VERSION2) ) { |
BerElement tmpber = *ber; /* struct copy */ |
BerElement tmpber = *ber; /* struct copy */ |
char **refs = NULL; |
char **refs = NULL; |
|
|
if( tag == LDAP_RES_SEARCH_REFERENCE ) { |
if( tag == LDAP_RES_SEARCH_REFERENCE) { |
/* This is a V3 search reference */ |
/* This is a V3 search reference */ |
/* Assume we do not chase the reference, |
/* Assume we do not chase the reference, but pass it to application */ |
* but pass it to application */ |
v3ref = -1; |
v3ref = V3REF_TOAPP; |
|
if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) || |
if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) || |
(lr->lr_parent != NULL) ) |
(lr->lr_parent != NULL) ) |
{ |
{ |
Line 559 nextresp2:
|
Line 521 nextresp2:
|
if ( ber_scanf( &tmpber, "{v}", &refs ) == LBER_ERROR ) { |
if ( ber_scanf( &tmpber, "{v}", &refs ) == LBER_ERROR ) { |
rc = LDAP_DECODING_ERROR; |
rc = LDAP_DECODING_ERROR; |
} else { |
} else { |
/* Note: refs array is freed by ldap_chase_v3referrals */ |
/* Note: refs arrary is freed by ldap_chase_v3referrals */ |
refer_cnt = ldap_chase_v3referrals( ld, lr, refs, |
refer_cnt = ldap_chase_v3referrals( ld, lr, refs, |
1, &lr->lr_res_error, &hadref ); |
1, &lr->lr_res_error, &hadref ); |
if ( refer_cnt > 0 ) { |
if ( refer_cnt > 0 ) { /* sucessfully chased reference */ |
/* sucessfully chased reference */ |
|
/* If haven't got end search, set chasing referrals */ |
/* If haven't got end search, set chasing referrals */ |
if( lr->lr_status != LDAP_REQST_COMPLETED) { |
if( lr->lr_status != LDAP_REQST_COMPLETED) { |
lr->lr_status = LDAP_REQST_CHASINGREFS; |
lr->lr_status = LDAP_REQST_CHASINGREFS; |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: search ref chased, " |
"read1msg: search ref chased, mark request chasing refs, id = %d\n", |
"mark request chasing refs, " |
lr->lr_msgid, 0, 0); |
"id = %d\n", |
|
lr->lr_msgid, 0, 0); |
|
} |
} |
|
v3ref = 1; /* We sucessfully chased the reference */ |
/* We successfully chased the reference */ |
|
v3ref = V3REF_SUCCESS; |
|
} |
} |
} |
} |
} |
} |
} else { |
} else { |
/* Check for V3 referral */ |
/* Check for V3 referral */ |
ber_len_t len; |
ber_len_t len; |
char *lr_res_error = NULL; |
if ( ber_scanf( &tmpber, "{iaa",/*}*/ &lderr, |
|
&lr->lr_res_matched, &lr->lr_res_error ) |
#ifdef LDAP_NULL_IS_NULL |
!= LBER_ERROR ) { |
if ( ber_scanf( &tmpber, "{eAA",/*}*/ &lderr, |
|
&lr->lr_res_matched, &lr_res_error ) |
|
!= LBER_ERROR ) |
|
#else /* ! LDAP_NULL_IS_NULL */ |
|
if ( ber_scanf( &tmpber, "{eaa",/*}*/ &lderr, |
|
&lr->lr_res_matched, &lr_res_error ) |
|
!= LBER_ERROR ) |
|
#endif /* ! LDAP_NULL_IS_NULL */ |
|
{ |
|
if ( lr_res_error != NULL ) { |
|
#ifndef LDAP_NULL_IS_NULL |
|
if ( lr_res_error[ 0 ] == '\0' ) { |
|
LDAP_FREE( lr_res_error ); |
|
lr_res_error = NULL; |
|
} else |
|
#endif /* ! LDAP_NULL_IS_NULL */ |
|
{ |
|
if ( lr->lr_res_error != NULL ) { |
|
(void)ldap_append_referral( ld, &lr->lr_res_error, lr_res_error ); |
|
LDAP_FREE( (char *)lr_res_error ); |
|
|
|
} else { |
|
lr->lr_res_error = lr_res_error; |
|
} |
|
} |
|
lr_res_error = NULL; |
|
} |
|
|
|
/* Check if V3 referral */ |
/* Check if V3 referral */ |
if ( ber_peek_tag( &tmpber, &len ) == LDAP_TAG_REFERRAL ) { |
if( ber_peek_tag( &tmpber, &len) == LDAP_TAG_REFERRAL ) { |
/* We have a V3 referral, assume we cannot chase it */ |
/* We have a V3 referral, assume we cannot chase it */ |
v3ref = V3REF_TOAPP; |
v3ref = -1; |
if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) |
if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) |
|| (lr->lr_parent != NULL) ) |
|| (lr->lr_parent != NULL) ) |
{ |
{ |
|
v3ref = -1; /* Assume referral not chased and return it to app */ |
/* Get the referral list */ |
/* Get the referral list */ |
if( ber_scanf( &tmpber, "{v}", &refs) == LBER_ERROR) { |
if( ber_scanf( &tmpber, "{v}", &refs) == LBER_ERROR) { |
rc = LDAP_DECODING_ERROR; |
rc = LDAP_DECODING_ERROR; |
lr->lr_status = LDAP_REQST_COMPLETED; |
lr->lr_status = LDAP_REQST_COMPLETED; |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: referral decode error, mark request completed, ld %p msgid %d\n", |
"read1msg: referral decode error, mark request completed, id = %d\n", |
(void *)ld, lr->lr_msgid, 0); |
lr->lr_msgid, 0, 0); |
} else { |
} else { |
/* Chase the referral |
/* Chase the referral |
* Note: refs arrary is freed by ldap_chase_v3referrals |
* Note: refs arrary is freed by ldap_chase_v3referrals |
Line 635 nextresp2:
|
Line 565 nextresp2:
|
0, &lr->lr_res_error, &hadref ); |
0, &lr->lr_res_error, &hadref ); |
lr->lr_status = LDAP_REQST_COMPLETED; |
lr->lr_status = LDAP_REQST_COMPLETED; |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: referral %s chased, " |
"read1msg: referral chased, mark request completed, id = %d\n", |
"mark request completed, ld %p msgid %d\n", |
lr->lr_msgid, 0, 0); |
hadref ? "" : "not", |
|
(void *)ld, lr->lr_msgid); |
|
if( refer_cnt > 0) { |
if( refer_cnt > 0) { |
/* Referral successfully chased */ |
v3ref = 1; /* Referral successfully chased */ |
v3ref = V3REF_SUCCESS; |
|
} else { |
|
refer_cnt = 0; |
|
} |
} |
} |
} |
} |
} |
Line 665 nextresp2:
|
Line 590 nextresp2:
|
* go through the following code. This code also chases V2 referrals |
* go through the following code. This code also chases V2 referrals |
* and checks if all referrals have been chased. |
* and checks if all referrals have been chased. |
*/ |
*/ |
if ( tag != LDAP_RES_SEARCH_ENTRY && |
if ( (tag != LDAP_RES_SEARCH_ENTRY) && (v3ref > -1) && |
tag != LDAP_RES_SEARCH_REFERENCE && |
(tag != LDAP_RES_INTERMEDIATE )) |
tag != LDAP_RES_INTERMEDIATE ) |
|
{ |
{ |
/* For a v3 search referral/reference, only come here if already chased it */ |
/* For a v3 search referral/reference, only come here if already chased it */ |
if ( ld->ld_version >= LDAP_VERSION2 && |
if ( ld->ld_version >= LDAP_VERSION2 && |
v3ref != V3REF_TOAPP && |
|
( lr->lr_parent != NULL || |
( lr->lr_parent != NULL || |
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) ) ) |
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) ) ) |
{ |
{ |
char *lr_res_error = NULL; |
|
|
|
tmpber = *ber; /* struct copy */ |
tmpber = *ber; /* struct copy */ |
if ( v3ref == V3REF_SUCCESS ) { |
if ( v3ref == 1 ) { |
/* V3 search reference or V3 referral |
/* V3 search reference or V3 referral |
* sucessfully chased. If this message |
* sucessfully chased. If this message |
* is a search result, then it has no more |
* is a search result, then it has no more |
Line 686 nextresp2:
|
Line 607 nextresp2:
|
*/ |
*/ |
if ( tag == LDAP_RES_SEARCH_RESULT ) |
if ( tag == LDAP_RES_SEARCH_RESULT ) |
refer_cnt = 0; |
refer_cnt = 0; |
#ifdef LDAP_NULL_IS_NULL |
} else if ( ber_scanf( &tmpber, "{iaa}", &lderr, |
} else if ( ber_scanf( &tmpber, "{eAA}", &lderr, |
&lr->lr_res_matched, &lr->lr_res_error ) |
&lr->lr_res_matched, &lr_res_error ) |
!= LBER_ERROR ) { |
!= LBER_ERROR ) |
if ( lderr != LDAP_SUCCESS ) { |
#else /* ! LDAP_NULL_IS_NULL */ |
|
} else if ( ber_scanf( &tmpber, "{eaa}", &lderr, |
|
&lr->lr_res_matched, &lr_res_error ) |
|
!= LBER_ERROR ) |
|
#endif /* ! LDAP_NULL_IS_NULL */ |
|
{ |
|
if ( lr_res_error != NULL ) { |
|
#ifndef LDAP_NULL_IS_NULL |
|
if ( lr_res_error[ 0 ] == '\0' ) { |
|
LDAP_FREE( lr_res_error ); |
|
} else |
|
#endif /* ! LDAP_NULL_IS_NULL */ |
|
{ |
|
if ( lr->lr_res_error != NULL ) { |
|
(void)ldap_append_referral( ld, &lr->lr_res_error, lr_res_error ); |
|
LDAP_FREE( (char *)lr_res_error ); |
|
} else { |
|
lr->lr_res_error = lr_res_error; |
|
} |
|
} |
|
lr_res_error = NULL; |
|
} |
|
|
|
switch ( lderr ) { |
|
case LDAP_SUCCESS: |
|
case LDAP_COMPARE_TRUE: |
|
case LDAP_COMPARE_FALSE: |
|
break; |
|
|
|
default: |
|
if ( lr->lr_res_error == NULL |
|
|| lr->lr_res_error[ 0 ] == '\0' ) |
|
{ |
|
break; |
|
} |
|
|
|
/* referrals are in error string */ |
/* referrals are in error string */ |
refer_cnt = ldap_chase_referrals( ld, lr, |
refer_cnt = ldap_chase_referrals( ld, lr, |
&lr->lr_res_error, -1, &hadref ); |
&lr->lr_res_error, -1, &hadref ); |
lr->lr_status = LDAP_REQST_COMPLETED; |
lr->lr_status = LDAP_REQST_COMPLETED; |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: V2 referral chased, " |
"read1msg: V2 referral chased, mark request completed, id = %d\n", lr->lr_msgid, 0, 0); |
"mark request completed, id = %d\n", |
|
lr->lr_msgid, 0, 0 ); |
|
break; |
|
} |
} |
|
|
/* save errno, message, and matched string */ |
/* save errno, message, and matched string */ |
Line 747 nextresp2:
|
Line 629 nextresp2:
|
} else { |
} else { |
lr->lr_res_errno = LDAP_PARTIAL_RESULTS; |
lr->lr_res_errno = LDAP_PARTIAL_RESULTS; |
} |
} |
|
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, "new result: " |
"new result: res_errno: %d, res_error: <%s>, res_matched: <%s>\n", |
"res_errno: %d, " |
lr->lr_res_errno, lr->lr_res_error ? lr->lr_res_error : "", |
"res_error: <%s>, " |
lr->lr_res_matched ? lr->lr_res_matched : "" ); |
"res_matched: <%s>\n", |
|
lr->lr_res_errno, |
|
lr->lr_res_error ? lr->lr_res_error : "", |
|
lr->lr_res_matched ? lr->lr_res_matched : "" ); |
|
} |
|
|
|
/* in any case, don't leave any lr_res_error 'round */ |
|
if ( lr_res_error ) { |
|
LDAP_FREE( lr_res_error ); |
|
} |
} |
} |
} |
|
|
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: ld %p %d new referrals\n", |
"read1msg: %d new referrals\n", refer_cnt, 0, 0 ); |
(void *)ld, refer_cnt, 0 ); |
|
|
|
if ( refer_cnt != 0 ) { /* chasing referrals */ |
if ( refer_cnt != 0 ) { /* chasing referrals */ |
ber_free( ber, 1 ); |
ber_free( ber, 1 ); |
Line 786 nextresp2:
|
Line 658 nextresp2:
|
|
|
lr->lr_status = LDAP_REQST_COMPLETED; /* declare this request done */ |
lr->lr_status = LDAP_REQST_COMPLETED; /* declare this request done */ |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"read1msg: mark request completed, ld %p msgid %d\n", |
"read1msg: mark request completed, id = %d\n", lr->lr_msgid, 0, 0); |
(void *)ld, lr->lr_msgid, 0); |
|
while ( lr->lr_parent != NULL ) { |
while ( lr->lr_parent != NULL ) { |
merge_error_info( ld, lr->lr_parent, lr ); |
merge_error_info( ld, lr->lr_parent, lr ); |
|
|
Line 814 nextresp2:
|
Line 685 nextresp2:
|
{ |
{ |
id = lr->lr_msgid; |
id = lr->lr_msgid; |
tag = lr->lr_res_msgtype; |
tag = lr->lr_res_msgtype; |
Debug( LDAP_DEBUG_ANY, "request done: ld %p msgid %ld\n", |
Debug( LDAP_DEBUG_ANY, "request %ld done\n", |
(void *)ld, (long) id, 0 ); |
(long) id, 0, 0 ); |
Debug( LDAP_DEBUG_TRACE, |
Debug( LDAP_DEBUG_TRACE, |
"res_errno: %d, res_error: <%s>, res_matched: <%s>\n", |
"res_errno: %d, res_error: <%s>, res_matched: <%s>\n", |
lr->lr_res_errno, lr->lr_res_error ? lr->lr_res_error : "", |
lr->lr_res_errno, lr->lr_res_error ? lr->lr_res_error : "", |
Line 829 lr->lr_res_matched ? lr->lr_res_matched
|
Line 700 lr->lr_res_matched ? lr->lr_res_matched
|
} |
} |
} |
} |
|
|
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); |
|
#endif |
|
ldap_free_request( ld, lr ); |
ldap_free_request( ld, lr ); |
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); |
|
#endif |
|
} |
} |
|
|
if ( lc != NULL ) { |
if ( lc != NULL ) { |
#ifdef LDAP_R_COMPILE |
|
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); |
|
#endif |
|
ldap_free_connection( ld, lc, 0, 1 ); |
ldap_free_connection( ld, lc, 0, 1 ); |
#ifdef LDAP_R_COMPILE |
*lcp = NULL; |
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); |
|
#endif |
|
lc = *lcp = NULL; |
|
} |
} |
} |
} |
} |
} |
Line 856 lr->lr_res_matched ? lr->lr_res_matched
|
Line 715 lr->lr_res_matched ? lr->lr_res_matched
|
} |
} |
|
|
/* make a new ldap message */ |
/* make a new ldap message */ |
newmsg = (LDAPMessage *) LDAP_CALLOC( 1, sizeof(LDAPMessage) ); |
if ( (new = (LDAPMessage *) LDAP_CALLOC( 1, sizeof(LDAPMessage) )) |
if ( newmsg == NULL ) { |
== NULL ) { |
ld->ld_errno = LDAP_NO_MEMORY; |
ld->ld_errno = LDAP_NO_MEMORY; |
return( -1 ); |
return( -1 ); |
} |
} |
newmsg->lm_msgid = (int)id; |
new->lm_msgid = (int)id; |
newmsg->lm_msgtype = tag; |
new->lm_msgtype = tag; |
newmsg->lm_ber = ber; |
new->lm_ber = ber; |
newmsg->lm_chain_tail = newmsg; |
|
|
|
#ifdef LDAP_CONNECTIONLESS |
#ifdef LDAP_CONNECTIONLESS |
/* CLDAP replies all fit in a single datagram. In LDAPv2 RFC1798 |
/* CLDAP replies all fit in a single datagram. In LDAPv2 RFC1798 |
Line 907 lr->lr_res_matched ? lr->lr_res_matched
|
Line 765 lr->lr_res_matched ? lr->lr_res_matched
|
* datagram, if the sockbuf is readable we still have data |
* datagram, if the sockbuf is readable we still have data |
* to parse. |
* to parse. |
*/ |
*/ |
ber = ldap_alloc_ber_with_options( ld ); |
ber = ldap_alloc_ber_with_options(ld); |
if ( ber_sockbuf_ctrl( lc->lconn_sb, LBER_SB_OPT_DATA_READY, NULL ) ) ok = 1; |
if (ber_sockbuf_ctrl(sb, LBER_SB_OPT_DATA_READY, NULL)) ok=1; |
} |
} |
/* set up response chain */ |
/* set up response chain */ |
if ( tmp == NULL ) { |
if ( firstmsg ) { |
newmsg->lm_next = ld->ld_responses; |
firstmsg = 0; |
ld->ld_responses = newmsg; |
new->lm_next = ld->ld_responses; |
chain_head = newmsg; |
ld->ld_responses = new; |
|
new->lm_chain_tail = new; |
|
chain_head = new; |
} else { |
} else { |
tmp->lm_chain = newmsg; |
tmp->lm_chain = new; |
|
chain_head->lm_chain_tail = tmp; |
} |
} |
chain_head->lm_chain_tail = newmsg; |
tmp = new; |
tmp = newmsg; |
|
/* "ok" means there's more to parse */ |
/* "ok" means there's more to parse */ |
if (ok) { |
if (ok) { |
if (isv2) goto nextresp2; |
if (isv2) goto nextresp2; |
Line 938 lr->lr_res_matched ? lr->lr_res_matched
|
Line 798 lr->lr_res_matched ? lr->lr_res_matched
|
* stick the result onto the end of the chain, and then pull the |
* stick the result onto the end of the chain, and then pull the |
* first response off the head of the chain. |
* first response off the head of the chain. |
*/ |
*/ |
tmp->lm_chain = newmsg; |
tmp->lm_chain = new; |
chain_head->lm_chain_tail = newmsg; |
chain_head->lm_chain_tail = tmp; |
*result = chkResponseList( ld, msgid, all ); |
*result = chkResponseList( ld, msgid, all ); |
ld->ld_errno = LDAP_SUCCESS; |
ld->ld_errno = LDAP_SUCCESS; |
return( (*result)->lm_msgtype ); |
return( (*result)->lm_msgtype ); |
} |
} |
} |
} |
#endif /* LDAP_CONNECTIONLESS */ |
#endif |
|
|
/* is this the one we're looking for? */ |
/* is this the one we're looking for? */ |
if ( msgid == LDAP_RES_ANY || id == msgid ) { |
if ( msgid == LDAP_RES_ANY || id == msgid ) { |
if ( all == LDAP_MSG_ONE |
if ( all == LDAP_MSG_ONE |
|| (newmsg->lm_msgtype != LDAP_RES_SEARCH_RESULT |
|| (new->lm_msgtype != LDAP_RES_SEARCH_RESULT |
&& newmsg->lm_msgtype != LDAP_RES_SEARCH_ENTRY |
&& new->lm_msgtype != LDAP_RES_SEARCH_ENTRY |
&& newmsg->lm_msgtype != LDAP_RES_SEARCH_REFERENCE) ) { |
&& new->lm_msgtype != LDAP_RES_SEARCH_REFERENCE) ) { |
*result = newmsg; |
*result = new; |
ld->ld_errno = LDAP_SUCCESS; |
ld->ld_errno = LDAP_SUCCESS; |
return( tag ); |
return( tag ); |
} else if ( newmsg->lm_msgtype == LDAP_RES_SEARCH_RESULT) { |
} else if ( new->lm_msgtype == LDAP_RES_SEARCH_RESULT) { |
foundit = 1; /* return the chain later */ |
foundit = 1; /* return the chain later */ |
} |
} |
} |
} |
Line 969 lr->lr_res_matched ? lr->lr_res_matched
|
Line 829 lr->lr_res_matched ? lr->lr_res_matched
|
|
|
prev = NULL; |
prev = NULL; |
for ( l = ld->ld_responses; l != NULL; l = l->lm_next ) { |
for ( l = ld->ld_responses; l != NULL; l = l->lm_next ) { |
if ( l->lm_msgid == newmsg->lm_msgid ) |
if ( l->lm_msgid == new->lm_msgid ) |
break; |
break; |
prev = l; |
prev = l; |
} |
} |
Line 977 lr->lr_res_matched ? lr->lr_res_matched
|
Line 837 lr->lr_res_matched ? lr->lr_res_matched
|
/* not part of an existing search response */ |
/* not part of an existing search response */ |
if ( l == NULL ) { |
if ( l == NULL ) { |
if ( foundit ) { |
if ( foundit ) { |
*result = newmsg; |
*result = new; |
goto exit; |
goto exit; |
} |
} |
|
|
newmsg->lm_next = ld->ld_responses; |
new->lm_next = ld->ld_responses; |
ld->ld_responses = newmsg; |
ld->ld_responses = new; |
|
new->lm_chain_tail = new; |
goto exit; |
goto exit; |
} |
} |
|
|
Debug( LDAP_DEBUG_TRACE, "adding response ld %p msgid %ld type %ld:\n", |
Debug( LDAP_DEBUG_TRACE, "adding response id %ld type %ld:\n", |
(void *)ld, (long) newmsg->lm_msgid, (long) newmsg->lm_msgtype ); |
(long) new->lm_msgid, (long) new->lm_msgtype, 0 ); |
|
|
/* part of a search response - add to end of list of entries */ |
/* part of a search response - add to end of list of entries */ |
l->lm_chain_tail->lm_chain = newmsg; |
if (l->lm_chain == NULL) { |
l->lm_chain_tail = newmsg; |
if ((l->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || |
|
(l->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || |
|
(l->lm_msgtype == LDAP_RES_INTERMEDIATE)) { |
|
/* do not advance lm_chain_tail in this case */ |
|
l->lm_chain = new; |
|
} else { |
|
/*FIXME: ldap_msgfree( l );*/ |
|
l = new; |
|
l->lm_chain_tail = new; |
|
} |
|
} else { |
|
if ((l->lm_chain_tail->lm_chain->lm_msgtype |
|
== LDAP_RES_SEARCH_ENTRY) || |
|
(l->lm_chain_tail->lm_chain->lm_msgtype |
|
== LDAP_RES_SEARCH_REFERENCE) || |
|
(l->lm_chain_tail->lm_chain->lm_msgtype |
|
== LDAP_RES_INTERMEDIATE)) { |
|
l->lm_chain_tail->lm_chain->lm_chain = new; |
|
l->lm_chain_tail = l->lm_chain_tail->lm_chain; |
|
} else { |
|
/*FIXME: ldap_msgfree( l->lm_chain_tail->lm_chain );*/ |
|
l->lm_chain_tail->lm_chain = new; |
|
} |
|
} |
|
|
/* return the whole chain if that's what we were looking for */ |
/* return the whole chain if that's what we were looking for */ |
if ( foundit ) { |
if ( foundit ) { |
Line 1007 exit:
|
Line 891 exit:
|
ld->ld_errno = LDAP_SUCCESS; |
ld->ld_errno = LDAP_SUCCESS; |
return( tag ); |
return( tag ); |
} |
} |
if ( lc && ber_sockbuf_ctrl( lc->lconn_sb, LBER_SB_OPT_DATA_READY, NULL ) ) { |
if ( ber_sockbuf_ctrl( sb, LBER_SB_OPT_DATA_READY, NULL ) ) { |
goto retry; |
goto retry; |
} |
} |
return( LDAP_MSG_X_KEEP_LOOKING ); /* continue looking */ |
return( -2 ); /* continue looking */ |
} |
} |
|
|
|
|
Line 1031 build_result_ber( LDAP *ld, BerElement *
|
Line 915 build_result_ber( LDAP *ld, BerElement *
|
} |
} |
|
|
if ( ber_printf( ber, "{it{ess}}", lr->lr_msgid, |
if ( ber_printf( ber, "{it{ess}}", lr->lr_msgid, |
lr->lr_res_msgtype, lr->lr_res_errno, |
lr->lr_res_msgtype, lr->lr_res_errno, |
lr->lr_res_matched ? lr->lr_res_matched : "", |
lr->lr_res_matched ? lr->lr_res_matched : "", |
lr->lr_res_error ? lr->lr_res_error : "" ) == -1 ) |
lr->lr_res_error ? lr->lr_res_error : "" ) == -1 ) { |
{ |
|
ld->ld_errno = LDAP_ENCODING_ERROR; |
ld->ld_errno = LDAP_ENCODING_ERROR; |
ber_free(ber, 1); |
ber_free(ber, 1); |
return( LBER_ERROR ); |
return( LBER_ERROR ); |
Line 1048 build_result_ber( LDAP *ld, BerElement *
|
Line 932 build_result_ber( LDAP *ld, BerElement *
|
return( LBER_ERROR ); |
return( LBER_ERROR ); |
} |
} |
|
|
if ( ber_get_enum( ber, &along ) == LBER_ERROR ) { |
if ( ber_get_int( ber, &along ) == LBER_ERROR ) { |
ld->ld_errno = LDAP_DECODING_ERROR; |
ld->ld_errno = LDAP_DECODING_ERROR; |
ber_free(ber, 1); |
ber_free(ber, 1); |
return( LBER_ERROR ); |
return( LBER_ERROR ); |
Line 1080 merge_error_info( LDAP *ld, LDAPRequest
|
Line 964 merge_error_info( LDAP *ld, LDAPRequest
|
lr->lr_res_error ); |
lr->lr_res_error ); |
} |
} |
} else if ( lr->lr_res_errno != LDAP_SUCCESS && |
} else if ( lr->lr_res_errno != LDAP_SUCCESS && |
parentr->lr_res_errno == LDAP_SUCCESS ) |
parentr->lr_res_errno == LDAP_SUCCESS ) { |
{ |
|
parentr->lr_res_errno = lr->lr_res_errno; |
parentr->lr_res_errno = lr->lr_res_errno; |
if ( parentr->lr_res_error != NULL ) { |
if ( parentr->lr_res_error != NULL ) { |
LDAP_FREE( parentr->lr_res_error ); |
LDAP_FREE( parentr->lr_res_error ); |
} |
} |
parentr->lr_res_error = lr->lr_res_error; |
parentr->lr_res_error = lr->lr_res_error; |
lr->lr_res_error = NULL; |
lr->lr_res_error = NULL; |
if ( LDAP_NAME_ERROR( lr->lr_res_errno ) ) { |
if ( LDAP_NAME_ERROR( lr->lr_res_errno )) { |
if ( parentr->lr_res_matched != NULL ) { |
if ( parentr->lr_res_matched != NULL ) { |
LDAP_FREE( parentr->lr_res_matched ); |
LDAP_FREE( parentr->lr_res_matched ); |
} |
} |
Line 1111 int
|
Line 994 int
|
ldap_msgtype( LDAPMessage *lm ) |
ldap_msgtype( LDAPMessage *lm ) |
{ |
{ |
assert( lm != NULL ); |
assert( lm != NULL ); |
return ( lm != NULL ) ? (int)lm->lm_msgtype : -1; |
return ( lm != NULL ) ? lm->lm_msgtype : -1; |
} |
} |
|
|
|
|