version 1.50, 2000/10/03 16:51:30
|
version 1.51, 2000/10/04 23:40:36
|
Line 1
|
Line 1
|
/* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.49 2000/08/18 02:25:07 kurt Exp $ */ |
/* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.50 2000/10/03 16:51:30 kurt Exp $ */ |
/* |
/* |
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. |
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
Line 63 static ber_tag_t try_read1msg LDAP_P(( L
|
Line 63 static ber_tag_t try_read1msg LDAP_P(( L
|
int all, Sockbuf *sb, 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)); |
|
|
|
|
/* |
/* |
Line 89 ldap_result(
|
Line 90 ldap_result(
|
struct timeval *timeout, |
struct timeval *timeout, |
LDAPMessage **result ) |
LDAPMessage **result ) |
{ |
{ |
LDAPMessage *lm, *lastlm, *nextlm; |
LDAPMessage *lm; |
|
|
assert( ld != NULL ); |
assert( ld != NULL ); |
assert( result != NULL ); |
assert( result != NULL ); |
|
|
Debug( LDAP_DEBUG_TRACE, "ldap_result\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_TRACE, "ldap_result msgid %d\n", msgid, 0, 0 ); |
|
|
if( ld == NULL ) { |
if( ld == NULL ) { |
return -1; |
return -1; |
Line 105 ldap_result(
|
Line 106 ldap_result(
|
return -1; |
return -1; |
} |
} |
|
|
/* |
lm = chkResponseList(ld, msgid, all); |
* First, look through the list of responses we have received on |
|
|
if ( lm == NULL ) { |
|
return( wait4msg( ld, msgid, all, timeout, result ) ); |
|
} |
|
|
|
*result = lm; |
|
ld->ld_errno = LDAP_SUCCESS; |
|
return( lm->lm_msgtype ); |
|
} |
|
|
|
static LDAPMessage * |
|
chkResponseList( LDAP *ld, |
|
int msgid, |
|
int all) |
|
{ |
|
LDAPMessage *lm, *lastlm, *nextlm; |
|
/* |
|
* 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 |
* is there. If it is, return it. If not, call wait4msg() to |
* is there. If it is, return it. If not, call wait4msg() to |
* wait until it arrives or timeout occurs. |
* wait until it arrives or timeout occurs. |
*/ |
*/ |
|
|
*result = NULL; |
|
lastlm = NULL; |
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 154 ldap_result(
|
Line 171 ldap_result(
|
} |
} |
lastlm = lm; |
lastlm = lm; |
} |
} |
if ( lm == NULL ) { |
if ( lm != NULL ) { |
return( wait4msg( ld, msgid, all, timeout, result ) ); |
if ( lastlm == NULL ) { |
} |
ld->ld_responses = (all == LDAP_MSG_ONE && lm->lm_chain != NULL |
|
? lm->lm_chain : lm->lm_next); |
if ( lastlm == NULL ) { |
} else { |
ld->ld_responses = (all == LDAP_MSG_ONE && lm->lm_chain != NULL |
lastlm->lm_next = (all == LDAP_MSG_ONE && lm->lm_chain != NULL |
? lm->lm_chain : lm->lm_next); |
? lm->lm_chain : lm->lm_next); |
} else { |
} |
lastlm->lm_next = (all == LDAP_MSG_ONE && lm->lm_chain != NULL |
if ( all == LDAP_MSG_ONE && lm->lm_chain != NULL ) |
? lm->lm_chain : lm->lm_next); |
{ |
} |
lm->lm_chain->lm_next = lm->lm_next; |
if ( all == LDAP_MSG_ONE && lm->lm_chain != NULL ) |
lm->lm_chain = NULL; |
{ |
} |
lm->lm_chain->lm_next = lm->lm_next; |
lm->lm_next = NULL; |
lm->lm_chain = NULL; |
} |
} |
return lm; |
lm->lm_next = NULL; |
|
|
|
*result = lm; |
|
ld->ld_errno = LDAP_SUCCESS; |
|
return( lm->lm_msgtype ); |
|
} |
} |
|
|
static int |
static int |
wait4msg( |
wait4msg( |
LDAP *ld, |
LDAP *ld, |
Line 196 wait4msg(
|
Line 207 wait4msg(
|
|
|
#ifdef LDAP_DEBUG |
#ifdef LDAP_DEBUG |
if ( timeout == NULL ) { |
if ( timeout == NULL ) { |
Debug( LDAP_DEBUG_TRACE, "wait4msg (infinite timeout)\n", |
Debug( LDAP_DEBUG_TRACE, "wait4msg (infinite timeout), msgid %d\n", |
0, 0, 0 ); |
msgid, 0, 0 ); |
} else { |
} else { |
Debug( LDAP_DEBUG_TRACE, "wait4msg (timeout %ld sec, %ld usec)\n", |
Debug( LDAP_DEBUG_TRACE, "wait4msg (timeout %ld sec, %ld usec), msgid %d\n", |
(long) timeout->tv_sec, (long) timeout->tv_usec, 0 ); |
(long) timeout->tv_sec, (long) timeout->tv_usec, msgid ); |
} |
} |
#endif /* LDAP_DEBUG */ |
#endif /* LDAP_DEBUG */ |
|
|
Line 223 wait4msg(
|
Line 234 wait4msg(
|
for ( lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next ) { |
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 ) ) { |
rc = try_read1msg( ld, msgid, all, lc->lconn_sb, |
if( (*result = chkResponseList(ld, msgid, all)) == NULL ) { |
lc, result ); |
rc = try_read1msg( ld, msgid, all, lc->lconn_sb, |
break; |
lc, result ); |
|
} else { |
|
rc = (*result)->lm_msgtype; |
|
} |
|
break; |
} |
} |
} |
} |
|
|
Line 314 try_read1msg(
|
Line 329 try_read1msg(
|
assert( ld != NULL ); |
assert( ld != NULL ); |
assert( lc != NULL ); |
assert( lc != NULL ); |
|
|
Debug( LDAP_DEBUG_TRACE, "read1msg\n", 0, 0, 0 ); |
Debug( LDAP_DEBUG_TRACE, "read1msg: msgid %d, all %d\n", msgid, all, 0 ); |
|
|
if ( lc->lconn_ber == NULL ) { |
if ( lc->lconn_ber == NULL ) { |
lc->lconn_ber = ldap_alloc_ber_with_options(ld); |
lc->lconn_ber = ldap_alloc_ber_with_options(ld); |