0

I write an openLDAP client using its API to add base dn.But when program run,error will occur:

ldap_add: Type or value exists (20)
additional info: attribute 'objectClass' provided more than once

My code is below:

#include <stdio.h>
#include "ldap.h"

#define SERVERIP 172.0.1.4
#define ROOTDN "cn=root,dc=jc,dc=com"
#define ROOTPW "secret"

int main()
{
    int protocol_version = LDAP_VERSION3;
    int ret;
    LDAP *ld;

    if((ld = ldap_init(SERVERIP,LDAP_PORT) == NULL)
    {
            perror("ldap_init failed\n");
            return 1;
    }
    ret = ldap_set_option(ld,LDAP_OPT_PROTOCOL_VERSION,&protocol_version);
    if(ret != LDAP_SUCCESS)
    {
            fprintf(stderr,"ldap_select_version:%s\n",ldap_err2string(ret));
            return 1;
    }
    ret = ldap_simple_bind_s(ld,ROOTDN,ROOTPW);
    if(ret != LDAP_SUCCESS)
    {
            fprintf(stderr,"ldap_simple_bind_s:%s\n",ldap_err2string(ret));
            return 1;
    }
    printf("add base dn\n");
    char baseDN[] = "dc=jc,dc=com";
    char *objVals1[] = {"organization",NULL};
    char *objVals2[] = {"dcObject",NULL};
    char *dcVals[] = {"jc",NULL};
    char *oVals[] = {"jc Inc",NULL};

    LDAPMod add1 = {LDAP_MOD_ADD,"objectClass",objVals1};
    LDAPMod add2 = {LDAP_MOD_ADD,"objectClass",objVals2};
    LDAPMod add3 = {LDAP_MOD_ADD,"dc",dcVals};
    LDAPMod add4 = {LDAP_MOD_ADD,"o",oVals};
    LDAPMod *addBase[] = {&add1,&add2,&add3,&add4,NULL};
    if(ldap_add_ext_s(ld,baseDN,addBase,NULL,NULL) != LDAP_SUCCESS)
            ldap_perror(ld,"ldap_add");
    else
            printf("ldap_add success\n");
    ldap_unbind(ld);        
}

What's wrong with my code?

sideshowbarker
  • 81,827
  • 26
  • 193
  • 197
EK.CR
  • 15
  • 5

1 Answers1

0
char *objVals1[] = {"organization",NULL};
char *objVals2[] = {"dcObject",NULL};
char *dcVals[] = {"jc",NULL};
char *oVals[] = {"jc Inc",NULL};

LDAPMod add1 = {LDAP_MOD_ADD,"objectClass",objVals1};
LDAPMod add2 = {LDAP_MOD_ADD,"objectClass",objVals2};

You're adding objectClass as two separate attributes with a single value each. It is a multi-value attribute, like most in LDAP, and should be added like this:

char *objVals1[] = {"organization", "dcObject",NULL};
// ...

LDAPMod add1 = {LDAP_MOD_ADD,"objectClass",objVals1};
user207421
  • 305,947
  • 44
  • 307
  • 483