diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-09-14 14:59:31 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-09-16 09:34:35 +0200 |
commit | c9f5cfd3df2706da940a39d6d816ad084ba80fbd (patch) | |
tree | 3aac86238ce840c3c25ff89892f6109c081f60d8 /lib/fstream/uncompress/istream_compressor.c | |
parent | f757737060d4daebb24a32e90d912661428708a8 (diff) |
Implement istream decompression support
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/fstream/uncompress/istream_compressor.c')
-rw-r--r-- | lib/fstream/uncompress/istream_compressor.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/fstream/uncompress/istream_compressor.c b/lib/fstream/uncompress/istream_compressor.c new file mode 100644 index 0000000..924f309 --- /dev/null +++ b/lib/fstream/uncompress/istream_compressor.c @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * istream_compressor.c + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#include "../internal.h" + +static const char *comp_get_filename(istream_t *strm) +{ + istream_comp_t *comp = (istream_comp_t *)strm; + + return comp->wrapped->get_filename(comp->wrapped); +} + +static void comp_destroy(sqfs_object_t *obj) +{ + istream_comp_t *comp = (istream_comp_t *)obj; + + comp->cleanup(comp); + sqfs_destroy(comp->wrapped); + free(comp); +} + +istream_t *istream_compressor_create(istream_t *strm, int comp_id) +{ + istream_comp_t *comp = NULL; + sqfs_object_t *obj; + istream_t *base; + + switch (comp_id) { + case FSTREAM_COMPRESSOR_GZIP: +#ifdef WITH_GZIP + comp = istream_gzip_create(strm->get_filename(strm)); +#endif + break; + case FSTREAM_COMPRESSOR_XZ: +#ifdef WITH_XZ + comp = istream_xz_create(strm->get_filename(strm)); +#endif + break; + default: + break; + } + + if (comp == NULL) + return NULL; + + comp->wrapped = strm; + + base = (istream_t *)comp; + base->get_filename = comp_get_filename; + base->buffer = comp->uncompressed; + base->eof = false; + + obj = (sqfs_object_t *)comp; + obj->destroy = comp_destroy; + return base; +} |