From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> 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@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list