Back to index

lightning-sunbird  0.9+nobinonly
Functions
getattr.c File Reference
#include "ldap-int.h"

Go to the source code of this file.

Functions

static unsigned long bytes_remaining (BerElement *ber)
char *LDAP_CALL ldap_first_attribute (LDAP *ld, LDAPMessage *entry, BerElement **ber)
char *LDAP_CALL ldap_next_attribute (LDAP *ld, LDAPMessage *entry, BerElement *ber)

Function Documentation

static unsigned long bytes_remaining ( BerElement *  ber) [static]

Definition at line 55 of file getattr.c.

{
       unsigned long len;

       if ( ber_get_option( ber, LBER_OPT_REMAINING_BYTES, &len ) != 0 ) {
              return( 0 );  /* not sure what else to do.... */
       }
       return( len );
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* LDAP_CALL ldap_first_attribute ( LDAP *  ld,
LDAPMessage *  entry,
BerElement **  ber 
)

Definition at line 68 of file getattr.c.

{
       char   *attr;
       int    err;
       long   seqlength;

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

       if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
              return( NULL );             /* punt */
       }

       if ( ber == NULL || !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
              LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
              return( NULL );
       }
       
       if ( nsldapi_alloc_ber_with_options( ld, ber ) != LDAP_SUCCESS ) {
              return( NULL );
       }

       **ber = *entry->lm_ber;

       attr = NULL;                /* pessimistic */
       err = LDAP_DECODING_ERROR;  /* ditto */

       /* 
        * Skip past the sequence, dn, and sequence of sequence.
        * Reset number of bytes remaining so we confine the rest of our
        * decoding to the current sequence.
        */
       if ( ber_scanf( *ber, "{xl{", &seqlength ) != LBER_ERROR &&
            ber_set_option( *ber, LBER_OPT_REMAINING_BYTES, &seqlength )
           == 0 ) {
              /* snarf the attribute type, and skip the set of values,
               * leaving us positioned right before the next attribute
               * type/value sequence.
               */
              if ( ber_scanf( *ber, "{ax}", &attr ) != LBER_ERROR ||
                  bytes_remaining( *ber ) == 0 ) {
                     err = LDAP_SUCCESS;
              }
       }

       LDAP_SET_LDERRNO( ld, err, NULL, NULL );
       if ( attr == NULL || err != LDAP_SUCCESS ) {
              ber_free( *ber, 0 );
              *ber = NULL;
       }
       return( attr );
}

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 123 of file getattr.c.

{
       char   *attr;
       int    err;

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

       if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
              return( NULL );             /* punt */
       }

       if ( ber == NULL || !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
              LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
              return( NULL );
       }

       attr = NULL;                /* pessimistic */
       err = LDAP_DECODING_ERROR;  /* ditto */

       /* skip sequence, snarf attribute type, skip values */
       if ( ber_scanf( ber, "{ax}", &attr ) != LBER_ERROR ||
           bytes_remaining( ber ) == 0 ) {
              err = LDAP_SUCCESS;
       }

       LDAP_SET_LDERRNO( ld, err, NULL, NULL );
       return( attr );
}

Here is the call graph for this function:

Here is the caller graph for this function: