From dfab234dfae735103d2e5206b0f335c8449ee3d5 Mon Sep 17 00:00:00 2001
From: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Date: Thu, 5 Mar 2020 22:55:09 +0100
Subject: Get rid of sqfs_compressor_exists

Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
---
 difftool/sqfsdiff.c        | 13 ------------
 extras/browse.c            |  5 -----
 extras/list_files.c        |  5 -----
 include/sqfs/compressor.h  | 18 ----------------
 lib/common/compress.c      | 51 ++++++++++++++++++++++++++++++++++++++--------
 lib/sqfs/comp/compressor.c |  8 --------
 tar/sqfs2tar.c             | 12 -----------
 unpack/rdsquashfs.c        | 13 ------------
 8 files changed, 42 insertions(+), 83 deletions(-)

diff --git a/difftool/sqfsdiff.c b/difftool/sqfsdiff.c
index 6415165..2871322 100644
--- a/difftool/sqfsdiff.c
+++ b/difftool/sqfsdiff.c
@@ -22,19 +22,6 @@ static int open_sfqs(sqfs_state_t *state, const char *path)
 		goto fail_file;
 	}
 
-	ret = sqfs_compressor_exists(state->super.compression_id);
-
-#ifdef WITH_LZO
-	if (state->super.compression_id == SQFS_COMP_LZO)
-		ret = true;
-#endif
-
-	if (!ret) {
-		fprintf(stderr, "%s: unknown compressor used.\n",
-			path);
-		goto fail_file;
-	}
-
 	sqfs_compressor_config_init(&state->cfg, state->super.compression_id,
 				    state->super.block_size,
 				    SQFS_COMP_FLAG_UNCOMPRESS);
diff --git a/extras/browse.c b/extras/browse.c
index 9dd735a..a238793 100644
--- a/extras/browse.c
+++ b/extras/browse.c
@@ -502,11 +502,6 @@ int main(int argc, char **argv)
 		goto out_fd;
 	}
 
-	if (!sqfs_compressor_exists(super.compression_id)) {
-		fprintf(stderr, "%s: unknown compressor used.\n", argv[1]);
-		goto out_fd;
-	}
-
 	sqfs_compressor_config_init(&cfg, super.compression_id,
 				    super.block_size,
 				    SQFS_COMP_FLAG_UNCOMPRESS);
diff --git a/extras/list_files.c b/extras/list_files.c
index eba4fff..61184bf 100644
--- a/extras/list_files.c
+++ b/extras/list_files.c
@@ -75,11 +75,6 @@ int main(int argc, char **argv)
 		goto out_fd;
 	}
 
-	if (!sqfs_compressor_exists(super.compression_id)) {
-		fprintf(stderr, "%s: unknown compressor used.\n", argv[1]);
-		goto out_fd;
-	}
-
 	sqfs_compressor_config_init(&cfg, super.compression_id,
 				    super.block_size,
 				    SQFS_COMP_FLAG_UNCOMPRESS);
diff --git a/include/sqfs/compressor.h b/include/sqfs/compressor.h
index 1a36c82..4190c67 100644
--- a/include/sqfs/compressor.h
+++ b/include/sqfs/compressor.h
@@ -338,16 +338,6 @@ SQFS_API int sqfs_compressor_config_init(sqfs_compressor_config_t *cfg,
 					 SQFS_COMPRESSOR id,
 					 size_t block_size, sqfs_u16 flags);
 
-/**
- * @brief Check if a specified compressor implementation is available.
- *
- * @param id An @ref SQFS_COMPRESSOR identifier.
- *
- * @return true if the implementation is available and can be instantiated
- *         through @ref sqfs_compressor_create.
- */
-SQFS_API bool sqfs_compressor_exists(SQFS_COMPRESSOR id);
-
 /**
  * @brief Create an instance of a compressor implementation.
  *
@@ -368,10 +358,6 @@ SQFS_API int sqfs_compressor_create(const sqfs_compressor_config_t *cfg,
 /**
  * @brief Get the name of a compressor backend from its ID.
  *
- * This function will even resolve compressor names that are not built in, so
- * use @ref sqfs_compressor_exists to check if a compressor is actually
- * available.
- *
  * @param id An @ref SQFS_COMPRESSOR identifier.
  *
  * @return A string holding the name of the compressor, NULL if the compressor
@@ -382,10 +368,6 @@ SQFS_API const char *sqfs_compressor_name_from_id(SQFS_COMPRESSOR id);
 /**
  * @brief Get the compressor ID using just the name of the backend.
  *
- * This function will even resolve compressor names that are not built in, so
- * use @ref sqfs_compressor_exists to check if a compressor is actually
- * available.
- *
  * @param name The name of the compressor backend.
  *
  * @return A positive, @ref SQFS_COMPRESSOR identifier on success
diff --git a/lib/common/compress.c b/lib/common/compress.c
index 3ee242d..cb4ce10 100644
--- a/lib/common/compress.c
+++ b/lib/common/compress.c
@@ -6,31 +6,64 @@
  */
 #include "common.h"
 
