Revision 20840d4c
b/include/qapi/error.h | ||
---|---|---|
36 | 36 |
*/ |
37 | 37 |
void error_set_errno(Error **err, int os_error, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(4, 5); |
38 | 38 |
|
39 |
#ifdef _WIN32 |
|
40 |
/** |
|
41 |
* Set an indirect pointer to an error given a ErrorClass value and a |
|
42 |
* printf-style human message, followed by a g_win32_error_message() string if |
|
43 |
* @win32_err is not zero. |
|
44 |
*/ |
|
45 |
void error_set_win32(Error **err, int win32_err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(4, 5); |
|
46 |
#endif |
|
47 |
|
|
39 | 48 |
/** |
40 | 49 |
* Same as error_set(), but sets a generic error |
41 | 50 |
*/ |
... | ... | |
43 | 52 |
error_set(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__) |
44 | 53 |
#define error_setg_errno(err, os_error, fmt, ...) \ |
45 | 54 |
error_set_errno(err, os_error, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__) |
55 |
#ifdef _WIN32 |
|
56 |
#define error_setg_win32(err, win32_err, fmt, ...) \ |
|
57 |
error_set_win32(err, win32_err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__) |
|
58 |
#endif |
|
46 | 59 |
|
47 | 60 |
/** |
48 | 61 |
* Helper for open() errors |
b/util/error.c | ||
---|---|---|
76 | 76 |
error_setg_errno(errp, os_errno, "Could not open '%s'", filename); |
77 | 77 |
} |
78 | 78 |
|
79 |
#ifdef _WIN32 |
|
80 |
|
|
81 |
void error_set_win32(Error **errp, int win32_err, ErrorClass err_class, |
|
82 |
const char *fmt, ...) |
|
83 |
{ |
|
84 |
Error *err; |
|
85 |
char *msg1; |
|
86 |
va_list ap; |
|
87 |
|
|
88 |
if (errp == NULL) { |
|
89 |
return; |
|
90 |
} |
|
91 |
assert(*errp == NULL); |
|
92 |
|
|
93 |
err = g_malloc0(sizeof(*err)); |
|
94 |
|
|
95 |
va_start(ap, fmt); |
|
96 |
msg1 = g_strdup_vprintf(fmt, ap); |
|
97 |
if (win32_err != 0) { |
|
98 |
char *msg2 = g_win32_error_message(win32_err); |
|
99 |
err->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2, |
|
100 |
(unsigned)win32_err); |
|
101 |
g_free(msg2); |
|
102 |
g_free(msg1); |
|
103 |
} else { |
|
104 |
err->msg = msg1; |
|
105 |
} |
|
106 |
va_end(ap); |
|
107 |
err->err_class = err_class; |
|
108 |
|
|
109 |
*errp = err; |
|
110 |
} |
|
111 |
|
|
112 |
#endif |
|
113 |
|
|
79 | 114 |
Error *error_copy(const Error *err) |
80 | 115 |
{ |
81 | 116 |
Error *err_new; |
Also available in: Unified diff