error: error_set_errno() is unused, drop
[qemu/ar7.git] / util / error.c
blobb842f2040cfd36f3334d2f4ac05307c881d1bf17
1 /*
2 * QEMU Error Objects
4 * Copyright IBM, Corp. 2011
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
9 * This work is licensed under the terms of the GNU LGPL, version 2. See
10 * the COPYING.LIB file in the top-level directory.
13 #include "qemu-common.h"
14 #include "qapi/error.h"
15 #include "qemu/error-report.h"
17 struct Error
19 char *msg;
20 ErrorClass err_class;
23 Error *error_abort;
25 static void error_setv(Error **errp, ErrorClass err_class,
26 const char *fmt, va_list ap)
28 Error *err;
29 int saved_errno = errno;
31 if (errp == NULL) {
32 return;
34 assert(*errp == NULL);
36 err = g_malloc0(sizeof(*err));
37 err->msg = g_strdup_vprintf(fmt, ap);
38 err->err_class = err_class;
40 if (errp == &error_abort) {
41 error_report_err(err);
42 abort();
45 *errp = err;
47 errno = saved_errno;
50 void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
52 va_list ap;
54 va_start(ap, fmt);
55 error_setv(errp, err_class, fmt, ap);
56 va_end(ap);
59 void error_setg(Error **errp, const char *fmt, ...)
61 va_list ap;
63 va_start(ap, fmt);
64 error_setv(errp, ERROR_CLASS_GENERIC_ERROR, fmt, ap);
65 va_end(ap);
68 void error_setg_errno(Error **errp, int os_errno, const char *fmt, ...)
70 va_list ap;
71 char *msg;
72 int saved_errno = errno;
74 if (errp == NULL) {
75 return;
78 va_start(ap, fmt);
79 error_setv(errp, ERROR_CLASS_GENERIC_ERROR, fmt, ap);
80 va_end(ap);
82 if (os_errno != 0) {
83 msg = (*errp)->msg;
84 (*errp)->msg = g_strdup_printf("%s: %s", msg, strerror(os_errno));
85 g_free(msg);
88 errno = saved_errno;
91 void error_setg_file_open(Error **errp, int os_errno, const char *filename)
93 error_setg_errno(errp, os_errno, "Could not open '%s'", filename);
96 #ifdef _WIN32
98 void error_setg_win32(Error **errp, int win32_err, const char *fmt, ...)
100 va_list ap;
101 char *msg1, *msg2;
103 if (errp == NULL) {
104 return;
107 va_start(ap, fmt);
108 error_setv(errp, ERROR_CLASS_GENERIC_ERROR, fmt, ap);
109 va_end(ap);
111 if (win32_err != 0) {
112 msg1 = (*errp)->msg;
113 msg2 = g_win32_error_message(win32_err);
114 (*errp)->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2,
115 (unsigned)win32_err);
116 g_free(msg2);
117 g_free(msg1);
121 #endif
123 Error *error_copy(const Error *err)
125 Error *err_new;
127 err_new = g_malloc0(sizeof(*err));
128 err_new->msg = g_strdup(err->msg);
129 err_new->err_class = err->err_class;
131 return err_new;
134 ErrorClass error_get_class(const Error *err)
136 return err->err_class;
139 const char *error_get_pretty(Error *err)
141 return err->msg;
144 void error_report_err(Error *err)
146 error_report("%s", error_get_pretty(err));
147 error_free(err);
150 void error_free(Error *err)
152 if (err) {
153 g_free(err->msg);
154 g_free(err);
158 void error_propagate(Error **dst_errp, Error *local_err)
160 if (local_err && dst_errp == &error_abort) {
161 error_report_err(local_err);
162 abort();
163 } else if (dst_errp && !*dst_errp) {
164 *dst_errp = local_err;
165 } else if (local_err) {
166 error_free(local_err);