/*
* call-seq:
* conn.modify_ext(dn, mods, sctrls, cctrls) => self
*
* Modify an entry with the DN, +dn+, and the attributes, +mods+. +mods+
* should be either an array of LDAP#Mod objects or a hash of attribute/value
* array pairs. +sctrls+ is an array of server controls, whilst +cctrls+ is
* an array of client controls.
*/
VALUE
rb_ldap_conn_modify_ext_s (VALUE self, VALUE dn, VALUE attrs,
VALUE serverctrls, VALUE clientctrls)
{
RB_LDAP_DATA *ldapdata;
char *c_dn;
LDAPMod **c_attrs;
int i;
LDAPControl **sctrls, **cctrls;
switch (TYPE (attrs))
{
case T_HASH:
attrs =
rb_ldap_hash2mods (rb_mLDAP,
INT2NUM (LDAP_MOD_REPLACE | LDAP_MOD_BVALUES),
attrs);
break;
case T_ARRAY:
break;
default:
rb_raise (rb_eTypeError, "must be a hash or an array");
};
GET_LDAP_DATA (self, ldapdata);
c_dn = StringValueCStr (dn);
c_attrs = ALLOC_N (LDAPMod *, RARRAY (attrs)->len + 1);
sctrls = rb_ldap_get_controls (serverctrls);
cctrls = rb_ldap_get_controls (clientctrls);
for (i = 0; i < RARRAY (attrs)->len; i++)
{
VALUE mod = RARRAY (attrs)->ptr[i];
RB_LDAPMOD_DATA *moddata;
Check_Kind (mod, rb_cLDAP_Mod);
GET_LDAPMOD_DATA (mod, moddata);
c_attrs[i] = moddata->mod;
};
c_attrs[i] = NULL;
ldapdata->err =
ldap_modify_ext_s (ldapdata->ldap, c_dn, c_attrs, sctrls, cctrls);
Check_LDAP_Result (ldapdata->err);
return self;
}