diff --git a/headers/os/package/hpkg/HPKGDefs.h b/headers/os/package/hpkg/HPKGDefs.h index 4650a7ff05..ba7735c666 100644 --- a/headers/os/package/hpkg/HPKGDefs.h +++ b/headers/os/package/hpkg/HPKGDefs.h @@ -98,7 +98,8 @@ enum BHPKGAttributeID { // compression types enum { B_HPKG_COMPRESSION_NONE = 0, - B_HPKG_COMPRESSION_ZLIB = 1 + B_HPKG_COMPRESSION_ZLIB = 1, + B_HPKG_COMPRESSION_ZSTD = 2 }; diff --git a/src/add-ons/kernel/file_systems/packagefs/Jamfile b/src/add-ons/kernel/file_systems/packagefs/Jamfile index 52aebe0975..5a31abff21 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Jamfile +++ b/src/add-ons/kernel/file_systems/packagefs/Jamfile @@ -5,6 +5,17 @@ UseBuildFeatureHeaders zlib ; UsePrivateKernelHeaders ; UsePrivateHeaders package shared storage support ; +local zstdSources ; +local zstdKernelLib ; + +if [ FIsBuildFeatureEnabled zstd ] { + zstdSources = ZstdCompressionAlgorithm.cpp ; + zstdKernelLib = kernel_libzstd.a ; + UseBuildFeatureHeaders zstd ; + Includes [ FGristFiles $(zstdSources) ] + : [ BuildFeatureAttribute zstd : headers ] ; + SubDirC++Flags -DZSTD_ENABLED ; +} local subDirs = indices @@ -117,6 +128,7 @@ local storageKitSources = local supportKitSources = CompressionAlgorithm.cpp ZlibCompressionAlgorithm.cpp + $(zstdSources) ; KernelAddon packagefs @@ -129,7 +141,7 @@ KernelAddon packagefs $(storageKitSources) $(supportKitSources) - : kernel_libz.a + : kernel_libz.a $(zstdKernelLib) ; diff --git a/src/bin/package/command_create.cpp b/src/bin/package/command_create.cpp index ed2498210b..b397201f06 100644 --- a/src/bin/package/command_create.cpp +++ b/src/bin/package/command_create.cpp @@ -39,6 +39,7 @@ command_create(int argc, const char* const* argv) bool quiet = false; bool verbose = false; int32 compressionLevel = BPackageKit::BHPKG::B_HPKG_COMPRESSION_LEVEL_BEST; + int32 compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZLIB; while (true) { static struct option sLongOptions[] = { @@ -49,7 +50,7 @@ command_create(int argc, const char* const* argv) }; opterr = 0; // don't print errors - int c = getopt_long(argc, (char**)argv, "+b0123456789C:hi:I:qv", + int c = getopt_long(argc, (char**)argv, "+b0123456789C:hi:I:qvz", sLongOptions, NULL); if (c == -1) break; @@ -96,6 +97,10 @@ command_create(int argc, const char* const* argv) verbose = true; break; + case 'z': + compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZSTD; + break; + default: print_usage_and_exit(true); break; @@ -123,6 +128,10 @@ command_create(int argc, const char* const* argv) BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE); } + if (compressionLevel == 0) + compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE; + writerParameters.SetCompression(compression); + PackageWriterListener listener(verbose, quiet); BPackageWriter packageWriter(&listener); status_t result = packageWriter.Init(packageFileName, &writerParameters); diff --git a/src/bin/package/command_recompress.cpp b/src/bin/package/command_recompress.cpp index c380a3e844..671e42e5e9 100644 --- a/src/bin/package/command_recompress.cpp +++ b/src/bin/package/command_recompress.cpp @@ -45,6 +45,7 @@ command_recompress(int argc, const char* const* argv) bool quiet = false; bool verbose = false; int32 compressionLevel = BPackageKit::BHPKG::B_HPKG_COMPRESSION_LEVEL_BEST; + int32 compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZLIB; while (true) { static struct option sLongOptions[] = { @@ -55,7 +56,7 @@ command_recompress(int argc, const char* const* argv) }; opterr = 0; // don't print errors - int c = getopt_long(argc, (char**)argv, "+0123456789:hqv", + int c = getopt_long(argc, (char**)argv, "+0123456789:hqvz", sLongOptions, NULL); if (c == -1) break; @@ -86,6 +87,10 @@ command_recompress(int argc, const char* const* argv) verbose = true; break; + case 'z': + compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_ZSTD; + break; + default: print_usage_and_exit(true); break; @@ -124,6 +129,10 @@ command_recompress(int argc, const char* const* argv) BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE); } + if (compressionLevel == 0) + compression = BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE; + writerParameters.SetCompression(compression); + PackageWriterListener listener(verbose, quiet); BPackageWriter packageWriter(&listener); if (strcmp(outputPackageFileName, "-") == 0) { diff --git a/src/bin/package/package.cpp b/src/bin/package/package.cpp index d47b8bca7b..bfbb6c348e 100644 --- a/src/bin/package/package.cpp +++ b/src/bin/package/package.cpp @@ -50,6 +50,7 @@ static const char* kUsage = "\n" " -q - Be quiet (don't show any output except for errors).\n" " -v - Be verbose (show more info about created package).\n" + " -z - Use Zstd compression.\n" "\n" " create [ ] \n" " Creates package file from contents of current directory.\n" @@ -120,6 +121,7 @@ static const char* kUsage = " Defaults to 9.\n" " -q - Be quiet (don't show any output except for errors).\n" " -v - Be verbose (show more info about created package).\n" + " -z - Use Zstd compression.\n" "\n" "Common Options:\n" " -h, --help - Print this usage info.\n" diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile index b849ecf189..98b03b92d4 100644 --- a/src/kits/package/Jamfile +++ b/src/kits/package/Jamfile @@ -62,7 +62,9 @@ local architectureObject ; for architectureObject in [ MultiArchSubDirSetup ] { on $(architectureObject) { UseBuildFeatureHeaders curl ; - + if [ FIsBuildFeatureEnabled zstd ] { + SubDirC++Flags -DZSTD_ENABLED ; + } SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg ] ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg v1 ] ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package manager ] ; diff --git a/src/kits/package/hpkg/ReaderImplBase.cpp b/src/kits/package/hpkg/ReaderImplBase.cpp index bb3bb1b05e..c4e4978c15 100644 --- a/src/kits/package/hpkg/ReaderImplBase.cpp +++ b/src/kits/package/hpkg/ReaderImplBase.cpp @@ -20,6 +20,9 @@ #include #include +#ifdef ZSTD_ENABLED +#include +#endif #include #include @@ -824,6 +827,19 @@ ReaderImplBase::InitHeapReader(uint32 compression, uint32 chunkSize, return B_NO_MEMORY; } break; +#ifdef ZSTD_ENABLED + case B_HPKG_COMPRESSION_ZSTD: + decompressionAlgorithm = DecompressionAlgorithmOwner::Create( + new(std::nothrow) BZstdCompressionAlgorithm, + new(std::nothrow) BZstdDecompressionParameters); + decompressionAlgorithmReference.SetTo(decompressionAlgorithm, true); + if (decompressionAlgorithm == NULL + || decompressionAlgorithm->algorithm == NULL + || decompressionAlgorithm->parameters == NULL) { + return B_NO_MEMORY; + } + break; +#endif default: fErrorOutput->PrintError("Error: Invalid heap compression\n"); return B_BAD_DATA; diff --git a/src/kits/package/hpkg/WriterImplBase.cpp b/src/kits/package/hpkg/WriterImplBase.cpp index 7db79e1dc3..c17f534a61 100644 --- a/src/kits/package/hpkg/WriterImplBase.cpp +++ b/src/kits/package/hpkg/WriterImplBase.cpp @@ -20,6 +20,9 @@ #include #include +#ifdef ZSTD_ENABLED +#include +#endif #include #include @@ -326,6 +329,29 @@ WriterImplBase::InitHeapReader(size_t headerSize) throw std::bad_alloc(); } break; +#ifdef ZSTD_ENABLED + case B_HPKG_COMPRESSION_ZSTD: + compressionAlgorithm = CompressionAlgorithmOwner::Create( + new(std::nothrow) BZstdCompressionAlgorithm, + new(std::nothrow) BZstdCompressionParameters( + fParameters.CompressionLevel())); + compressionAlgorithmReference.SetTo(compressionAlgorithm, true); + + decompressionAlgorithm = DecompressionAlgorithmOwner::Create( + new(std::nothrow) BZstdCompressionAlgorithm, + new(std::nothrow) BZstdDecompressionParameters); + decompressionAlgorithmReference.SetTo(decompressionAlgorithm, true); + + if (compressionAlgorithm == NULL + || compressionAlgorithm->algorithm == NULL + || compressionAlgorithm->parameters == NULL + || decompressionAlgorithm == NULL + || decompressionAlgorithm->algorithm == NULL + || decompressionAlgorithm->parameters == NULL) { + throw std::bad_alloc(); + } + break; +#endif default: fErrorOutput->PrintError("Error: Invalid heap compression\n"); return B_BAD_VALUE;