This chapter provides a simple example of an LDAP client written with the Mozilla LDAP C SDK.
The chapter contains the following sections:
The following is the source code for a command-line program (a console application) that retrieves the full name, last name, email address, and telephone number of Barbara Jensen.
#include <stdio.h>
#include "ldap.h"
/* Adjust these setting for your own LDAP server */
#define HOSTNAME "localhost"
#define PORT_NUMBER LDAP_PORT
#define FIND_DN "uid=bjensen, ou=People, dc=example,dc=com"
int
main( int argc, char **argv )
{
LDAP *ld;
LDAPMessage *result, *e;
BerElement *ber;
char *a;
char **vals;
int i, rc;
/* Get a handle to an LDAP connection. */
if ( (ld = ldap_init( HOSTNAME, PORT_NUMBER )) == NULL ) {
perror( "ldap_init" );
return( 1 );
}
/* Bind anonymously to the LDAP server. */
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc));
return( 1 );
}
/* Search for the entry. */
if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
"(objectclass=*)", NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) != LDAP_SUCCESS ) {
fprintf(stderr, "ldap_search_ext_s: %s\n", ldap_err2string(rc));
return( 1 );
}
/* Since we are doing a base search, there should be only
one matching entry. */
e = ldap_first_entry( ld, result );
if ( e != NULL ) {
printf( "\nFound %s:\n\n", FIND_DN );
/* Iterate through each attribute in the entry. */
for ( a = ldap_first_attribute( ld, e, &ber );
a != NULL; a = ldap_next_attribute( ld, e, ber ) ) {
/* For each attribute, print the attribute name and values. */
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 ) {
ber_free( ber, 0 );
}
}
ldap_msgfree( result );
ldap_unbind( ld );
return( 0 );
}
How you compile the example program depends on the operating system on which you compile. Below are examples of compiling on Solaris and Windows NT systems.
The examples directory contains
a sample UNIX makefile. You can modify the makefile to compile the
example in this section by adjusting the flags specified in this
file as needed. The makefile assumes that the LDAP API header files
are located in the ../include directory.
For example, you can use the following Solaris makefile for this example:
# Makefile for the example in this chapter.
#
EXTRACFLAGS=
EXTRALDFLAGS=-lsocket -lnsl
LDAPLIB=ldap50 -lplc4 -lplds4 -lnspr4
INCDIR=../include
LIBDIR=../lib
LIBS=-L$(LIBDIR) $(LDAPLIB) $(EXTRALDFLAGS)
OPTFLAGS=-g
CFLAGS=$(OPTFLAGS) -I$(INCDIR) $(EXTRACFLAGS)
CC=cc
PROGS=rdentry
all: $(PROGS)
rdentry: rdentry.o
$(CC) -o rdentry rdentry.o $(LIBS)
clean: /bin/rm -f $(PROGS) *.o a.out core
If you are compiling this on Windows NT, set up a makefile for this application. Make sure to do the following:
lib as one of the directories
containing library files and include as one of the
directories containing include files.
nsldap32v50.lib, the LDAP API import library
for Windows.
First, make sure your LDAP server is set up with the entry that the
example attempts to find. For example, if you are running Netscape
Directory Server, make sure the Arius.ldif file is
imported in the database.
If you have compiled and linked the client on a UNIX platform, make
sure to set your LD_LIBRARY_PATH variable to the location
of the libldap50.so, plc3, plds3,
and nspr4 library files. (As an alternative, when linking
the file, specify the flag that identifies the library directories that
the run-time linker should search. For example, on Solaris, use the
-R flag to specify the location of the
libldap50.so file.)
If you have linked the client with the nsldap32v50.lib
import library on Windows NT, make sure to copy the
nsldap32v50.dll dynamic link library file to one of the
following directories:
winnt\system32).
PATH environment variable.