#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>
#if defined(N_PLAT_NLM) && defined(LIBC)
#include <screen.h>
#endif
static char usage[] =
"\n Usage: searchMsg <host name> <port number> <login dn> <password>"
"\n <search base>\n"
"\n Example: searchMsg acme.com 389 cn=admin,o=acme secret"
"\n ou=Sales,o=Acme\n\n";
int main( int argc, char **argv)
{
int version, ldapPort, i, rc, messageID, parseResult;
int messageType, entryCount, referenceCount, messageCount;
char *ldapHost, *loginDN, *password, *searchBase;
char *attribute, *dn, **values, **referrals;
LDAP *ld;
BerElement *ber;
LDAPMessage *searchResult, *message;
struct timeval timeOut = {10,0};
#if defined(N_PLAT_NLM) && defined(LIBC)
setscreenmode(SCR_NO_MODE);
#endif
if (argc != 6)
{
printf("%s", usage);
return(1);
}
ldapHost = argv[1];
ldapPort = atoi(argv[2]);
loginDN = argv[3];
password = argv[4];
searchBase = argv[5];
version = LDAP_VERSION3;
ldap_set_option( NULL, LDAP_OPT_PROTOCOL_VERSION, &version);
ldap_set_option( NULL, LDAP_OPT_NETWORK_TIMEOUT, &timeOut);
ldap_set_option( NULL, LDAP_OPT_REFERRALS, LDAP_OPT_OFF );
if (( ld = ldap_init( ldapHost, ldapPort )) == NULL)
{
printf("\n\tLDAP session initialization failed\n");
return( 1 );
}
rc = ldap_simple_bind_s( ld, loginDN, password );
if (rc != LDAP_SUCCESS )
{
printf("ldap_simple_bind_s: %s\n", ldap_err2string( rc ));
ldap_unbind_s( ld );
return( 1 );
}
rc = ldap_search_ext_s(
ld,
searchBase,
LDAP_SCOPE_SUBTREE,
"(objectclass=*)",
NULL,
0,
NULL,
NULL,
&timeOut,
LDAP_NO_LIMIT,
&searchResult );
if ( rc != LDAP_SUCCESS )
{
printf("ldap_search_ext_s: %s\n", ldap_err2string( rc ));
if (rc == LDAP_REFERRAL)
{
char **reflist = NULL;
rc = ldap_get_option(ld, LDAP_OPT_REFERRAL_LIST, &reflist);
if (rc == LDAP_SUCCESS)
{
printf(" Referrals:\n");
for (i=0; reflist[i]; i++)
printf(" %s\n",reflist[i]);
ldap_value_free(reflist);
}
}
ldap_unbind_s( ld );
ldap_msgfree( searchResult );
return( 1 );
}
for ( message = ldap_first_message( ld, searchResult );
message != NULL;
message = ldap_next_message( ld, message ) )
{
messageType = ldap_msgtype( message );
printf("\nMessage type: %d\n", messageType );
messageID = ldap_msgid( message );
printf("Message ID: %d\n", messageID );
switch ( messageType )
{
case LDAP_RES_SEARCH_ENTRY:
if (( dn = ldap_get_dn( ld, message )) != NULL )
{
printf("\tdn: %s\n", dn );
ldap_memfree( dn );
}
for ( attribute = ldap_first_attribute( ld,searchResult,&ber );
attribute != NULL;
attribute = ldap_next_attribute( ld, searchResult,ber))
{
if (( values = ldap_get_values( ld, message, attribute))
!= NULL )
{
for ( i = 0; values[ i ] != NULL; i++ )
printf("\t\t%s: %s\n", attribute, values[ i ] );
ldap_value_free( values );
}
ldap_memfree( attribute );
}
ber_free(ber, 0);
break;
case LDAP_RES_SEARCH_REFERENCE:
parseResult = ldap_parse_reference(
ld,
message,
&referrals,
NULL,
0);
if ( parseResult != LDAP_SUCCESS )
{
printf("ldap_parse_result: %s\n",
ldap_err2string( parseResult ) );
ldap_msgfree( searchResult );
ldap_unbind_s( ld );
return( 1 );
}
if ( referrals != NULL )
{
for ( i = 0; referrals[ i ] != NULL; i++ )
printf("Search reference: %s\n\n", referrals[ i ] );
ldap_value_free( referrals );
}
break;
case LDAP_RES_SEARCH_RESULT:
break;
default:
break;
}
}
messageCount = ldap_count_messages( ld, searchResult );
entryCount = ldap_count_entries( ld, searchResult );
referenceCount = ldap_count_references( ld, searchResult );
printf("\nSearch completed successfully.\n"
"\nMessages returned: %d\n"
"Entries returned: %d\n"
"Search references returned: %d\n",
messageCount, entryCount, referenceCount );
ldap_msgfree( searchResult );
ldap_unbind_s( ld );
return( 0 );
}