From: Greg Hudson Date: Sun, 21 Oct 2012 04:49:05 +0000 (-0400) Subject: Add functions to save and restore error state X-Git-Tag: krb5-1.12-alpha1~401 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=26245eed626245255c980efdfe69ca1f65186338;p=thirdparty%2Fkrb5.git Add functions to save and restore error state --- diff --git a/src/include/k5-err.h b/src/include/k5-err.h index d6d4bbff5f..083dee4a29 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 6f3de8f345..a452915517 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 416cb77187..99db926747 100644 --- a/src/lib/krb5/krb/kerrs.c +++ b/src/lib/krb5/krb/kerrs.c @@ -26,6 +26,7 @@ #include #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; +}