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