+static int cmp_ids[] = {
+	SQFS_COMP_XZ,
+	SQFS_COMP_ZSTD,
+	SQFS_COMP_GZIP,
+	SQFS_COMP_LZ4,
+	SQFS_COMP_LZO,
+};
+
 SQFS_COMPRESSOR compressor_get_default(void)
 {
-	if (sqfs_compressor_exists(SQFS_COMP_XZ))
-		return SQFS_COMP_XZ;
+	sqfs_compressor_config_t cfg;
+	sqfs_compressor_t *temp;
+	size_t i;
+	int ret;
+
+	for (i = 0; i < sizeof(cmp_ids) / sizeof(cmp_ids[0]); ++i) {
+		sqfs_compressor_config_init(&cfg, cmp_ids[i],
+					    SQFS_DEFAULT_BLOCK_SIZE, 0);
 
-	if (sqfs_compressor_exists(SQFS_COMP_ZSTD))
-		return SQFS_COMP_ZSTD;
+		ret = sqfs_compressor_create(&cfg, &temp);
 
-	return SQFS_COMP_GZIP;
+		if (ret == 0) {
+			sqfs_destroy(temp);
+			return cmp_ids[i];
+		}
+	}
+
+#ifdef WITH_LZO
+	return SQFS_COMP_LZO;
+#else
+	assert(0);
+#endif
 }
 
 void compressor_print_available(void)
 {
+	sqfs_compressor_config_t cfg;
+	sqfs_compressor_t *temp;
 	bool have_compressor;
-	int i;
+	int i, ret;
 
 	fputs("Available compressors:\n", stdout);
 
 	for (i = SQFS_COMP_MIN; i <= SQFS_COMP_MAX; ++i) {
-		have_compressor = sqfs_compressor_exists(i);
+		sqfs_compressor_config_init(&cfg, i,
+					    SQFS_DEFAULT_BLOCK_SIZE, 0);
 
-#ifdef WITH_LZO
-		if (i == SQFS_COMP_LZO)
+		ret = sqfs_compressor_create(&cfg, &temp);
+
+		if (ret == 0) {
+			sqfs_destroy(temp);
 			have_compressor = true;
+		} else {
+#ifdef WITH_LZO
+			if (i == SQFS_COMP_LZO)
+				have_compressor = true;
 #endif
+		}
 
 		if (have_compressor)
 			printf("\t%s\n", sqfs_compressor_name_from_id(i));
diff --git a/lib/sqfs/comp/compressor.c b/lib/sqfs/comp/compressor.c
index 3b48030..946ee25 100644
--- a/lib/sqfs/comp/compressor.c
+++ b/lib/sqfs/comp/compressor.c
@@ -73,14 +73,6 @@ int sqfs_generic_read_options(sqfs_file_t *file, void *data, size_t size)
 	return 0;
 }
 
-bool sqfs_compressor_exists(SQFS_COMPRESSOR id)
-{
-	if (id < SQFS_COMP_MIN || id > SQFS_COMP_MAX)
-		return false;
-
-	return (compressors[id] != NULL);
-}
-
 int sqfs_compressor_create(const sqfs_compressor_config_t *cfg,
 			   sqfs_compressor_t **out)
 {
diff --git a/tar/sqfs2tar.c b/tar/sqfs2tar.c
index 2b013d6..925ae9c 100644
--- a/tar/sqfs2tar.c
+++ b/tar/sqfs2tar.c
@@ -540,18 +540,6 @@ int main(int argc, char **argv)
 		goto out_fd;
 	}
 
-	ret = sqfs_compressor_exists(super.compression_id);
-
-#ifdef WITH_LZO
-	if (super.compression_id == SQFS_COMP_LZO)
-		ret = true;
-#endif
-
-	if (!ret) {
-		fprintf(stderr, "%s: unknown compressor used.\n", filename);
-		goto out_fd;
-	}
-
 	sqfs_compressor_config_init(&cfg, super.compression_id,
 				    super.block_size,
 				    SQFS_COMP_FLAG_UNCOMPRESS);
diff --git a/unpack/rdsquashfs.c b/unpack/rdsquashfs.c
index 5ca9de4..c166f4a 100644
--- a/unpack/rdsquashfs.c
+++ b/unpack/rdsquashfs.c
@@ -35,19 +35,6 @@ int main(int argc, char **argv)
 		goto out_file;
 	}
 
-	ret = sqfs_compressor_exists(super.compression_id);
-
-#ifdef WITH_LZO
-	if (super.compression_id == SQFS_COMP_LZO)
-		ret = true;
-#endif
-
-	if (!ret) {
-		fprintf(stderr, "%s: unknown compressor used.\n",
-			opt.image_name);
-		goto out_file;
-	}
-
 	sqfs_compressor_config_init(&cfg, super.compression_id,
 				    super.block_size,
 				    SQFS_COMP_FLAG_UNCOMPRESS);
-- 
cgit v1.2.3