Currently, most src/* files have their own ReportError
function. Some support printf style arguments, others
only allow reporting a single string message. The code
for all of them does virtually the same thing, possibly
passing a different constant off to another function.
The attached patch adds a function to virterror.c which
encapsulates the common ReportError logic. I used this
to replace qemudReportError with a macro, which also
allows passing off filename and line number info if
we wanted to do something with it later.
I did just the one function conversion to see what
people think: if I'm missing something, or ideas for
anything else to add. Seems to work as expected in
my testing.
Thanks,
Cole
diff --git a/src/internal.h b/src/internal.h
index a3d48fa..07fc151 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -313,6 +313,10 @@ void __virRaiseError(virConnectPtr conn,
int int1, int int2, const char *msg, ...)
ATTRIBUTE_FORMAT(printf, 12, 13);
const char *__virErrorMsg(virErrorNumber error, const char *info);
+void __virReportErrorHelper(virConnectPtr conn, virDomainPtr dom, virNetworkPtr net,
+ int domcode, int errcode, const char *filename,
+ long long filenr, const char *fmt, ...)
+ ATTRIBUTE_FORMAT(printf, 8, 9);
/************************************************************************
* *
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index 314c14a..2513f74 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -59,27 +59,6 @@ VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
#define qemudLog(level, msg...) fprintf(stderr, msg)
-void qemudReportError(virConnectPtr conn,
- virDomainPtr dom,
- virNetworkPtr net,
- int code, const char *fmt, ...) {
- va_list args;
- char errorMessage[1024];
- const char *virerr;
-
- if (fmt) {
- va_start(args, fmt);
- vsnprintf(errorMessage, sizeof(errorMessage)-1, fmt, args);
- va_end(args);
- } else {
- errorMessage[0] = '\0';
- }
-
- virerr = __virErrorMsg(code, (errorMessage[0] ? errorMessage : NULL));
- __virRaiseError(conn, dom, net, VIR_FROM_QEMU, code, VIR_ERR_ERROR,
- virerr, errorMessage, NULL, -1, -1, virerr, errorMessage);
-}
-
int qemudLoadDriverConfig(struct qemud_driver *driver,
const char *filename) {
virConfPtr conf;
diff --git a/src/qemu_conf.h b/src/qemu_conf.h
index 0099dff..a3c9b74 100644
--- a/src/qemu_conf.h
+++ b/src/qemu_conf.h
@@ -69,11 +69,9 @@ struct qemud_driver {
};
-void qemudReportError(virConnectPtr conn,
- virDomainPtr dom,
- virNetworkPtr net,
- int code, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf,5,6);
+#define qemudReportError(conn, dom, net, code, fmt...) \
+ __virReportErrorHelper(conn, dom, net, VIR_FROM_QEMU, code, \
+ __FILE__, __LINE__, fmt)
int qemudLoadDriverConfig(struct qemud_driver *driver,
diff --git a/src/virterror.c b/src/virterror.c
index 4aa7f42..bae6f55 100644
--- a/src/virterror.c
+++ b/src/virterror.c
@@ -722,3 +722,42 @@ __virErrorMsg(virErrorNumber error, const char *info)
}
return (errmsg);
}
+
+/**
+ * __virReportErrorHelper
+ *
+ * @conn: the connection to the hypervisor if available
+ * @dom: the domain if available
+ * @net: the network if available
+ * @domcode: the virErrorDomain indicating where it's coming from
+ * @errcode: the virErrorNumber code for the error
+ * @filename: Source file error is dispatched from
+ * @linenr: Line number error is dispatched from
+ * @msg: the message to display/transmit
+ * @...: extra parameters for the message display
+ *
+ * Helper function to do most of the grunt work for individual driver ReportError
+ */
+void __virReportErrorHelper(virConnectPtr conn, virDomainPtr dom, virNetworkPtr net,
+ int domcode, int errcode,
+ const char *filename ATTRIBUTE_UNUSED,
+ long long linenr ATTRIBUTE_UNUSED,
+ const char *fmt, ...)
+{
+ va_list args;
+ char errorMessage[1024];
+ const char *virerr;
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(errorMessage, sizeof(errorMessage)-1, fmt, args);
+ va_end(args);
+ } else {
+ errorMessage[0] = '\0';
+ }
+
+ virerr = __virErrorMsg(errcode, (errorMessage[0] ? errorMessage : NULL));
+ __virRaiseError(conn, dom, net, domcode, errcode, VIR_ERR_ERROR,
+ virerr, errorMessage, NULL, -1, -1, virerr, errorMessage);
+
+}
--
Libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list