[libvirt] [PATCH] Add helpers for dealing with system errors

Daniel P. Berrange berrange at redhat.com
Fri Jul 19 14:14:53 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

Add virErrorSetErrnoFromLastError and virLastErrorIsSystemErrno
to simplify code which wants to handle system errors in a more
graceful fashion.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/libvirt_private.syms |  1 +
 src/util/virerror.c      | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/util/virerror.h      |  4 ++++
 3 files changed, 53 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5d39d50..a2b61c7 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1318,6 +1318,7 @@ ebtablesRemoveForwardAllowIn;
 # util/virerror.h
 virDispatchError;
 virErrorInitialize;
+virLastErrorIsSystemErrno;
 virRaiseErrorFull;
 virReportErrorHelper;
 virReportOOMErrorFull;
diff --git a/src/util/virerror.c b/src/util/virerror.c
index 36d256b..e90ff07 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -1404,3 +1404,51 @@ void virSetErrorLogPriorityFunc(virErrorLogPriorityFunc func)
 {
     virErrorLogPriorityFilter = func;
 }
+
+
+/**
+ * virErrorSetErrnoFromLastError:
+ *
+ * If the last error had a code of VIR_ERR_SYSTEM_ERROR
+ * then set errno to the value saved in the error object.
+ *
+ * If the last error had a code of VIR_ERR_NO_MEMORY
+ * then set errno to ENOMEM
+ *
+ * Otherwise set errno to EIO.
+ */
+void virErrorSetErrnoFromLastError(void)
+{
+    virErrorPtr err = virGetLastError();
+    if (err && err->code == VIR_ERR_SYSTEM_ERROR) {
+        errno = err->int1;
+    } else if (err && err->code == VIR_ERR_NO_MEMORY) {
+        errno = ENOMEM;
+    } else {
+        errno = EIO;
+    }
+}
+
+
+/**
+ * virLastErrorIsSystemErrno:
+ * @errnum: the errno value
+ *
+ * Check if the last error reported is a system
+ * error with the specific errno value.
+ *
+ * If @errnum is zero, any system error will pass.
+ *
+ * Returns true if the last errr was a system error with errno == @errnum
+ */
+bool virLastErrorIsSystemErrno(int errnum)
+{
+    virErrorPtr err = virGetLastError();
+    if (!err)
+        return false;
+    if (err->code != VIR_ERR_SYSTEM_ERROR)
+        return false;
+    if (errnum != 0 && err->int1 != errnum)
+        return false;
+    return true;
+}
diff --git a/src/util/virerror.h b/src/util/virerror.h
index 6ea456b..05e9950 100644
--- a/src/util/virerror.h
+++ b/src/util/virerror.h
@@ -175,4 +175,8 @@ const char *virStrerror(int theerrno, char *errBuf, size_t errBufLen);
 typedef int (*virErrorLogPriorityFunc)(virErrorPtr, int);
 void virSetErrorLogPriorityFunc(virErrorLogPriorityFunc func);
 
+void virErrorSetErrnoFromLastError(void);
+
+bool virLastErrorIsSystemErrno(int errnum);
+
 #endif
-- 
1.8.1.4




More information about the libvir-list mailing list