aboutsummaryrefslogtreecommitdiffstats
path: root/copy_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'copy_error.c')
-rw-r--r--copy_error.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/copy_error.c b/copy_error.c
new file mode 100644
index 0000000..8d93131
--- /dev/null
+++ b/copy_error.c
@@ -0,0 +1,31 @@
+/* See LICENSE file for copyright and license details. */
+#include "internal.h"
+
+
+struct liberror_error *
+liberror_copy_error(struct liberror_error *src)
+{
+ struct liberror_error *dest;
+ int saved_errno;
+ if (!src)
+ return NULL;
+ saved_errno = errno;
+ dest = malloc(sizeof(*dest));
+ if (dest) {
+ memcpy(dest, src, sizeof(*src));
+ if (dest->backtrace)
+ dest->backtrace->refcount += 1;
+ dest->dynamically_allocated = 1;
+ if (src->cause) {
+ dest->cause = liberror_copy_error(src->cause);
+ if (!dest->cause) {
+ if (dest->backtrace)
+ dest->backtrace->refcount -= 1;
+ free(dest);
+ dest = NULL;
+ }
+ }
+ }
+ errno = saved_errno;
+ return dest;
+}