summaryrefslogtreecommitdiff
path: root/difftool/extract.c
diff options
context:
space:
mode:
Diffstat (limited to 'difftool/extract.c')
-rw-r--r--difftool/extract.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/difftool/extract.c b/difftool/extract.c
new file mode 100644
index 0000000..9d84265
--- /dev/null
+++ b/difftool/extract.c
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * extract.c
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "difftool.h"
+
+static int extract(data_reader_t *data, file_info_t *fi,
+ const char *path, char prefix)
+{
+ char *ptr, *temp = alloca(strlen(path) + 3);
+ int fd;
+
+ temp[0] = prefix;
+ temp[1] = '/';
+ strcpy(temp + 2, path);
+
+ ptr = strrchr(temp, '/');
+ *ptr = '\0';
+ if (mkdir_p(temp))
+ return -1;
+ *ptr = '/';
+
+ fd = open(temp, O_CREAT | O_EXCL | O_WRONLY, 0600);
+ if (fd < 0) {
+ perror(temp);
+ return -1;
+ }
+
+ if (data_reader_dump_file(data, fi, fd, true)) {
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+ return 0;
+}
+
+int extract_files(file_info_t *a, file_info_t *b, const char *path)
+{
+ if (a != NULL) {
+ if (extract(sqfs_a.data, a, path, 'a'))
+ return -1;
+ }
+
+ if (b != NULL) {
+ if (extract(sqfs_b.data, b, path, 'b'))
+ return -1;
+ }
+ return 0;
+}