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.
modify.c

This is an example of using a modify operation to change an existing entry in the directory.

To compile this example on Unix:

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

To compile this example on Windows:

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

To link this example on Unix:

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

To link this example on Windows:

cl /nologo /o modify.exe modify.obj \
    C:\Progra~1\Isode\bin\libdua.lib
/*
* Copyright (c) 2008-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>
#include <string.h>
#define S(a) (a), strlen(a)
int main ( void )
{
DS_Session *ds = NULL;
DS_Indication *di = NULL;
DS_DN *dn = NULL;
DS_Attr *sn = NULL;
DS_Attr *mail = NULL;
DS_Attr *description = NULL;
DS_Entry *entry = NULL;
DS_Status status;
int rc = 1;
status = DS_Initialize( );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Initialization failed\n" );
goto cleanup;
}
status = DS_String2DN( "cn=DSA Manager,cn=dsa,dc=example,dc=com", &dn );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Bad Manager DN\n" );
goto cleanup;
}
status = DS_Session_New( "Internet=localhost+19999", 0, &ds );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Failed to create session\n" );
goto cleanup;
}
status = DS_BindSimpleSync( ds, dn, "secret", NULL, &di );
if ( DS_Indication_GetErrorCodes( di, &t, &v ) == DS_E_NOERROR &&
t != DS_E_SUCCESS )
status = DS_E_DSOPFAILED;
DS_DN_Delete( dn );
dn = NULL;
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Bind failed\n" );
goto cleanup;
}
/* Build a set of changes */
status = DS_Entry_New( &entry );
status = DS_String2DN( "cn=John Smith,ou=People,dc=example,dc=com", &dn );
status = DS_Entry_SetDN( entry, dn );
status = DS_Attr_New( "sn", &sn );
status = DS_Attr_AddStringValue( sn, S("Schmidt") );
status = DS_Entry_AddValues( entry, sn );
status = DS_Attr_New( "mail", &mail );
/* no values means delete entire attribute */
status = DS_Entry_DeleteValues( entry, mail );
status = DS_Attr_New( "description", &description );
status = DS_Attr_AddStringValue( description, S("new surname") );
status = DS_Entry_ReplaceValues( entry, description );
status = DS_ModifySync( ds, entry, NULL, &di );
if ( di != NULL &&
fprintf( stderr, "Modify returns error type %d and error value %d\n",
t, v );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Modify operation failed\n" );
goto cleanup;
}
rc = 0;
cleanup:
if ( di != NULL ) DS_Indication_Delete( di );
if ( entry != NULL ) DS_Entry_Delete( entry );
if ( mail != NULL ) DS_Attr_Delete( mail );
if ( sn != NULL ) DS_Attr_Delete( sn );
if ( description != NULL ) DS_Attr_Delete( description );
if ( ds != NULL ) DS_UnbindSync( &ds );
return rc;
}