summaryrefslogtreecommitdiffstats
path: root/src/kim/lib/kim_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kim/lib/kim_error.c')
-rw-r--r--src/kim/lib/kim_error.c124
1 files changed, 79 insertions, 45 deletions
diff --git a/src/kim/lib/kim_error.c b/src/kim/lib/kim_error.c
index 6698139d2..890f044c1 100644
--- a/src/kim/lib/kim_error.c
+++ b/src/kim/lib/kim_error.c
@@ -40,11 +40,26 @@ struct kim_error_opaque kim_error_initializer = { KIM_NO_ERROR_ECODE, NULL };
/* ------------------------------------------------------------------------ */
-static inline kim_error kim_error_allocate (kim_error *out_error)
+static inline kim_error kim_error_allocate (kim_error *out_error,
+ kim_error_code in_code)
{
kim_error err = KIM_NO_ERROR;
kim_error error = NULL;
+ /* short circuit out of memory errors so we don't loop */
+ switch (in_code) {
+ case 0:
+ return KIM_NO_ERROR;
+
+ case KIM_OUT_OF_MEMORY_ECODE:
+ case ENOMEM:
+ case KRB5_CC_NOMEM:
+ case ccErrNoMem:
+ // case klMemFullErr:
+ // case memFullErr:
+ return kim_no_memory_error;
+ }
+
if (!err) {
error = malloc (sizeof (*error));
if (!error) {
@@ -55,6 +70,8 @@ static inline kim_error kim_error_allocate (kim_error *out_error)
}
if (!err) {
+ error->code = in_code;
+
*out_error = error;
error = NULL;
}
@@ -64,16 +81,24 @@ static inline kim_error kim_error_allocate (kim_error *out_error)
return check_error (err);
}
+/* ------------------------------------------------------------------------ */
+
+static kim_boolean kim_error_is_builtin (kim_error in_error)
+{
+ return (in_error == KIM_NO_ERROR ||
+ in_error == kim_no_memory_error);
+}
+
#pragma mark -- Helper Functions --
-/* These helper functions exist so we get type checking on the most common errors */
+/* These helper functions exist so we get type checking on common errors */
/* ------------------------------------------------------------------------ */
kim_error _kim_error_create_for_param (kim_string in_function,
- unsigned int in_argument_position,
- kim_string in_argument_name,
- kim_string in_invalid_value)
+ unsigned int in_argument_position,
+ kim_string in_argument_name,
+ kim_string in_invalid_value)
{
return kim_error_create_from_code (KIM_PARAMETER_ECODE,
in_function,
@@ -87,7 +112,7 @@ kim_error _kim_error_create_for_param (kim_string in_function,
/* ------------------------------------------------------------------------ */
kim_error kim_error_create_from_code (kim_error_code in_code,
- ...)
+ ...)
{
kim_error err = KIM_NO_ERROR;
va_list args;
@@ -102,54 +127,66 @@ kim_error kim_error_create_from_code (kim_error_code in_code,
/* ------------------------------------------------------------------------ */
kim_error kim_error_create_from_code_va (kim_error_code in_code,
- va_list in_args)
+ va_list in_args)
{
kim_error err = KIM_NO_ERROR;
kim_error error = KIM_NO_ERROR;
- kim_string message = NULL;
- /* short circuit out of memory errors so we don't loop */
- switch (in_code) {
- case 0:
- return KIM_NO_ERROR;
-
- case KIM_OUT_OF_MEMORY_ECODE:
- case ENOMEM:
- case KRB5_CC_NOMEM:
- case ccErrNoMem:
-// case klMemFullErr:
-// case memFullErr:
- err = kim_no_memory_error;
- break;
+ if (!err) {
+ err = kim_error_allocate (&error, in_code);
+ }
+
+ if (!err && !kim_error_is_builtin (error)) {
+ err = kim_string_create_from_format_va_retcode (&error->message,
+ error_message (in_code),
+ in_args);
}
if (!err) {
- err = kim_string_create_from_format_va_retcode (&message, error_message (in_code), in_args);
+ err = error;
+ error = NULL; /* take ownership */
}
+ kim_error_free (&error);
+
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+kim_error kim_error_create_from_krb5_error (krb5_context in_context,
+ krb5_error_code in_code)
+{
+ kim_error err = KIM_NO_ERROR;
+ kim_error error = KIM_NO_ERROR;
+
if (!err) {
- err = kim_error_allocate (&error);
+ err = kim_error_allocate (&error, in_code);
+ }
+
+ if (!err && !kim_error_is_builtin (error)) {
+ const char *message = krb5_get_error_message (in_context, in_code);
+
+ err = kim_string_copy (&error->message, message);
+
+ if (message) { krb5_free_error_message (in_context, message); }
}
if (!err) {
- error->code = in_code;
- error->message = message;
- message = NULL; /* take ownership */
-
err = error;
error = NULL; /* take ownership */
}
kim_error_free (&error);
- kim_string_free (&message);
return err;
}
-
+
/* ------------------------------------------------------------------------ */
kim_error kim_error_copy (kim_error *out_error,
- kim_error in_error)
+ kim_error in_error)
{
kim_error err = KIM_NO_ERROR;
kim_error error = KIM_NO_ERROR;
@@ -158,18 +195,15 @@ kim_error kim_error_copy (kim_error *out_error,
if (!err && !in_error ) { err = param_error (2, "in_error", "NULL"); }
if (!err) {
- if (in_error == kim_no_memory_error) {
- error = kim_no_memory_error;
+ if (kim_error_is_builtin (in_error)) {
+ error = in_error;
} else {
- err = kim_error_allocate (&error);
+ err = kim_error_allocate (&error, in_error->code);
- if (!err) {
- error->code = in_error->code;
- if (in_error->message) {
- err = kim_string_copy (&error->message, in_error->message);
- }
- }
+ if (!err && in_error->message) {
+ err = kim_string_copy (&error->message, in_error->message);
+ }
}
}
@@ -205,7 +239,7 @@ kim_string kim_error_get_display_string (kim_error in_error)
return in_error->message;
} else {
- /* Note that kim_no_memory_error will get here because its string is NULL */
+ /* Note: kim_no_memory_error will get here because its string is NULL */
return error_message (in_error->code);
}
}
@@ -215,9 +249,9 @@ kim_string kim_error_get_display_string (kim_error in_error)
void kim_error_free (kim_error *io_error)
{
if (io_error && *io_error) {
- if (*io_error != kim_no_memory_error) {
+ if (kim_error_is_builtin (*io_error)) {
kim_string_free (&(*io_error)->message);
- free (*io_error);
+ free (*io_error);
*io_error = KIM_NO_ERROR;
}
}
@@ -228,9 +262,9 @@ void kim_error_free (kim_error *io_error)
/* ------------------------------------------------------------------------ */
kim_error _check_error (kim_error in_err,
- kim_string in_function,
- kim_string in_file,
- int in_line)
+ kim_string in_function,
+ kim_string in_file,
+ int in_line)
{
if (in_err) {
kim_error_code code = kim_error_get_code (in_err);