Table of Contents | Previous | Next | Index

Netscape Directory SDK 3.0 for C Programmer’s Guide
     Chapter 18 Functions

ldap_search()

Searches the directory asynchronously.

Note that this is an older function that is included in the LDAP API for backward-compatibility. If you are writing a new LDAP client, use ldap_search_ext() instead.

Syntax

#include <ldap.h>
int ldap_search( LDAP *ld, const char *base, int scope,
   const char* filter, char **attrs, int attrsonly );

Parameters

This function has the following parameters:

ld

Connection handle, which is a pointer to an LDAP structure containing information about the connection to the LDAP server.

base

Distinguished name (DN) of the entry that serves as the starting point for the search. For example, setting base to "o=Airius.com" restricts the search to entries at Airius.com.

scope

Scope of the search, which can be one of the following values:

filter

String representation of the filter to apply in the search. You can specify simple filters with the following syntax:

For details on the syntax for filters, see "Specifying a Search Filter" on page 113.

attrs

A NULL-terminated array of attribute types to return from entries that match filter. If you specify a NULL, all attributes will be returned.

attrsonly

Specifies whether or not attribute values are returned along with the attribute types. This parameter can have the following values:

Returns

Returns the message ID of the ldap_search() operation. To check the result of this operation, call ldap_result() and ldap_result2error() For a list of possible result codes for an LDAP search operation, see the result code documentation for the ldap_search_ext_s() function.

Description

The ldap_search() function searches the directory asynchronously.

A newer version of this function, ldap_search_ext(), is available in this release of the LDAP API. ldap_search() (the older version of the function) is included only for backward-compatibility. If you are writing a new LDAP client, use ldap_search_ext() instead of ldap_search().

If you want more information on ldap_search(), refer to the LDAP C SDK 1.0 Programmer's Guide.

Example

The following section of code searches the directory.

#include "examples.h"
static void do_other_work();
unsigned long global_counter = 0;
int
main( int argc, char **argv )
{
   LDAP *ld;
   LDAPMessage *result, *e;
   BerElement *ber;
   char *a, *dn;
   char **vals;
   int i, rc, finished, msgid;
   int num_entries = 0;
   struct timeval zerotime;
   zerotime.tv_sec = zerotime.tv_usec = 0L;
/* get a handle to an LDAP connection */
if ( (ld = ldap_init( MY_HOST, MY_PORT )) == NULL ) {
   perror( "ldap_init" );
   return( 1 );
}
/* authenticate to the directory as nobody */
if ( ldap_simple_bind_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {
   ldap_perror( ld, "ldap_simple_bind_s" );
   return( 1 );
}
/* search for all entries with surname of Jensen */
if (( msgid = ldap_search( ld, MY_SEARCHBASE, LDAP_SCOPE_SUBTREE,
       MY_FILTER, NULL, 0 )) == -1 ) {
   ldap_perror( ld, "ldap_search" );
   return( 1 );
}
/* Loop, polling for results until finished */
finished = 0;
while ( !finished ) {
   /*
   * Poll for results.   We call ldap_result with the "all" parameter
   * set to zero. This causes ldap_result() to return exactly one
   * entry if at least one entry is available. This allows us to
   * display the entries as they are received.
   */
   result = NULL;
   rc = ldap_result( ld, msgid, 0, &zerotime, &result );
   switch ( rc ) {
   case -1:
      /* some error occurred */
      ldap_perror( ld, "ldap_result" );
      return( 1 );
   case 0:
   /* Timeout was exceeded. No entries are ready for retrieval. */
      if ( result != NULL ) {
         ldap_msgfree( result );
      }
      break;
   default:
   /*
   * Either an entry is ready for retrieval, or all entries have
   * been retrieved.
   */
      if (( e = ldap_first_entry( ld, result )) == NULL ) {
         /* All done */
         finished = 1;
         if ( result != NULL ) {
            ldap_msgfree( result );
         }
         continue;
       }
      /* for each entry print out name + all attrs and values */
      num_entries++;
      if (( dn = ldap_get_dn( ld, e )) != NULL ) {
         printf( "dn: %s\n", dn );
         ldap_memfree( dn );
      }
      for ( a = ldap_first_attribute( ld, e, &ber );
       a != NULL; a = ldap_next_attribute( ld, e, ber ) ) {
         if (( vals = ldap_get_values( ld, e, a )) != NULL ) {
            for ( i = 0; vals[ i ] != NULL; i++ ) {
               printf( "%s: %s\n", a, vals[ i ] );
            }
         ldap_value_free( vals );
         }
         ldap_memfree( a );
      }
      if ( ber != NULL ) {
         ldap_ber_free( ber, 0 );
      }
      printf( "\n" );
      ldap_msgfree( result );
   }
   /* Do other work here while you are waiting... */
   do_other_work();
}
/* All done. Print a summary. */
printf( "%d entries retrieved. I counted to %ld "
       "while waiting.\n", num_entries, global_counter );
ldap_unbind( ld );
return( 0 );
}
/*
 * Perform other work while polling for results. */
static void
do_other_work()
{
    global_counter++;
}

See Also

ldap_search_ext().


Table of Contents | Previous | Next | Index

Last Updated: 10/01/98 17:06:23