diff options
Diffstat (limited to 'lib/stdlib/src/zip.erl')
-rw-r--r-- | lib/stdlib/src/zip.erl | 21 |
1 files changed, 20 insertions, 1 deletions
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(), |