diff options
author | Richard Weinberger <richard@nod.at> | 2023-08-06 21:35:58 +0200 |
---|---|---|
committer | David Oberhollenzer <goliath@infraroot.at> | 2023-08-10 09:25:51 +0200 |
commit | b637566020abe184cdda199d640c636a7565a05c (patch) | |
tree | c9e3057cff9eaf9fa7d33016096c6228348f6f45 /lib/tar | |
parent | e7ecb1f92ae618a56ee8eabb6cbf98365de3695a (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.c | 16 | ||||
-rw-r--r-- | lib/tar/test/tar_iterator.c | 4 | ||||
-rw-r--r-- | lib/tar/test/tar_iterator2.c | 2 | ||||
-rw-r--r-- | lib/tar/test/tar_iterator3.c | 2 |
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); |