X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Freferences.c;h=371919db10de2318b04555649645fc194570e6fe;hb=403f4479bc9f9a864122d4aeecf7284408918302;hp=3c317e1937ff649e01a3f10d5186bf0b40984856;hpb=138d76ecf458ca1d1fd6ca0e24183d86a8b71e92;p=openldap diff --git a/libraries/libldap/references.c b/libraries/libldap/references.c index 3c317e1937..371919db10 100644 --- a/libraries/libldap/references.c +++ b/libraries/libldap/references.c @@ -1,3 +1,8 @@ +/* $OpenLDAP$ */ +/* + * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ /* * references.c */ @@ -5,7 +10,8 @@ #include "portable.h" #include -#include + +#include #include #include @@ -14,12 +20,15 @@ #include "ldap-int.h" -/* ARGSUSED */ LDAPMessage * ldap_first_reference( LDAP *ld, LDAPMessage *chain ) { - if ( ld == NULL || chain == NULLMSG ) { - return NULLMSG; + assert( ld != NULL ); + assert( LDAP_VALID( ld ) ); + assert( chain != NULL ); + + if ( ld == NULL || chain == NULL ) { + return NULL; } return chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE @@ -27,17 +36,20 @@ ldap_first_reference( LDAP *ld, LDAPMessage *chain ) : ldap_next_reference( ld, chain ); } -/* ARGSUSED */ LDAPMessage * ldap_next_reference( LDAP *ld, LDAPMessage *ref ) { - if ( ld == NULL || ref == NULLMSG ) { - return NULLMSG; + assert( ld != NULL ); + assert( LDAP_VALID( ld ) ); + assert( ref != NULL ); + + if ( ld == NULL || ref == NULL ) { + return NULL; } for ( ref = ref->lm_chain; - ref != NULLMSG; + ref != NULL; ref = ref->lm_chain ) { if( ref->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) { @@ -45,19 +57,23 @@ ldap_next_reference( LDAP *ld, LDAPMessage *ref ) } } - return( NULLMSG ); + return( NULL ); } -/* ARGSUSED */ int ldap_count_references( LDAP *ld, LDAPMessage *chain ) { int i; + assert( ld != NULL ); + assert( LDAP_VALID( ld ) ); + assert( chain != NULL ); + if ( ld == NULL ) { return -1; } + for ( i = 0; chain != NULL; chain = chain->lm_chain ) { if( chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) { i++; @@ -66,3 +82,76 @@ ldap_count_references( LDAP *ld, LDAPMessage *chain ) return( i ); } + +int +ldap_parse_reference( + LDAP *ld, + LDAPMessage *ref, + char ***referralsp, + LDAPControl ***serverctrls, + int freeit) +{ + BerElement be; + char **refs = NULL; + int rc; + + assert( ld != NULL ); + assert( LDAP_VALID( ld ) ); + assert( ref != NULL ); + + if( ld == NULL || ref == NULL || + ref->lm_msgtype != LDAP_RES_SEARCH_REFERENCE ) + { + return LDAP_PARAM_ERROR; + } + + /* make a private copy of BerElement */ + SAFEMEMCPY(&be, ref->lm_ber, sizeof(be)); + + if ( ber_scanf( &be, "{v" /*}*/, &refs ) == LBER_ERROR ) { + rc = LDAP_DECODING_ERROR; + goto free_and_return; + } + + if ( serverctrls == NULL ) { + rc = LDAP_SUCCESS; + goto free_and_return; + } + + if ( ber_scanf( &be, /*{*/ "}" ) == LBER_ERROR ) { + rc = LDAP_DECODING_ERROR; + goto free_and_return; + } + + rc = ldap_int_get_controls( &be, serverctrls ); + +free_and_return: + + if( referralsp != NULL ) { + /* provide references regradless of return code */ + *referralsp = refs; + + } else { + ldap_value_free( refs ); + } + + if( freeit ) { + ldap_msgfree( ref ); + } + + if( rc != LDAP_SUCCESS ) { + ld->ld_errno = rc; + + if( ld->ld_matched != NULL ) { + LDAP_FREE( ld->ld_matched ); + ld->ld_matched = NULL; + } + + if( ld->ld_error != NULL ) { + LDAP_FREE( ld->ld_error ); + ld->ld_error = NULL; + } + } + + return rc; +}