From f5384eed3ff62f92ac2d5a4e93dc13b56f42dbbf Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 19 Jul 2013 11:14:51 +0100 Subject: [PATCH] Add helpers for dealing with system errors Add virErrorSetErrnoFromLastError and virLastErrorIsSystemErrno to simplify code which wants to handle system errors in a more graceful fashion. Signed-off-by: Daniel P. Berrange --- src/libvirt_private.syms | 2 ++ src/util/virerror.c | 48 ++++++++++++++++++++++++++++++++++++++++ src/util/virerror.h | 4 ++++ 3 files changed, 54 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5d39d50ef2..2a38d89119 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1318,6 +1318,8 @@ ebtablesRemoveForwardAllowIn; # util/virerror.h virDispatchError; virErrorInitialize; +virErrorSetErrnoFromLastError; +virLastErrorIsSystemErrno; virRaiseErrorFull; virReportErrorHelper; virReportOOMErrorFull; diff --git a/src/util/virerror.c b/src/util/virerror.c index 36d256bbf7..b92c6d1052 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 error 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 6ea456b8f5..05e9950a9b 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