home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ldapsdk.zip / libraries / libldap / getentry.c < prev    next >
C/C++ Source or Header  |  2000-07-29  |  2KB  |  133 lines

  1. /* $OpenLDAP: pkg/ldap/libraries/libldap/getentry.c,v 1.14.4.4 2000/07/29 01:53:08 kurt Exp $ */
  2. /*
  3.  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  4.  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  5.  */
  6. /*  Portions
  7.  *  Copyright (c) 1990 Regents of the University of Michigan.
  8.  *  All rights reserved.
  9.  *
  10.  *  getentry.c
  11.  */
  12.  
  13. #include "portable.h"
  14.  
  15. #include <stdio.h>
  16. #include <ac/stdlib.h>
  17.  
  18. #include <ac/socket.h>
  19. #include <ac/string.h>
  20. #include <ac/time.h>
  21.  
  22. #include "ldap-int.h"
  23.  
  24. /* ARGSUSED */
  25. LDAPMessage *
  26. ldap_first_entry( LDAP *ld, LDAPMessage *chain )
  27. {
  28.     assert( ld != NULL );
  29.     assert( LDAP_VALID( ld ) );
  30.     assert( chain != NULL );
  31.  
  32.     if( ld == NULL || chain == NULL ) {
  33.         return NULL;
  34.     }
  35.  
  36.     return chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY
  37.         ? chain
  38.         : ldap_next_entry( ld, chain );
  39. }
  40.  
  41. LDAPMessage *
  42. ldap_next_entry( LDAP *ld, LDAPMessage *entry )
  43. {
  44.     assert( ld != NULL );
  45.     assert( LDAP_VALID( ld ) );
  46.     assert( entry != NULL );
  47.  
  48.     if ( ld == NULL || entry == NULL ) {
  49.         return NULL;
  50.     }
  51.  
  52.     for (
  53.         entry = entry->lm_chain;
  54.         entry != NULL;
  55.         entry = entry->lm_chain )
  56.     {
  57.         if( entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
  58.             return( entry );
  59.         }
  60.     }
  61.  
  62.     return( NULL );
  63. }
  64.  
  65. int
  66. ldap_count_entries( LDAP *ld, LDAPMessage *chain )
  67. {
  68.     int    i;
  69.  
  70.     assert( ld != NULL );
  71.     assert( LDAP_VALID( ld ) );
  72.  
  73.     if ( ld == NULL ) {
  74.         return -1;
  75.     }
  76.  
  77.     for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
  78.         if( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
  79.             i++;
  80.         }
  81.     }
  82.  
  83.     return( i );
  84. }
  85.  
  86. int
  87. ldap_get_entry_controls(
  88.     LDAP *ld,
  89.     LDAPMessage *entry, 
  90.     LDAPControl ***sctrls )
  91. {
  92.     int rc;
  93.     BerElement be;
  94.  
  95.     assert( ld != NULL );
  96.     assert( LDAP_VALID( ld ) );
  97.     assert( entry != NULL );
  98.     assert( sctrls != NULL );
  99.  
  100.     if ( ld == NULL || sctrls == NULL ||
  101.         entry == NULL || entry->lm_msgtype != LDAP_RES_SEARCH_ENTRY )
  102.     {
  103.         return LDAP_PARAM_ERROR;
  104.     }
  105.  
  106.     /* make a local copy of the BerElement */
  107.     AC_MEMCPY(&be, entry->lm_ber, sizeof(be));
  108.  
  109.     if ( ber_scanf( &be, "{xx" /*}*/ ) == LBER_ERROR ) {
  110.         rc = LDAP_DECODING_ERROR;
  111.         goto cleanup_and_return;
  112.     }
  113.  
  114.     rc = ldap_int_get_controls( &be, sctrls );
  115.  
  116. cleanup_and_return:
  117.     if( rc != LDAP_SUCCESS ) {
  118.         ld->ld_errno = rc;
  119.  
  120.         if( ld->ld_matched != NULL ) {
  121.             LDAP_FREE( ld->ld_matched );
  122.             ld->ld_matched = NULL;
  123.         }
  124.  
  125.         if( ld->ld_error != NULL ) {
  126.             LDAP_FREE( ld->ld_error );
  127.             ld->ld_error = NULL;
  128.         }
  129.     }
  130.  
  131.     return rc;
  132. }
  133.