krb5 commit: Add functions to save and restore error state

Greg Hudson ghudson at MIT.EDU
Wed Dec 19 12:55:38 EST 2012


https://github.com/krb5/krb5/commit/26245eed626245255c980efdfe69ca1f65186338
commit 26245eed626245255c980efdfe69ca1f65186338
Author: Greg Hudson <ghudson at mit.edu>
Date:   Sun Oct 21 00:49:05 2012 -0400

    Add functions to save and restore error state

 src/include/k5-err.h         |    1 +
 src/lib/krb5/krb/int-proto.h |    8 ++++++++
 src/lib/krb5/krb/kerrs.c     |   29 +++++++++++++++++++++++++++++
 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;
+}


More information about the cvs-krb5 mailing list