diff --git a/contrib/zstd/CMakeLists.txt b/contrib/zstd/CMakeLists.txt index c045933..bae244f 100644 --- a/contrib/zstd/CMakeLists.txt +++ b/contrib/zstd/CMakeLists.txt @@ -51,9 +51,11 @@ add_sapi_library( ZSTD_createDCtx ZSTD_freeDCtx + ZSTD_createCCtx + ZSTD_freeCCtx + ZSTD_CCtx_setParameter - ZSTD_compressBound ZSTD_compress ZSTD_compressStream ZSTD_compressStream2 diff --git a/contrib/zstd/test/zstd_test.cc b/contrib/zstd/test/zstd_test.cc index 17ce6f3..b997574 100644 --- a/contrib/zstd/test/zstd_test.cc +++ b/contrib/zstd/test/zstd_test.cc @@ -207,7 +207,7 @@ TEST(SandboxTest, CheckCompressStream) { ASSERT_TRUE(outfile.is_open()); absl::Status status = CompressStream(api, infile, outfile, 0); - ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory"; + ASSERT_THAT(status, IsOk()) << "Unable to compress stream"; infile.clear(); @@ -233,7 +233,7 @@ TEST(SandboxTest, CheckDecompressStream) { ASSERT_TRUE(outfile.is_open()); absl::Status status = DecompressStream(api, infile, outfile); - ASSERT_THAT(status, IsOk()) << "Unable to decompress file in memory"; + ASSERT_THAT(status, IsOk()) << "Unable to decompress stream"; ASSERT_GT(outfile.tellp(), infile.tellg()); @@ -266,7 +266,7 @@ TEST(SandboxTest, CheckCompressAndDecompressStream) { ASSERT_TRUE(outmiddle.is_open()); status = CompressStream(api, infile, outmiddle, 0); - ASSERT_THAT(status, IsOk()) << "Unable to compress file in memory"; + ASSERT_THAT(status, IsOk()) << "Unable to compress stream"; infile.clear(); ASSERT_LT(outmiddle.tellp(), infile.tellg()); diff --git a/contrib/zstd/utils/utils_zstd.cc b/contrib/zstd/utils/utils_zstd.cc index ab148f6..806b3d0 100644 --- a/contrib/zstd/utils/utils_zstd.cc +++ b/contrib/zstd/utils/utils_zstd.cc @@ -28,12 +28,12 @@ std::streamsize GetStreamSize(std::ifstream& stream) { return ssize; } -absl::Status CompressInMemory(ZstdApi& api, std::ifstream& in_file, +absl::Status CompressInMemory(ZstdApi& api, std::ifstream& in_stream, std::ofstream& out_stream, int level) { - std::streamsize ssize = GetStreamSize(in_file); + std::streamsize ssize = GetStreamSize(in_stream); sapi::v::Array inbuf(ssize); - in_file.read(reinterpret_cast(inbuf.GetData()), ssize); - if (in_file.gcount() != ssize) { + in_stream.read(reinterpret_cast(inbuf.GetData()), ssize); + if (in_stream.gcount() != ssize) { return absl::UnavailableError("Unable to read file"); } @@ -57,13 +57,13 @@ absl::Status CompressInMemory(ZstdApi& api, std::ifstream& in_file, return absl::OkStatus(); } -absl::Status DecompressInMemory(ZstdApi& api, std::ifstream& in_file, +absl::Status DecompressInMemory(ZstdApi& api, std::ifstream& in_stream, std::ofstream& out_stream) { int iserr; - std::streamsize ssize = GetStreamSize(in_file); + std::streamsize ssize = GetStreamSize(in_stream); sapi::v::Array inbuf(ssize); - in_file.read(reinterpret_cast(inbuf.GetData()), ssize); - if (in_file.gcount() != ssize) { + in_stream.read(reinterpret_cast(inbuf.GetData()), ssize); + if (in_stream.gcount() != ssize) { return absl::UnavailableError("Unable to read file"); } @@ -94,7 +94,7 @@ absl::Status DecompressInMemory(ZstdApi& api, std::ifstream& in_file, return absl::OkStatus(); } -absl::Status CompressStream(ZstdApi& api, std::ifstream& in_file, +absl::Status CompressStream(ZstdApi& api, std::ifstream& in_stream, std::ofstream& out_stream, int level) { int iserr; @@ -110,23 +110,25 @@ absl::Status CompressStream(ZstdApi& api, std::ifstream& in_file, } // Create Zstd context. - SAPI_ASSIGN_OR_RETURN(ZSTD_DCtx * dctx, api.ZSTD_createDCtx()); - sapi::v::RemotePtr rdctx(dctx); + SAPI_ASSIGN_OR_RETURN(ZSTD_CCtx * cctx, api.ZSTD_createCCtx()); + sapi::v::RemotePtr rcctx(cctx); SAPI_ASSIGN_OR_RETURN(iserr, api.ZSTD_CCtx_setParameter( - &rdctx, ZSTD_c_compressionLevel, level)); - if (!iserr) { + &rcctx, ZSTD_c_compressionLevel, level)); + SAPI_ASSIGN_OR_RETURN(iserr, api.ZSTD_isError(iserr)) + if (iserr) { return absl::UnavailableError("Unable to set parameter"); } SAPI_ASSIGN_OR_RETURN( - iserr, api.ZSTD_CCtx_setParameter(&rdctx, ZSTD_c_checksumFlag, 1)); - if (!iserr) { + iserr, api.ZSTD_CCtx_setParameter(&rcctx, ZSTD_c_checksumFlag, 1)); + SAPI_ASSIGN_OR_RETURN(iserr, api.ZSTD_isError(iserr)) + if (iserr) { return absl::UnavailableError("Unable to set parameter"); } // Compress. - while (in_file) { - in_file.read(reinterpret_cast(inbuf.GetData()), inbuf_size); + while (in_stream) { + in_stream.read(reinterpret_cast(inbuf.GetData()), inbuf_size); if (!api.GetSandbox()->TransferToSandboxee(&inbuf).ok()) { return absl::UnavailableError("Unable to transfer data"); @@ -135,10 +137,10 @@ absl::Status CompressStream(ZstdApi& api, std::ifstream& in_file, sapi::v::Struct struct_in; struct_in.mutable_data()->src = static_cast(inbuf.GetRemote()); struct_in.mutable_data()->pos = 0; - struct_in.mutable_data()->size = in_file.gcount(); + struct_in.mutable_data()->size = in_stream.gcount(); ZSTD_EndDirective mode = ZSTD_e_continue; - if (in_file.gcount() < inbuf_size) { + if (in_stream.gcount() < inbuf_size) { mode = ZSTD_e_end; } @@ -151,7 +153,7 @@ absl::Status CompressStream(ZstdApi& api, std::ifstream& in_file, struct_out.mutable_data()->size = outbuf.GetSize(); SAPI_ASSIGN_OR_RETURN(size_t remaining, api.ZSTD_compressStream2( - &rdctx, struct_out.PtrBoth(), + &rcctx, struct_out.PtrBoth(), struct_in.PtrBoth(), mode)); SAPI_ASSIGN_OR_RETURN(int iserr, api.ZSTD_isError(remaining)) if (iserr) { @@ -168,19 +170,19 @@ absl::Status CompressStream(ZstdApi& api, std::ifstream& in_file, } if (mode == ZSTD_e_continue) { - isdone = (struct_in.mutable_data()->pos == in_file.gcount()); + isdone = (struct_in.mutable_data()->pos == in_stream.gcount()); } else { isdone = (remaining == 0); } } } - api.ZSTD_freeDCtx(&rdctx).IgnoreError(); + api.ZSTD_freeDCtx(&rcctx).IgnoreError(); return absl::OkStatus(); } -absl::Status DecompressStream(ZstdApi& api, std::ifstream& in_file, +absl::Status DecompressStream(ZstdApi& api, std::ifstream& in_stream, std::ofstream& out_stream) { // Create necessary buffers. SAPI_ASSIGN_OR_RETURN(size_t inbuf_size, api.ZSTD_CStreamInSize()); @@ -198,8 +200,8 @@ absl::Status DecompressStream(ZstdApi& api, std::ifstream& in_file, sapi::v::RemotePtr rdctx(dctx); // Decompress. - while (in_file) { - in_file.read(reinterpret_cast(inbuf.GetData()), inbuf_size); + while (in_stream) { + in_stream.read(reinterpret_cast(inbuf.GetData()), inbuf_size); if (!api.GetSandbox()->TransferToSandboxee(&inbuf).ok()) { return absl::UnavailableError("Unable to transfer data"); @@ -207,10 +209,10 @@ absl::Status DecompressStream(ZstdApi& api, std::ifstream& in_file, sapi::v::Struct struct_in; *struct_in.mutable_data() = {static_cast(inbuf.GetRemote()), - (size_t)in_file.gcount(), 0}; + (size_t)in_stream.gcount(), 0}; bool isdone = false; - while (struct_in.mutable_data()->pos < in_file.gcount()) { + while (struct_in.mutable_data()->pos < in_stream.gcount()) { sapi::v::Struct struct_out; *struct_out.mutable_data() = {static_cast(outbuf.GetRemote()), (size_t)outbuf.GetSize(), 0}; diff --git a/contrib/zstd/utils/utils_zstd.h b/contrib/zstd/utils/utils_zstd.h index 1c5f131..cac7a9d 100644 --- a/contrib/zstd/utils/utils_zstd.h +++ b/contrib/zstd/utils/utils_zstd.h @@ -20,14 +20,14 @@ #include "contrib/zstd/sandboxed.h" -absl::Status CompressInMemory(ZstdApi& api, std::ifstream& in_file, - std::ofstream& out_file, int level); -absl::Status DecompressInMemory(ZstdApi& api, std::ifstream& in_file, - std::ofstream& out_file); +absl::Status CompressInMemory(ZstdApi& api, std::ifstream& in_stream, + std::ofstream& out_stream, int level); +absl::Status DecompressInMemory(ZstdApi& api, std::ifstream& in_stream, + std::ofstream& out_stream); -absl::Status CompressStream(ZstdApi& api, std::ifstream& in_file, - std::ofstream& out_file, int level); -absl::Status DecompressStream(ZstdApi& api, std::ifstream& in_file, - std::ofstream& out_file); +absl::Status CompressStream(ZstdApi& api, std::ifstream& in_stream, + std::ofstream& out_stream, int level); +absl::Status DecompressStream(ZstdApi& api, std::ifstream& in_stream, + std::ofstream& out_stream); #endif // CONTRIB_ZSTD_UTILS_UTILS_ZSTD_H_