async.c
This is an example of doing an asynchronous operation (a read), polling for results, and then printing them out.
Error handling has mostly been omitted for clarity.
To compile this example on Unix:
cc -I /opt/isode/include -c async.c
To compile this example on Windows:
cl /nologo /I C:\Progra~1\Isode\include /c async.c
To link this example on Unix:
cc -o async async.o -L/opt/isode/lib \ -ldua -lisode -libase -lldap -llber \ -lssl -lcrypto -lpthread
To link this example on Windows:
cl /nologo /o async.exe async.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>
#ifdef _WIN32
# include <stdlib.h>
# define sleep _sleep
#else
# include <unistd.h>
#endif
#include <isode/ds/dsapi/dsapi.h>
int main ( void )
{
DS_Session *ds = NULL;
DS_Indication *di = NULL;
DS_ErrorType t;
const DS_EntryList *el = NULL;
const DS_Entry *e = NULL;
const DS_AttrList *al = NULL;
const DS_Attr *a = NULL;
DS_DN *dn = NULL;
int op_id;
int i;
const char *attrs[] = { "objectClass", "cn", "manager", NULL };
DS_Status status;
status = DS_Initialize();
fprintf( stderr, "Failed to create session\n" );
return 1;
}
status = DS_BindAnonymousSync( ds, NULL, &di );
t != DS_E_SUCCESS )
status = DS_E_DSOPFAILED;
DS_Indication_Delete( di );
if ( status != DS_E_NOERROR) {
DS_UnbindSync( &ds );
fprintf( stderr, "Failed to bind\n" );
return 1;
}
status = DS_ReadAsync( ds, dn, attrs, NULL, &op_id );
di = NULL;
for ( i = 0; i < 5; i++ ) {
sleep( 1 );
status = DS_Poll( ds, op_id, &di );
if ( status == DS_E_NOERROR )
break;
}
status = DS_Indication_GetEntryList( di, &el );
e = DS_EntryList_GetFirst( el );
status = DS_Entry_GetAttrList( e, &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 );
v != NULL;
v = DS_AttrValList_GetNext( v ) ) {
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_Indication_Delete( di );
DS_UnbindSync( &ds );
return 0;
}
DS_Status DS_AttrVal_GetStringPointer(const DS_AttrVal *value, const char **str_p, size_t *str_len_p)
Return a pointer to the stored LDAPv3 format string encoding.
const DS_Attr * DS_AttrList_GetNext(const DS_Attr *attr)
Get the next attribute in a list.
DS_Status DS_Indication_GetEntryList(DS_Indication *indication, const DS_EntryList **entry_list_p)
Return the set of entries contained in the operation outcome.
DS_Status DS_Attr_GetTypeName(const DS_Attr *attr, const char **str_p)
Return the type name of a given attribute.
DS_Status DS_Entry_GetAttrList(const DS_Entry *entry, const DS_AttrList **attr_list_p)
Get the entry attribute list.
const DS_AttrVal * DS_AttrValList_GetNext(const DS_AttrVal *value)
Get the next attribute in a list.
DS_Status DS_ReadAsync(DS_Session *session, const DS_DN *dn, const char *attr_selection[], DS_CommonArgs *common_args, int *ret_op_id)
Invoke an asynchronous directory read entry operation.
const DS_Entry * DS_EntryList_GetFirst(const DS_EntryList *entry_list)
Get the first entry in a list of entries.
DS_Status DS_Indication_GetErrorCodes(DS_Indication *indication, DS_ErrorType *type_p, DS_ErrorValue *value_p)
Get the directory (operation) error type and value codes.
DS_Status DS_Session_New(const char *address, int force_tls, DS_Session **session_p)
Create an unbound directory session, validating the specified address.
Methods for session management and invoking directory operations.
DS_Status DS_Attr_GetValueList(const DS_Attr *attr, const DS_AttrValList **val_list_p)
Get an attribute's value list.
const DS_AttrVal * DS_AttrValList_GetFirst(const DS_AttrValList *value_list)
Get the first attribute in a list.
DS_Status DS_BindAnonymousSync(DS_Session *session, DS_CommonArgs *common_args, DS_Indication **indication_p)
Perform an anonymous synchronous directory bind.
DS_Status DS_Poll(DS_Session *session, int op_id, DS_Indication **indication_p)
Poll for an asynchronous operation indication.
const DS_Attr * DS_AttrList_GetFirst(const DS_AttrList *attr_list)
Get the first attribute in an attribute list.
DS_Status DS_String2DN(const char *str_dn, DS_DN **dn_p)
Convert an LDAPv3 string formatted DN to the API structure.
void DS_Indication_Delete(DS_Indication *indication)
Free a DS_Indication structure.