1 /*
2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * lib/krb5/krb/kerrs.c
6  *
7  * Copyright 2006 Massachusetts Institute of Technology.
8  * All Rights Reserved.
9  *
10  * Export of this software from the United States of America may
11  *   require a specific license from the United States Government.
12  *   It is the responsibility of any person or organization contemplating
13  *   export to obtain such a license before exporting.
14  *
15  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
16  * distribute this software and its documentation for any purpose and
17  * without fee is hereby granted, provided that the above copyright
18  * notice appear in all copies and that both that copyright notice and
19  * this permission notice appear in supporting documentation, and that
20  * the name of M.I.T. not be used in advertising or publicity pertaining
21  * to distribution of the software without specific, written prior
22  * permission.  Furthermore if you modify this software you must label
23  * your software as modified software and not distribute it in such a
24  * fashion that it might be confused with the original M.I.T. software.
25  * M.I.T. makes no representations about the suitability of
26  * this software for any purpose.  It is provided "as is" without express
27  * or implied warranty.
28  *
29  * error-message functions
30  */
31 #include        <sys/param.h>
32 #include        <unistd.h>
33 #include        <assert.h>
34 #include        <stdio.h>
35 #include        <stdlib.h>
36 #include        <string.h>
37 #include        <k5-int.h>
38 #include        <krb5.h>
39 #include        <mglueP.h>
40 #include        "gssapiP_spnego.h"
41 #include        "gssapiP_generic.h"
42 #include        <gssapi_err_generic.h>
43 
44 #ifdef DEBUG
45 static int error_message_debug = 0;
46 #ifndef ERROR_MESSAGE_DEBUG
47 #define ERROR_MESSAGE_DEBUG() (error_message_debug != 0)
48 #endif
49 #endif
50 
51 void
spnego_set_error_message(spnego_gss_ctx_id_t ctx,spnego_error_code code,const char * fmt,...)52 spnego_set_error_message (spnego_gss_ctx_id_t ctx, spnego_error_code code,
53 			const char *fmt, ...)
54 {
55     va_list args;
56     if (ctx == NULL)
57 	return;
58     va_start (args, fmt);
59 #ifdef DEBUG
60     if (ERROR_MESSAGE_DEBUG())
61 	fprintf(stderr,
62 		"spnego_set_error_message(ctx=%p/err=%p, code=%ld, ...)\n",
63 		ctx, &ctx->err, (long) code);
64 #endif
65     krb5int_vset_error (&ctx->err, code, fmt, args);
66 #ifdef DEBUG
67     if (ERROR_MESSAGE_DEBUG())
68 	fprintf(stderr, "->%s\n", ctx->err.msg);
69 #endif
70     va_end (args);
71 }
72 
73 void
spnego_vset_error_message(spnego_gss_ctx_id_t ctx,spnego_error_code code,const char * fmt,va_list args)74 spnego_vset_error_message (spnego_gss_ctx_id_t ctx, spnego_error_code code,
75 			 const char *fmt, va_list args)
76 {
77 #ifdef DEBUG
78     if (ERROR_MESSAGE_DEBUG())
79 	fprintf(stderr, "spnego_vset_error_message(ctx=%p, code=%ld, ...)\n",
80 		ctx, (long) code);
81 #endif
82     if (ctx == NULL)
83 	return;
84     krb5int_vset_error (&ctx->err, code, fmt, args);
85 #ifdef DEBUG
86     if (ERROR_MESSAGE_DEBUG())
87 	fprintf(stderr, "->%s\n", ctx->err.msg);
88 #endif
89 }
90 
91 const char *
spnego_get_error_message(spnego_gss_ctx_id_t ctx,spnego_error_code code)92 spnego_get_error_message (spnego_gss_ctx_id_t ctx, spnego_error_code code)
93 {
94 #ifdef DEBUG
95     if (ERROR_MESSAGE_DEBUG())
96 	fprintf(stderr, "spnego_get_error_message(%p, %ld)\n", ctx, (long) code);
97 #endif
98     if (ctx == NULL)
99 	return error_message(code);
100     return krb5int_get_error (&ctx->err, code);
101 }
102 
103 void
spnego_free_error_message(spnego_gss_ctx_id_t ctx,const char * msg)104 spnego_free_error_message (spnego_gss_ctx_id_t ctx, const char *msg)
105 {
106 #ifdef DEBUG
107     if (ERROR_MESSAGE_DEBUG())
108 	fprintf(stderr, "spnego_free_error_message(%p, %p)\n", ctx, msg);
109 #endif
110     if (ctx == NULL)
111 	return;
112     krb5int_free_error (&ctx->err, msg);
113 }
114 
115 void
spnego_clear_error_message(spnego_gss_ctx_id_t ctx)116 spnego_clear_error_message (spnego_gss_ctx_id_t ctx)
117 {
118 #ifdef DEBUG
119     if (ERROR_MESSAGE_DEBUG())
120 	fprintf(stderr, "spnego_clear_error_message(%p)\n", ctx);
121 #endif
122     if (ctx == NULL)
123 	return;
124     krb5int_clear_error (&ctx->err);
125 }
126