1
1
/* result.c - wait for an ldap result */
2
/* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.124.2.12 2008/07/09 23:16:48 quanah Exp $ */
2
/* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.124.2.17 2009/02/10 23:42:16 quanah Exp $ */
3
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
* Copyright 1998-2008 The OpenLDAP Foundation.
5
* Copyright 1998-2009 The OpenLDAP Foundation.
6
6
* All rights reserved.
8
8
* Redistribution and use in source and binary forms, with or without
71
71
static int wait4msg LDAP_P(( LDAP *ld, ber_int_t msgid, int all, struct timeval *timeout,
72
72
LDAPMessage **result ));
73
73
static ber_tag_t try_read1msg LDAP_P(( LDAP *ld, ber_int_t msgid,
74
int all, LDAPConn **lc, LDAPMessage **result ));
74
int all, LDAPConn *lc, LDAPMessage **result ));
75
75
static ber_tag_t build_result_ber LDAP_P(( LDAP *ld, BerElement **bp, LDAPRequest *lr ));
76
76
static void merge_error_info LDAP_P(( LDAP *ld, LDAPRequest *parentr, LDAPRequest *lr ));
77
77
static LDAPMessage * chkResponseList LDAP_P(( LDAP *ld, int msgid, int all));
118
118
ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex );
122
/* this is already done inside wait4msg(), right?... */
123
lm = chkResponseList( ld, msgid, all );
127
rc = wait4msg( ld, msgid, all, timeout, result );
131
ld->ld_errno = LDAP_SUCCESS;
121
rc = wait4msg( ld, msgid, all, timeout, result );
135
123
#ifdef LDAP_R_COMPILE
136
124
ldap_pvt_thread_mutex_unlock( &ld->ld_res_mutex );
335
323
if ( ber_sockbuf_ctrl( lc->lconn_sb,
336
324
LBER_SB_OPT_DATA_READY, NULL ) )
338
#ifdef LDAP_R_COMPILE
339
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
341
rc = try_read1msg( ld, msgid, all, &lc, result );
342
#ifdef LDAP_R_COMPILE
343
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
375
356
rc = LDAP_MSG_X_KEEP_LOOKING; /* select interrupted: loop */
378
rc = LDAP_MSG_X_KEEP_LOOKING;
379
#ifdef LDAP_R_COMPILE
380
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
382
if ( ld->ld_requests &&
383
ld->ld_requests->lr_status == LDAP_REQST_WRITING &&
384
ldap_is_write_ready( ld,
385
ld->ld_requests->lr_conn->lconn_sb ) )
387
ldap_int_flush_request( ld, ld->ld_requests );
389
#ifdef LDAP_R_COMPILE
390
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
391
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
393
for ( lc = ld->ld_conns;
394
rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL; )
396
if ( lc->lconn_status == LDAP_CONNST_CONNECTED &&
397
ldap_is_read_ready( ld, lc->lconn_sb ) )
399
#ifdef LDAP_R_COMPILE
400
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
402
rc = try_read1msg( ld, msgid, all, &lc, result );
403
#ifdef LDAP_R_COMPILE
404
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
407
/* if lc gets free()'d,
408
* there's no guarantee
409
* lc->lconn_next is still
410
* sane; better restart
364
rc = LDAP_MSG_X_KEEP_LOOKING;
365
#ifdef LDAP_R_COMPILE
366
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
368
if ( ld->ld_requests &&
369
ld->ld_requests->lr_status == LDAP_REQST_WRITING &&
370
ldap_is_write_ready( ld,
371
ld->ld_requests->lr_conn->lconn_sb ) )
373
ldap_int_flush_request( ld, ld->ld_requests );
375
#ifdef LDAP_R_COMPILE
376
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
377
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
379
for ( lc = ld->ld_conns;
380
rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL;
383
if ( lc->lconn_status == LDAP_CONNST_CONNECTED &&
384
ldap_is_read_ready( ld, lc->lconn_sb ) )
386
/* Don't let it get freed out from under us */
388
#ifdef LDAP_R_COMPILE
389
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
391
rc = try_read1msg( ld, msgid, all, lc, result );
392
lnext = lc->lconn_next;
414
/* don't get to next conn! */
394
/* Only take locks if we're really freeing */
395
if ( lc->lconn_refcnt <= 1 ) {
396
#ifdef LDAP_R_COMPILE
397
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
399
ldap_free_connection( ld, lc, 0, 1 );
400
#ifdef LDAP_R_COMPILE
401
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
406
#ifdef LDAP_R_COMPILE
407
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
410
lnext = lc->lconn_next;
422
#ifdef LDAP_R_COMPILE
423
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
413
#ifdef LDAP_R_COMPILE
414
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
514
502
Debug( LDAP_DEBUG_TRACE, "read1msg: ld %p msgid %d all %d\n",
515
503
(void *)ld, msgid, all );
520
506
if ( lc->lconn_ber == NULL ) {
521
507
lc->lconn_ber = ldap_alloc_ber_with_options( ld );
561
547
if ( err == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
563
549
ld->ld_errno = LDAP_SERVER_DOWN;
564
#ifdef LDAP_R_COMPILE
565
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
567
ldap_free_connection( ld, lc, 1, 0 );
568
#ifdef LDAP_R_COMPILE
569
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
551
lc->lconn_status = 0;
937
918
* shouldn't necessarily end the connection
939
920
if ( lc != NULL && id != 0 ) {
940
#ifdef LDAP_R_COMPILE
941
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
943
ldap_free_connection( ld, lc, 0, 1 );
944
#ifdef LDAP_R_COMPILE
945
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
1011
986
/* get rid of the connection... */
1012
987
if ( lc != NULL ) {
1013
#ifdef LDAP_R_COMPILE
1014
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
1016
ldap_free_connection( ld, lc, 0, 1 );
1017
#ifdef LDAP_R_COMPILE
1018
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
1023
991
/* need to return -1, because otherwise
1126
1094
if ( msgid == LDAP_RES_ANY || id == msgid ) {
1127
1095
if ( all == LDAP_MSG_ONE
1128
1096
|| ( newmsg->lm_msgtype != LDAP_RES_SEARCH_RESULT
1129
&& newmsg->lm_msgtype != LDAP_RES_SEARCH_ENTRY
1097
&& newmsg->lm_msgtype != LDAP_RES_SEARCH_ENTRY
1098
&& newmsg->lm_msgtype != LDAP_RES_INTERMEDIATE
1130
1099
&& newmsg->lm_msgtype != LDAP_RES_SEARCH_REFERENCE ) )
1132
1101
*result = newmsg;
1435
1404
/* NOTE: those assertions are repeated in ldap_int_bisect_delete() */
1436
1405
assert( idx >= 0 );
1437
assert( idx < ld->ld_nabandoned );
1406
assert( (unsigned) idx < ld->ld_nabandoned );
1438
1407
assert( ld->ld_abandoned[ idx ] == msgid );
1440
1409
return ldap_int_bisect_delete( &ld->ld_abandoned, &ld->ld_nabandoned,