Skip to content

Commit

Permalink
error, qerror: add ErrorClass argument to error functions
Browse files Browse the repository at this point in the history
The new argument is added to functions qerror_report() and error_set().
It's stored in Error and QError. qerror_report_err() is also updated to
take care of it.

The QERR_ macros are changed to contain a place holder value for the
new argument, so that the value is used on all current calls to
qerror_report() and error_set() (and also to initialize qerror_table[]).

Next commit will update the QERR_ macros with a proper ErrorClass
value.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
  • Loading branch information
Luiz Capitulino committed Aug 13, 2012
1 parent 8546505 commit 13f59ae
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 78 deletions.
8 changes: 6 additions & 2 deletions error.c
Expand Up @@ -14,16 +14,18 @@
#include "error.h"
#include "qjson.h"
#include "qdict.h"
#include "qapi-types.h"
#include "error_int.h"
#include "qerror.h"

struct Error
{
QDict *obj;
char *msg;
ErrorClass err_class;
};

void error_set(Error **errp, const char *fmt, ...)
void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
{
Error *err;
va_list ap;
Expand All @@ -39,6 +41,7 @@ void error_set(Error **errp, const char *fmt, ...)
err->obj = qobject_to_qdict(qobject_from_jsonv(fmt, &ap));
va_end(ap);
err->msg = qerror_format(fmt, err->obj);
err->err_class = err_class;

*errp = err;
}
Expand All @@ -49,6 +52,7 @@ Error *error_copy(const Error *err)

err_new = g_malloc0(sizeof(*err));
err_new->msg = g_strdup(err->msg);
err_new->err_class = err->err_class;
err_new->obj = err->obj;
QINCREF(err_new->obj);

Expand Down Expand Up @@ -97,7 +101,7 @@ void error_free(Error *err)
}
}

bool error_is_type(Error *err, const char *fmt)
bool error_is_type(Error *err, ErrorClass err_class, const char *fmt)
{
const char *error_class;
char *ptr;
Expand Down
5 changes: 3 additions & 2 deletions error.h
Expand Up @@ -13,6 +13,7 @@
#define ERROR_H

#include "compiler.h"
#include "qapi-types.h"
#include <stdbool.h>

/**
Expand All @@ -26,7 +27,7 @@ typedef struct Error Error;
* Currently, qerror.h defines these error formats. This function is not
* meant to be used outside of QEMU.
*/
void error_set(Error **err, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
void error_set(Error **err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(3, 4);

/**
* Returns true if an indirect pointer to an error is pointing to a valid
Expand Down Expand Up @@ -70,6 +71,6 @@ void error_free(Error *err);
* Determine if an error is of a speific type (based on the qerror format).
* Non-QEMU users should get the `class' field to identify the error type.
*/
bool error_is_type(Error *err, const char *fmt);
bool error_is_type(Error *err, ErrorClass err_class, const char *fmt);

#endif
10 changes: 7 additions & 3 deletions qerror.c
Expand Up @@ -386,13 +386,15 @@ static QDict *error_obj_from_fmt_no_fail(const char *fmt, va_list *va)
*
* Return strong reference.
*/
static QError *qerror_from_info(const char *fmt, va_list *va)
static QError *qerror_from_info(ErrorClass err_class, const char *fmt,
va_list *va)
{
QError *qerr;

qerr = qerror_new();
loc_save(&qerr->loc);

qerr->err_class = err_class;
qerr->error = error_obj_from_fmt_no_fail(fmt, va);
qerr->err_msg = qerror_format(fmt, qerr->error);

Expand Down Expand Up @@ -518,13 +520,13 @@ static void qerror_print(QError *qerror)
QDECREF(qstring);
}

void qerror_report(const char *fmt, ...)
void qerror_report(ErrorClass eclass, const char *fmt, ...)
{
va_list va;
QError *qerror;

va_start(va, fmt);
qerror = qerror_from_info(fmt, &va);
qerror = qerror_from_info(eclass, fmt, &va);
va_end(va);

if (monitor_cur_is_qmp()) {
Expand All @@ -540,6 +542,7 @@ struct Error
{
QDict *obj;
char *msg;
ErrorClass err_class;
};

void qerror_report_err(Error *err)
Expand All @@ -551,6 +554,7 @@ void qerror_report_err(Error *err)
QINCREF(err->obj);
qerr->error = err->obj;
qerr->err_msg = g_strdup(err->msg);
qerr->err_class = err->err_class;

if (monitor_cur_is_qmp()) {
monitor_set_error(cur_mon, qerr);
Expand Down

0 comments on commit 13f59ae

Please sign in to comment.