4 * Copyright (C) 2009 Red Hat Inc.
7 * Luiz Capitulino <lcapitulino@redhat.com>
9 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
10 * See the COPYING.LIB file in the top-level directory.
13 #include "monitor/monitor.h"
14 #include "qapi/qmp/qjson.h"
15 #include "qapi/qmp/qerror.h"
16 #include "qemu-common.h"
18 static void qerror_destroy_obj(QObject
*obj
);
20 static const QType qerror_type
= {
22 .destroy
= qerror_destroy_obj
,
26 * qerror_new(): Create a new QError
28 * Return strong reference.
30 static QError
*qerror_new(void)
34 qerr
= g_malloc0(sizeof(*qerr
));
35 QOBJECT_INIT(qerr
, &qerror_type
);
41 * qerror_from_info(): Create a new QError from error information
43 * Return strong reference.
45 static QError
* GCC_FMT_ATTR(2, 0)
46 qerror_from_info(ErrorClass err_class
, const char *fmt
, va_list *va
)
53 qerr
->err_msg
= g_strdup_vprintf(fmt
, *va
);
54 qerr
->err_class
= err_class
;
60 * qerror_human(): Format QError data into human-readable string.
62 QString
*qerror_human(const QError
*qerror
)
64 return qstring_from_str(qerror
->err_msg
);
68 * qerror_print(): Print QError data
70 * This function will print the member 'desc' of the specified QError object,
71 * it uses error_report() for this, so that the output is routed to the right
72 * place (ie. stderr or Monitor's device).
74 static void qerror_print(QError
*qerror
)
76 QString
*qstring
= qerror_human(qerror
);
77 loc_push_restore(&qerror
->loc
);
78 error_report("%s", qstring_get_str(qstring
));
79 loc_pop(&qerror
->loc
);
83 void qerror_report(ErrorClass eclass
, const char *fmt
, ...)
89 qerror
= qerror_from_info(eclass
, fmt
, &va
);
92 if (monitor_cur_is_qmp()) {
93 monitor_set_error(cur_mon
, qerror
);
104 ErrorClass err_class
;
107 void qerror_report_err(Error
*err
)
112 loc_save(&qerr
->loc
);
113 qerr
->err_msg
= g_strdup(err
->msg
);
114 qerr
->err_class
= err
->err_class
;
116 if (monitor_cur_is_qmp()) {
117 monitor_set_error(cur_mon
, qerr
);
124 void assert_no_error(Error
*err
)
127 qerror_report_err(err
);
133 * qobject_to_qerror(): Convert a QObject into a QError
135 static QError
*qobject_to_qerror(const QObject
*obj
)
137 if (qobject_type(obj
) != QTYPE_QERROR
) {
141 return container_of(obj
, QError
, base
);
145 * qerror_destroy_obj(): Free all memory allocated by a QError
147 static void qerror_destroy_obj(QObject
*obj
)
152 qerr
= qobject_to_qerror(obj
);
154 g_free(qerr
->err_msg
);