root / error.c @ 09f1bbcd
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 | d5ec4f27 | Luiz Capitulino | #include "error.h" |
15 | f795e743 | Luiz Capitulino | #include "qjson.h" |
16 | f795e743 | Luiz Capitulino | #include "qdict.h" |
17 | d5ec4f27 | Luiz Capitulino | #include "error_int.h" |
18 | d5ec4f27 | Luiz Capitulino | #include "qerror.h" |
19 | d5ec4f27 | Luiz Capitulino | |
20 | d5ec4f27 | Luiz Capitulino | struct Error
|
21 | d5ec4f27 | Luiz Capitulino | { |
22 | d5ec4f27 | Luiz Capitulino | QDict *obj; |
23 | d5ec4f27 | Luiz Capitulino | const char *fmt; |
24 | d5ec4f27 | Luiz Capitulino | char *msg;
|
25 | d5ec4f27 | Luiz Capitulino | }; |
26 | d5ec4f27 | Luiz Capitulino | |
27 | d5ec4f27 | Luiz Capitulino | void error_set(Error **errp, const char *fmt, ...) |
28 | d5ec4f27 | Luiz Capitulino | { |
29 | d5ec4f27 | Luiz Capitulino | Error *err; |
30 | d5ec4f27 | Luiz Capitulino | va_list ap; |
31 | d5ec4f27 | Luiz Capitulino | |
32 | d5ec4f27 | Luiz Capitulino | if (errp == NULL) { |
33 | d5ec4f27 | Luiz Capitulino | return;
|
34 | d5ec4f27 | Luiz Capitulino | } |
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 | d5ec4f27 | Luiz Capitulino | err->obj = qobject_to_qdict(qobject_from_jsonv(fmt, &ap)); |
40 | d5ec4f27 | Luiz Capitulino | va_end(ap); |
41 | d5ec4f27 | Luiz Capitulino | err->fmt = fmt; |
42 | d5ec4f27 | Luiz Capitulino | |
43 | d5ec4f27 | Luiz Capitulino | *errp = err; |
44 | d5ec4f27 | Luiz Capitulino | } |
45 | d5ec4f27 | Luiz Capitulino | |
46 | 79020cfc | Luiz Capitulino | Error *error_copy(const Error *err)
|
47 | 79020cfc | Luiz Capitulino | { |
48 | 79020cfc | Luiz Capitulino | Error *err_new; |
49 | 79020cfc | Luiz Capitulino | |
50 | 79020cfc | Luiz Capitulino | err_new = g_malloc0(sizeof(*err));
|
51 | 79020cfc | Luiz Capitulino | err_new->msg = g_strdup(err->msg); |
52 | 79020cfc | Luiz Capitulino | err_new->fmt = err->fmt; |
53 | 79020cfc | Luiz Capitulino | err_new->obj = err->obj; |
54 | 79020cfc | Luiz Capitulino | QINCREF(err_new->obj); |
55 | 79020cfc | Luiz Capitulino | |
56 | 79020cfc | Luiz Capitulino | return err_new;
|
57 | 79020cfc | Luiz Capitulino | } |
58 | 79020cfc | Luiz Capitulino | |
59 | d5ec4f27 | Luiz Capitulino | bool error_is_set(Error **errp)
|
60 | d5ec4f27 | Luiz Capitulino | { |
61 | d5ec4f27 | Luiz Capitulino | return (errp && *errp);
|
62 | d5ec4f27 | Luiz Capitulino | } |
63 | d5ec4f27 | Luiz Capitulino | |
64 | d5ec4f27 | Luiz Capitulino | const char *error_get_pretty(Error *err) |
65 | d5ec4f27 | Luiz Capitulino | { |
66 | d5ec4f27 | Luiz Capitulino | if (err->msg == NULL) { |
67 | d5ec4f27 | Luiz Capitulino | QString *str; |
68 | d5ec4f27 | Luiz Capitulino | str = qerror_format(err->fmt, err->obj); |
69 | 7267c094 | Anthony Liguori | err->msg = g_strdup(qstring_get_str(str)); |
70 | d5ec4f27 | Luiz Capitulino | QDECREF(str); |
71 | d5ec4f27 | Luiz Capitulino | } |
72 | d5ec4f27 | Luiz Capitulino | |
73 | d5ec4f27 | Luiz Capitulino | return err->msg;
|
74 | d5ec4f27 | Luiz Capitulino | } |
75 | d5ec4f27 | Luiz Capitulino | |
76 | d5ec4f27 | Luiz Capitulino | const char *error_get_field(Error *err, const char *field) |
77 | d5ec4f27 | Luiz Capitulino | { |
78 | d5ec4f27 | Luiz Capitulino | if (strcmp(field, "class") == 0) { |
79 | d5ec4f27 | Luiz Capitulino | return qdict_get_str(err->obj, field);
|
80 | d5ec4f27 | Luiz Capitulino | } else {
|
81 | d5ec4f27 | Luiz Capitulino | QDict *dict = qdict_get_qdict(err->obj, "data");
|
82 | d5ec4f27 | Luiz Capitulino | return qdict_get_str(dict, field);
|
83 | d5ec4f27 | Luiz Capitulino | } |
84 | d5ec4f27 | Luiz Capitulino | } |
85 | d5ec4f27 | Luiz Capitulino | |
86 | d5ec4f27 | Luiz Capitulino | QDict *error_get_data(Error *err) |
87 | d5ec4f27 | Luiz Capitulino | { |
88 | d5ec4f27 | Luiz Capitulino | QDict *data = qdict_get_qdict(err->obj, "data");
|
89 | d5ec4f27 | Luiz Capitulino | QINCREF(data); |
90 | d5ec4f27 | Luiz Capitulino | return data;
|
91 | d5ec4f27 | Luiz Capitulino | } |
92 | d5ec4f27 | Luiz Capitulino | |
93 | d5ec4f27 | Luiz Capitulino | void error_set_field(Error *err, const char *field, const char *value) |
94 | d5ec4f27 | Luiz Capitulino | { |
95 | d5ec4f27 | Luiz Capitulino | QDict *dict = qdict_get_qdict(err->obj, "data");
|
96 | 0ed6dc1a | Amos Kong | qdict_put(dict, field, qstring_from_str(value)); |
97 | d5ec4f27 | Luiz Capitulino | } |
98 | d5ec4f27 | Luiz Capitulino | |
99 | d5ec4f27 | Luiz Capitulino | void error_free(Error *err)
|
100 | d5ec4f27 | Luiz Capitulino | { |
101 | d5ec4f27 | Luiz Capitulino | if (err) {
|
102 | d5ec4f27 | Luiz Capitulino | QDECREF(err->obj); |
103 | 7267c094 | Anthony Liguori | g_free(err->msg); |
104 | 7267c094 | Anthony Liguori | g_free(err); |
105 | d5ec4f27 | Luiz Capitulino | } |
106 | d5ec4f27 | Luiz Capitulino | } |
107 | d5ec4f27 | Luiz Capitulino | |
108 | d5ec4f27 | Luiz Capitulino | bool error_is_type(Error *err, const char *fmt) |
109 | d5ec4f27 | Luiz Capitulino | { |
110 | d5ec4f27 | Luiz Capitulino | const char *error_class; |
111 | d5ec4f27 | Luiz Capitulino | char *ptr;
|
112 | d5ec4f27 | Luiz Capitulino | char *end;
|
113 | d5ec4f27 | Luiz Capitulino | |
114 | acceb4d9 | Anthony Liguori | if (!err) {
|
115 | acceb4d9 | Anthony Liguori | return false; |
116 | acceb4d9 | Anthony Liguori | } |
117 | acceb4d9 | Anthony Liguori | |
118 | d5ec4f27 | Luiz Capitulino | ptr = strstr(fmt, "'class': '");
|
119 | d5ec4f27 | Luiz Capitulino | assert(ptr != NULL);
|
120 | d5ec4f27 | Luiz Capitulino | ptr += strlen("'class': '");
|
121 | d5ec4f27 | Luiz Capitulino | |
122 | d5ec4f27 | Luiz Capitulino | end = strchr(ptr, '\'');
|
123 | d5ec4f27 | Luiz Capitulino | assert(end != NULL);
|
124 | d5ec4f27 | Luiz Capitulino | |
125 | d5ec4f27 | Luiz Capitulino | error_class = error_get_field(err, "class");
|
126 | d5ec4f27 | Luiz Capitulino | if (strlen(error_class) != end - ptr) {
|
127 | d5ec4f27 | Luiz Capitulino | return false; |
128 | d5ec4f27 | Luiz Capitulino | } |
129 | d5ec4f27 | Luiz Capitulino | |
130 | d5ec4f27 | Luiz Capitulino | return strncmp(ptr, error_class, end - ptr) == 0; |
131 | d5ec4f27 | Luiz Capitulino | } |
132 | d5ec4f27 | Luiz Capitulino | |
133 | d5ec4f27 | Luiz Capitulino | void error_propagate(Error **dst_err, Error *local_err)
|
134 | d5ec4f27 | Luiz Capitulino | { |
135 | d5ec4f27 | Luiz Capitulino | if (dst_err) {
|
136 | d5ec4f27 | Luiz Capitulino | *dst_err = local_err; |
137 | d5ec4f27 | Luiz Capitulino | } else if (local_err) { |
138 | d5ec4f27 | Luiz Capitulino | error_free(local_err); |
139 | d5ec4f27 | Luiz Capitulino | } |
140 | d5ec4f27 | Luiz Capitulino | } |
141 | d5ec4f27 | Luiz Capitulino | |
142 | d5ec4f27 | Luiz Capitulino | QObject *error_get_qobject(Error *err) |
143 | d5ec4f27 | Luiz Capitulino | { |
144 | d5ec4f27 | Luiz Capitulino | QINCREF(err->obj); |
145 | d5ec4f27 | Luiz Capitulino | return QOBJECT(err->obj);
|
146 | d5ec4f27 | Luiz Capitulino | } |
147 | d5ec4f27 | Luiz Capitulino | |
148 | d5ec4f27 | Luiz Capitulino | void error_set_qobject(Error **errp, QObject *obj)
|
149 | d5ec4f27 | Luiz Capitulino | { |
150 | d5ec4f27 | Luiz Capitulino | Error *err; |
151 | d5ec4f27 | Luiz Capitulino | if (errp == NULL) { |
152 | d5ec4f27 | Luiz Capitulino | return;
|
153 | d5ec4f27 | Luiz Capitulino | } |
154 | 7267c094 | Anthony Liguori | err = g_malloc0(sizeof(*err));
|
155 | d5ec4f27 | Luiz Capitulino | err->obj = qobject_to_qdict(obj); |
156 | d5ec4f27 | Luiz Capitulino | qobject_incref(obj); |
157 | d5ec4f27 | Luiz Capitulino | |
158 | d5ec4f27 | Luiz Capitulino | *errp = err; |
159 | d5ec4f27 | Luiz Capitulino | } |