[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error rep
From: |
Alistair Francis |
Subject: |
[Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting |
Date: |
Wed, 5 Jul 2017 10:36:28 -0700 |
This patch converts the existing error_vreport() function into a generic
qmesg_vreport() function that takes an enum describing the
information to be reported.
As part of this change a new qmesg_report() function is added as well with the
same capability.
To maintain full compatibility the original error_report() function is
maintained and no changes to the way errors are printed have been made.
To improve access to the new informaiton and warning options wrapper functions
similar to error_report() have been added for warnings and information
printing.
Signed-off-by: Alistair Francis <address@hidden>
---
RFC V3:
- Change the function and enum names to be more descriptive
- Add wrapper functions for *_report() and *_vreport()
include/qemu/error-report.h | 16 +++++++++
scripts/checkpatch.pl | 8 ++++-
util/qemu-error.c | 80 +++++++++++++++++++++++++++++++++++++++++++--
3 files changed, 100 insertions(+), 4 deletions(-)
diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h
index 3001865896..62fc167ace 100644
--- a/include/qemu/error-report.h
+++ b/include/qemu/error-report.h
@@ -21,6 +21,12 @@ typedef struct Location {
struct Location *prev;
} Location;
+typedef enum {
+ REPORT_TYPE_ERROR,
+ REPORT_TYPE_WARNING,
+ REPORT_TYPE_INFO,
+} report_type;
+
Location *loc_push_restore(Location *loc);
Location *loc_push_none(Location *loc);
Location *loc_pop(Location *loc);
@@ -30,13 +36,23 @@ void loc_set_none(void);
void loc_set_cmdline(char **argv, int idx, int cnt);
void loc_set_file(const char *fname, int lno);
+void qmsg_vreport(report_type type, const char *fmt, va_list ap)
GCC_FMT_ATTR(2, 0);
+void qmsg_report(report_type type, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
+
void error_vprintf(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0);
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;
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 45027b9281..8b02621739 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -2530,8 +2530,14 @@ sub process {
error_set|
error_prepend|
error_reportf_err|
+ qmsg_vreport|
error_vreport|
- error_report}x;
+ warn_vreport|
+ info_vreport|
+ qmsg_report|
+ error_report|
+ warn_report|
+ info_report}x;
if ($rawline =~ /\b(?:$qemu_error_funcs)\s*\(.*\".*\\n/) {
ERROR("Error messages should not contain newlines\n" .
$herecurr);
diff --git a/util/qemu-error.c b/util/qemu-error.c
index 1c5e35ecdb..63fdc0e174 100644
--- a/util/qemu-error.c
+++ b/util/qemu-error.c
@@ -179,17 +179,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.
* 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)
+void qmsg_vreport(report_type type, const char *fmt, va_list ap)
{
GTimeVal tv;
gchar *timestr;
+ switch (type) {
+ case REPORT_TYPE_ERROR:
+ /* To maintain compatibility we don't add anything here */
+ 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);
@@ -204,16 +216,78 @@ void error_vreport(const char *fmt, va_list ap)
/*
* Print an error message to current monitor if we have one, else to stderr.
+ */
+void error_vreport(const char *fmt, va_list ap)
+{
+ qmsg_vreport(REPORT_TYPE_ERROR, fmt, ap);
+}
+
+/*
+ * Print a warning message to current monitor if we have one, else to stderr.
+ */
+void warn_vreport(const char *fmt, va_list ap)
+{
+ qmsg_vreport(REPORT_TYPE_WARNING, fmt, ap);
+}
+
+/*
+ * Print an information message to current monitor if we have one, else to
+ * stderr.
+ */
+void info_vreport(const char *fmt, va_list ap)
+{
+ qmsg_vreport(REPORT_TYPE_INFO, fmt, ap);
+}
+
+/*
+ * Print a 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 qmsg_report(report_type type, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ qmsg_vreport(type, fmt, ap);
+ va_end(ap);
+}
+
+/*
+ * Print an error message to current monitor if we have one, else to stderr.
+ */
void error_report(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- error_vreport(fmt, ap);
+ qmsg_vreport(REPORT_TYPE_ERROR, fmt, ap);
+ va_end(ap);
+}
+
+/*
+ * Print a warning message to current monitor if we have one, else to stderr.
+ */
+void warn_report(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ qmsg_vreport(REPORT_TYPE_WARNING, fmt, ap);
+ va_end(ap);
+}
+
+/*
+ * Print an information message to current monitor if we have one, else to
+ * stderr.
+ */
+void info_report(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ qmsg_vreport(REPORT_TYPE_INFO, fmt, ap);
va_end(ap);
}
--
2.11.0
- [Qemu-devel] [RFC v3 0/3] Implement a warning_report function, Alistair Francis, 2017/07/05
- [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting,
Alistair Francis <=
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Thomas Huth, 2017/07/05
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Markus Armbruster, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Daniel P. Berrange, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Markus Armbruster, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Daniel P. Berrange, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Markus Armbruster, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Daniel P. Berrange, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Markus Armbruster, 2017/07/06
- Re: [Qemu-devel] [RFC v3 2/3] qemu-error: Implement a more generic error reporting, Alistair Francis, 2017/07/06
[Qemu-devel] [RFC v3 3/3] char-socket: Report TCP socket waiting as information, Alistair Francis, 2017/07/05