Skip to content

Commit

Permalink
error: Functions to report warnings and informational messages
Browse files Browse the repository at this point in the history
Add warn_report(), warn_vreport() for reporting warnings, and
info_report(), info_vreport() for informational messages.

These are implemented them with a helper function factored out of
error_vreport(), suitably generalized. This patch makes no changes
to the output of the original error_report() function.

Signed-off-by: Alistair Francis <[email protected]>
Reviewed-by: Markus Armbruster <[email protected]>
Message-Id: <c89e9980019f296ec9aa38d7689ac4d5c369296d.1499866456.git.alistair.francis@xilinx.com>
Signed-off-by: Markus Armbruster <[email protected]>
  • Loading branch information
alistair23 authored and Markus Armbruster committed Jul 13, 2017
1 parent beeb175 commit 97f4030
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 6 deletions.
7 changes: 7 additions & 0 deletions include/qemu/error-report.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,15 @@ void error_printf(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
void error_vprintf_unless_qmp(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0);
void error_printf_unless_qmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
void error_set_progname(const char *argv0);

void error_vreport(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0);
void warn_vreport(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0);
void info_vreport(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0);

void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
void warn_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
void info_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);

const char *error_get_progname(void);
extern bool enable_timestamp_msg;

Expand Down
6 changes: 5 additions & 1 deletion scripts/checkpatch.pl
Original file line number Diff line number Diff line change
Expand Up @@ -2535,7 +2535,11 @@ sub process {
error_prepend|
error_reportf_err|
error_vreport|
error_report}x;
warn_vreport|
info_vreport|
error_report|
warn_report|
info_report}x;

if ($rawline =~ /\b(?:$qemu_error_funcs)\s*\(.*\".*\\n/) {
ERROR("Error messages should not contain newlines\n" . $herecurr);
Expand Down
102 changes: 97 additions & 5 deletions util/qemu-error.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@
#include "monitor/monitor.h"
#include "qemu/error-report.h"

/*
* @report_type is the type of message: error, warning or
* informational.
*/
typedef enum {
REPORT_TYPE_ERROR,
REPORT_TYPE_WARNING,
REPORT_TYPE_INFO,
} report_type;

void error_printf(const char *fmt, ...)
{
va_list ap;
Expand Down Expand Up @@ -179,17 +189,29 @@ static void print_loc(void)

bool enable_timestamp_msg;
/*
* Print an error message to current monitor if we have one, else to stderr.
* Print a message to current monitor if we have one, else to stderr.
* @report_type is the type of message: error, warning or informational.
* Format arguments like vsprintf(). The resulting message should be
* a single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
void error_vreport(const char *fmt, va_list ap)
static void vreport(report_type type, const char *fmt, va_list ap)
{
GTimeVal tv;
gchar *timestr;

switch (type) {
case REPORT_TYPE_ERROR:
break;
case REPORT_TYPE_WARNING:
error_printf("warning: ");
break;
case REPORT_TYPE_INFO:
error_printf("info: ");
break;
}

if (enable_timestamp_msg && !cur_mon) {
g_get_current_time(&tv);
timestr = g_time_val_to_iso8601(&tv);
Expand All @@ -204,8 +226,45 @@ void error_vreport(const char *fmt, va_list ap)

/*
* Print an error message to current monitor if we have one, else to stderr.
* Format arguments like sprintf(). The resulting message should be a
* single phrase, with no newline or trailing punctuation.
* Format arguments like vsprintf(). The resulting message should be
* a single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
void error_vreport(const char *fmt, va_list ap)
{
vreport(REPORT_TYPE_ERROR, fmt, ap);
}

/*
* Print a warning message to current monitor if we have one, else to stderr.
* Format arguments like vsprintf(). The resulting message should be
* a single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
void warn_vreport(const char *fmt, va_list ap)
{
vreport(REPORT_TYPE_WARNING, fmt, ap);
}

/*
* Print an information message to current monitor if we have one, else to
* stderr.
* Format arguments like vsprintf(). The resulting message should be
* a single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
void info_vreport(const char *fmt, va_list ap)
{
vreport(REPORT_TYPE_INFO, fmt, ap);
}

/*
* Print an error message to current monitor if we have one, else to stderr.
* Format arguments like sprintf(). The resulting message should be
* a single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
Expand All @@ -214,6 +273,39 @@ void error_report(const char *fmt, ...)
va_list ap;

va_start(ap, fmt);
error_vreport(fmt, ap);
vreport(REPORT_TYPE_ERROR, fmt, ap);
va_end(ap);
}

/*
* Print a warning message to current monitor if we have one, else to stderr.
* Format arguments like sprintf(). The resulting message should be a
* single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
void warn_report(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
vreport(REPORT_TYPE_WARNING, fmt, ap);
va_end(ap);
}

/*
* Print an information message to current monitor if we have one, else to
* stderr.
* Format arguments like sprintf(). The resulting message should be a
* single phrase, with no newline or trailing punctuation.
* Prepend the current location and append a newline.
* It's wrong to call this in a QMP monitor. Use error_setg() there.
*/
void info_report(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
vreport(REPORT_TYPE_INFO, fmt, ap);
va_end(ap);
}

0 comments on commit 97f4030

Please sign in to comment.