From 8333e7455eb2a28cb1e6f2415597d0e57a11a15b Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 1 Sep 2017 16:19:56 +0200 Subject: [PATCH] util: error: Add helpers for saving and restoring of last error Some cleanup paths overwrite a usefull error message with a less useful one and we then try to preserve the original message. The handlers added in this patch will simplify the operations since they are designed right for the purpose. --- src/libvirt_private.syms | 2 ++ src/util/virerror.c | 45 ++++++++++++++++++++++++++++++++++++++++ src/util/virerror.h | 3 +++ 3 files changed, 50 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 247d1175ba..e4fa771d9d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1605,6 +1605,8 @@ ebtablesRemoveForwardAllowIn; virDispatchError; virErrorCopyNew; virErrorInitialize; +virErrorPreserveLast; +virErrorRestore; virErrorSetErrnoFromLastError; virLastErrorIsSystemErrno; virRaiseErrorFull; diff --git a/src/util/virerror.c b/src/util/virerror.c index a5a2d6ed10..1f15c5dbbe 100644 --- a/src/util/virerror.c +++ b/src/util/virerror.c @@ -371,6 +371,51 @@ virSaveLastError(void) return to; } + +/** + * virErrorPreserveLast: + * @saveerr: pointer to virErrorPtr for storing last error object + * + * Preserves the currently set last error (for the thread) into @saveerr so that + * it can be restored via virErrorRestore(). @saveerr must be passed to + * virErrorRestore() + */ +void +virErrorPreserveLast(virErrorPtr *saveerr) +{ + int saved_errno = errno; + virErrorPtr lasterr = virGetLastError(); + + *saveerr = NULL; + + if (lasterr) + *saveerr = virErrorCopyNew(lasterr); + + errno = saved_errno; +} + + +/** + * virErrorRestore: + * @savederr: error object holding saved error + * + * Restores the error passed via @savederr and clears associated memory. + */ +void +virErrorRestore(virErrorPtr *savederr) +{ + int saved_errno = errno; + + if (!*savederr) + return; + + virSetError(*savederr); + virFreeError(*savederr); + *savederr = NULL; + errno = saved_errno; +} + + /** * virResetError: * @err: pointer to the virError to clean up diff --git a/src/util/virerror.h b/src/util/virerror.h index 234864812a..54530d0811 100644 --- a/src/util/virerror.h +++ b/src/util/virerror.h @@ -196,4 +196,7 @@ void virErrorSetErrnoFromLastError(void); bool virLastErrorIsSystemErrno(int errnum); +void virErrorPreserveLast(virErrorPtr *saveerr); +void virErrorRestore(virErrorPtr *savederr); + #endif -- GitLab