Summary: Isode provides a number of APIs which allow integrators and product developers to build components that allow client programs to connect to, query and modify data in the directory.
read.c

This is an example of doing a synchronous read operation, and how to process the returned results.

To compile this example on Unix:

cc -I /opt/isode/include -c read.c 

To compile this example on Windows:

cl /nologo /I C:\Progra~1\Isode\include /c read.c

To link this example on Unix:

cc -o read read.o -L/opt/isode/lib \
    -ldua -lisode -libase -lldap -llber \
    -lisode_ssl -lisode_crypto -lpthread

To link this example on Windows:

cl /nologo /o read.exe read.obj \
    C:\Progra~1\Isode\bin\libdua.lib
/*
* Copyright (c) 2005-2009, Isode Limited, London, England.
* All rights reserved.
*
* Acquisition and use of this software and related materials for any
* purpose requires a written licence agreement from Isode Limited,
* or a written licence from an organisation licenced by Isode Limited
* to grant such a licence.
*/
#include <stdio.h>
int main ( void )
{
DS_Session *ds = NULL;
DS_Indication *di = NULL;
const DS_EntryList *el = NULL;
const DS_Entry *e = NULL;
const DS_AttrList *al = NULL;
const DS_Attr *a = NULL;
DS_DN *dn = NULL;
const char *attrs[] = { "objectClass", "cn", "manager", NULL };
DS_Status status;
status = DS_Initialize();
status = DS_String2DN( "cn=dsa,dc=example,dc=com", &dn );
status = DS_Session_New( "Internet=localhost+19999", 0, &ds );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Failed to create session\n" );
return 1;
}
status = DS_BindAnonymousSync( ds, NULL, &di );
if ( DS_Indication_GetErrorCodes( di, &t, &v ) == DS_E_NOERROR &&
t != DS_E_SUCCESS )
status = DS_E_DSOPFAILED;
if ( status != DS_E_NOERROR) {
DS_UnbindSync( &ds );
fprintf( stderr, "Failed to bind\n" );
return 1;
}
status = DS_ReadSync( ds, dn, attrs, NULL, &di );
status = DS_Indication_GetEntryList( di, &el );
status = DS_Entry_GetAttrList( e, &al );
for ( a = DS_AttrList_GetFirst( al );
a != NULL;
a = DS_AttrList_GetNext( a ) ) {
const char *name;
const DS_AttrValList *vl;
const DS_AttrVal *v;
DS_Attr_GetTypeName( a, &name );
printf( "%s:\n", name );
/* Don't free name */
status = DS_Attr_GetValueList( a, &vl );
for ( v = DS_AttrValList_GetFirst( vl );
v != NULL;
const char *val_str;
size_t val_len;
status = DS_AttrVal_GetStringPointer( v, &val_str, &val_len );
if ( status == DS_E_NOERROR )
printf( "\t%s\n", val_str );
else
printf( "\t(No string value)\n");
/* Don't free val_str */
}
}
DS_UnbindSync( &ds );
return 0;
}