xref: /openbmc/qemu/include/qapi/error.h (revision 3c4b89c3)
1 /*
2  * QEMU Error Objects
3  *
4  * Copyright IBM, Corp. 2011
5  * Copyright (C) 2011-2015 Red Hat, Inc.
6  *
7  * Authors:
8  *  Anthony Liguori   <aliguori@us.ibm.com>
9  *  Markus Armbruster <armbru@redhat.com>
10  *
11  * This work is licensed under the terms of the GNU LGPL, version 2.  See
12  * the COPYING.LIB file in the top-level directory.
13  */
14 
15 /*
16  * Error reporting system loosely patterned after Glib's GError.
17  *
18  * = Rules =
19  *
20  * - Functions that use Error to report errors have an Error **errp
21  *   parameter.  It should be the last parameter, except for functions
22  *   taking variable arguments.
23  *
24  * - You may pass NULL to not receive the error, &error_abort to abort
25  *   on error, &error_fatal to exit(1) on error, or a pointer to a
26  *   variable containing NULL to receive the error.
27  *
28  * - Separation of concerns: the function is responsible for detecting
29  *   errors and failing cleanly; handling the error is its caller's
30  *   job.  Since the value of @errp is about handling the error, the
31  *   function should not examine it.
32  *
33  * - On success, the function should not touch *errp.  On failure, it
34  *   should set a new error, e.g. with error_setg(errp, ...), or
35  *   propagate an existing one, e.g. with error_propagate(errp, ...).
36  *
37  * - Whenever practical, also return a value that indicates success /
38  *   failure.  This can make the error checking more concise, and can
39  *   avoid useless error object creation and destruction.  Note that
40  *   we still have many functions returning void.  We recommend
41  *   • bool-valued functions return true on success / false on failure,
42  *   • pointer-valued functions return non-null / null pointer, and
43  *   • integer-valued functions return non-negative / negative.
44  *
45  * = Creating errors =
46  *
47  * Create an error:
48  *     error_setg(&err, "situation normal, all fouled up");
49  *
50  * Create an error and add additional explanation:
51  *     error_setg(&err, "invalid quark");
52  *     error_append_hint(&err, "Valid quarks are up, down, strange, "
53  *                       "charm, top, bottom.\n");
54  *
55  * Do *not* contract this to
56  *     error_setg(&err, "invalid quark\n" // WRONG!
57  *                "Valid quarks are up, down, strange, charm, top, bottom.");
58  *
59  * = Reporting and destroying errors =
60  *
61  * Report an error to the current monitor if we have one, else stderr:
62  *     error_report_err(err);
63  * This frees the error object.
64  *
65  * Likewise, but with additional text prepended:
66  *     error_reportf_err(err, "Could not frobnicate '%s': ", name);
67  *
68  * Report an error somewhere else:
69  *     const char *msg = error_get_pretty(err);
70  *     do with msg what needs to be done...
71  *     error_free(err);
72  * Note that this loses hints added with error_append_hint().
73  *
74  * Call a function ignoring errors:
75  *     foo(arg, NULL);
76  * This is more concise than
77  *     Error *err = NULL;
78  *     foo(arg, &err);
79  *     error_free(err); // don't do this
80  *
81  * Call a function aborting on errors:
82  *     foo(arg, &error_abort);
83  * This is more concise and fails more nicely than
84  *     Error *err = NULL;
85  *     foo(arg, &err);
86  *     assert(!err); // don't do this
87  *
88  * Call a function treating errors as fatal:
89  *     foo(arg, &error_fatal);
90  * This is more concise than
91  *     Error *err = NULL;
92  *     foo(arg, &err);
93  *     if (err) { // don't do this
94  *         error_report_err(err);
95  *         exit(1);
96  *     }
97  *
98  * Handle an error without reporting it (just for completeness):
99  *     error_free(err);
100  *
101  * Assert that an expected error occurred, but clean it up without
102  * reporting it (primarily useful in testsuites):
103  *     error_free_or_abort(&err);
104  *
105  * = Passing errors around =
106  *
107  * Errors get passed to the caller through the conventional @errp
108  * parameter.
109  *
110  * Pass an existing error to the caller:
111  *     error_propagate(errp, err);
112  * where Error **errp is a parameter, by convention the last one.
113  *
114  * Pass an existing error to the caller with the message modified:
115  *     error_propagate_prepend(errp, err,
116  *                             "Could not frobnicate '%s': ", name);
117  * This is more concise than
118  *     error_propagate(errp, err); // don't do this
119  *     error_prepend(errp, "Could not frobnicate '%s': ", name);
120  * and works even when @errp is &error_fatal.
121  *
122  * Create a new error and pass it to the caller:
123  *     error_setg(errp, "situation normal, all fouled up");
124  *
125  * Call a function, receive an error from it, and pass it to the caller
126  * - when the function returns a value that indicates failure, say
127  *   false:
128  *     if (!foo(arg, errp)) {
129  *         handle the error...
130  *     }
131  * - when it does not, say because it is a void function:
132  *     Error *err = NULL;
133  *     foo(arg, &err);
134  *     if (err) {
135  *         handle the error...
136  *         error_propagate(errp, err);
137  *     }
138  * Do *not* "optimize" this to
139  *     foo(arg, errp);
140  *     if (*errp) { // WRONG!
141  *         handle the error...
142  *     }
143  * because errp may be NULL!
144  *
145  * But when all you do with the error is pass it on, please use
146  *     foo(arg, errp);
147  * for readability.
148  *
149  * Receive an error, and handle it locally
150  * - when the function returns a value that indicates failure, say
151  *   false:
152  *     Error *err = NULL;
153  *     if (!foo(arg, &err)) {
154  *         handle the error...
155  *     }
156  * - when it does not, say because it is a void function:
157  *     Error *err = NULL;
158  *     foo(arg, &err);
159  *     if (err) {
160  *         handle the error...
161  *     }
162  *
163  * Receive and accumulate multiple errors (first one wins):
164  *     Error *err = NULL, *local_err = NULL;
165  *     foo(arg, &err);
166  *     bar(arg, &local_err);
167  *     error_propagate(&err, local_err);
168  *     if (err) {
169  *         handle the error...
170  *     }
171  *
172  * Do *not* "optimize" this to
173  *     Error *err = NULL;
174  *     foo(arg, &err);
175  *     bar(arg, &err); // WRONG!
176  *     if (err) {
177  *         handle the error...
178  *     }
179  * because this may pass a non-null err to bar().
180  *
181  * Likewise, do *not*
182  *     Error *err = NULL;
183  *     if (cond1) {
184  *         error_setg(&err, ...);
185  *     }
186  *     if (cond2) {
187  *         error_setg(&err, ...); // WRONG!
188  *     }
189  * because this may pass a non-null err to error_setg().
190  */
191 
192 #ifndef ERROR_H
193 #define ERROR_H
194 
195 #include "qapi/qapi-types-error.h"
196 
197 /*
198  * Overall category of an error.
199  * Based on the qapi type QapiErrorClass, but reproduced here for nicer
200  * enum names.
201  */
202 typedef enum ErrorClass {
203     ERROR_CLASS_GENERIC_ERROR = QAPI_ERROR_CLASS_GENERICERROR,
204     ERROR_CLASS_COMMAND_NOT_FOUND = QAPI_ERROR_CLASS_COMMANDNOTFOUND,
205     ERROR_CLASS_DEVICE_NOT_ACTIVE = QAPI_ERROR_CLASS_DEVICENOTACTIVE,
206     ERROR_CLASS_DEVICE_NOT_FOUND = QAPI_ERROR_CLASS_DEVICENOTFOUND,
207     ERROR_CLASS_KVM_MISSING_CAP = QAPI_ERROR_CLASS_KVMMISSINGCAP,
208 } ErrorClass;
209 
210 /*
211  * Get @err's human-readable error message.
212  */
213 const char *error_get_pretty(const Error *err);
214 
215 /*
216  * Get @err's error class.
217  * Note: use of error classes other than ERROR_CLASS_GENERIC_ERROR is
218  * strongly discouraged.
219  */
220 ErrorClass error_get_class(const Error *err);
221 
222 /*
223  * Create a new error object and assign it to *@errp.
224  * If @errp is NULL, the error is ignored.  Don't bother creating one
225  * then.
226  * If @errp is &error_abort, print a suitable message and abort().
227  * If @errp is &error_fatal, print a suitable message and exit(1).
228  * If @errp is anything else, *@errp must be NULL.
229  * The new error's class is ERROR_CLASS_GENERIC_ERROR, and its
230  * human-readable error message is made from printf-style @fmt, ...
231  * The resulting message should be a single phrase, with no newline or
232  * trailing punctuation.
233  * Please don't error_setg(&error_fatal, ...), use error_report() and
234  * exit(), because that's more obvious.
235  * Likewise, don't error_setg(&error_abort, ...), use assert().
236  */
237 #define error_setg(errp, fmt, ...)                              \
238     error_setg_internal((errp), __FILE__, __LINE__, __func__,   \
239                         (fmt), ## __VA_ARGS__)
240 void error_setg_internal(Error **errp,
241                          const char *src, int line, const char *func,
242                          const char *fmt, ...)
243     GCC_FMT_ATTR(5, 6);
244 
245 /*
246  * Just like error_setg(), with @os_error info added to the message.
247  * If @os_error is non-zero, ": " + strerror(os_error) is appended to
248  * the human-readable error message.
249  *
250  * The value of errno (which usually can get clobbered by almost any
251  * function call) will be preserved.
252  */
253 #define error_setg_errno(errp, os_error, fmt, ...)                      \
254     error_setg_errno_internal((errp), __FILE__, __LINE__, __func__,     \
255                               (os_error), (fmt), ## __VA_ARGS__)
256 void error_setg_errno_internal(Error **errp,
257                                const char *fname, int line, const char *func,
258                                int os_error, const char *fmt, ...)
259     GCC_FMT_ATTR(6, 7);
260 
261 #ifdef _WIN32
262 /*
263  * Just like error_setg(), with @win32_error info added to the message.
264  * If @win32_error is non-zero, ": " + g_win32_error_message(win32_err)
265  * is appended to the human-readable error message.
266  */
267 #define error_setg_win32(errp, win32_err, fmt, ...)                     \
268     error_setg_win32_internal((errp), __FILE__, __LINE__, __func__,     \
269                               (win32_err), (fmt), ## __VA_ARGS__)
270 void error_setg_win32_internal(Error **errp,
271                                const char *src, int line, const char *func,
272                                int win32_err, const char *fmt, ...)
273     GCC_FMT_ATTR(6, 7);
274 #endif
275 
276 /*
277  * Propagate error object (if any) from @local_err to @dst_errp.
278  * If @local_err is NULL, do nothing (because there's nothing to
279  * propagate).
280  * Else, if @dst_errp is NULL, errors are being ignored.  Free the
281  * error object.
282  * Else, if @dst_errp is &error_abort, print a suitable message and
283  * abort().
284  * Else, if @dst_errp is &error_fatal, print a suitable message and
285  * exit(1).
286  * Else, if @dst_errp already contains an error, ignore this one: free
287  * the error object.
288  * Else, move the error object from @local_err to *@dst_errp.
289  * On return, @local_err is invalid.
290  * Please don't error_propagate(&error_fatal, ...), use
291  * error_report_err() and exit(), because that's more obvious.
292  */
293 void error_propagate(Error **dst_errp, Error *local_err);
294 
295 
296 /*
297  * Propagate error object (if any) with some text prepended.
298  * Behaves like
299  *     error_prepend(&local_err, fmt, ...);
300  *     error_propagate(dst_errp, local_err);
301  */
302 void error_propagate_prepend(Error **dst_errp, Error *local_err,
303                              const char *fmt, ...);
304 
305 /*
306  * Prepend some text to @errp's human-readable error message.
307  * The text is made by formatting @fmt, @ap like vprintf().
308  */
309 void error_vprepend(Error *const *errp, const char *fmt, va_list ap);
310 
311 /*
312  * Prepend some text to @errp's human-readable error message.
313  * The text is made by formatting @fmt, ... like printf().
314  */
315 void error_prepend(Error *const *errp, const char *fmt, ...)
316     GCC_FMT_ATTR(2, 3);
317 
318 /*
319  * Append a printf-style human-readable explanation to an existing error.
320  * If the error is later reported to a human user with
321  * error_report_err() or warn_report_err(), the hints will be shown,
322  * too.  If it's reported via QMP, the hints will be ignored.
323  * Intended use is adding helpful hints on the human user interface,
324  * e.g. a list of valid values.  It's not for clarifying a confusing
325  * error message.
326  * @errp may be NULL, but not &error_fatal or &error_abort.
327  * Trivially the case if you call it only after error_setg() or
328  * error_propagate().
329  * May be called multiple times.  The resulting hint should end with a
330  * newline.
331  */
332 void error_append_hint(Error *const *errp, const char *fmt, ...)
333     GCC_FMT_ATTR(2, 3);
334 
335 /*
336  * Convenience function to report open() failure.
337  */
338 #define error_setg_file_open(errp, os_errno, filename)                  \
339     error_setg_file_open_internal((errp), __FILE__, __LINE__, __func__, \
340                                   (os_errno), (filename))
341 void error_setg_file_open_internal(Error **errp,
342                                    const char *src, int line, const char *func,
343                                    int os_errno, const char *filename);
344 
345 /*
346  * Return an exact copy of @err.
347  */
348 Error *error_copy(const Error *err);
349 
350 /*
351  * Free @err.
352  * @err may be NULL.
353  */
354 void error_free(Error *err);
355 
356 /*
357  * Convenience function to assert that *@errp is set, then silently free it.
358  */
359 void error_free_or_abort(Error **errp);
360 
361 /*
362  * Convenience function to warn_report() and free @err.
363  * The report includes hints added with error_append_hint().
364  */
365 void warn_report_err(Error *err);
366 
367 /*
368  * Convenience function to error_report() and free @err.
369  * The report includes hints added with error_append_hint().
370  */
371 void error_report_err(Error *err);
372 
373 /*
374  * Convenience function to error_prepend(), warn_report() and free @err.
375  */
376 void warn_reportf_err(Error *err, const char *fmt, ...)
377     GCC_FMT_ATTR(2, 3);
378 
379 /*
380  * Convenience function to error_prepend(), error_report() and free @err.
381  */
382 void error_reportf_err(Error *err, const char *fmt, ...)
383     GCC_FMT_ATTR(2, 3);
384 
385 /*
386  * Just like error_setg(), except you get to specify the error class.
387  * Note: use of error classes other than ERROR_CLASS_GENERIC_ERROR is
388  * strongly discouraged.
389  */
390 #define error_set(errp, err_class, fmt, ...)                    \
391     error_set_internal((errp), __FILE__, __LINE__, __func__,    \
392                        (err_class), (fmt), ## __VA_ARGS__)
393 void error_set_internal(Error **errp,
394                         const char *src, int line, const char *func,
395                         ErrorClass err_class, const char *fmt, ...)
396     GCC_FMT_ATTR(6, 7);
397 
398 /*
399  * Special error destination to abort on error.
400  * See error_setg() and error_propagate() for details.
401  */
402 extern Error *error_abort;
403 
404 /*
405  * Special error destination to exit(1) on error.
406  * See error_setg() and error_propagate() for details.
407  */
408 extern Error *error_fatal;
409 
410 #endif
411