diff --git a/c/ldap.c b/c/ldap.c index 22fd391..dc4b131 100644 --- a/c/ldap.c +++ b/c/ldap.c @@ -9,6 +9,8 @@ FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapmessage, scsh_ldapmessage_record_type, FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapmod, scsh_ldapmod_record_type, LDAPMod*); +/* LDAPAPIInfo */ + FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapiinfo, scsh_ldapapiinfo_record_type, LDAPAPIInfo*); @@ -36,6 +38,58 @@ FFIT_STRUCT_GET(scsh_ldapapiinfo_get_extensions, scsh_ldapapiinfo_record_type, LDAPAPIInfo*, ldapai_extensions, ffit_enter_string_array); +/* LDAPControl */ + +FFIT_MAKE_ENTER_RECORD(scsh_enter_ldapcontrol, scsh_ldapcontrol_record_type, + LDAPControl*); + +FFIT_STRUCT_GET_STRING(scsh_ldapcontrol_get_objectid, + scsh_ldapcontrol_record_type, LDAPControl*, + ldctl_oid); + +FFIT_STRUCT_SET_STRING(scsh_ldapcontrol_set_objectid, + scsh_ldapcontrol_record_type, LDAPControl*, + ldctl_oid); + +s48_value scsh_ldapcontrol_get_value(s48_value control) +{ + LDAPControl* ctrl; + s48_value bytes; + S48_DECLARE_GC_PROTECT(2); + + S48_GC_PROTECT_2(control, bytes); + ctrl = scsh_extract_ldapcontrol(control); + bytes = scsh_enter_BerValue_as_bytevector(&(ctrl->ldctl_value)); + S48_GC_UNPROTECT(); + return bytes; +} + +s48_value scsh_ldapcontrol_set_value(s48_value control, s48_value value) +{ + BerValue* bv; + LDAPControl* ctrl; + S48_DECLARE_GC_PROTECT(2); + + S48_GC_PROTECT_2(control, value); + ctrl = scsh_extract_ldapcontrol(control); + bv = scsh_extract_bytevector_as_BerValue(value); + (ctrl->ldctl_value).bv_len = bv->bv_len; + (ctrl->ldctl_value).bv_val = bv->bv_val; + free(bv); + S48_GC_UNPROTECT(); + return S48_UNSPECIFIC; +} + +FFIT_STRUCT_GET_CHAR(scsh_ldapcontrol_get_iscritical, + scsh_ldapcontrol_record_type, LDAPControl*, + ldctl_iscritical); + +FFIT_STRUCT_SET_CHAR(scsh_ldapcontrol_set_iscritical, + scsh_ldapcontrol_record_type, LDAPControl*, + ldctl_iscritical); + +/* BerElement */ + FFIT_MAKE_ENTER_RECORD(scsh_enter_berelement, scsh_berelement_record_type, BerElement *); @@ -74,6 +128,16 @@ s48_value scsh_ldap_sasl_bind_s(s48_value ldap, s48_value dn, s48_value client_controls, s48_value server_cred_p) { + LDAP *l; + BerValue *bv; + int ret; + S48_DECLARE_GC_PROTECT(8); + + bv = scsh_extract_bytevector_as_BerValue(cred); + + l = scsh_extract_ldap(ldap); + + /* need to implement bindings for berval stuff first */ return S48_FALSE; } @@ -619,13 +683,13 @@ LDAPMod** scsh_extract_ldapmod_list(s48_value list) S48_DECLARE_GC_PROTECT(2); S48_GC_PROTECT_2(list, e); - l = length_scheme_list(list); + l = s48_length(list); if ((a = (LDAPMod **) calloc(l + 1, sizeof(LDAPMod *))) == NULL) s48_raise_out_of_memory_error(); a[l] = NULL; - for (e = list, i = 0; e != NULL; e = S48_CDR(e), i++) + for (e = list, i = 0; e != S48_NULL; e = S48_CDR(e), i++) a[i] = scsh_create_ldapmod(S48_CAR(e)); S48_GC_UNPROTECT(); @@ -642,6 +706,37 @@ void scsh_free_ldapmod_array(LDAPMod **a) free(a); } +s48_value scsh_enter_BerValue_as_bytevector(BerValue* bv) +{ + int i; + s48_value res = S48_FALSE; + S48_DECLARE_GC_PROTECT(1); + + S48_GC_PROTECT_1(res); + + res = s48_make_byte_vector(bv->bv_len, 0); + for (i = 0; i < bv->bv_len; i++) + S48_BYTE_VECTOR_SET(res, i, bv->bv_val[i]); + + S48_GC_UNPROTECT(); + return res; +} + +BerValue* scsh_extract_bytevector_as_BerValue(s48_value bytevector) +{ + BerValue* bv; + S48_DECLARE_GC_PROTECT(1); + + S48_GC_PROTECT_1(bytevector); + if ((bv = (BerValue*) malloc(sizeof(BerValue))) == NULL) + s48_raise_out_of_memory_error(); + + bv->bv_val = s48_extract_byte_vector(bytevector); + bv->bv_len = S48_BYTE_VECTOR_LENGTH(bytevector); + S48_GC_UNPROTECT(); + return bv; +} + void raise_ldap_memory_alloc_error(void) { s48_raise_scheme_exception(condition_ldap_memory_alloc_error, 0); diff --git a/c/scsh-ldap.h b/c/scsh-ldap.h index 101410f..01cb8f1 100644 --- a/c/scsh-ldap.h +++ b/c/scsh-ldap.h @@ -25,6 +25,7 @@ static s48_value scsh_ldapmessage_record_type = S48_FALSE; static s48_value scsh_ldapmod_record_type = S48_FALSE; static s48_value scsh_ldapapiinfo_record_type = S48_FALSE; static s48_value scsh_berelement_record_type = S48_FALSE; +static s48_value scsh_ldapcontrol_record_type = S48_FALSE; FFIT_MAKE_ENTER_RECORD_PROTOTYPE(scsh_enter_ldap, LDAP*); #define scsh_extract_ldap(x) \ @@ -55,6 +56,11 @@ FFIT_MAKE_ENTER_RECORD_PROTOTYPE(scsh_enter_berelement, BerElement*); ((BerElement *) \ s48_extract_integer(S48_RECORD_REF(x, 0))) +FFIT_MAKE_ENTER_RECORD_PROTOTYPE(scsh_enter_ldapcontrol_record_type, LDAPControl*); +#define scsh_extract_ldapcontrol(x) \ + ((LDAPControl *) \ + s48_extract_integer(S48_RECORD_REF(x, 0))) + /* conditions */ static s48_value condition_ldap_memory_alloc_error = S48_FALSE; static s48_value condition_ldap_feature_not_supported = S48_FALSE; @@ -115,4 +121,6 @@ s48_value scsh_ldap_get_set_option(s48_value, s48_value, s48_value, s48_value); LDAPMod* scsh_create_ldapmod(s48_value ldapmod); LDAPMod** scsh_extract_ldapmod_list(s48_value); void scsh_free_ldapmod_array(LDAPMod **); +s48_value scsh_enter_BerValue_as_bytevector(BerValue* bv); +BerValue* scsh_extract_bytevector_as_BerValue(s48_value bytevector); void scsh_init_ldap_bindings(void);