From: "Daniel P. Berrange" <berrange(a)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(a)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