Back to index

openldap  2.4.31
Functions
getattr.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

char * ldap_first_attribute (LDAP *ld, LDAPMessage *entry, BerElement **berout)
char * ldap_next_attribute (LDAP *ld, LDAPMessage *entry, BerElement *ber)
int ldap_get_attribute_ber (LDAP *ld, LDAPMessage *entry, BerElement *ber, BerValue *attr, BerVarray *vals)

Function Documentation

char* ldap_first_attribute ( LDAP *  ld,
LDAPMessage *  entry,
BerElement **  berout 
)

Definition at line 31 of file getattr.c.

{
       int rc;
       ber_tag_t tag;
       ber_len_t len = 0;
       char *attr;
       BerElement *ber;

       Debug( LDAP_DEBUG_TRACE, "ldap_first_attribute\n", 0, 0, 0 );

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

       *berout = NULL;

       ber = ldap_alloc_ber_with_options( ld );
       if( ber == NULL ) {
              return NULL;
       }

       *ber = *entry->lm_ber;

       /* 
        * Skip past the sequence, dn, sequence of sequence leaving
        * us at the first attribute.
        */

       tag = ber_scanf( ber, "{xl{" /*}}*/, &len );
       if( tag == LBER_ERROR ) {
              ld->ld_errno = LDAP_DECODING_ERROR;
              ber_free( ber, 0 );
              return NULL;
       }

       /* set the length to avoid overrun */
       rc = ber_set_option( ber, LBER_OPT_REMAINING_BYTES, &len );
       if( rc != LBER_OPT_SUCCESS ) {
              ld->ld_errno = LDAP_LOCAL_ERROR;
              ber_free( ber, 0 );
              return NULL;
       }

       if ( ber_pvt_ber_remaining( ber ) == 0 ) {
              assert( len == 0 );
              ber_free( ber, 0 );
              return NULL;
       }
       assert( len != 0 );

       /* snatch the first attribute */
       tag = ber_scanf( ber, "{ax}", &attr );
       if( tag == LBER_ERROR ) {
              ld->ld_errno = LDAP_DECODING_ERROR;
              ber_free( ber, 0 );
              return NULL;
       }

       *berout = ber;
       return attr;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int ldap_get_attribute_ber ( LDAP *  ld,
LDAPMessage *  entry,
BerElement *  ber,
BerValue attr,
BerVarray vals 
)

Definition at line 128 of file getattr.c.

{
       ber_tag_t tag;
       int rc = LDAP_SUCCESS;

       Debug( LDAP_DEBUG_TRACE, "ldap_get_attribute_ber\n", 0, 0, 0 );

       assert( ld != NULL );
       assert( LDAP_VALID( ld ) );
       assert( entry != NULL );
       assert( ber != NULL );
       assert( attr != NULL );

       attr->bv_val = NULL;
       attr->bv_len = 0;

       if ( ber_pvt_ber_remaining( ber ) ) {
              ber_len_t siz = sizeof( BerValue );

              /* skip sequence, snarf attribute type */
              tag = ber_scanf( ber, vals ? "{mM}" : "{mx}", attr, vals,
                     &siz, 0 ); 
              if( tag == LBER_ERROR ) {
                     rc = ld->ld_errno = LDAP_DECODING_ERROR;
              }
       }

       return rc;
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* ldap_next_attribute ( LDAP *  ld,
LDAPMessage *  entry,
BerElement *  ber 
)

Definition at line 96 of file getattr.c.

{
       ber_tag_t tag;
       char *attr;

       Debug( LDAP_DEBUG_TRACE, "ldap_next_attribute\n", 0, 0, 0 );

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

       if ( ber_pvt_ber_remaining( ber ) == 0 ) {
              return NULL;
       }

       /* skip sequence, snarf attribute type, skip values */
       tag = ber_scanf( ber, "{ax}", &attr ); 
       if( tag == LBER_ERROR ) {
              ld->ld_errno = LDAP_DECODING_ERROR;
              return NULL;
       }

       return attr;
}

Here is the call graph for this function:

Here is the caller graph for this function: