aboutsummaryrefslogtreecommitdiff
path: root/lib/tar
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2023-08-06 21:35:58 +0200
committerDavid Oberhollenzer <goliath@infraroot.at>2023-08-10 09:25:51 +0200
commitb637566020abe184cdda199d640c636a7565a05c (patch)
treec9e3057cff9eaf9fa7d33016096c6228348f6f45 /lib/tar
parente7ecb1f92ae618a56ee8eabb6cbf98365de3695a (diff)
tar2sqfs: Add option to exclude files
Using --exclude or -E it is now possible to exclude files from the input tar stream. The options can be used multiple times. Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'lib/tar')
-rw-r--r--lib/tar/src/iterator.c16
-rw-r--r--lib/tar/test/tar_iterator.c4
-rw-r--r--lib/tar/test/tar_iterator2.c2
-rw-r--r--lib/tar/test/tar_iterator3.c2
4 files changed, 19 insertions, 5 deletions
diff --git a/lib/tar/src/iterator.c b/lib/tar/src/iterator.c
index 6b456d6..a2708a0 100644
--- a/lib/tar/src/iterator.c
+++ b/lib/tar/src/iterator.c
@@ -16,11 +16,14 @@
#include <string.h>
#include <assert.h>
#include <stdbool.h>
+#include <fnmatch.h>
typedef struct {
dir_iterator_t base;
tar_header_decoded_t current;
sqfs_istream_t *stream;
+ char **excludedirs;
+ size_t num_excludedirs;
int state;
/* File I/O wrapper related */
@@ -167,6 +170,7 @@ static void strm_destroy(sqfs_object_t *obj)
static int it_next(dir_iterator_t *it, sqfs_dir_entry_t **out)
{
tar_iterator_t *tar = (tar_iterator_t *)it;
+ size_t idx;
int ret;
*out = NULL;
@@ -209,6 +213,11 @@ retry:
return tar->state;
}
+ for (idx = 0; idx < tar->num_excludedirs; idx++) {
+ if (fnmatch(tar->excludedirs[idx], tar->current.name, 0) == 0)
+ goto retry;
+ }
+
*out = sqfs_dir_entry_create(tar->current.name, tar->current.mode, 0);
if ((*out) == NULL) {
tar->state = SQFS_ERROR_ALLOC;
@@ -350,7 +359,7 @@ static int tar_probe(const sqfs_u8 *data, size_t size)
return 0;
}
-dir_iterator_t *tar_open_stream(sqfs_istream_t *strm)
+dir_iterator_t *tar_open_stream(sqfs_istream_t *strm, tar_iterator_opts *opts)
{
tar_iterator_t *tar = calloc(1, sizeof(*tar));
dir_iterator_t *it = (dir_iterator_t *)tar;
@@ -370,6 +379,11 @@ dir_iterator_t *tar_open_stream(sqfs_istream_t *strm)
it->open_file_ro = it_open_file_ro;
it->read_xattr = it_read_xattr;
+ if (opts) {
+ tar->excludedirs = opts->excludedirs;
+ tar->num_excludedirs = opts->num_excludedirs;
+ }
+
/* proble if the stream is compressed */
ret = strm->get_buffered_data(strm, &ptr, &size,
sizeof(tar_header_t));
diff --git a/lib/tar/test/tar_iterator.c b/lib/tar/test/tar_iterator.c
index 6931a7c..cd24c94 100644
--- a/lib/tar/test/tar_iterator.c
+++ b/lib/tar/test/tar_iterator.c
@@ -46,7 +46,7 @@ int main(int argc, char **argv)
TEST_EQUAL_I(iret, 0);
TEST_NOT_NULL(fp);
TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1);
- it = tar_open_stream(fp);
+ it = tar_open_stream(fp, NULL);
TEST_NOT_NULL(it);
TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 2);
TEST_EQUAL_UI(((sqfs_object_t *)it)->refcount, 1);
@@ -115,7 +115,7 @@ int main(int argc, char **argv)
0);
TEST_EQUAL_I(iret, 0);
TEST_NOT_NULL(fp);
- it = tar_open_stream(fp);
+ it = tar_open_stream(fp, NULL);
TEST_NOT_NULL(it);
/* read entry */
diff --git a/lib/tar/test/tar_iterator2.c b/lib/tar/test/tar_iterator2.c
index 681835d..7b22af3 100644
--- a/lib/tar/test/tar_iterator2.c
+++ b/lib/tar/test/tar_iterator2.c
@@ -57,7 +57,7 @@ int main(int argc, char **argv)
0);
TEST_EQUAL_I(iret, 0);
TEST_NOT_NULL(fp);
- it = tar_open_stream(fp);
+ it = tar_open_stream(fp, NULL);
TEST_NOT_NULL(it);
sqfs_drop(fp);
diff --git a/lib/tar/test/tar_iterator3.c b/lib/tar/test/tar_iterator3.c
index f8d0bda..7973441 100644
--- a/lib/tar/test/tar_iterator3.c
+++ b/lib/tar/test/tar_iterator3.c
@@ -28,7 +28,7 @@ int main(int argc, char **argv)
TEST_EQUAL_I(ret, 0);
TEST_NOT_NULL(fp);
TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 1);
- it = tar_open_stream(fp);
+ it = tar_open_stream(fp, NULL);
TEST_NOT_NULL(it);
TEST_EQUAL_UI(((sqfs_object_t *)fp)->refcount, 2);
TEST_EQUAL_UI(((sqfs_object_t *)it)->refcount, 1);