Line data Source code
1 : /*
2 : * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
3 : * (Royal Institute of Technology, Stockholm, Sweden).
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions
8 : * are met:
9 : *
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : *
13 : * 2. Redistributions in binary form must reproduce the above copyright
14 : * notice, this list of conditions and the following disclaimer in the
15 : * documentation and/or other materials provided with the distribution.
16 : *
17 : * 3. Neither the name of the Institute nor the names of its contributors
18 : * may be used to endorse or promote products derived from this software
19 : * without specific prior written permission.
20 : *
21 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 : * SUCH DAMAGE.
32 : */
33 :
34 : #include "hx_locl.h"
35 :
36 : /**
37 : * @page page_error Hx509 error reporting functions
38 : *
39 : * See the library functions here: @ref hx509_error
40 : */
41 :
42 : struct hx509_error_data {
43 : hx509_error next;
44 : int code;
45 : char *msg;
46 : };
47 :
48 : /**
49 : * Resets the error strings the hx509 context.
50 : *
51 : * @param context A hx509 context.
52 : *
53 : * @ingroup hx509_error
54 : */
55 :
56 : HX509_LIB_FUNCTION void HX509_LIB_CALL
57 753649 : hx509_clear_error_string(hx509_context context)
58 : {
59 753649 : if (context) {
60 753649 : heim_release(context->error);
61 753649 : context->error = NULL;
62 : }
63 753649 : }
64 :
65 : /**
66 : * Add an error message to the hx509 context.
67 : *
68 : * @param context A hx509 context.
69 : * @param flags
70 : * - HX509_ERROR_APPEND appends the error string to the old messages
71 : (code is updated).
72 : * @param code error code related to error message
73 : * @param fmt error message format
74 : * @param ap arguments to error message format
75 : *
76 : * @ingroup hx509_error
77 : */
78 :
79 : HX509_LIB_FUNCTION void HX509_LIB_CALL
80 180 : hx509_set_error_stringv(hx509_context context, int flags, int code,
81 : const char *fmt, va_list ap)
82 : {
83 8 : heim_error_t msg;
84 :
85 180 : if (context == NULL)
86 0 : return;
87 :
88 180 : msg = heim_error_createv(code, fmt, ap);
89 180 : if (msg) {
90 180 : if (flags & HX509_ERROR_APPEND)
91 0 : heim_error_append(msg, context->error);
92 180 : heim_release(context->error);
93 : }
94 180 : context->error = msg;
95 : }
96 :
97 : /**
98 : * See hx509_set_error_stringv().
99 : *
100 : * @param context A hx509 context.
101 : * @param flags
102 : * - HX509_ERROR_APPEND appends the error string to the old messages
103 : (code is updated).
104 : * @param code error code related to error message
105 : * @param fmt error message format
106 : * @param ... arguments to error message format
107 : *
108 : * @ingroup hx509_error
109 : */
110 :
111 : HX509_LIB_FUNCTION void HX509_LIB_CALL
112 180 : hx509_set_error_string(hx509_context context, int flags, int code,
113 : const char *fmt, ...)
114 : {
115 8 : va_list ap;
116 :
117 180 : va_start(ap, fmt);
118 180 : hx509_set_error_stringv(context, flags, code, fmt, ap);
119 180 : va_end(ap);
120 180 : }
121 :
122 : /**
123 : * Sets ENOMEM as the error on a hx509 context.
124 : *
125 : * @param context A hx509 context.
126 : *
127 : * @ingroup hx509_error
128 : */
129 :
130 : HX509_LIB_FUNCTION int HX509_LIB_CALL
131 0 : hx509_enomem(hx509_context context)
132 : {
133 0 : return heim_enomem(context->hcontext);
134 : }
135 :
136 : /**
137 : * Get an error string from context associated with error_code.
138 : *
139 : * @param context A hx509 context.
140 : * @param error_code Get error message for this error code.
141 : *
142 : * @return error string, free with hx509_free_error_string().
143 : *
144 : * @ingroup hx509_error
145 : */
146 :
147 : HX509_LIB_FUNCTION char * HX509_LIB_CALL
148 61 : hx509_get_error_string(hx509_context context, int error_code)
149 : {
150 61 : heim_string_t s = NULL;
151 61 : const char *cstr = NULL;
152 0 : char *str;
153 :
154 61 : if (context) {
155 102 : if (context->error &&
156 82 : heim_error_get_code(context->error) == error_code &&
157 41 : (s = heim_error_copy_string(context->error)))
158 41 : cstr = heim_string_get_utf8(s);
159 :
160 61 : if (cstr == NULL)
161 20 : cstr = com_right(context->et_list, error_code);
162 :
163 61 : if (cstr == NULL && error_code > -1)
164 0 : cstr = strerror(error_code);
165 : } /* else this could be an error in hx509_context_init() */
166 :
167 61 : if (cstr == NULL)
168 0 : cstr = error_message(error_code); /* never returns NULL */
169 :
170 61 : str = strdup(cstr);
171 61 : heim_release(s);
172 61 : return str;
173 : }
174 :
175 : /**
176 : * Free error string returned by hx509_get_error_string().
177 : *
178 : * @param str error string to free.
179 : *
180 : * @ingroup hx509_error
181 : */
182 :
183 : HX509_LIB_FUNCTION void HX509_LIB_CALL
184 0 : hx509_free_error_string(char *str)
185 : {
186 0 : free(str);
187 0 : }
188 :
189 : /**
190 : * Print error message and fatally exit from error code
191 : *
192 : * @param context A hx509 context.
193 : * @param exit_code exit() code from process.
194 : * @param error_code Error code for the reason to exit.
195 : * @param fmt format string with the exit message.
196 : * @param ... argument to format string.
197 : *
198 : * @ingroup hx509_error
199 : */
200 :
201 : HX509_LIB_NORETURN_FUNCTION
202 : __attribute__ ((__noreturn__, __format__ (__printf__, 4, 5)))
203 : void HX509_LIB_CALL
204 0 : hx509_err(hx509_context context, int exit_code,
205 : int error_code, const char *fmt, ...)
206 : {
207 0 : va_list ap;
208 0 : const char *msg;
209 0 : char *str;
210 0 : int ret;
211 :
212 0 : va_start(ap, fmt);
213 0 : ret = vasprintf(&str, fmt, ap);
214 0 : va_end(ap);
215 0 : msg = hx509_get_error_string(context, error_code);
216 0 : if (msg == NULL)
217 0 : msg = "no error";
218 :
219 0 : errx(exit_code, "%s: %s", ret != -1 ? str : "ENOMEM", msg);
220 : }
|