root / error.c @ 333c574d
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 | d5ec4f27 | Luiz Capitulino | #include "error_int.h" |
16 | d5ec4f27 | Luiz Capitulino | #include "qemu-objects.h" |
17 | d5ec4f27 | Luiz Capitulino | #include "qerror.h" |
18 | d5ec4f27 | Luiz Capitulino | |
19 | d5ec4f27 | Luiz Capitulino | struct Error
|
20 | d5ec4f27 | Luiz Capitulino | { |
21 | d5ec4f27 | Luiz Capitulino | QDict *obj; |
22 | d5ec4f27 | Luiz Capitulino | const char *fmt; |
23 | d5ec4f27 | Luiz Capitulino | char *msg;
|
24 | d5ec4f27 | Luiz Capitulino | }; |
25 | d5ec4f27 | Luiz Capitulino | |
26 | d5ec4f27 | Luiz Capitulino | void error_set(Error **errp, 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 | d5ec4f27 | Luiz Capitulino | |
35 | d5ec4f27 | Luiz Capitulino | err = qemu_mallocz(sizeof(*err));
|
36 | d5ec4f27 | Luiz Capitulino | |
37 | d5ec4f27 | Luiz Capitulino | va_start(ap, fmt); |
38 | d5ec4f27 | Luiz Capitulino | err->obj = qobject_to_qdict(qobject_from_jsonv(fmt, &ap)); |
39 | d5ec4f27 | Luiz Capitulino | va_end(ap); |
40 | d5ec4f27 | Luiz Capitulino | err->fmt = fmt; |
41 | d5ec4f27 | Luiz Capitulino | |
42 | d5ec4f27 | Luiz Capitulino | *errp = err; |
43 | d5ec4f27 | Luiz Capitulino | } |
44 | d5ec4f27 | Luiz Capitulino | |
45 | d5ec4f27 | Luiz Capitulino | bool error_is_set(Error **errp)
|
46 | d5ec4f27 | Luiz Capitulino | { |
47 | d5ec4f27 | Luiz Capitulino | return (errp && *errp);
|
48 | d5ec4f27 | Luiz Capitulino | } |
49 | d5ec4f27 | Luiz Capitulino | |
50 | d5ec4f27 | Luiz Capitulino | const char *error_get_pretty(Error *err) |
51 | d5ec4f27 | Luiz Capitulino | { |
52 | d5ec4f27 | Luiz Capitulino | if (err->msg == NULL) { |
53 | d5ec4f27 | Luiz Capitulino | QString *str; |
54 | d5ec4f27 | Luiz Capitulino | str = qerror_format(err->fmt, err->obj); |
55 | d5ec4f27 | Luiz Capitulino | err->msg = qemu_strdup(qstring_get_str(str)); |
56 | d5ec4f27 | Luiz Capitulino | QDECREF(str); |
57 | d5ec4f27 | Luiz Capitulino | } |
58 | d5ec4f27 | Luiz Capitulino | |
59 | d5ec4f27 | Luiz Capitulino | return err->msg;
|
60 | d5ec4f27 | Luiz Capitulino | } |
61 | d5ec4f27 | Luiz Capitulino | |
62 | d5ec4f27 | Luiz Capitulino | const char *error_get_field(Error *err, const char *field) |
63 | d5ec4f27 | Luiz Capitulino | { |
64 | d5ec4f27 | Luiz Capitulino | if (strcmp(field, "class") == 0) { |
65 | d5ec4f27 | Luiz Capitulino | return qdict_get_str(err->obj, field);
|
66 | d5ec4f27 | Luiz Capitulino | } else {
|
67 | d5ec4f27 | Luiz Capitulino | QDict *dict = qdict_get_qdict(err->obj, "data");
|
68 | d5ec4f27 | Luiz Capitulino | return qdict_get_str(dict, field);
|
69 | d5ec4f27 | Luiz Capitulino | } |
70 | d5ec4f27 | Luiz Capitulino | } |
71 | d5ec4f27 | Luiz Capitulino | |
72 | d5ec4f27 | Luiz Capitulino | QDict *error_get_data(Error *err) |
73 | d5ec4f27 | Luiz Capitulino | { |
74 | d5ec4f27 | Luiz Capitulino | QDict *data = qdict_get_qdict(err->obj, "data");
|
75 | d5ec4f27 | Luiz Capitulino | QINCREF(data); |
76 | d5ec4f27 | Luiz Capitulino | return data;
|
77 | d5ec4f27 | Luiz Capitulino | } |
78 | d5ec4f27 | Luiz Capitulino | |
79 | d5ec4f27 | Luiz Capitulino | void error_set_field(Error *err, const char *field, const char *value) |
80 | d5ec4f27 | Luiz Capitulino | { |
81 | d5ec4f27 | Luiz Capitulino | QDict *dict = qdict_get_qdict(err->obj, "data");
|
82 | d5ec4f27 | Luiz Capitulino | return qdict_put(dict, field, qstring_from_str(value));
|
83 | d5ec4f27 | Luiz Capitulino | } |
84 | d5ec4f27 | Luiz Capitulino | |
85 | d5ec4f27 | Luiz Capitulino | void error_free(Error *err)
|
86 | d5ec4f27 | Luiz Capitulino | { |
87 | d5ec4f27 | Luiz Capitulino | if (err) {
|
88 | d5ec4f27 | Luiz Capitulino | QDECREF(err->obj); |
89 | d5ec4f27 | Luiz Capitulino | qemu_free(err->msg); |
90 | d5ec4f27 | Luiz Capitulino | qemu_free(err); |
91 | d5ec4f27 | Luiz Capitulino | } |
92 | d5ec4f27 | Luiz Capitulino | } |
93 | d5ec4f27 | Luiz Capitulino | |
94 | d5ec4f27 | Luiz Capitulino | bool error_is_type(Error *err, const char *fmt) |
95 | d5ec4f27 | Luiz Capitulino | { |
96 | d5ec4f27 | Luiz Capitulino | const char *error_class; |
97 | d5ec4f27 | Luiz Capitulino | char *ptr;
|
98 | d5ec4f27 | Luiz Capitulino | char *end;
|
99 | d5ec4f27 | Luiz Capitulino | |
100 | d5ec4f27 | Luiz Capitulino | ptr = strstr(fmt, "'class': '");
|
101 | d5ec4f27 | Luiz Capitulino | assert(ptr != NULL);
|
102 | d5ec4f27 | Luiz Capitulino | ptr += strlen("'class': '");
|
103 | d5ec4f27 | Luiz Capitulino | |
104 | d5ec4f27 | Luiz Capitulino | end = strchr(ptr, '\'');
|
105 | d5ec4f27 | Luiz Capitulino | assert(end != NULL);
|
106 | d5ec4f27 | Luiz Capitulino | |
107 | d5ec4f27 | Luiz Capitulino | error_class = error_get_field(err, "class");
|
108 | d5ec4f27 | Luiz Capitulino | if (strlen(error_class) != end - ptr) {
|
109 | d5ec4f27 | Luiz Capitulino | return false; |
110 | d5ec4f27 | Luiz Capitulino | } |
111 | d5ec4f27 | Luiz Capitulino | |
112 | d5ec4f27 | Luiz Capitulino | return strncmp(ptr, error_class, end - ptr) == 0; |
113 | d5ec4f27 | Luiz Capitulino | } |
114 | d5ec4f27 | Luiz Capitulino | |
115 | d5ec4f27 | Luiz Capitulino | void error_propagate(Error **dst_err, Error *local_err)
|
116 | d5ec4f27 | Luiz Capitulino | { |
117 | d5ec4f27 | Luiz Capitulino | if (dst_err) {
|
118 | d5ec4f27 | Luiz Capitulino | *dst_err = local_err; |
119 | d5ec4f27 | Luiz Capitulino | } else if (local_err) { |
120 | d5ec4f27 | Luiz Capitulino | error_free(local_err); |
121 | d5ec4f27 | Luiz Capitulino | } |
122 | d5ec4f27 | Luiz Capitulino | } |
123 | d5ec4f27 | Luiz Capitulino | |
124 | d5ec4f27 | Luiz Capitulino | QObject *error_get_qobject(Error *err) |
125 | d5ec4f27 | Luiz Capitulino | { |
126 | d5ec4f27 | Luiz Capitulino | QINCREF(err->obj); |
127 | d5ec4f27 | Luiz Capitulino | return QOBJECT(err->obj);
|
128 | d5ec4f27 | Luiz Capitulino | } |
129 | d5ec4f27 | Luiz Capitulino | |
130 | d5ec4f27 | Luiz Capitulino | void error_set_qobject(Error **errp, QObject *obj)
|
131 | d5ec4f27 | Luiz Capitulino | { |
132 | d5ec4f27 | Luiz Capitulino | Error *err; |
133 | d5ec4f27 | Luiz Capitulino | if (errp == NULL) { |
134 | d5ec4f27 | Luiz Capitulino | return;
|
135 | d5ec4f27 | Luiz Capitulino | } |
136 | d5ec4f27 | Luiz Capitulino | err = qemu_mallocz(sizeof(*err));
|
137 | d5ec4f27 | Luiz Capitulino | err->obj = qobject_to_qdict(obj); |
138 | d5ec4f27 | Luiz Capitulino | qobject_incref(obj); |
139 | d5ec4f27 | Luiz Capitulino | |
140 | d5ec4f27 | Luiz Capitulino | *errp = err; |
141 | d5ec4f27 | Luiz Capitulino | } |