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)
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__ */
#include <stdarg.h>
#include "k5-int.h"
+#include "int-proto.h"
#ifdef DEBUG
static int error_message_debug = 0;
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;
+}