From baebc1fe503f69e2e0cdd3d932dc328a86be1b7d Mon Sep 17 00:00:00 2001
From: sbwml <admin@cooluc.com>
Date: Thu, 29 May 2025 17:11:26 +0800
Subject: [PATCH 11/12] tools: squashfs4: enable zstd compression support

Signed-off-by: sbwml <admin@cooluc.com>
---
 tools/Makefile                                |  2 +-
 tools/squashfs4/Makefile                      |  1 +
 ...negative-levels-for-zstd-compression.patch | 77 +++++++++++++++++++
 3 files changed, 79 insertions(+), 1 deletion(-)
 create mode 100644 tools/squashfs4/patches/100-Support-negative-levels-for-zstd-compression.patch

diff --git a/tools/Makefile b/tools/Makefile
index 702184a..d706c13 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -129,7 +129,7 @@ $(curdir)/pkgconf/compile := $(curdir)/meson/compile
 $(curdir)/quilt/compile := $(curdir)/autoconf/compile $(curdir)/findutils/compile
 $(curdir)/sdcc/compile := $(curdir)/bison/compile
 $(curdir)/squashfs3-lzma/compile := $(curdir)/lzma-old/compile
-$(curdir)/squashfs4/compile := $(curdir)/xz/compile $(curdir)/zlib/compile
+$(curdir)/squashfs4/compile := $(curdir)/xz/compile $(curdir)/zlib/compile $(curdir)/zstd/compile
 $(curdir)/util-linux/compile := $(curdir)/bison/compile $(curdir)/automake/compile
 $(curdir)/yafut/compile := $(curdir)/cmake/compile
 
diff --git a/tools/squashfs4/Makefile b/tools/squashfs4/Makefile
index 38c3e52..e3065bf 100644
--- a/tools/squashfs4/Makefile
+++ b/tools/squashfs4/Makefile
@@ -27,6 +27,7 @@ define Host/Compile
 		XZ_SUPPORT=1 \
 		LZMA_XZ_SUPPORT=1 \
 		XZ_EXTENDED_OPTIONS=1 \
+		ZSTD_SUPPORT=1 \
 		EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include" \
 		mksquashfs unsquashfs
 endef
diff --git a/tools/squashfs4/patches/100-Support-negative-levels-for-zstd-compression.patch b/tools/squashfs4/patches/100-Support-negative-levels-for-zstd-compression.patch
new file mode 100644
index 0000000..b219d9f
--- /dev/null
+++ b/tools/squashfs4/patches/100-Support-negative-levels-for-zstd-compression.patch
@@ -0,0 +1,77 @@
+From 31f103dc9b0cce526adc35a5f49437d58b6799c0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= <anders.f.bjorklund@gmail.com>
+Date: Sun, 16 Feb 2025 13:42:53 +0100
+Subject: [PATCH] Support negative levels for zstd compression
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+These levels correspond to the --fast option of the zstd program,
+and offers better compression speed for worse compression rate.
+
+Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com>
+---
+ squashfs-tools/zstd_wrapper.c | 27 +++++++++++++++++++++------
+ 1 file changed, 21 insertions(+), 6 deletions(-)
+
+--- a/squashfs-tools/zstd_wrapper.c
++++ b/squashfs-tools/zstd_wrapper.c
+@@ -51,12 +51,25 @@ static int zstd_options(char *argv[], in
+ 			fprintf(stderr, "zstd: -Xcompression-level missing "
+ 				"compression level\n");
+ 			fprintf(stderr, "zstd: -Xcompression-level it should "
+-				"be 1 <= n <= %d\n", ZSTD_maxCLevel());
++				"be %d <= n <= -1 or 1 <= n <= %d\n",
++				ZSTD_minCLevel(), ZSTD_maxCLevel());
+ 			goto failed;
+ 		}
+ 
+ 		compression_level = atoi(argv[1]);
+-		if (compression_level < 1 ||
++		if (compression_level == 0) {
++			fprintf(stderr, "zstd: -Xcompression-level invalid, it "
++				"should be %d <= n <= -1 or 1 <= n <= %d\n",
++				ZSTD_minCLevel(), ZSTD_maxCLevel());
++			goto failed;
++		}
++		if (compression_level < 0 &&
++		    compression_level < ZSTD_minCLevel()) {
++			fprintf(stderr, "zstd: -Xcompression-level invalid, it "
++				"should be %d <= n <= -1\n", ZSTD_minCLevel());
++			goto failed;
++		}
++		if (compression_level > 0 &&
+ 		    compression_level > ZSTD_maxCLevel()) {
+ 			fprintf(stderr, "zstd: -Xcompression-level invalid, it "
+ 				"should be 1 <= n <= %d\n", ZSTD_maxCLevel());
+@@ -132,7 +145,8 @@ static int zstd_extract_options(int bloc
+ 
+ 	SQUASHFS_INSWAP_COMP_OPTS(comp_opts);
+ 
+-	if (comp_opts->compression_level < 1 ||
++	if (comp_opts->compression_level == 0 ||
++	    comp_opts->compression_level < ZSTD_minCLevel() ||
+ 	    comp_opts->compression_level > ZSTD_maxCLevel()) {
+ 		fprintf(stderr, "zstd: bad compression level in compression "
+ 			"options structure\n");
+@@ -160,7 +174,8 @@ static void zstd_display_options(void *b
+ 
+ 	SQUASHFS_INSWAP_COMP_OPTS(comp_opts);
+ 
+-	if (comp_opts->compression_level < 1 ||
++	if (comp_opts->compression_level == 0 ||
++	    comp_opts->compression_level < ZSTD_minCLevel() ||
+ 	    comp_opts->compression_level > ZSTD_maxCLevel()) {
+ 		fprintf(stderr, "zstd: bad compression level in compression "
+ 			"options structure\n");
+@@ -235,8 +250,8 @@ static int zstd_uncompress(void *dest, v
+ static void zstd_usage(FILE *stream)
+ {
+ 	fprintf(stream, "\t  -Xcompression-level <compression-level>\n");
+-	fprintf(stream, "\t\t<compression-level> should be 1 .. %d (default "
+-		"%d)\n", ZSTD_maxCLevel(), ZSTD_DEFAULT_COMPRESSION_LEVEL);
++	fprintf(stream, "\t\t<compression-level> should be %d .. -1 or 1 .. %d (default %d).  Negative compression levels correspond to the zstd --fast option.\n",
++		ZSTD_minCLevel(), ZSTD_maxCLevel(), ZSTD_DEFAULT_COMPRESSION_LEVEL);
+ }
+ 
+ 
-- 
2.43.5

