File 5841-Added-zip-zip_get_crc32-2-to-CRC32-sum-of-open-zip-f.patch of Package erlang
From 99ce627cd7de26b0d21b595bb79eedae8a57cdb1 Mon Sep 17 00:00:00 2001
From: Dominic Letz <dominic@diode.io>
Date: Fri, 17 Jun 2022 13:09:20 +0200
Subject: [PATCH] Added `zip:zip_get_crc32/2` to CRC32 sum of open zip files
---
lib/stdlib/doc/src/zip.xml | 8 ++++++++
lib/stdlib/src/zip.erl | 21 ++++++++++++++++++++-
lib/stdlib/test/zip_SUITE.erl | 2 ++
3 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/lib/stdlib/doc/src/zip.xml b/lib/stdlib/doc/src/zip.xml
index a056621ca1..03c28f5d3c 100644
--- a/lib/stdlib/doc/src/zip.xml
+++ b/lib/stdlib/doc/src/zip.xml
@@ -506,6 +506,14 @@
</desc>
</func>
+ <func>
+ <name name="zip_get_crc32" arity="2" since="OTP 25.1"/>
+ <fsummary>Extracts a crc32 checksum from an open archive.</fsummary>
+ <desc>
+ <p>Extracts one crc32 checksum from an open archive.</p>
+ </desc>
+ </func>
+
<func>
<name name="zip_list_dir" arity="1" since=""/>
<fsummary>Return a table of files in open zip archive.</fsummary>
diff --git a/lib/stdlib/src/zip.erl b/lib/stdlib/src/zip.erl
index c59398a84e..0809dbb492 100644
--- a/lib/stdlib/src/zip.erl
+++ b/lib/stdlib/src/zip.erl
@@ -35,7 +35,7 @@
%% zip server
-export([zip_open/1, zip_open/2,
- zip_get/1, zip_get/2,
+ zip_get/1, zip_get/2, zip_get_crc32/2,
zip_t/1, zip_tt/1,
zip_list_dir/1, zip_list_dir/2,
zip_close/1]).
@@ -267,6 +267,13 @@ do_openzip_get(#openzip{files = Files, in = In0, input = Input,
do_openzip_get(_) ->
throw(einval).
+%% retrieve the crc32 checksum from an open archive
+openzip_get_crc32(FileName, #openzip{files = Files}) ->
+ case file_name_search(FileName, Files) of
+ {_,#zip_file_extra{crc32=CRC}} -> {ok, CRC};
+ _ -> throw(file_not_found)
+ end.
+
%% retrieve a file from an open archive
openzip_get(FileName, OpenZip) ->
case ?CATCH(do_openzip_get(FileName, OpenZip)) of
@@ -1165,6 +1172,9 @@ server_loop(Parent, OpenZip) ->
{From, {get, FileName}} ->
From ! {self(), openzip_get(FileName, OpenZip)},
server_loop(Parent, OpenZip);
+ {From, {get_crc32, FileName}} ->
+ From ! {self(), openzip_get_crc32(FileName, OpenZip)},
+ server_loop(Parent, OpenZip);
{From, list_dir} ->
From ! {self(), openzip_list_dir(OpenZip)},
server_loop(Parent, OpenZip);
@@ -1223,6 +1233,15 @@ zip_close(Pid) when is_pid(Pid) ->
zip_get(FileName, Pid) when is_pid(Pid) ->
request(self(), Pid, {get, FileName}).
+-spec(zip_get_crc32(FileName, ZipHandle) -> {ok, CRC} | {error, Reason} when
+ FileName :: file:name(),
+ ZipHandle :: handle(),
+ CRC :: non_neg_integer(),
+ Reason :: term()).
+
+zip_get_crc32(FileName, Pid) when is_pid(Pid) ->
+ request(self(), Pid, {get_crc32, FileName}).
+
-spec(zip_list_dir(ZipHandle) -> {ok, Result} | {error, Reason} when
Result :: [zip_comment() | zip_file()],
ZipHandle :: handle(),
diff --git a/lib/stdlib/test/zip_SUITE.erl b/lib/stdlib/test/zip_SUITE.erl
index 1709acc523..f44095a732 100644
--- a/lib/stdlib/test/zip_SUITE.erl
+++ b/lib/stdlib/test/zip_SUITE.erl
@@ -280,6 +280,8 @@ zip_api(Config) when is_list(Config) ->
Name1 = hd(Names),
{ok, Data1} = file:read_file(Name1),
{ok, {Name1, Data1}} = zip:zip_get(Name1, ZipSrv),
+ Data1Crc = erlang:crc32(Data1),
+ {ok, Data1Crc} = zip:zip_get_crc32(Name1, ZipSrv),
%% Get all files
FilesDatas = lists:map(fun(Name) -> {ok, B} = file:read_file(Name),
--
2.35.3