#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <ldap.h>
#if defined(N_PLAT_NLM) && defined(LIBC)
#include <screen.h>
#endif
static char usage[] =
"\n Usage: searchBinary <host name> <port number> <login dn> <password>"
"\n <search base>\n"
"\n Example: searchBinary Acme.com 389 cn=admin,o=Acme secret"
"\n ou=Sales,o=Acme\n";
int value_is_printable( struct berval *bval );
void binary_print( char *attr, struct berval *bval );
int main( int argc, char **argv )
{
int version, ldapPort, i, rc;
char *ldapHost, *loginDN, *password, *searchBase;
char *attribute, *dn, *sortAttribute;
BerElement *ber;
LDAP *ld;
LDAPMessage *searchResult, *entry;
struct berval **bvalues;
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);
if (( ld = ldap_init( ldapHost, ldapPort )) == NULL)
{
printf ( "\n LDAP session initialization failed\n");
return( 1 );
}
printf ( "\n LDAP session initialized\n");
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 );
}
printf("\n Bind successful\n");
rc = ldap_search_ext_s(
ld,
searchBase,
LDAP_SCOPE_ONELEVEL,
"(objectclass=*)",
NULL,
0,
NULL,
NULL,
&timeOut,
LDAP_NO_LIMIT,
&searchResult );
if ( rc != LDAP_SUCCESS )
{
printf("ldap_search_ext_s: %s\n", ldap_err2string( rc ));
ldap_msgfree( searchResult );
ldap_unbind_s( ld );
return ( 1 );
}
sortAttribute = "sn";
ldap_sort_entries( ld,
&searchResult,
sortAttribute,
strcmp );
for ( entry = ldap_first_entry( ld, searchResult );
entry != NULL;
entry = ldap_next_entry( ld, entry ) )
{
if (( dn = ldap_get_dn( ld, entry )) != NULL )
{
printf("\n--- dn: %s\n", dn );
ldap_memfree( dn );
}
for ( attribute = ldap_first_attribute( ld, entry, &ber );
attribute != NULL;
attribute = ldap_next_attribute( ld, entry, ber ) )
{
if ((bvalues = ldap_get_values_len( ld, entry, attribute)) != NULL)
{
for ( i = 0; bvalues[i] != NULL; i++ )
{
printf("\n");
if (value_is_printable( bvalues[i] ) )
printf(" %s: %s\n",
attribute, bvalues[i]->bv_val );
else
binary_print( attribute, bvalues[i] );
}
ldap_value_free_len( bvalues );
}
ldap_memfree( attribute );
}
ber_free(ber, 0);
}
printf("\n Search completed successfully.\n");
ldap_msgfree( searchResult );
ldap_unbind_s( ld );
return( 0 );
}
int value_is_printable( struct berval *bval )
{
unsigned int i;
for ( i=0; i<bval->bv_len; i++)
{
if ( !isprint( (bval->bv_val)[i] ) )
return 0;
}
return 1;
}
void binary_print( char *attr, struct berval *bval )
{
int i, x, len, lines, m=0;
char szChar[3], szHex[4];
char HexLine[(3*16)+1], CharLine[16+1];
unsigned char *buf;
len = (int)bval->bv_len;
buf = (unsigned char*)bval->bv_val;
printf(" %s:\n", attr );
lines = len / 16;
if ( len % 16 )
lines++;
for (i=0; i<lines; i++)
{
HexLine[0] = '\0';
CharLine[0] = '\0';
for (x=0; x<16; x++)
{
if (m < len)
{
sprintf(szHex, "%.2X ", buf[m]);
if (isprint(buf[m]))
sprintf(szChar, "%c", buf[m]);
else
sprintf(szChar, ".");
m++;
}
else
{
sprintf(szHex, " ");
sprintf(szChar, " ");
}
strcat(HexLine, szHex);
strcat(CharLine, szChar);
}
printf(" %s %s\n", HexLine, CharLine);
}
}