#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>
#if defined(N_PLAT_NLM) && defined(LIBC)
#include <screen.h>
#endif
void print_schema(LDAPSchema *schema, int type);
int main(int argc, char *argv[])
{
char *ldapHost, *loginDN, *password;
LDAP *ld;
LDAPSchema *schema = NULL;
int rc, ldapPort, version;
struct timeval timeOut = {10,0};
LDAPSchemaMod m_oid, m_name, m_desc, m_syntax, m_x, *mod[6];
char *syntax[] = {"1.3.6.1.4.1.1466.115.121.1.15", NULL};
char *oid [] = {"2.16.840.1.113719.1.187.4.1", NULL};
char *name[] = {"TestAttribute", NULL};
char *desc[] = {"Test attribute definition", NULL};
char *x_field = "X-NDS_NOT_SCHED_SYNC_IMMEDIATE";
char *x_values[]= {"1", NULL };
#if defined(N_PLAT_NLM) && defined(LIBC)
setscreenmode(SCR_NO_MODE);
#endif
if (argc != 5){
printf("\n Usage: schema <host name> <port number>"
" <login dn> <password>\n\n"
" Example: schema Acme.com 389 cn=admin,o=Acme secret \n");
return 1;
}
ldapHost = argv[1];
ldapPort = atoi( argv[2] );
loginDN = argv[3];
password = argv[4];
version = LDAP_VERSION3;
ldap_set_option( NULL, LDAP_OPT_PROTOCOL_VERSION, &version);
ldap_set_option( NULL, LDAP_OPT_NETWORK_TIMEOUT, &timeOut);
ld = ldap_init( ldapHost, ldapPort);
if (ld == NULL ){
printf ( "\n\tLDAP session initialization failed.\n");
return 1;
}
printf("\n\tLDAP session initialized successfully.\n");
rc = ldap_simple_bind_s( ld, loginDN, password );
if (rc != LDAP_SUCCESS ){
printf("ldap_simple_bind_s: %s\n", ldap_err2string( rc ));
ldap_unbind_s ( ld );
return( 1 );
}
printf("\n\tBind successful.\n");
rc = ldap_schema_fetch( ld, &schema, NULL );
if (rc != LDAP_SUCCESS) {
printf("ldap_simple_bind_s: %s\n", ldap_err2string( rc ));
ldap_unbind_s ( ld );
return( 1 );
}
print_schema(schema, LDAP_SCHEMA_ATTRIBUTE_TYPE);
print_schema(schema, LDAP_SCHEMA_OBJECT_CLASS);
print_schema(schema, LDAP_SCHEMA_MATCHING_RULE);
print_schema(schema, LDAP_SCHEMA_MATCHING_RULE_USE);
print_schema(schema, LDAP_SCHEMA_SYNTAX);
print_schema(schema, LDAP_SCHEMA_DIT_CONTENT_RULE);
print_schema(schema, LDAP_SCHEMA_DIT_STRUCTURE_RULE);
rc = ldap_schema_delete(schema, LDAP_SCHEMA_ATTRIBUTE_TYPE, name[0]);
if (rc == LDAP_SUCCESS){
rc = ldap_schema_save(ld, schema, NULL);
if (rc != LDAP_SUCCESS)
printf("Could not remove an existing attribute: %s(%d)",
ldap_err2string(rc), rc);
}
m_oid.fieldName = LDAP_SCHEMA_OID;
m_oid.values = oid;
mod[0] = &m_oid;
m_name.fieldName = LDAP_SCHEMA_NAMES;
m_name.values = name;
mod[1] = &m_name;
m_desc.fieldName = LDAP_SCHEMA_DESCRIPTION;
m_desc.values = desc;
mod[2] = &m_desc;
m_syntax.fieldName = LDAP_SCHEMA_SYNTAX_OID;
m_syntax.values = syntax;
mod[3] = &m_syntax;
m_x.fieldName = x_field;
m_x.values = x_values;
mod[4] = &m_x;
mod[5] = NULL;
rc = ldap_schema_add(schema, LDAP_SCHEMA_ATTRIBUTE_TYPE, mod);
if (rc != LDAP_SUCCESS) {
printf("Error in function ldap_schema_add: %s(%d)",
ldap_err2string(rc), rc);
}
rc = ldap_schema_save(ld, schema, NULL);
if (rc != LDAP_SUCCESS) {
printf("Error in function ldap_schema_save: %s(%d)",
ldap_err2string(rc), rc);
}
ldap_schema_free(schema);
ldap_unbind(ld);
return 1;
}
void print_schema(LDAPSchema *schema, int type)
{
int index,
field,
value,
count,
rc;
LDAPSchemaElement *element;
char** names;
char** values;
count = ldap_schema_get_count(schema, type);
for (index=0; index < count; index++)
{
rc = ldap_schema_get_by_index(
schema, index, type, &element);
if (rc != LDAP_SUCCESS ) {
printf("Error in function ldap_schema_get_by_index: %s(%d)",
ldap_err2string(rc), rc);
break;
}
rc = ldap_schema_get_field_names( element, &names );
if (rc != LDAP_SUCCESS ) {
printf("Error in function ldap_schema_get_by_index: %s(%d)",
ldap_err2string(rc), rc);
break;
}
for (field = 0; names[field] != NULL; field++)
{
printf("%s\n", names[field]);
rc = ldap_schema_get_field_values(
element, names[field], &values );
if (rc != LDAP_SUCCESS ) {
printf("Error in function ldap_schema_get_by_index: %s(%d)",
ldap_err2string(rc), rc);
break;
}
if (values[0] != NULL)
printf("\t%s", values[0]);
for(value = 1; values[value] != NULL; value++)
printf(", %s", values[value]);
printf("\n");
ldap_value_free ( values );
}
ldap_value_free( names );
}
}