[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: problem with ldap_modify_s

> We are experiencing unexpected behavior using this function.
> Here is our code example:
>  	LDAPMod *array[2];
>       array[0]=new (LDAPMod )[sizeof(LDAPMod)];
>       array[0]->mod_op=LDAP_MOD_REPLACE;
>       array[0]->mod_type="SPAM";
>       array[0]->mod_vals.modv_strvals=new char*[2];
>       array[0]->mod_vals.modv_strvals[0]="EGGS&SPAM";
>       array[0]->mod_vals.modv_strvals[1]=NULL;
>       array[1]=NULL;
>       int  rc=ldap_modify_s(LDAP_HANDLE_,"cn=albatross, ou=users,
> dc=company", array);
>       if(rc != LDAP_SUCCESS)
>       {
>                 cout<<"LDAP update failed: "<<ldap_err2string(rc)<<endl; 
>       } 
> There is no entry "SPAM" under user "albatross" so we expect this operation
> to fail. Instead it adds this entry which is the effect we would expect from
> mod_op LDAP_MOD_ADD but not from LDAP_MOD_REPLACE.
> Dmitry

It is behaving correctly.  You are saying that there is no
attribute "SPAM" under the user "albatross".  If the attribute does
not exist, LDAP_MOD_REPLACE will create it.  If it already exists, it replaces
it.  Think of LDAP_MOD_REPLACE as meaning "make it look like this, regardless
what it was before".  In LDAPv3 (OpenLDAP 2.x), you can even supply an
empty empty mod_vals list, which implies a delete, which is a feature that
will save me some code (but is not supported in LDAPv2/OpenLDAP 1.2.x).