From: "Daniel P. Berrange" <berrange(a)redhat.com>
Apps using libvirt will often have code like
if (virXXXX() < 0) {
virErrorPtr err = virGetLastError();
fprintf(stderr, "Something failed: %s\n",
err && err->message ? err->message :
"unknown error");
return -1;
}
Checking for a NULL error object or message leads to very
verbose code. A virGetLastErrorMessage() helper from libvirt
can simplify this to
if (virXXXX() < 0) {
fprintf(stderr, "Something failed: %s\n",
virGetLastErrorMessage());
return -1;
}
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
include/libvirt/virterror.h | 2 ++
src/libvirt_public.syms | 5 +++++
src/util/virerror.c | 21 +++++++++++++++++++++
3 files changed, 28 insertions(+)
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
index 3864a31..cd7e3b3 100644
--- a/include/libvirt/virterror.h
+++ b/include/libvirt/virterror.h
@@ -313,6 +313,8 @@ void virResetLastError (void);
void virResetError (virErrorPtr err);
void virFreeError (virErrorPtr err);
+const char * virGetLastErrorMessage (void);
+
virErrorPtr virConnGetLastError (virConnectPtr conn);
void virConnResetLastError (virConnectPtr conn);
int virCopyLastError (virErrorPtr to);
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index dfbf44e..4ee2d27 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -616,4 +616,9 @@ LIBVIRT_1.0.5 {
virNodeDeviceDetachFlags;
} LIBVIRT_1.0.3;
+LIBVIRT_1.0.6 {
+ global:
+ virGetLastErrorMessage;
+} LIBVIRT_1.0.5;
+
# .... define new API here using predicted next version number ....
diff --git a/src/util/virerror.c b/src/util/virerror.c
index af4da8c..4e1dc9a 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -234,6 +234,27 @@ virGetLastError(void)
return err;
}
+
+/**
+ * virGetLastErrorMessage:
+ *
+ * Get the most recent error message
+ *
+ * Returns the most recent error message string in this
+ * thread, or a generic message if none is set
+ */
+const char *
+virGetLastErrorMessage(void)
+{
+ virErrorPtr err = virLastErrorObject();
+ if (!err || err->code == VIR_ERR_OK)
+ return _("no error");
+ if (err->message == NULL)
+ return _("unknown error");
+ return err->message;
+}
+
+
/**
* virSetError:
* @newerr: previously saved error object
--
1.8.2.1