aboutsummaryrefslogtreecommitdiff
path: root/bin/tar2sqfs/tar2sqfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/tar2sqfs/tar2sqfs.c')
-rw-r--r--bin/tar2sqfs/tar2sqfs.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/bin/tar2sqfs/tar2sqfs.c b/bin/tar2sqfs/tar2sqfs.c
index 6cab231..603ee25 100644
--- a/bin/tar2sqfs/tar2sqfs.c
+++ b/bin/tar2sqfs/tar2sqfs.c
@@ -6,11 +6,38 @@
*/
#include "tar2sqfs.h"
+static int tar_probe(const sqfs_u8 *data, size_t size)
+{
+ size_t i, offset;
+
+ if (size >= TAR_RECORD_SIZE) {
+ for (i = 0; i < TAR_RECORD_SIZE; ++i) {
+ if (data[i] != 0x00)
+ break;
+ }
+
+ if (i == TAR_RECORD_SIZE) {
+ data += TAR_RECORD_SIZE;
+ size -= TAR_RECORD_SIZE;
+ }
+ }
+
+ offset = offsetof(tar_header_t, magic);
+
+ if (offset + 5 <= size) {
+ if (memcmp(data + offset, "ustar", 5) == 0)
+ return 1;
+ }
+
+ return 0;
+}
+
int main(int argc, char **argv)
{
int status = EXIT_FAILURE;
istream_t *input_file = NULL;
sqfs_writer_t sqfs;
+ int ret;
process_args(argc, argv);
@@ -18,6 +45,24 @@ int main(int argc, char **argv)
if (input_file == NULL)
return EXIT_FAILURE;
+ ret = istream_detect_compressor(input_file, tar_probe);
+ if (ret < 0)
+ goto out_if;
+
+ if (ret > 0) {
+ if (!fstream_compressor_exists(ret)) {
+ fprintf(stderr,
+ "%s: %s compression is not supported.\n",
+ istream_get_filename(input_file),
+ fstream_compressor_name_from_id(ret));
+ goto out_if;
+ }
+
+ input_file = istream_compressor_create(input_file, ret);
+ if (input_file == NULL)
+ return EXIT_FAILURE;
+ }
+
memset(&sqfs, 0, sizeof(sqfs));
if (sqfs_writer_init(&sqfs, &cfg))
goto out_if;