+ better error handling

This commit is contained in:
eknauel 2004-01-08 07:48:00 +00:00
parent c7a73723dc
commit e496a72c7b
2 changed files with 28 additions and 15 deletions

View File

@ -44,7 +44,10 @@ s48_value scsh_ldap_init(s48_value host, s48_value port)
S48_GC_PROTECT_2(host, port); S48_GC_PROTECT_2(host, port);
ldap = ldap_init(s48_extract_string(host), s48_extract_integer(port)); ldap = ldap_init(s48_extract_string(host), s48_extract_integer(port));
S48_GC_UNPROTECT(); 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) 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); a = ffit_extract_list_of_strings(attrs);
r = ldap_search_s(scsh_extract_ldap(ldap), 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_integer(scope),
s48_extract_string(filter), s48_extract_string(filter),
a, a,
S48_TRUE_P(attrsonly), S48_TRUE_P(attrsonly),
msg); msg);
free(a); 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(); S48_GC_UNPROTECT();
return res; 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), s48_extract_integer(scope), s48_extract_string(filter),
a, S48_TRUE_P(attrsonly), &timeout, msg); a, S48_TRUE_P(attrsonly), &timeout, msg);
free(a); 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(); S48_GC_UNPROTECT();
return res; 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 scsh_ldap_get_set_option(s48_value ldap, s48_value option,
s48_value set, s48_value inval) s48_value set, s48_value inval)
{ {
int opt, r; int opt, rc;
LDAP *ld; LDAP *ld;
void *outvalue; 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_RECORD_TYPE(ldap, scsh_ldap_record_type);
FFIT_CHECK_BOOLEAN(set); FFIT_CHECK_BOOLEAN(set);
ld = scsh_extract_ldap(ldap); ld = scsh_extract_ldap(ldap);
res = S48_UNSPECIFIC;
switch (opt) { switch (opt) {
case LDAP_OPT_API_INFO: case LDAP_OPT_API_INFO:
{ {
if (S48_TRUE_P(set)) if (S48_TRUE_P(set))
raise_ldap_read_only_option(); raise_ldap_read_only_option();
r = ldap_get_option(ld, opt, outvalue); rc = ldap_get_option(ld, opt, outvalue);
if (r == LDAP_SUCCESS) if (rc == LDAP_OPT_SUCCESS)
res = scsh_enter_ldapiinfo((LDAPAPIInfo *) outvalue); res = scsh_enter_ldapiinfo((LDAPAPIInfo *) outvalue);
break; break;
} }
@ -492,10 +500,10 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
if (S48_TRUE_P(set)) { if (S48_TRUE_P(set)) {
FFIT_CHECK_INTEGER(inval); FFIT_CHECK_INTEGER(inval);
l = s48_extract_integer(inval); l = s48_extract_integer(inval);
r = ldap_set_option(ld, opt, &l); rc = ldap_set_option(ld, opt, &l);
} }
else 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)); res = s48_enter_integer(*((int*)outvalue));
break; break;
} }
@ -504,10 +512,10 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
{ {
if (S48_TRUE_P(set)) { if (S48_TRUE_P(set)) {
FFIT_CHECK_BOOLEAN(inval); 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 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; res = outvalue == 0 ? S48_TRUE : S48_FALSE;
break; break;
} }
@ -517,10 +525,10 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
if (S48_TRUE_P(set)) { if (S48_TRUE_P(set)) {
FFIT_CHECK_INTEGER(inval); FFIT_CHECK_INTEGER(inval);
v = s48_extract_integer(inval); v = s48_extract_integer(inval);
r = ldap_set_option(ld, opt, &v); rc = ldap_set_option(ld, opt, &v);
} }
else 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); res = s48_enter_integer(*(int *)outvalue);
break; break;
} }
@ -530,6 +538,12 @@ s48_value scsh_ldap_get_set_option(s48_value ldap, s48_value option,
raise_ldap_read_only_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;
} }
/* ************************************************************************ */ /* ************************************************************************ */

View File

@ -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_ldap_get_set_option(s48_value, s48_value, s48_value, s48_value);
s48_value scsh_ldapmod_create(s48_value, s48_value, s48_value); s48_value scsh_ldapmod_create(s48_value, s48_value, s48_value);
void scsh_init_ldap_bindings(void); void scsh_init_ldap_bindings(void);