root / util / error.c @ f4ff3b7b
History | View | Annotate | Download (2.9 kB)
1 | d5ec4f27 | Luiz Capitulino | /*
|
---|---|---|---|
2 | d5ec4f27 | Luiz Capitulino | * QEMU Error Objects
|
3 | d5ec4f27 | Luiz Capitulino | *
|
4 | d5ec4f27 | Luiz Capitulino | * Copyright IBM, Corp. 2011
|
5 | d5ec4f27 | Luiz Capitulino | *
|
6 | d5ec4f27 | Luiz Capitulino | * Authors:
|
7 | d5ec4f27 | Luiz Capitulino | * Anthony Liguori <aliguori@us.ibm.com>
|
8 | d5ec4f27 | Luiz Capitulino | *
|
9 | d5ec4f27 | Luiz Capitulino | * This work is licensed under the terms of the GNU LGPL, version 2. See
|
10 | d5ec4f27 | Luiz Capitulino | * the COPYING.LIB file in the top-level directory.
|
11 | d5ec4f27 | Luiz Capitulino | */
|
12 | e4ea5e2d | Stefan Weil | |
13 | e4ea5e2d | Stefan Weil | #include "qemu-common.h" |
14 | 7b1b5d19 | Paolo Bonzini | #include "qapi/error.h" |
15 | 7b1b5d19 | Paolo Bonzini | #include "qapi/qmp/qjson.h" |
16 | 7b1b5d19 | Paolo Bonzini | #include "qapi/qmp/qdict.h" |
17 | 13f59ae8 | Luiz Capitulino | #include "qapi-types.h" |
18 | 7b1b5d19 | Paolo Bonzini | #include "qapi/qmp/qerror.h" |
19 | d5ec4f27 | Luiz Capitulino | |
20 | d5ec4f27 | Luiz Capitulino | struct Error
|
21 | d5ec4f27 | Luiz Capitulino | { |
22 | d5ec4f27 | Luiz Capitulino | char *msg;
|
23 | 13f59ae8 | Luiz Capitulino | ErrorClass err_class; |
24 | d5ec4f27 | Luiz Capitulino | }; |
25 | d5ec4f27 | Luiz Capitulino | |
26 | 13f59ae8 | Luiz Capitulino | void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) |
27 | d5ec4f27 | Luiz Capitulino | { |
28 | d5ec4f27 | Luiz Capitulino | Error *err; |
29 | d5ec4f27 | Luiz Capitulino | va_list ap; |
30 | d5ec4f27 | Luiz Capitulino | |
31 | d5ec4f27 | Luiz Capitulino | if (errp == NULL) { |
32 | d5ec4f27 | Luiz Capitulino | return;
|
33 | d5ec4f27 | Luiz Capitulino | } |
34 | d195325b | Paolo Bonzini | assert(*errp == NULL);
|
35 | d5ec4f27 | Luiz Capitulino | |
36 | 7267c094 | Anthony Liguori | err = g_malloc0(sizeof(*err));
|
37 | d5ec4f27 | Luiz Capitulino | |
38 | d5ec4f27 | Luiz Capitulino | va_start(ap, fmt); |
39 | df1e608a | Luiz Capitulino | err->msg = g_strdup_vprintf(fmt, ap); |
40 | d5ec4f27 | Luiz Capitulino | va_end(ap); |
41 | 13f59ae8 | Luiz Capitulino | err->err_class = err_class; |
42 | d5ec4f27 | Luiz Capitulino | |
43 | d5ec4f27 | Luiz Capitulino | *errp = err; |
44 | d5ec4f27 | Luiz Capitulino | } |
45 | d5ec4f27 | Luiz Capitulino | |
46 | 680d16dc | Paolo Bonzini | void error_set_errno(Error **errp, int os_errno, ErrorClass err_class, |
47 | 680d16dc | Paolo Bonzini | const char *fmt, ...) |
48 | 680d16dc | Paolo Bonzini | { |
49 | 680d16dc | Paolo Bonzini | Error *err; |
50 | 680d16dc | Paolo Bonzini | char *msg1;
|
51 | 680d16dc | Paolo Bonzini | va_list ap; |
52 | 680d16dc | Paolo Bonzini | |
53 | 680d16dc | Paolo Bonzini | if (errp == NULL) { |
54 | 680d16dc | Paolo Bonzini | return;
|
55 | 680d16dc | Paolo Bonzini | } |
56 | 680d16dc | Paolo Bonzini | assert(*errp == NULL);
|
57 | 680d16dc | Paolo Bonzini | |
58 | 680d16dc | Paolo Bonzini | err = g_malloc0(sizeof(*err));
|
59 | 680d16dc | Paolo Bonzini | |
60 | 680d16dc | Paolo Bonzini | va_start(ap, fmt); |
61 | 680d16dc | Paolo Bonzini | msg1 = g_strdup_vprintf(fmt, ap); |
62 | 680d16dc | Paolo Bonzini | if (os_errno != 0) { |
63 | 680d16dc | Paolo Bonzini | err->msg = g_strdup_printf("%s: %s", msg1, strerror(os_errno));
|
64 | 680d16dc | Paolo Bonzini | g_free(msg1); |
65 | 680d16dc | Paolo Bonzini | } else {
|
66 | 680d16dc | Paolo Bonzini | err->msg = msg1; |
67 | 680d16dc | Paolo Bonzini | } |
68 | 680d16dc | Paolo Bonzini | va_end(ap); |
69 | 680d16dc | Paolo Bonzini | err->err_class = err_class; |
70 | 680d16dc | Paolo Bonzini | |
71 | 680d16dc | Paolo Bonzini | *errp = err; |
72 | 680d16dc | Paolo Bonzini | } |
73 | 680d16dc | Paolo Bonzini | |
74 | 54028d75 | Luiz Capitulino | void error_setg_file_open(Error **errp, int os_errno, const char *filename) |
75 | 54028d75 | Luiz Capitulino | { |
76 | 54028d75 | Luiz Capitulino | error_setg_errno(errp, os_errno, "Could not open '%s'", filename);
|
77 | 54028d75 | Luiz Capitulino | } |
78 | 54028d75 | Luiz Capitulino | |
79 | 20840d4c | Tomoki Sekiyama | #ifdef _WIN32
|
80 | 20840d4c | Tomoki Sekiyama | |
81 | 20840d4c | Tomoki Sekiyama | void error_set_win32(Error **errp, int win32_err, ErrorClass err_class, |
82 | 20840d4c | Tomoki Sekiyama | const char *fmt, ...) |
83 | 20840d4c | Tomoki Sekiyama | { |
84 | 20840d4c | Tomoki Sekiyama | Error *err; |
85 | 20840d4c | Tomoki Sekiyama | char *msg1;
|
86 | 20840d4c | Tomoki Sekiyama | va_list ap; |
87 | 20840d4c | Tomoki Sekiyama | |
88 | 20840d4c | Tomoki Sekiyama | if (errp == NULL) { |
89 | 20840d4c | Tomoki Sekiyama | return;
|
90 | 20840d4c | Tomoki Sekiyama | } |
91 | 20840d4c | Tomoki Sekiyama | assert(*errp == NULL);
|
92 | 20840d4c | Tomoki Sekiyama | |
93 | 20840d4c | Tomoki Sekiyama | err = g_malloc0(sizeof(*err));
|
94 | 20840d4c | Tomoki Sekiyama | |
95 | 20840d4c | Tomoki Sekiyama | va_start(ap, fmt); |
96 | 20840d4c | Tomoki Sekiyama | msg1 = g_strdup_vprintf(fmt, ap); |
97 | 20840d4c | Tomoki Sekiyama | if (win32_err != 0) { |
98 | 20840d4c | Tomoki Sekiyama | char *msg2 = g_win32_error_message(win32_err);
|
99 | 20840d4c | Tomoki Sekiyama | err->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2,
|
100 | 20840d4c | Tomoki Sekiyama | (unsigned)win32_err);
|
101 | 20840d4c | Tomoki Sekiyama | g_free(msg2); |
102 | 20840d4c | Tomoki Sekiyama | g_free(msg1); |
103 | 20840d4c | Tomoki Sekiyama | } else {
|
104 | 20840d4c | Tomoki Sekiyama | err->msg = msg1; |
105 | 20840d4c | Tomoki Sekiyama | } |
106 | 20840d4c | Tomoki Sekiyama | va_end(ap); |
107 | 20840d4c | Tomoki Sekiyama | err->err_class = err_class; |
108 | 20840d4c | Tomoki Sekiyama | |
109 | 20840d4c | Tomoki Sekiyama | *errp = err; |
110 | 20840d4c | Tomoki Sekiyama | } |
111 | 20840d4c | Tomoki Sekiyama | |
112 | 20840d4c | Tomoki Sekiyama | #endif
|
113 | 20840d4c | Tomoki Sekiyama | |
114 | 79020cfc | Luiz Capitulino | Error *error_copy(const Error *err)
|
115 | 79020cfc | Luiz Capitulino | { |
116 | 79020cfc | Luiz Capitulino | Error *err_new; |
117 | 79020cfc | Luiz Capitulino | |
118 | 79020cfc | Luiz Capitulino | err_new = g_malloc0(sizeof(*err));
|
119 | 79020cfc | Luiz Capitulino | err_new->msg = g_strdup(err->msg); |
120 | 13f59ae8 | Luiz Capitulino | err_new->err_class = err->err_class; |
121 | 79020cfc | Luiz Capitulino | |
122 | 79020cfc | Luiz Capitulino | return err_new;
|
123 | 79020cfc | Luiz Capitulino | } |
124 | 79020cfc | Luiz Capitulino | |
125 | d5ec4f27 | Luiz Capitulino | bool error_is_set(Error **errp)
|
126 | d5ec4f27 | Luiz Capitulino | { |
127 | d5ec4f27 | Luiz Capitulino | return (errp && *errp);
|
128 | d5ec4f27 | Luiz Capitulino | } |
129 | d5ec4f27 | Luiz Capitulino | |
130 | ea25fbca | Luiz Capitulino | ErrorClass error_get_class(const Error *err)
|
131 | ea25fbca | Luiz Capitulino | { |
132 | ea25fbca | Luiz Capitulino | return err->err_class;
|
133 | ea25fbca | Luiz Capitulino | } |
134 | ea25fbca | Luiz Capitulino | |
135 | d5ec4f27 | Luiz Capitulino | const char *error_get_pretty(Error *err) |
136 | d5ec4f27 | Luiz Capitulino | { |
137 | d5ec4f27 | Luiz Capitulino | return err->msg;
|
138 | d5ec4f27 | Luiz Capitulino | } |
139 | d5ec4f27 | Luiz Capitulino | |
140 | d5ec4f27 | Luiz Capitulino | void error_free(Error *err)
|
141 | d5ec4f27 | Luiz Capitulino | { |
142 | d5ec4f27 | Luiz Capitulino | if (err) {
|
143 | 7267c094 | Anthony Liguori | g_free(err->msg); |
144 | 7267c094 | Anthony Liguori | g_free(err); |
145 | d5ec4f27 | Luiz Capitulino | } |
146 | d5ec4f27 | Luiz Capitulino | } |
147 | d5ec4f27 | Luiz Capitulino | |
148 | d5ec4f27 | Luiz Capitulino | void error_propagate(Error **dst_err, Error *local_err)
|
149 | d5ec4f27 | Luiz Capitulino | { |
150 | d195325b | Paolo Bonzini | if (dst_err && !*dst_err) {
|
151 | d5ec4f27 | Luiz Capitulino | *dst_err = local_err; |
152 | d5ec4f27 | Luiz Capitulino | } else if (local_err) { |
153 | d5ec4f27 | Luiz Capitulino | error_free(local_err); |
154 | d5ec4f27 | Luiz Capitulino | } |
155 | d5ec4f27 | Luiz Capitulino | } |