From e496a72c7b3d25bec4e5d00bd6db166a302bc097 Mon Sep 17 00:00:00 2001 From: eknauel Date: Thu, 8 Jan 2004 07:48:00 +0000 Subject: [PATCH] + better error handling --- c/ldap.c | 42 ++++++++++++++++++++++++++++-------------- c/scsh-ldap.h | 1 - 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/c/ldap.c b/c/ldap.c index 78e0c24..24f3c24 100644 --- a/c/ldap.c +++ b/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; } /* ************************************************************************ */ diff --git a/c/scsh-ldap.h b/c/scsh-ldap.h index 5ee1177..41e8efe 100644 --- a/c/scsh-ldap.h +++ b/c/scsh-ldap.h @@ -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); -