#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ldap.h>
#if defined(N_PLAT_NLM) && defined(LIBC)
#include <screen.h>
#endif
static char usage[] =
"\n Usage: listgroup <host name> <port number> <login dn> <password>"
"\n <group dn>\n"
"\n Example: listgroup Acme.com 389 cn=admin,o=Acme secret"
"\n cn=salesGroup,ou=sales,o=acme\n";
int main( int argc, char **argv )
{
int version, ldapPort, i, rc;
LDAP *ld;
char *ldapHost, *loginDN, *password, *groupDN;
char *attrs[] = { "objectClass", "memberQueryURL", "dgIdentity",
"dgAllowDuplicates", "dgTimeout",
"excludedMember", "member", NULL };
LDAPMessage *searchResult;
char *attribute;
BerElement *ber;
char **objClass=NULL, **identity=NULL, **queryURL=NULL;
char **allowDuplicates=NULL, **dgTimeout=NULL;
char **excludedMember=NULL, **member=NULL;
int isGroup=0, isDynamicGroup=0;
int retStatus = 1;
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];
groupDN = 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 );
}
rc = ldap_simple_bind_s( ld, loginDN, password );
if (rc != LDAP_SUCCESS )
{
printf( "ldap_simple_bind_s: %s\n", ldap_err2string( rc ) );
goto cleanup;
}
printf( "\n Reading object: %s\n", groupDN );
rc = ldap_search_ext_s(
ld,
groupDN,
LDAP_SCOPE_BASE,
NULL,
attrs,
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 );
goto cleanup;
}
for ( attribute = ldap_first_attribute( ld, searchResult, &ber );
attribute != NULL;
attribute = ldap_next_attribute( ld, searchResult, ber ) )
{
if (strcmp( attribute, "objectClass" ) == 0 ||
strcmp( attribute, "objectclass" ) == 0 )
{
objClass = ldap_get_values( ld, searchResult, attribute );
}
else if (strcmp( attribute, "memberQueryURL" ) == 0 )
{
queryURL = ldap_get_values( ld, searchResult, attribute );
}
else if (strcmp( attribute, "dgIdentity" ) == 0 )
{
identity = ldap_get_values( ld, searchResult, attribute );
}
else if (strcmp( attribute, "dgAllowDuplicates" ) == 0 )
{
allowDuplicates = ldap_get_values( ld, searchResult, attribute );
}
else if (strcmp( attribute, "dgTImeout" ) == 0 )
{
dgTimeout = ldap_get_values( ld, searchResult, attribute );
}
else if (strcmp( attribute, "excludedMember" ) == 0)
{
excludedMember = ldap_get_values( ld, searchResult, attribute );
}
else if (strcmp(attribute, "member") == 0 ||
strcmp(attribute, "uniqueMember") == 0)
{
member = ldap_get_values( ld, searchResult, attribute );
}
ldap_memfree( attribute );
}
ber_free( ber, 0 );
ldap_msgfree( searchResult );
if (!objClass)
{
printf( "\n Could not read objectClass of this object. Exiting.\n");
goto cleanup;
}
for ( i = 0; objClass[i] != NULL; i++ )
{
if ( strcmp( objClass[i], "group" ) == 0 ||
strcmp( objClass[i], "groupOfNames" ) == 0 ||
strcmp( objClass[i], "groupOfUniqueNames" ) == 0 )
isGroup=1;
else if ( strcmp(objClass[i], "dynamicGroup" ) == 0 ||
strcmp(objClass[i], "dynamicGroupAux" ) == 0 )
isDynamicGroup = isGroup = 1;
}
if (!isGroup)
{
printf( "\n This object is NOT a group object. Exiting.\n" );
goto cleanup;
}
if (isDynamicGroup)
{
printf( "\n This object is a dynamic group.\n" );
if (queryURL)
{
printf( "\n Member Query URL:\n" );
for (i=0; queryURL[i]; i++)
printf( " %s\n", queryURL[i] );
}
if (identity && identity[0])
{
printf( "\n Identity for search:\n %s\n",
identity[0] );
}
if (allowDuplicates && allowDuplicates[0])
{
printf( "\n allowDuplicates: %s\n", allowDuplicates[0] );
}
if (dgTimeout && dgTimeout[0])
{
printf( "\n dgTimeout: %s\n", dgTimeout[0] );
}
if (excludedMember)
{
printf( "\n Excluded member list:\n" );
for (i=0; excludedMember[i]; i++)
printf( " %s\n", excludedMember[i] );
}
}
if (member!=NULL) {
printf( "\n Member list:\n" );
for (i=0; member[i]; i++)
printf( " %s\n", member[i] );
}
else {
printf("\n %s has no members.\n\n", groupDN);
}
retStatus = 0;
cleanup:
ldap_value_free( objClass );
ldap_value_free( queryURL );
ldap_value_free( identity );
ldap_value_free( allowDuplicates );
ldap_value_free( dgTimeout );
ldap_value_free( excludedMember );
ldap_value_free( member );
ldap_unbind_s( ld );
return( retStatus );
}