root / error.c @ 130c57c0
History | View | Annotate | Download (2 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 | 13f59ae8 | Luiz Capitulino | #include "qapi-types.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 | 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 | 79020cfc | Luiz Capitulino | Error *error_copy(const Error *err)
|
75 | 79020cfc | Luiz Capitulino | { |
76 | 79020cfc | Luiz Capitulino | Error *err_new; |
77 | 79020cfc | Luiz Capitulino | |
78 | 79020cfc | Luiz Capitulino | err_new = g_malloc0(sizeof(*err));
|
79 | 79020cfc | Luiz Capitulino | err_new->msg = g_strdup(err->msg); |
80 | 13f59ae8 | Luiz Capitulino | err_new->err_class = err->err_class; |
81 | 79020cfc | Luiz Capitulino | |
82 | 79020cfc | Luiz Capitulino | return err_new;
|
83 | 79020cfc | Luiz Capitulino | } |
84 | 79020cfc | Luiz Capitulino | |
85 | d5ec4f27 | Luiz Capitulino | bool error_is_set(Error **errp)
|
86 | d5ec4f27 | Luiz Capitulino | { |
87 | d5ec4f27 | Luiz Capitulino | return (errp && *errp);
|
88 | d5ec4f27 | Luiz Capitulino | } |
89 | d5ec4f27 | Luiz Capitulino | |
90 | ea25fbca | Luiz Capitulino | ErrorClass error_get_class(const Error *err)
|
91 | ea25fbca | Luiz Capitulino | { |
92 | ea25fbca | Luiz Capitulino | return err->err_class;
|
93 | ea25fbca | Luiz Capitulino | } |
94 | ea25fbca | Luiz Capitulino | |
95 | d5ec4f27 | Luiz Capitulino | const char *error_get_pretty(Error *err) |
96 | d5ec4f27 | Luiz Capitulino | { |
97 | d5ec4f27 | Luiz Capitulino | return err->msg;
|
98 | d5ec4f27 | Luiz Capitulino | } |
99 | d5ec4f27 | Luiz Capitulino | |
100 | d5ec4f27 | Luiz Capitulino | void error_free(Error *err)
|
101 | d5ec4f27 | Luiz Capitulino | { |
102 | d5ec4f27 | Luiz Capitulino | if (err) {
|
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 | void error_propagate(Error **dst_err, Error *local_err)
|
109 | d5ec4f27 | Luiz Capitulino | { |
110 | d195325b | Paolo Bonzini | if (dst_err && !*dst_err) {
|
111 | d5ec4f27 | Luiz Capitulino | *dst_err = local_err; |
112 | d5ec4f27 | Luiz Capitulino | } else if (local_err) { |
113 | d5ec4f27 | Luiz Capitulino | error_free(local_err); |
114 | d5ec4f27 | Luiz Capitulino | } |
115 | d5ec4f27 | Luiz Capitulino | } |