Back to index

openldap  2.4.31
Functions
references.c File Reference
#include "portable.h"
#include <stdio.h>
#include <ac/stdlib.h>
#include <ac/socket.h>
#include <ac/string.h>
#include <ac/time.h>
#include "ldap-int.h"

Go to the source code of this file.

Functions

LDAPMessage * ldap_first_reference (LDAP *ld, LDAPMessage *chain)
LDAPMessage * ldap_next_reference (LDAP *ld, LDAPMessage *ref)
int ldap_count_references (LDAP *ld, LDAPMessage *chain)
int ldap_parse_reference (LDAP *ld, LDAPMessage *ref, char ***referralsp, LDAPControl ***serverctrls, int freeit)

Function Documentation

int ldap_count_references ( LDAP *  ld,
LDAPMessage *  chain 
)

Definition at line 62 of file references.c.

{
       int    i;

       assert( ld != NULL );
       assert( LDAP_VALID( ld ) );

       for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
              if( chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
                     i++;
              }
       }

       return( i );
}
LDAPMessage* ldap_first_reference ( LDAP *  ld,
LDAPMessage *  chain 
)

Definition at line 30 of file references.c.

{
       assert( ld != NULL );
       assert( LDAP_VALID( ld ) );
       assert( chain != NULL );

       return chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE
              ? chain
              : ldap_next_reference( ld, chain );
}

Here is the call graph for this function:

LDAPMessage* ldap_next_reference ( LDAP *  ld,
LDAPMessage *  ref 
)

Definition at line 42 of file references.c.

{
       assert( ld != NULL );
       assert( LDAP_VALID( ld ) );
       assert( ref != NULL );

       for (
              ref = ref->lm_chain;
              ref != NULL;
              ref = ref->lm_chain )
       {
              if( ref->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
                     return( ref );
              }
       }

       return( NULL );
}

Here is the caller graph for this function:

int ldap_parse_reference ( LDAP *  ld,
LDAPMessage *  ref,
char ***  referralsp,
LDAPControl ***  serverctrls,
int  freeit 
)

Definition at line 79 of file references.c.

{
       BerElement be;
       char **refs = NULL;
       int rc;

       assert( ld != NULL );
       assert( LDAP_VALID( ld ) );
       assert( ref !=  NULL );

       if( ref->lm_msgtype != LDAP_RES_SEARCH_REFERENCE ) {
              return LDAP_PARAM_ERROR;
       }

       /* make a private copy of BerElement */
       AC_MEMCPY(&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_pvt_get_controls( &be, serverctrls );

free_and_return:

       if( referralsp != NULL ) {
              /* provide references regradless of return code */
              *referralsp = refs;

       } else {
              LDAP_VFREE( 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;
}

Here is the call graph for this function:

Here is the caller graph for this function: