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

This is an example of using an add operation to add a new entry (a person) to the directory.

To compile this example on Unix:

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

To compile this example on Windows:

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

To link this example on Unix:

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

To link this example on Windows:

cl /nologo /o add.exe add.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 *objectclass = NULL;
DS_Attr *cn = NULL;
DS_Attr *sn = NULL;
DS_Attr *mail = 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 an entry to add */
status = DS_Entry_New( &entry );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot create new entry\n" );
goto cleanup;
}
status = DS_String2DN( "cn=John Smith,ou=People,dc=example,dc=com", &dn );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Bad New DN\n" );
goto cleanup;
}
status = DS_Entry_SetDN( entry, dn );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot set new DN\n" );
goto cleanup;
}
status = DS_Attr_New( "objectClass", &objectclass );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot create new objectclass\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( objectclass, S("top") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add top\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( objectclass, S("person") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add person\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( objectclass, S("organizationalPerson") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add organizationalPerson\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( objectclass, S("inetOrgPerson") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add inetOrgPerson\n" );
goto cleanup;
}
status = DS_Attr_New( "cn", &cn );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot create new cn\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( cn, S("John Smith") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add John Smith\n" );
goto cleanup;
}
status = DS_Attr_New( "sn", &sn );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot create new sn\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( sn, S("Smith") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add Smith\n" );
goto cleanup;
}
status = DS_Attr_New( "mail", &mail );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot create new mail\n" );
goto cleanup;
}
status = DS_Attr_AddStringValue( mail, S("john.smith@example.com") );
if ( status != DS_E_NOERROR) {
fprintf( stderr, "Cannot add john.smith@example.com\n" );
goto cleanup;
}
status = DS_Entry_AddValues( entry, objectclass );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot add objectclass attribute\n" );
goto cleanup;
}
status = DS_Entry_AddValues( entry, cn );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot add cn attribute\n" );
goto cleanup;
}
status = DS_Entry_AddValues( entry, sn );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot add sn attribute\n" );
goto cleanup;
}
status = DS_Entry_AddValues( entry, mail );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Cannot add mail attribute\n" );
goto cleanup;
}
status = DS_AddSync( ds, entry, NULL, &di );
if ( di != NULL &&
fprintf( stderr, "Add returns error type %d and error value %d\n",
t, v );
if ( status != DS_E_NOERROR ) {
fprintf( stderr, "Add 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 ( cn != NULL ) DS_Attr_Delete( cn );
if ( objectclass != NULL ) DS_Attr_Delete( objectclass );
if ( ds != NULL ) DS_UnbindSync( &ds );
return rc;
}