3 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
14 #include <ac/stdlib.h>
17 #include <ac/socket.h>
18 #include <ac/string.h>
24 ldap_first_reference( LDAP *ld, LDAPMessage *chain )
27 assert( LDAP_VALID( ld ) );
28 assert( chain != NULL );
30 if ( ld == NULL || chain == NULL ) {
34 return chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE
36 : ldap_next_reference( ld, chain );
40 ldap_next_reference( LDAP *ld, LDAPMessage *ref )
43 assert( LDAP_VALID( ld ) );
44 assert( ref != NULL );
46 if ( ld == NULL || ref == NULL ) {
55 if( ref->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
64 ldap_count_references( LDAP *ld, LDAPMessage *chain )
69 assert( LDAP_VALID( ld ) );
70 assert( chain != NULL );
77 for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
78 if( chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
91 LDAPControl ***serverctrls,
99 assert( LDAP_VALID( ld ) );
100 assert( ref != NULL );
102 if( ld == NULL || ref == NULL ||
103 ref->lm_msgtype != LDAP_RES_SEARCH_REFERENCE )
105 return LDAP_PARAM_ERROR;
108 /* make a private copy of BerElement */
109 SAFEMEMCPY(&be, ref->lm_ber, sizeof(be));
111 if ( ber_scanf( &be, "{v" /*}*/, &refs ) == LBER_ERROR ) {
112 rc = LDAP_DECODING_ERROR;
113 goto free_and_return;
116 if ( serverctrls == NULL ) {
118 goto free_and_return;
121 if ( ber_scanf( &be, /*{*/ "}" ) == LBER_ERROR ) {
122 rc = LDAP_DECODING_ERROR;
123 goto free_and_return;
126 rc = ldap_int_get_controls( &be, serverctrls );
130 if( referralsp != NULL ) {
131 /* provide references regradless of return code */
135 ldap_value_free( refs );
142 if( rc != LDAP_SUCCESS ) {
145 if( ld->ld_matched != NULL ) {
146 LDAP_FREE( ld->ld_matched );
147 ld->ld_matched = NULL;
150 if( ld->ld_error != NULL ) {
151 LDAP_FREE( ld->ld_error );