diff options
author | Greg Hudson <ghudson@mit.edu> | 2012-10-21 00:49:05 -0400 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2012-12-19 12:45:11 -0500 |
commit | 26245eed626245255c980efdfe69ca1f65186338 (patch) | |
tree | 101ed996617e3a8e890759b3a8edaeb24ad5afd6 | |
parent | dbbc38c38150d76ebd6ff0b9d971ff48de3fbe38 (diff) | |
download | krb5-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.h | 1 | ||||
-rw-r--r-- | src/lib/krb5/krb/int-proto.h | 8 | ||||
-rw-r--r-- | 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; +} |