root / error.c @ 39bffca2
History | View | Annotate | Download (2.7 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 | d5ec4f27 | Luiz Capitulino | bool error_is_set(Error **errp)
|
47 | d5ec4f27 | Luiz Capitulino | { |
48 | d5ec4f27 | Luiz Capitulino | return (errp && *errp);
|
49 | d5ec4f27 | Luiz Capitulino | } |
50 | d5ec4f27 | Luiz Capitulino | |
51 | d5ec4f27 | Luiz Capitulino | const char *error_get_pretty(Error *err) |
52 | d5ec4f27 | Luiz Capitulino | { |
53 | d5ec4f27 | Luiz Capitulino | if (err->msg == NULL) { |
54 | d5ec4f27 | Luiz Capitulino | QString *str; |
55 | d5ec4f27 | Luiz Capitulino | str = qerror_format(err->fmt, err->obj); |
56 | 7267c094 | Anthony Liguori | err->msg = g_strdup(qstring_get_str(str)); |
57 | d5ec4f27 | Luiz Capitulino | QDECREF(str); |
58 | d5ec4f27 | Luiz Capitulino | } |
59 | d5ec4f27 | Luiz Capitulino | |
60 | d5ec4f27 | Luiz Capitulino | return err->msg;
|
61 | d5ec4f27 | Luiz Capitulino | } |
62 | d5ec4f27 | Luiz Capitulino | |
63 | d5ec4f27 | Luiz Capitulino | const char *error_get_field(Error *err, const char *field) |
64 | d5ec4f27 | Luiz Capitulino | { |
65 | d5ec4f27 | Luiz Capitulino | if (strcmp(field, "class") == 0) { |
66 | d5ec4f27 | Luiz Capitulino | return qdict_get_str(err->obj, field);
|
67 | d5ec4f27 | Luiz Capitulino | } else {
|
68 | d5ec4f27 | Luiz Capitulino | QDict *dict = qdict_get_qdict(err->obj, "data");
|
69 | d5ec4f27 | Luiz Capitulino | return qdict_get_str(dict, field);
|
70 | d5ec4f27 | Luiz Capitulino | } |
71 | d5ec4f27 | Luiz Capitulino | } |
72 | d5ec4f27 | Luiz Capitulino | |
73 | d5ec4f27 | Luiz Capitulino | QDict *error_get_data(Error *err) |
74 | d5ec4f27 | Luiz Capitulino | { |
75 | d5ec4f27 | Luiz Capitulino | QDict *data = qdict_get_qdict(err->obj, "data");
|
76 | d5ec4f27 | Luiz Capitulino | QINCREF(data); |
77 | d5ec4f27 | Luiz Capitulino | return data;
|
78 | d5ec4f27 | Luiz Capitulino | } |
79 | d5ec4f27 | Luiz Capitulino | |
80 | d5ec4f27 | Luiz Capitulino | void error_set_field(Error *err, const char *field, const char *value) |
81 | d5ec4f27 | Luiz Capitulino | { |
82 | d5ec4f27 | Luiz Capitulino | QDict *dict = qdict_get_qdict(err->obj, "data");
|
83 | d5ec4f27 | Luiz Capitulino | return qdict_put(dict, field, qstring_from_str(value));
|
84 | d5ec4f27 | Luiz Capitulino | } |
85 | d5ec4f27 | Luiz Capitulino | |
86 | d5ec4f27 | Luiz Capitulino | void error_free(Error *err)
|
87 | d5ec4f27 | Luiz Capitulino | { |
88 | d5ec4f27 | Luiz Capitulino | if (err) {
|
89 | d5ec4f27 | Luiz Capitulino | QDECREF(err->obj); |
90 | 7267c094 | Anthony Liguori | g_free(err->msg); |
91 | 7267c094 | Anthony Liguori | g_free(err); |
92 | d5ec4f27 | Luiz Capitulino | } |
93 | d5ec4f27 | Luiz Capitulino | } |
94 | d5ec4f27 | Luiz Capitulino | |
95 | d5ec4f27 | Luiz Capitulino | bool error_is_type(Error *err, const char *fmt) |
96 | d5ec4f27 | Luiz Capitulino | { |
97 | d5ec4f27 | Luiz Capitulino | const char *error_class; |
98 | d5ec4f27 | Luiz Capitulino | char *ptr;
|
99 | d5ec4f27 | Luiz Capitulino | char *end;
|
100 | d5ec4f27 | Luiz Capitulino | |
101 | acceb4d9 | Anthony Liguori | if (!err) {
|
102 | acceb4d9 | Anthony Liguori | return false; |
103 | acceb4d9 | Anthony Liguori | } |
104 | acceb4d9 | Anthony Liguori | |
105 | d5ec4f27 | Luiz Capitulino | ptr = strstr(fmt, "'class': '");
|
106 | d5ec4f27 | Luiz Capitulino | assert(ptr != NULL);
|
107 | d5ec4f27 | Luiz Capitulino | ptr += strlen("'class': '");
|
108 | d5ec4f27 | Luiz Capitulino | |
109 | d5ec4f27 | Luiz Capitulino | end = strchr(ptr, '\'');
|
110 | d5ec4f27 | Luiz Capitulino | assert(end != NULL);
|
111 | d5ec4f27 | Luiz Capitulino | |
112 | d5ec4f27 | Luiz Capitulino | error_class = error_get_field(err, "class");
|
113 | d5ec4f27 | Luiz Capitulino | if (strlen(error_class) != end - ptr) {
|
114 | d5ec4f27 | Luiz Capitulino | return false; |
115 | d5ec4f27 | Luiz Capitulino | } |
116 | d5ec4f27 | Luiz Capitulino | |
117 | d5ec4f27 | Luiz Capitulino | return strncmp(ptr, error_class, end - ptr) == 0; |
118 | d5ec4f27 | Luiz Capitulino | } |
119 | d5ec4f27 | Luiz Capitulino | |
120 | d5ec4f27 | Luiz Capitulino | void error_propagate(Error **dst_err, Error *local_err)
|
121 | d5ec4f27 | Luiz Capitulino | { |
122 | d5ec4f27 | Luiz Capitulino | if (dst_err) {
|
123 | d5ec4f27 | Luiz Capitulino | *dst_err = local_err; |
124 | d5ec4f27 | Luiz Capitulino | } else if (local_err) { |
125 | d5ec4f27 | Luiz Capitulino | error_free(local_err); |
126 | d5ec4f27 | Luiz Capitulino | } |
127 | d5ec4f27 | Luiz Capitulino | } |
128 | d5ec4f27 | Luiz Capitulino | |
129 | d5ec4f27 | Luiz Capitulino | QObject *error_get_qobject(Error *err) |
130 | d5ec4f27 | Luiz Capitulino | { |
131 | d5ec4f27 | Luiz Capitulino | QINCREF(err->obj); |
132 | d5ec4f27 | Luiz Capitulino | return QOBJECT(err->obj);
|
133 | d5ec4f27 | Luiz Capitulino | } |
134 | d5ec4f27 | Luiz Capitulino | |
135 | d5ec4f27 | Luiz Capitulino | void error_set_qobject(Error **errp, QObject *obj)
|
136 | d5ec4f27 | Luiz Capitulino | { |
137 | d5ec4f27 | Luiz Capitulino | Error *err; |
138 | d5ec4f27 | Luiz Capitulino | if (errp == NULL) { |
139 | d5ec4f27 | Luiz Capitulino | return;
|
140 | d5ec4f27 | Luiz Capitulino | } |
141 | 7267c094 | Anthony Liguori | err = g_malloc0(sizeof(*err));
|
142 | d5ec4f27 | Luiz Capitulino | err->obj = qobject_to_qdict(obj); |
143 | d5ec4f27 | Luiz Capitulino | qobject_incref(obj); |
144 | d5ec4f27 | Luiz Capitulino | |
145 | d5ec4f27 | Luiz Capitulino | *errp = err; |
146 | d5ec4f27 | Luiz Capitulino | } |