+ better error handling
This commit is contained in:
parent
c7a73723dc
commit
e496a72c7b
42
c/ldap.c
42
c/ldap.c
|
@ -44,7 +44,10 @@ s48_value scsh_ldap_init(s48_value host, s48_value port)
|
|||
S48_GC_PROTECT_2(host, port);
|
||||
ldap = ldap_init(s48_extract_string(host), s48_extract_integer(port));
|
||||
S48_GC_UNPROTECT();
|
||||
return ldap == NULL ? S48_FALSE : scsh_enter_ldap(ldap);
|
||||
if (ldap == NULL)
|
||||
s48_raise_os_error(error());
|
||||
else
|
||||
scsh_enter_ldap(ldap);
|
||||
}
|
||||
|
||||
s48_value scsh_ldap_simple_bind_s(s48_value ldap, s48_value user, s48_value cred)
|
||||
|
@ -122,14 +125,15 @@ s48_value scsh_ldap_search_s(s48_value ldap, s48_value base,
|
|||
|
||||
a = ffit_extract_list_of_strings(attrs);
|
||||
r = ldap_search_s(scsh_extract_ldap(ldap),
|
||||
s48_extract_string(base),
|
||||
S48_FALSE_P(base) ? NULL : s48_extract_string(base),
|
||||
s48_extract_integer(scope),
|
||||
s48_extract_string(filter),
|
||||
a,
|
||||
S48_TRUE_P(attrsonly),
|
||||
msg);
|
||||
free(a);
|
||||
res = s48_list_2(s48_enter_integer(r), scsh_enter_ldapmessage(*msg));
|
||||
res = s48_list_2(s48_enter_integer(r),
|
||||
r == LDAP_SUCCESS ? scsh_enter_ldapmessage(*msg) : S48_FALSE);
|
||||
S48_GC_UNPROTECT();
|
||||
return res;
|
||||
}
|
||||
|
@ -158,7 +162,8 @@ s48_value scsh_ldap_search_st(s48_value ldap, s48_value base,
|
|||
s48_extract_integer(scope), s48_extract_string(filter),
|
||||
a, S48_TRUE_P(attrsonly), &timeout, msg);
|
||||
free(a);
|
||||
res = s48_list_2(s48_enter_integer(r), scsh_enter_ldapmessage(*msg));
|
||||
res = s48_list_2(s48_enter_integer(r),
|
||||
r == LDAP_SUCCESS ? scsh_enter_ldapmessage(*msg) : S48_FALSE);
|
||||
S48_GC_UNPROTECT();
|
||||
return res;
|
||||
}
|
||||
|
@ -463,22 +468,25 @@ s48_value scsh_ldap_abandon(s48_value ldap, s48_value msgid)
|
|||
s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
|
||||
s48_value set, s48_value inval)
|
||||
{
|
||||
int opt, r;
|
||||
int opt, rc;
|
||||
LDAP *ld;
|
||||
void *outvalue;
|
||||
s48_value res = S48_UNSPECIFIC;
|
||||
s48_value res, res_list;
|
||||
S48_DECLARE_GC_PROTECT(6);
|
||||
|
||||
S48_GC_PROTECT(ldap, option, set, inval, res, res_list);
|
||||
FFIT_CHECK_RECORD_TYPE(ldap, scsh_ldap_record_type);
|
||||
FFIT_CHECK_BOOLEAN(set);
|
||||
ld = scsh_extract_ldap(ldap);
|
||||
|
||||
res = S48_UNSPECIFIC;
|
||||
switch (opt) {
|
||||
case LDAP_OPT_API_INFO:
|
||||
{
|
||||
if (S48_TRUE_P(set))
|
||||
raise_ldap_read_only_option();
|
||||
r = ldap_get_option(ld, opt, outvalue);
|
||||
if (r == LDAP_SUCCESS)
|
||||
rc = ldap_get_option(ld, opt, outvalue);
|
||||
if (rc == LDAP_OPT_SUCCESS)
|
||||
res = scsh_enter_ldapiinfo((LDAPAPIInfo *) outvalue);
|
||||
break;
|
||||
}
|
||||
|
@ -492,10 +500,10 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
|
|||
if (S48_TRUE_P(set)) {
|
||||
FFIT_CHECK_INTEGER(inval);
|
||||
l = s48_extract_integer(inval);
|
||||
r = ldap_set_option(ld, opt, &l);
|
||||
rc = ldap_set_option(ld, opt, &l);
|
||||
}
|
||||
else
|
||||
if ((r = ldap_get_option(ld, opt, outvalue)) == LDAP_SUCCESS)
|
||||
if ((rc = ldap_get_option(ld, opt, outvalue)) == LDAP_SUCCESS)
|
||||
res = s48_enter_integer(*((int*)outvalue));
|
||||
break;
|
||||
}
|
||||
|
@ -504,10 +512,10 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
|
|||
{
|
||||
if (S48_TRUE_P(set)) {
|
||||
FFIT_CHECK_BOOLEAN(inval);
|
||||
r = ldap_set_option(ld, opt, S48_TRUE_P(inval) ? LDAP_OPT_ON : LDAP_OPT_OFF);
|
||||
rc = ldap_set_option(ld, opt, S48_TRUE_P(inval) ? LDAP_OPT_ON : LDAP_OPT_OFF);
|
||||
}
|
||||
else
|
||||
if ((r = ldap_get_option(ld, opt, outvalue)) == LDAP_SUCCESS)
|
||||
if ((rc = ldap_get_option(ld, opt, outvalue)) == LDAP_SUCCESS)
|
||||
res = outvalue == 0 ? S48_TRUE : S48_FALSE;
|
||||
break;
|
||||
}
|
||||
|
@ -517,10 +525,10 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
|
|||
if (S48_TRUE_P(set)) {
|
||||
FFIT_CHECK_INTEGER(inval);
|
||||
v = s48_extract_integer(inval);
|
||||
r = ldap_set_option(ld, opt, &v);
|
||||
rc = ldap_set_option(ld, opt, &v);
|
||||
}
|
||||
else
|
||||
if ((r = ldap_get_option(ld, opt, outvalue)) == LDAP_SUCCESS)
|
||||
if ((rc = ldap_get_option(ld, opt, outvalue)) == LDAP_SUCCESS)
|
||||
res = s48_enter_integer(*(int *)outvalue);
|
||||
break;
|
||||
}
|
||||
|
@ -530,6 +538,12 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
|
|||
raise_ldap_read_only_option();
|
||||
}
|
||||
}
|
||||
|
||||
res_list =
|
||||
s48_list_2(rc == LDAP_OPT_SUCCESS ? S48_TRUE : S48_FALSE,
|
||||
rc == LDAP_OPT_SUCCESS ? res : S48_UNSPECIFIC);
|
||||
S48_GC_UNPROTECT();
|
||||
return res_list;
|
||||
}
|
||||
|
||||
/* ************************************************************************ */
|
||||
|
|
|
@ -102,4 +102,3 @@ s48_value scsh_ldap_abandon(s48_value, s48_value);
|
|||
s48_value scsh_ldap_get_set_option(s48_value, s48_value, s48_value, s48_value);
|
||||
s48_value scsh_ldapmod_create(s48_value, s48_value, s48_value);
|
||||
void scsh_init_ldap_bindings(void);
|
||||
|
||||
|
|
Loading…
Reference in New Issue