aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2012-10-21 00:49:05 -0400
committerGreg Hudson <ghudson@mit.edu>2012-12-19 12:45:11 -0500
commit26245eed626245255c980efdfe69ca1f65186338 (patch)
tree101ed996617e3a8e890759b3a8edaeb24ad5afd6
parentdbbc38c38150d76ebd6ff0b9d971ff48de3fbe38 (diff)
downloadkrb5-26245eed626245255c980efdfe69ca1f65186338.zip
krb5-26245eed626245255c980efdfe69ca1f65186338.tar.gz
krb5-26245eed626245255c980efdfe69ca1f65186338.tar.bz2
Add functions to save and restore error state
-rw-r--r--src/include/k5-err.h1
-rw-r--r--src/lib/krb5/krb/int-proto.h8
-rw-r--r--src/lib/krb5/krb/kerrs.c29
3 files changed, 38 insertions, 0 deletions
diff --git a/src/include/k5-err.h b/src/include/k5-err.h
index d6d4bbf..083dee4 100644
--- a/src/include/k5-err.h
+++ b/src/include/k5-err.h
@@ -46,6 +46,7 @@ struct errinfo {
long code;
char *msg;
};
+#define EMPTY_ERRINFO { 0, NULL }
void k5_set_error(struct errinfo *ep, long code, const char *fmt, ...)
#if !defined(__cplusplus) && (__GNUC__ > 2)
diff --git a/src/lib/krb5/krb/int-proto.h b/src/lib/krb5/krb/int-proto.h
index 6f3de8f..a452915 100644
--- a/src/lib/krb5/krb/int-proto.h
+++ b/src/lib/krb5/krb/int-proto.h
@@ -234,4 +234,12 @@ const char *
k5_response_items_get_answer(const k5_response_items *ri,
const char *question);
+/* Save code and its extended message (if any) in out. */
+void
+k5_save_ctx_error(krb5_context ctx, krb5_error_code code, struct errinfo *out);
+
+/* Return the code from in and restore its extended message (if any). */
+krb5_error_code
+k5_restore_ctx_error(krb5_context ctx, struct errinfo *in);
+
#endif /* KRB5_INT_FUNC_PROTO__ */
diff --git a/src/lib/krb5/krb/kerrs.c b/src/lib/krb5/krb/kerrs.c
index 416cb77..99db926 100644
--- a/src/lib/krb5/krb/kerrs.c
+++ b/src/lib/krb5/krb/kerrs.c
@@ -26,6 +26,7 @@
#include <stdarg.h>
#include "k5-int.h"
+#include "int-proto.h"
#ifdef DEBUG
static int error_message_debug = 0;
@@ -151,3 +152,31 @@ krb5_clear_error_message(krb5_context ctx)
return;
k5_clear_error(&ctx->err);
}
+
+void
+k5_save_ctx_error(krb5_context ctx, krb5_error_code code, struct errinfo *out)
+{
+ out->code = code;
+ out->msg = NULL;
+ if (ctx != NULL && ctx->err.code == code) {
+ out->msg = ctx->err.msg;
+ ctx->err.code = 0;
+ ctx->err.msg = NULL;
+ }
+}
+
+krb5_error_code
+k5_restore_ctx_error(krb5_context ctx, struct errinfo *in)
+{
+ krb5_error_code code = in->code;
+
+ if (ctx != NULL) {
+ k5_clear_error(&ctx->err);
+ ctx->err.code = in->code;
+ ctx->err.msg = in->msg;
+ in->msg = NULL;
+ } else {
+ k5_clear_error(in);
+ }
+ return code;
+}