aboutsummaryrefslogtreecommitdiffstats
path: root/copy_error.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2019-04-12 21:12:12 +0200
committerMattias Andrée <maandree@kth.se>2019-04-12 21:13:19 +0200
commit1484b1264552ad05d75a4ca4f40972ac94e729e9 (patch)
treeb9f6d6212866699db66e8bd64310d445498db2f3 /copy_error.c
downloadliberror-1484b1264552ad05d75a4ca4f40972ac94e729e9.tar.gz
liberror-1484b1264552ad05d75a4ca4f40972ac94e729e9.tar.bz2
liberror-1484b1264552ad05d75a4ca4f40972ac94e729e9.tar.xz
First commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
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;
+}