From 66cd39f2bdfb78911099d9877f694a5a8525cab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Fri, 6 Jan 2023 11:01:48 +0100 Subject: [PATCH 1/2] zlib: add support for zip archives --- configure.py | 7 + deps/libzip/.clang-format | 12 + deps/libzip/.gitattributes | 11 + .../.github/ISSUE_TEMPLATE/bug-report.md | 32 + .../.github/ISSUE_TEMPLATE/compile-error.md | 25 + .../.github/ISSUE_TEMPLATE/feature-request.md | 22 + deps/libzip/.github/workflows/CIFuzz.yml | 23 + deps/libzip/.github/workflows/build.yml | 53 + .../.github/workflows/codeql-analysis.yml | 66 + deps/libzip/.gitignore | 11 + deps/libzip/API-CHANGES.md | 162 ++ deps/libzip/AUTHORS | 2 + deps/libzip/CMakeLists.txt | 490 ++++++ deps/libzip/INSTALL.md | 69 + deps/libzip/LICENSE | 31 + deps/libzip/NEWS.md | 319 ++++ deps/libzip/README.md | 34 + deps/libzip/SECURITY.md | 13 + deps/libzip/THANKS | 149 ++ deps/libzip/TODO.md | 184 +++ deps/libzip/android/do.sh | 63 + deps/libzip/android/docker/Dockerfile | 122 ++ deps/libzip/android/readme.txt | 13 + deps/libzip/appveyor.yml | 81 + .../cmake-compat/CMakePushCheckState.cmake | 91 ++ .../cmake-compat/CheckLibraryExists.cmake | 102 ++ .../cmake-compat/CheckSymbolExists.cmake | 169 ++ deps/libzip/cmake-compat/FindBZip2.cmake | 104 ++ deps/libzip/cmake-compat/FindGnuTLS.cmake | 82 + deps/libzip/cmake-compat/FindLibLZMA.cmake | 124 ++ .../FindPackageHandleStandardArgs.cmake | 453 ++++++ .../cmake-compat/FindPackageMessage.cmake | 48 + .../SelectLibraryConfigurations.cmake | 80 + deps/libzip/cmake-config.h.in | 73 + deps/libzip/cmake-zipconf.h.in | 47 + deps/libzip/cmake/Dist.cmake | 83 + deps/libzip/cmake/FindMbedTLS.cmake | 141 ++ deps/libzip/cmake/FindNettle.cmake | 141 ++ deps/libzip/cmake/FindZstd.cmake | 135 ++ deps/libzip/custom/config.h | 73 + deps/libzip/examples/CMakeLists.txt | 5 + deps/libzip/examples/add-compressed-data.c | 171 ++ deps/libzip/examples/autoclose-archive.c | 160 ++ deps/libzip/examples/in-memory.c | 217 +++ deps/libzip/examples/windows-open.c | 60 + deps/libzip/lib/CMakeLists.txt | 242 +++ deps/libzip/lib/compat.h | 240 +++ deps/libzip/lib/config.h | 73 + deps/libzip/lib/zip.h | 494 ++++++ deps/libzip/lib/zip_add.c | 49 + deps/libzip/lib/zip_add_dir.c | 44 + deps/libzip/lib/zip_add_entry.c | 80 + deps/libzip/lib/zip_algorithm_bzip2.c | 287 ++++ deps/libzip/lib/zip_algorithm_deflate.c | 267 ++++ deps/libzip/lib/zip_algorithm_xz.c | 408 +++++ deps/libzip/lib/zip_algorithm_zstd.c | 294 ++++ deps/libzip/lib/zip_buffer.c | 337 ++++ deps/libzip/lib/zip_close.c | 714 +++++++++ deps/libzip/lib/zip_crypto.h | 54 + deps/libzip/lib/zip_crypto_commoncrypto.c | 110 ++ deps/libzip/lib/zip_crypto_commoncrypto.h | 53 + deps/libzip/lib/zip_crypto_gnutls.c | 134 ++ deps/libzip/lib/zip_crypto_gnutls.h | 68 + deps/libzip/lib/zip_crypto_mbedtls.c | 162 ++ deps/libzip/lib/zip_crypto_mbedtls.h | 56 + deps/libzip/lib/zip_crypto_openssl.c | 184 +++ deps/libzip/lib/zip_crypto_openssl.h | 56 + deps/libzip/lib/zip_crypto_win.c | 495 ++++++ deps/libzip/lib/zip_crypto_win.h | 53 + deps/libzip/lib/zip_delete.c | 68 + deps/libzip/lib/zip_dir_add.c | 92 ++ deps/libzip/lib/zip_dirent.c | 1156 ++++++++++++++ deps/libzip/lib/zip_discard.c | 80 + deps/libzip/lib/zip_entry.c | 51 + deps/libzip/lib/zip_err_str.c | 78 + deps/libzip/lib/zip_error.c | 156 ++ deps/libzip/lib/zip_error_clear.c | 44 + deps/libzip/lib/zip_error_get.c | 54 + deps/libzip/lib/zip_error_get_sys_type.c | 45 + deps/libzip/lib/zip_error_strerror.c | 128 ++ deps/libzip/lib/zip_error_to_str.c | 58 + deps/libzip/lib/zip_extra_field.c | 427 +++++ deps/libzip/lib/zip_extra_field_api.c | 355 +++++ deps/libzip/lib/zip_fclose.c | 54 + deps/libzip/lib/zip_fdopen.c | 91 ++ deps/libzip/lib/zip_file_add.c | 52 + deps/libzip/lib/zip_file_error_clear.c | 44 + deps/libzip/lib/zip_file_error_get.c | 41 + deps/libzip/lib/zip_file_get_comment.c | 55 + .../lib/zip_file_get_external_attributes.c | 50 + deps/libzip/lib/zip_file_get_offset.c | 117 ++ deps/libzip/lib/zip_file_rename.c | 67 + deps/libzip/lib/zip_file_replace.c | 105 ++ deps/libzip/lib/zip_file_set_comment.c | 101 ++ deps/libzip/lib/zip_file_set_encryption.c | 116 ++ .../lib/zip_file_set_external_attributes.c | 82 + deps/libzip/lib/zip_file_set_mtime.c | 73 + deps/libzip/lib/zip_file_strerror.c | 41 + deps/libzip/lib/zip_fopen.c | 46 + deps/libzip/lib/zip_fopen_encrypted.c | 46 + deps/libzip/lib/zip_fopen_index.c | 41 + deps/libzip/lib/zip_fopen_index_encrypted.c | 86 + deps/libzip/lib/zip_fread.c | 63 + deps/libzip/lib/zip_fseek.c | 61 + deps/libzip/lib/zip_ftell.c | 54 + deps/libzip/lib/zip_get_archive_comment.c | 58 + deps/libzip/lib/zip_get_archive_flag.c | 45 + .../lib/zip_get_encryption_implementation.c | 62 + deps/libzip/lib/zip_get_file_comment.c | 50 + deps/libzip/lib/zip_get_name.c | 58 + deps/libzip/lib/zip_get_num_entries.c | 52 + deps/libzip/lib/zip_get_num_files.c | 51 + deps/libzip/lib/zip_hash.c | 410 +++++ deps/libzip/lib/zip_io_util.c | 134 ++ deps/libzip/lib/zip_libzip_version.c | 41 + deps/libzip/lib/zip_memdup.c | 56 + deps/libzip/lib/zip_name_locate.c | 116 ++ deps/libzip/lib/zip_new.c | 73 + deps/libzip/lib/zip_node_ext.c | 12 + deps/libzip/lib/zip_open.c | 875 ++++++++++ deps/libzip/lib/zip_pkware.c | 112 ++ deps/libzip/lib/zip_progress.c | 293 ++++ deps/libzip/lib/zip_random_unix.c | 104 ++ deps/libzip/lib/zip_random_uwp.c | 81 + deps/libzip/lib/zip_random_win32.c | 81 + deps/libzip/lib/zip_rename.c | 42 + deps/libzip/lib/zip_replace.c | 42 + deps/libzip/lib/zip_set_archive_comment.c | 80 + deps/libzip/lib/zip_set_archive_flag.c | 65 + deps/libzip/lib/zip_set_default_password.c | 58 + deps/libzip/lib/zip_set_file_comment.c | 46 + deps/libzip/lib/zip_set_file_compression.c | 91 ++ deps/libzip/lib/zip_set_name.c | 157 ++ deps/libzip/lib/zip_source_accept_empty.c | 52 + deps/libzip/lib/zip_source_begin_write.c | 57 + .../lib/zip_source_begin_write_cloning.c | 57 + deps/libzip/lib/zip_source_buffer.c | 643 ++++++++ deps/libzip/lib/zip_source_call.c | 68 + deps/libzip/lib/zip_source_close.c | 57 + deps/libzip/lib/zip_source_commit_write.c | 68 + deps/libzip/lib/zip_source_compress.c | 397 +++++ deps/libzip/lib/zip_source_crc.c | 201 +++ deps/libzip/lib/zip_source_error.c | 46 + deps/libzip/lib/zip_source_file.h | 90 ++ deps/libzip/lib/zip_source_file_common.c | 378 +++++ deps/libzip/lib/zip_source_file_stdio.c | 178 +++ deps/libzip/lib/zip_source_file_stdio.h | 45 + deps/libzip/lib/zip_source_file_stdio_named.c | 392 +++++ deps/libzip/lib/zip_source_file_win32.c | 234 +++ deps/libzip/lib/zip_source_file_win32.h | 84 + deps/libzip/lib/zip_source_file_win32_ansi.c | 87 + deps/libzip/lib/zip_source_file_win32_named.c | 274 ++++ deps/libzip/lib/zip_source_file_win32_utf16.c | 113 ++ deps/libzip/lib/zip_source_file_win32_utf8.c | 73 + deps/libzip/lib/zip_source_free.c | 71 + deps/libzip/lib/zip_source_function.c | 99 ++ .../lib/zip_source_get_file_attributes.c | 108 ++ deps/libzip/lib/zip_source_is_deleted.c | 41 + deps/libzip/lib/zip_source_layered.c | 76 + deps/libzip/lib/zip_source_open.c | 76 + .../lib/zip_source_pass_to_lower_layer.c | 78 + deps/libzip/lib/zip_source_pkware_decode.c | 219 +++ deps/libzip/lib/zip_source_pkware_encode.c | 248 +++ deps/libzip/lib/zip_source_read.c | 96 ++ deps/libzip/lib/zip_source_remove.c | 65 + deps/libzip/lib/zip_source_rollback_write.c | 50 + deps/libzip/lib/zip_source_seek.c | 95 ++ deps/libzip/lib/zip_source_seek_write.c | 56 + deps/libzip/lib/zip_source_stat.c | 62 + deps/libzip/lib/zip_source_supports.c | 69 + deps/libzip/lib/zip_source_tell.c | 57 + deps/libzip/lib/zip_source_tell_write.c | 51 + deps/libzip/lib/zip_source_window.c | 337 ++++ .../libzip/lib/zip_source_winzip_aes_decode.c | 264 +++ .../libzip/lib/zip_source_winzip_aes_encode.c | 253 +++ deps/libzip/lib/zip_source_write.c | 46 + deps/libzip/lib/zip_source_zip.c | 59 + deps/libzip/lib/zip_source_zip_new.c | 314 ++++ deps/libzip/lib/zip_stat.c | 46 + deps/libzip/lib/zip_stat_index.c | 80 + deps/libzip/lib/zip_stat_init.c | 83 + deps/libzip/lib/zip_strerror.c | 41 + deps/libzip/lib/zip_string.c | 178 +++ deps/libzip/lib/zip_unchange.c | 98 ++ deps/libzip/lib/zip_unchange_all.c | 54 + deps/libzip/lib/zip_unchange_archive.c | 51 + deps/libzip/lib/zip_unchange_data.c | 53 + deps/libzip/lib/zip_utf-8.c | 226 +++ deps/libzip/lib/zip_winzip_aes.c | 162 ++ deps/libzip/lib/zipconf.h | 45 + deps/libzip/lib/zipint.h | 644 ++++++++ deps/libzip/libzip-config.cmake.in | 11 + deps/libzip/libzip.gyp | 124 ++ deps/libzip/libzip.pc.in | 14 + deps/libzip/man/CMakeLists.txt | 166 ++ deps/libzip/man/ZIP_SOURCE_GET_ARGS.html | 114 ++ deps/libzip/man/ZIP_SOURCE_GET_ARGS.man | 83 + deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc | 79 + deps/libzip/man/fix-man-links.sh | 6 + deps/libzip/man/handle_links | 74 + deps/libzip/man/libzip.html | 294 ++++ deps/libzip/man/libzip.man | 360 +++++ deps/libzip/man/libzip.mdoc | 295 ++++ deps/libzip/man/links | 25 + deps/libzip/man/make_zip_errors.sh | 114 ++ deps/libzip/man/mkdocset.pl | 216 +++ deps/libzip/man/nih-man.css | 59 + deps/libzip/man/update-html.cmake | 12 + deps/libzip/man/update-man.cmake | 7 + deps/libzip/man/zip_add.html | 121 ++ deps/libzip/man/zip_add.man | 106 ++ deps/libzip/man/zip_add.mdoc | 96 ++ deps/libzip/man/zip_add_dir.html | 102 ++ deps/libzip/man/zip_add_dir.man | 74 + deps/libzip/man/zip_add_dir.mdoc | 69 + deps/libzip/man/zip_close.html | 158 ++ deps/libzip/man/zip_close.man | 150 ++ deps/libzip/man/zip_close.mdoc | 133 ++ .../man/zip_compression_method_supported.html | 105 ++ .../man/zip_compression_method_supported.man | 70 + .../man/zip_compression_method_supported.mdoc | 65 + deps/libzip/man/zip_delete.html | 114 ++ deps/libzip/man/zip_delete.man | 84 + deps/libzip/man/zip_delete.mdoc | 80 + deps/libzip/man/zip_dir_add.html | 134 ++ deps/libzip/man/zip_dir_add.man | 116 ++ deps/libzip/man/zip_dir_add.mdoc | 109 ++ deps/libzip/man/zip_discard.html | 97 ++ deps/libzip/man/zip_discard.man | 66 + deps/libzip/man/zip_discard.mdoc | 61 + .../man/zip_encryption_method_supported.html | 105 ++ .../man/zip_encryption_method_supported.man | 70 + .../man/zip_encryption_method_supported.mdoc | 65 + deps/libzip/man/zip_error_clear.html | 104 ++ deps/libzip/man/zip_error_clear.man | 79 + deps/libzip/man/zip_error_clear.mdoc | 69 + deps/libzip/man/zip_error_code_system.html | 99 ++ deps/libzip/man/zip_error_code_system.man | 68 + deps/libzip/man/zip_error_code_system.mdoc | 63 + deps/libzip/man/zip_error_code_zip.html | 96 ++ deps/libzip/man/zip_error_code_zip.man | 65 + deps/libzip/man/zip_error_code_zip.mdoc | 60 + deps/libzip/man/zip_error_fini.html | 97 ++ deps/libzip/man/zip_error_fini.man | 65 + deps/libzip/man/zip_error_fini.mdoc | 60 + deps/libzip/man/zip_error_get.html | 150 ++ deps/libzip/man/zip_error_get.man | 139 ++ deps/libzip/man/zip_error_get.mdoc | 117 ++ deps/libzip/man/zip_error_get_sys_type.html | 116 ++ deps/libzip/man/zip_error_get_sys_type.man | 88 + deps/libzip/man/zip_error_get_sys_type.mdoc | 77 + deps/libzip/man/zip_error_init.html | 108 ++ deps/libzip/man/zip_error_init.man | 85 + deps/libzip/man/zip_error_init.mdoc | 76 + deps/libzip/man/zip_error_set.html | 102 ++ deps/libzip/man/zip_error_set.man | 75 + deps/libzip/man/zip_error_set.mdoc | 70 + .../libzip/man/zip_error_set_from_source.mdoc | 69 + deps/libzip/man/zip_error_strerror.html | 101 ++ deps/libzip/man/zip_error_strerror.man | 72 + deps/libzip/man/zip_error_strerror.mdoc | 67 + deps/libzip/man/zip_error_system_type.html | 107 ++ deps/libzip/man/zip_error_system_type.man | 83 + deps/libzip/man/zip_error_system_type.mdoc | 77 + deps/libzip/man/zip_error_to_data.html | 108 ++ deps/libzip/man/zip_error_to_data.man | 74 + deps/libzip/man/zip_error_to_data.mdoc | 69 + deps/libzip/man/zip_error_to_str.html | 124 ++ deps/libzip/man/zip_error_to_str.man | 99 ++ deps/libzip/man/zip_error_to_str.mdoc | 88 + deps/libzip/man/zip_errors.html | 150 ++ deps/libzip/man/zip_errors.man | 147 ++ deps/libzip/man/zip_errors.mdoc | 117 ++ deps/libzip/man/zip_fclose.html | 103 ++ deps/libzip/man/zip_fclose.man | 70 + deps/libzip/man/zip_fclose.mdoc | 65 + deps/libzip/man/zip_fdopen.html | 156 ++ deps/libzip/man/zip_fdopen.man | 162 ++ deps/libzip/man/zip_fdopen.mdoc | 149 ++ deps/libzip/man/zip_file_add.html | 178 +++ deps/libzip/man/zip_file_add.man | 183 +++ deps/libzip/man/zip_file_add.mdoc | 164 ++ deps/libzip/man/zip_file_attributes_init.html | 97 ++ deps/libzip/man/zip_file_attributes_init.man | 66 + deps/libzip/man/zip_file_attributes_init.mdoc | 61 + .../man/zip_file_extra_field_delete.html | 159 ++ .../man/zip_file_extra_field_delete.man | 141 ++ .../man/zip_file_extra_field_delete.mdoc | 130 ++ deps/libzip/man/zip_file_extra_field_get.html | 176 ++ deps/libzip/man/zip_file_extra_field_get.man | 169 ++ deps/libzip/man/zip_file_extra_field_get.mdoc | 157 ++ deps/libzip/man/zip_file_extra_field_set.html | 148 ++ deps/libzip/man/zip_file_extra_field_set.man | 123 ++ deps/libzip/man/zip_file_extra_field_set.mdoc | 115 ++ .../man/zip_file_extra_fields_count.html | 149 ++ .../man/zip_file_extra_fields_count.man | 124 ++ .../man/zip_file_extra_fields_count.mdoc | 113 ++ deps/libzip/man/zip_file_get_comment.html | 143 ++ deps/libzip/man/zip_file_get_comment.man | 126 ++ deps/libzip/man/zip_file_get_comment.mdoc | 119 ++ deps/libzip/man/zip_file_get_error.html | 95 ++ deps/libzip/man/zip_file_get_error.man | 62 + deps/libzip/man/zip_file_get_error.mdoc | 57 + .../man/zip_file_get_external_attributes.html | 176 ++ .../man/zip_file_get_external_attributes.man | 174 ++ .../man/zip_file_get_external_attributes.mdoc | 165 ++ deps/libzip/man/zip_file_rename.html | 132 ++ deps/libzip/man/zip_file_rename.man | 111 ++ deps/libzip/man/zip_file_rename.mdoc | 104 ++ deps/libzip/man/zip_file_set_comment.html | 137 ++ deps/libzip/man/zip_file_set_comment.man | 123 ++ deps/libzip/man/zip_file_set_comment.mdoc | 116 ++ deps/libzip/man/zip_file_set_encryption.html | 150 ++ deps/libzip/man/zip_file_set_encryption.man | 132 ++ deps/libzip/man/zip_file_set_encryption.mdoc | 121 ++ .../man/zip_file_set_external_attributes.html | 125 ++ .../man/zip_file_set_external_attributes.man | 95 ++ .../man/zip_file_set_external_attributes.mdoc | 89 ++ deps/libzip/man/zip_file_set_mtime.html | 167 ++ deps/libzip/man/zip_file_set_mtime.man | 145 ++ deps/libzip/man/zip_file_set_mtime.mdoc | 126 ++ deps/libzip/man/zip_file_strerror.html | 115 ++ deps/libzip/man/zip_file_strerror.man | 95 ++ deps/libzip/man/zip_file_strerror.mdoc | 85 + deps/libzip/man/zip_fopen.html | 172 ++ deps/libzip/man/zip_fopen.man | 167 ++ deps/libzip/man/zip_fopen.mdoc | 148 ++ deps/libzip/man/zip_fopen_encrypted.html | 158 ++ deps/libzip/man/zip_fopen_encrypted.man | 144 ++ deps/libzip/man/zip_fopen_encrypted.mdoc | 135 ++ deps/libzip/man/zip_fread.html | 113 ++ deps/libzip/man/zip_fread.man | 89 ++ deps/libzip/man/zip_fread.mdoc | 84 + deps/libzip/man/zip_fseek.html | 121 ++ deps/libzip/man/zip_fseek.man | 98 ++ deps/libzip/man/zip_fseek.mdoc | 88 + deps/libzip/man/zip_ftell.html | 105 ++ deps/libzip/man/zip_ftell.man | 71 + deps/libzip/man/zip_ftell.mdoc | 66 + deps/libzip/man/zip_get_archive_comment.html | 131 ++ deps/libzip/man/zip_get_archive_comment.man | 115 ++ deps/libzip/man/zip_get_archive_comment.mdoc | 112 ++ deps/libzip/man/zip_get_archive_flag.html | 118 ++ deps/libzip/man/zip_get_archive_flag.man | 98 ++ deps/libzip/man/zip_get_archive_flag.mdoc | 94 ++ deps/libzip/man/zip_get_error.html | 97 ++ deps/libzip/man/zip_get_error.man | 65 + deps/libzip/man/zip_get_error.mdoc | 60 + deps/libzip/man/zip_get_file_comment.html | 105 ++ deps/libzip/man/zip_get_file_comment.man | 78 + deps/libzip/man/zip_get_file_comment.mdoc | 73 + deps/libzip/man/zip_get_name.html | 146 ++ deps/libzip/man/zip_get_name.man | 141 ++ deps/libzip/man/zip_get_name.mdoc | 132 ++ deps/libzip/man/zip_get_num_entries.html | 116 ++ deps/libzip/man/zip_get_num_entries.man | 93 ++ deps/libzip/man/zip_get_num_entries.mdoc | 88 + deps/libzip/man/zip_get_num_files.html | 110 ++ deps/libzip/man/zip_get_num_files.man | 80 + deps/libzip/man/zip_get_num_files.mdoc | 75 + deps/libzip/man/zip_libzip_version.html | 98 ++ deps/libzip/man/zip_libzip_version.man | 71 + deps/libzip/man/zip_libzip_version.mdoc | 66 + deps/libzip/man/zip_name_locate.html | 163 ++ deps/libzip/man/zip_name_locate.man | 161 ++ deps/libzip/man/zip_name_locate.mdoc | 148 ++ deps/libzip/man/zip_open.html | 200 +++ deps/libzip/man/zip_open.man | 220 +++ deps/libzip/man/zip_open.mdoc | 192 +++ ...p_register_cancel_callback_with_state.html | 119 ++ ...ip_register_cancel_callback_with_state.man | 90 ++ ...p_register_cancel_callback_with_state.mdoc | 84 + .../man/zip_register_progress_callback.html | 111 ++ .../man/zip_register_progress_callback.man | 83 + .../man/zip_register_progress_callback.mdoc | 77 + ...register_progress_callback_with_state.html | 119 ++ ..._register_progress_callback_with_state.man | 93 ++ ...register_progress_callback_with_state.mdoc | 87 + deps/libzip/man/zip_rename.html | 104 ++ deps/libzip/man/zip_rename.man | 75 + deps/libzip/man/zip_rename.mdoc | 70 + deps/libzip/man/zip_set_archive_comment.html | 124 ++ deps/libzip/man/zip_set_archive_comment.man | 98 ++ deps/libzip/man/zip_set_archive_comment.mdoc | 93 ++ deps/libzip/man/zip_set_archive_flag.html | 107 ++ deps/libzip/man/zip_set_archive_flag.man | 79 + deps/libzip/man/zip_set_archive_flag.mdoc | 74 + deps/libzip/man/zip_set_default_password.html | 123 ++ deps/libzip/man/zip_set_default_password.man | 94 ++ deps/libzip/man/zip_set_default_password.mdoc | 90 ++ deps/libzip/man/zip_set_file_comment.html | 109 ++ deps/libzip/man/zip_set_file_comment.man | 84 + deps/libzip/man/zip_set_file_comment.mdoc | 79 + deps/libzip/man/zip_set_file_compression.html | 162 ++ deps/libzip/man/zip_set_file_compression.man | 155 ++ deps/libzip/man/zip_set_file_compression.mdoc | 145 ++ deps/libzip/man/zip_source.html | 119 ++ deps/libzip/man/zip_source.man | 91 ++ deps/libzip/man/zip_source.mdoc | 90 ++ deps/libzip/man/zip_source_begin_write.html | 123 ++ deps/libzip/man/zip_source_begin_write.man | 99 ++ deps/libzip/man/zip_source_begin_write.mdoc | 89 ++ deps/libzip/man/zip_source_buffer.html | 135 ++ deps/libzip/man/zip_source_buffer.man | 112 ++ deps/libzip/man/zip_source_buffer.mdoc | 102 ++ .../man/zip_source_buffer_fragment.html | 150 ++ .../libzip/man/zip_source_buffer_fragment.man | 125 ++ .../man/zip_source_buffer_fragment.mdoc | 112 ++ deps/libzip/man/zip_source_close.html | 105 ++ deps/libzip/man/zip_source_close.man | 72 + deps/libzip/man/zip_source_close.mdoc | 67 + deps/libzip/man/zip_source_commit_write.html | 109 ++ deps/libzip/man/zip_source_commit_write.man | 75 + deps/libzip/man/zip_source_commit_write.mdoc | 70 + deps/libzip/man/zip_source_error.html | 97 ++ deps/libzip/man/zip_source_error.man | 65 + deps/libzip/man/zip_source_error.mdoc | 60 + deps/libzip/man/zip_source_file.html | 141 ++ deps/libzip/man/zip_source_file.man | 125 ++ deps/libzip/man/zip_source_file.mdoc | 114 ++ deps/libzip/man/zip_source_filep.html | 137 ++ deps/libzip/man/zip_source_filep.man | 117 ++ deps/libzip/man/zip_source_filep.mdoc | 107 ++ deps/libzip/man/zip_source_free.html | 104 ++ deps/libzip/man/zip_source_free.man | 81 + deps/libzip/man/zip_source_free.mdoc | 76 + deps/libzip/man/zip_source_function.html | 390 +++++ deps/libzip/man/zip_source_function.man | 423 +++++ deps/libzip/man/zip_source_function.mdoc | 409 +++++ deps/libzip/man/zip_source_is_deleted.html | 103 ++ deps/libzip/man/zip_source_is_deleted.man | 67 + deps/libzip/man/zip_source_is_deleted.mdoc | 62 + deps/libzip/man/zip_source_keep.html | 97 ++ deps/libzip/man/zip_source_keep.man | 65 + deps/libzip/man/zip_source_keep.mdoc | 60 + deps/libzip/man/zip_source_layered.html | 213 +++ deps/libzip/man/zip_source_layered.man | 169 ++ deps/libzip/man/zip_source_layered.mdoc | 163 ++ .../man/zip_source_make_command_bitmap.html | 99 ++ .../man/zip_source_make_command_bitmap.man | 67 + .../man/zip_source_make_command_bitmap.mdoc | 62 + deps/libzip/man/zip_source_open.html | 108 ++ deps/libzip/man/zip_source_open.man | 75 + deps/libzip/man/zip_source_open.mdoc | 70 + .../man/zip_source_pass_to_lower_layer.mdoc | 64 + deps/libzip/man/zip_source_read.html | 113 ++ deps/libzip/man/zip_source_read.man | 85 + deps/libzip/man/zip_source_read.mdoc | 80 + .../libzip/man/zip_source_rollback_write.html | 103 ++ deps/libzip/man/zip_source_rollback_write.man | 73 + .../libzip/man/zip_source_rollback_write.mdoc | 68 + deps/libzip/man/zip_source_seek.html | 120 ++ deps/libzip/man/zip_source_seek.man | 89 ++ deps/libzip/man/zip_source_seek.mdoc | 81 + .../man/zip_source_seek_compute_offset.html | 119 ++ .../man/zip_source_seek_compute_offset.man | 85 + .../man/zip_source_seek_compute_offset.mdoc | 81 + deps/libzip/man/zip_source_seek_write.html | 123 ++ deps/libzip/man/zip_source_seek_write.man | 92 ++ deps/libzip/man/zip_source_seek_write.mdoc | 84 + deps/libzip/man/zip_source_stat.html | 154 ++ deps/libzip/man/zip_source_stat.man | 144 ++ deps/libzip/man/zip_source_stat.mdoc | 125 ++ deps/libzip/man/zip_source_tell.html | 108 ++ deps/libzip/man/zip_source_tell.man | 79 + deps/libzip/man/zip_source_tell.mdoc | 74 + deps/libzip/man/zip_source_tell_write.html | 112 ++ deps/libzip/man/zip_source_tell_write.man | 82 + deps/libzip/man/zip_source_tell_write.mdoc | 77 + deps/libzip/man/zip_source_win32a.html | 143 ++ deps/libzip/man/zip_source_win32a.man | 127 ++ deps/libzip/man/zip_source_win32a.mdoc | 116 ++ deps/libzip/man/zip_source_win32handle.html | 143 ++ deps/libzip/man/zip_source_win32handle.man | 127 ++ deps/libzip/man/zip_source_win32handle.mdoc | 116 ++ deps/libzip/man/zip_source_win32w.html | 142 ++ deps/libzip/man/zip_source_win32w.man | 125 ++ deps/libzip/man/zip_source_win32w.mdoc | 114 ++ deps/libzip/man/zip_source_window.html | 123 ++ deps/libzip/man/zip_source_window.man | 96 ++ deps/libzip/man/zip_source_window.mdoc | 91 ++ deps/libzip/man/zip_source_write.html | 115 ++ deps/libzip/man/zip_source_write.man | 85 + deps/libzip/man/zip_source_write.mdoc | 80 + deps/libzip/man/zip_source_zip.html | 157 ++ deps/libzip/man/zip_source_zip.man | 145 ++ deps/libzip/man/zip_source_zip.mdoc | 131 ++ deps/libzip/man/zip_stat.html | 190 +++ deps/libzip/man/zip_stat.man | 203 +++ deps/libzip/man/zip_stat.mdoc | 179 +++ deps/libzip/man/zip_stat_init.html | 109 ++ deps/libzip/man/zip_stat_init.man | 81 + deps/libzip/man/zip_stat_init.mdoc | 76 + deps/libzip/man/zip_unchange.html | 116 ++ deps/libzip/man/zip_unchange.man | 86 + deps/libzip/man/zip_unchange.mdoc | 81 + deps/libzip/man/zip_unchange_all.html | 103 ++ deps/libzip/man/zip_unchange_all.man | 69 + deps/libzip/man/zip_unchange_all.mdoc | 64 + deps/libzip/man/zip_unchange_archive.html | 103 ++ deps/libzip/man/zip_unchange_archive.man | 69 + deps/libzip/man/zip_unchange_archive.mdoc | 64 + deps/libzip/man/zipcmp.html | 128 ++ deps/libzip/man/zipcmp.man | 105 ++ deps/libzip/man/zipcmp.mdoc | 97 ++ deps/libzip/man/zipmerge.html | 136 ++ deps/libzip/man/zipmerge.man | 109 ++ deps/libzip/man/zipmerge.mdoc | 102 ++ deps/libzip/man/ziptool.html | 325 ++++ deps/libzip/man/ziptool.man | 402 +++++ deps/libzip/man/ziptool.mdoc | 339 ++++ deps/libzip/regress/CMakeLists.txt | 103 ++ deps/libzip/regress/NiHTest.pm | 1416 +++++++++++++++++ deps/libzip/regress/add_dir.test | 4 + deps/libzip/regress/add_from_buffer.test | 4 + deps/libzip/regress/add_from_file.test | 5 + .../regress/add_from_file_duplicate.test | 6 + .../add_from_file_twice_duplicate.test | 6 + .../regress/add_from_file_unchange.test | 4 + deps/libzip/regress/add_from_filep.c | 96 ++ deps/libzip/regress/add_from_filep.test | 6 + deps/libzip/regress/add_from_stdin.test | 5 + deps/libzip/regress/add_from_zip_closed.test | 5 + .../libzip/regress/add_from_zip_deflated.test | 5 + .../regress/add_from_zip_deflated2.test | 5 + .../add_from_zip_partial_deflated.test | 5 + .../regress/add_from_zip_partial_stored.test | 5 + deps/libzip/regress/add_from_zip_stored.test | 5 + deps/libzip/regress/add_stored.test | 4 + deps/libzip/regress/add_stored_in_memory.test | 4 + deps/libzip/regress/bigstored.zh | Bin 0 -> 24632 bytes deps/libzip/regress/bigzero-zip.zip | Bin 0 -> 10490 bytes deps/libzip/regress/bogus.zip | 1 + deps/libzip/regress/broken.zip | Bin 0 -> 75091 bytes deps/libzip/regress/buffer-fragment-read.test | 5 + .../libzip/regress/buffer-fragment-write.test | 4 + deps/libzip/regress/can_clone_file.c | 127 ++ deps/libzip/regress/cancel_45.test | 8 + deps/libzip/regress/cancel_90.test | 10 + deps/libzip/regress/cleanup.cmake | 7 + deps/libzip/regress/clone-buffer-add.test | 4 + deps/libzip/regress/clone-buffer-delete.test | 4 + deps/libzip/regress/clone-buffer-replace.test | 4 + deps/libzip/regress/clone-fs-add.test | 5 + deps/libzip/regress/clone-fs-delete.test | 5 + deps/libzip/regress/clone-fs-replace.test | 5 + deps/libzip/regress/cm-default.test | 5 + deps/libzip/regress/cm-default.zip | Bin 0 -> 8702 bytes deps/libzip/regress/count_entries.test | 5 + .../decrypt-correct-password-aes128.test | 6 + .../decrypt-correct-password-aes192.test | 6 + .../decrypt-correct-password-aes256.test | 6 + .../decrypt-correct-password-pkware-2.test | 9 + .../decrypt-correct-password-pkware.test | 5 + .../regress/decrypt-no-password-aes256.test | 6 + .../decrypt-wrong-password-aes128.test | 6 + .../decrypt-wrong-password-aes192.test | 6 + .../decrypt-wrong-password-aes256.test | 6 + .../decrypt-wrong-password-pkware-2.test | 7 + .../decrypt-wrong-password-pkware.test | 5 + deps/libzip/regress/delete_add_same.test | 5 + deps/libzip/regress/delete_invalid.test | 5 + deps/libzip/regress/delete_last.test | 4 + deps/libzip/regress/delete_multiple_last.test | 4 + .../regress/delete_multiple_partial.test | 4 + .../libzip/regress/delete_renamed_rename.test | 5 + deps/libzip/regress/encrypt-1234.zip | Bin 0 -> 380 bytes .../regress/encrypt-aes128-noentropy.zip | Bin 0 -> 260 bytes deps/libzip/regress/encrypt-aes128.zip | Bin 0 -> 260 bytes .../regress/encrypt-aes192-noentropy.zip | Bin 0 -> 264 bytes deps/libzip/regress/encrypt-aes192.zip | Bin 0 -> 316 bytes .../regress/encrypt-aes256-noentropy.zip | Bin 0 -> 268 bytes deps/libzip/regress/encrypt-aes256.zip | Bin 0 -> 320 bytes deps/libzip/regress/encrypt-none.zip | Bin 0 -> 218 bytes .../regress/encrypt-pkware-noentropy-2.zip | Bin 0 -> 246 bytes .../regress/encrypt-pkware-noentropy.zip | Bin 0 -> 246 bytes deps/libzip/regress/encrypt.test | 23 + deps/libzip/regress/encrypt.zip | Bin 0 -> 306 bytes deps/libzip/regress/encrypt_plus_extra.zip | Bin 0 -> 348 bytes .../regress/encrypt_plus_extra_modified_c.zip | Bin 0 -> 332 bytes .../regress/encrypt_plus_extra_modified_l.zip | Bin 0 -> 332 bytes .../regress/encryption-nonrandom-aes128.test | 7 + .../regress/encryption-nonrandom-aes192.test | 7 + .../regress/encryption-nonrandom-aes256.test | 7 + .../encryption-nonrandom-pkware-2.test | 7 + .../regress/encryption-nonrandom-pkware.test | 7 + deps/libzip/regress/encryption-remove.test | 5 + deps/libzip/regress/encryption-stat.test | 23 + deps/libzip/regress/extra_add.test | 7 + deps/libzip/regress/extra_add_multiple.test | 8 + deps/libzip/regress/extra_count.test | 10 + deps/libzip/regress/extra_count_by_id.test | 22 + .../regress/extra_count_ignore_zip64.test | 7 + deps/libzip/regress/extra_delete.test | 14 + deps/libzip/regress/extra_delete_by_id.test | 6 + deps/libzip/regress/extra_field_align.test | 31 + deps/libzip/regress/extra_field_align_1-0.zip | Bin 0 -> 110 bytes .../regress/extra_field_align_1-ef_00.zip | Bin 0 -> 123 bytes .../regress/extra_field_align_1-ef_ff.zip | Bin 0 -> 123 bytes .../libzip/regress/extra_field_align_1-ff.zip | Bin 0 -> 110 bytes deps/libzip/regress/extra_field_align_2-0.zip | Bin 0 -> 110 bytes .../regress/extra_field_align_2-ef_00.zip | Bin 0 -> 123 bytes .../regress/extra_field_align_2-ef_ff.zip | Bin 0 -> 123 bytes .../libzip/regress/extra_field_align_2-ff.zip | Bin 0 -> 110 bytes deps/libzip/regress/extra_field_align_3-0.zip | Bin 0 -> 110 bytes .../regress/extra_field_align_3-ef_00.zip | Bin 0 -> 123 bytes .../regress/extra_field_align_3-ef_ff.zip | Bin 0 -> 123 bytes .../libzip/regress/extra_field_align_3-ff.zip | Bin 0 -> 110 bytes .../libzip/regress/extra_field_align_4-ff.zip | Bin 0 -> 113 bytes deps/libzip/regress/extra_get.test | 9 + deps/libzip/regress/extra_get_by_id.test | 9 + deps/libzip/regress/extra_set.test | 14 + deps/libzip/regress/extra_set_modify_c.test | 16 + deps/libzip/regress/extra_set_modify_l.test | 16 + deps/libzip/regress/fdopen_ok.test | 15 + .../regress/file_comment_encmismatch.test | 4 + deps/libzip/regress/filename_duplicate.zip | Bin 0 -> 206 bytes .../regress/filename_duplicate_empty.zip | Bin 0 -> 186 bytes deps/libzip/regress/filename_empty.zip | Bin 0 -> 98 bytes deps/libzip/regress/fileorder.zip | Bin 0 -> 204 bytes .../regress/firstsecond-split-deflated.zip | Bin 0 -> 219 bytes .../regress/firstsecond-split-stored.zip | Bin 0 -> 215 bytes deps/libzip/regress/firstsecond.zip | Bin 0 -> 319 bytes deps/libzip/regress/foo-stored.zip | Bin 0 -> 107 bytes deps/libzip/regress/fopen_multiple.test | 7 + .../libzip/regress/fopen_multiple_reopen.test | 7 + deps/libzip/regress/fopen_unchanged.c | 90 ++ deps/libzip/regress/fopen_unchanged.test | 5 + deps/libzip/regress/fread.c | 212 +++ deps/libzip/regress/fread.test | 5 + deps/libzip/regress/fseek.c | 104 ++ deps/libzip/regress/fseek_deflated.test | 6 + deps/libzip/regress/fseek_fail.test | 6 + deps/libzip/regress/fseek_ok.test | 6 + deps/libzip/regress/fuzz_main.c | 50 + deps/libzip/regress/gap-add.zip | Bin 0 -> 451 bytes deps/libzip/regress/gap-delete.zip | Bin 0 -> 250 bytes deps/libzip/regress/gap-replace.zip | Bin 0 -> 351 bytes deps/libzip/regress/gap.zip | Bin 0 -> 358 bytes deps/libzip/regress/get_comment.test | 14 + deps/libzip/regress/hole.c | 190 +++ .../regress/incons-archive-comment-longer.zip | Bin 0 -> 153 bytes .../incons-archive-comment-shorter.zip | Bin 0 -> 203 bytes deps/libzip/regress/incons-cdoffset.zip | Bin 0 -> 153 bytes .../incons-central-compression-method.zip | Bin 0 -> 153 bytes ...ncons-central-compsize-larger-toolarge.zip | Bin 0 -> 153 bytes .../incons-central-compsize-larger.zip | Bin 0 -> 153 bytes .../incons-central-compsize-smaller.zip | Bin 0 -> 173 bytes deps/libzip/regress/incons-central-crc.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-central-date.zip | Bin 0 -> 131 bytes .../incons-central-file-comment-longer.zip | Bin 0 -> 153 bytes .../incons-central-file-comment-shorter.zip | Bin 0 -> 258 bytes .../regress/incons-central-magic-bad.zip | Bin 0 -> 153 bytes .../regress/incons-central-magic-bad2.zip | Bin 0 -> 153 bytes .../regress/incons-central-size-larger.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-data.zip | Bin 0 -> 153 bytes .../regress/incons-ef-central-size-wrong.zip | Bin 0 -> 151 bytes .../regress/incons-ef-local-id-size.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-ef-local-id.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-ef-local-size.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-eocd-magic-bad.zip | Bin 0 -> 153 bytes .../libzip/regress/incons-file-count-high.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-file-count-low.zip | Bin 0 -> 304 bytes .../regress/incons-file-count-overflow.zip | Bin 0 -> 198 bytes .../incons-local-compression-method.zip | Bin 0 -> 153 bytes .../regress/incons-local-compsize-larger.zip | Bin 0 -> 153 bytes .../regress/incons-local-compsize-smaller.zip | Bin 0 -> 173 bytes deps/libzip/regress/incons-local-crc.zip | Bin 0 -> 153 bytes .../regress/incons-local-filename-long.zip | Bin 0 -> 153 bytes .../regress/incons-local-filename-missing.zip | Bin 0 -> 152 bytes .../regress/incons-local-filename-short.zip | Bin 0 -> 153 bytes deps/libzip/regress/incons-local-filename.zip | Bin 0 -> 153 bytes .../libzip/regress/incons-local-magic-bad.zip | Bin 0 -> 153 bytes .../regress/incons-local-size-larger.zip | Bin 0 -> 153 bytes deps/libzip/regress/junk-at-end.zip | Bin 0 -> 416 bytes deps/libzip/regress/junk-at-start.zip | Bin 0 -> 416 bytes deps/libzip/regress/junk_at_end.test | 5 + deps/libzip/regress/junk_at_start.test | 5 + deps/libzip/regress/large-uncompressible | Bin 0 -> 8200 bytes deps/libzip/regress/liboverride-test.c | 108 ++ deps/libzip/regress/liboverride.c | 48 + deps/libzip/regress/lzma-no-eos.zip | Bin 0 -> 343 bytes deps/libzip/regress/malloc.c | 162 ++ deps/libzip/regress/manyfiles-zip.zip | Bin 0 -> 3434201 bytes deps/libzip/regress/multidisk.zip | Bin 0 -> 122 bytes deps/libzip/regress/name_locate-cp437.test | 9 + deps/libzip/regress/name_locate-utf8.test | 9 + deps/libzip/regress/name_locate.test | 27 + deps/libzip/regress/nihtest.conf.in | 4 + deps/libzip/regress/nonrandomopen.c | 44 + deps/libzip/regress/nonrandomopentest.c | 57 + deps/libzip/regress/open_cons_extrabytes.test | 7 + deps/libzip/regress/open_empty.test | 6 + deps/libzip/regress/open_empty_2.test | 7 + deps/libzip/regress/open_extrabytes.test | 6 + deps/libzip/regress/open_file_count.test | 11 + .../regress/open_filename_duplicate.test | 6 + .../open_filename_duplicate_consistency.test | 7 + .../open_filename_duplicate_empty.test | 6 + ..._filename_duplicate_empty_consistency.test | 7 + deps/libzip/regress/open_filename_empty.test | 6 + deps/libzip/regress/open_incons.test | 73 + deps/libzip/regress/open_many_fail.test | 11 + deps/libzip/regress/open_many_ok.test | 12 + deps/libzip/regress/open_multidisk.test | 7 + deps/libzip/regress/open_new_but_exists.test | 7 + deps/libzip/regress/open_new_ok.test | 5 + deps/libzip/regress/open_nonarchive.test | 7 + deps/libzip/regress/open_nosuchfile.test | 6 + deps/libzip/regress/open_ok.test | 6 + deps/libzip/regress/open_too_short.test | 7 + deps/libzip/regress/open_truncate.test | 6 + deps/libzip/regress/open_zip64_3mf.test | 6 + deps/libzip/regress/open_zip64_ok.test | 6 + deps/libzip/regress/ossfuzz.sh | 35 + deps/libzip/regress/preload.test | 4 + deps/libzip/regress/progress.test | 10 + deps/libzip/regress/read_seek_read.test | 7 + deps/libzip/regress/rename_ascii.test | 4 + deps/libzip/regress/rename_cp437.test | 4 + deps/libzip/regress/rename_deleted.test | 5 + deps/libzip/regress/rename_fail.test | 5 + deps/libzip/regress/rename_ok.test | 4 + deps/libzip/regress/rename_ok.zip | Bin 0 -> 709 bytes deps/libzip/regress/rename_utf8.test | 4 + .../regress/rename_utf8_encmismatch.test | 4 + deps/libzip/regress/reopen.test | 7 + deps/libzip/regress/reopen_partial.test | 6 + deps/libzip/regress/reopen_partial_rest.test | 7 + deps/libzip/regress/runtest.in | 60 + deps/libzip/regress/set_comment_all.test | 4 + .../libzip/regress/set_comment_localonly.test | 4 + .../regress/set_comment_removeglobal.test | 4 + deps/libzip/regress/set_comment_revert.test | 4 + .../set_compression_bzip2_to_deflate.test | 5 + .../set_compression_deflate_to_bzip2.test | 5 + .../set_compression_deflate_to_deflate.test | 4 + .../set_compression_deflate_to_store.test | 4 + .../set_compression_lzma_no_eos_to_store.test | 5 + .../set_compression_lzma_to_store.test | 5 + .../set_compression_store_to_bzip2.test | 5 + .../set_compression_store_to_deflate.test | 4 + .../set_compression_store_to_lzma.test | 5 + .../set_compression_store_to_store.test | 4 + .../regress/set_compression_store_to_xz.test | 5 + .../set_compression_store_to_zstd.test | 5 + .../regress/set_compression_unknown.test | 5 + .../regress/set_compression_xz_to_store.test | 5 + .../set_compression_zstd_to_store.test | 5 + deps/libzip/regress/set_file_dostime.test | 4 + deps/libzip/regress/set_file_mtime.test | 4 + .../libzip/regress/set_file_mtime_pkware.test | 5 + deps/libzip/regress/source_hole.c | 577 +++++++ .../regress/stat_index_cp437_guess.test | 148 ++ deps/libzip/regress/stat_index_cp437_raw.test | 149 ++ .../regress/stat_index_cp437_strict.test | 148 ++ deps/libzip/regress/stat_index_fileorder.test | 22 + deps/libzip/regress/stat_index_streamed.test | 13 + .../regress/stat_index_streamed_zip64.test | 13 + .../libzip/regress/stat_index_utf8_guess.test | 13 + deps/libzip/regress/stat_index_utf8_raw.test | 13 + .../regress/stat_index_utf8_strict.test | 14 + .../stat_index_utf8_unmarked_strict.test | 14 + deps/libzip/regress/stat_index_zip64.test | 13 + deps/libzip/regress/stored-no-eos.zip | Bin 0 -> 348 bytes deps/libzip/regress/streamed-zip64.zip | Bin 0 -> 148 bytes deps/libzip/regress/streamed.zip | Bin 0 -> 120 bytes .../regress/test-cp437-comment-utf-8.zip | Bin 0 -> 2619 bytes .../regress/test-cp437-fc-utf-8-filename.zip | Bin 0 -> 236 bytes deps/libzip/regress/test-cp437-fc.zip | Bin 0 -> 186 bytes deps/libzip/regress/test-cp437.zip | Bin 0 -> 2582 bytes deps/libzip/regress/test-utf8-unmarked.zip | Bin 0 -> 210 bytes deps/libzip/regress/test-utf8.zip | Bin 0 -> 210 bytes deps/libzip/regress/test.zip | Bin 0 -> 412 bytes deps/libzip/regress/test2.zip | Bin 0 -> 126 bytes deps/libzip/regress/test_open_multiple.zip | Bin 0 -> 152 bytes deps/libzip/regress/testbuffer.zip | Bin 0 -> 180 bytes deps/libzip/regress/testbuffer_reopen.zip | Bin 0 -> 247 bytes deps/libzip/regress/testbzip2.zip | Bin 0 -> 175 bytes deps/libzip/regress/testchanged.zip | Bin 0 -> 728 bytes deps/libzip/regress/testchangedlocal.zip | Bin 0 -> 714 bytes deps/libzip/regress/testcomment.zip | Bin 0 -> 703 bytes deps/libzip/regress/testcomment13.zip | Bin 0 -> 383 bytes deps/libzip/regress/testcommentremoved.zip | Bin 0 -> 640 bytes deps/libzip/regress/testdeflated.zip | Bin 0 -> 145 bytes deps/libzip/regress/testdeflated2.zip | Bin 0 -> 270 bytes deps/libzip/regress/testdir.zip | Bin 0 -> 222 bytes deps/libzip/regress/testempty.zip | Bin 0 -> 22 bytes deps/libzip/regress/testextrabytes.zip | Bin 0 -> 160 bytes deps/libzip/regress/testfile-UTF8.zip | Bin 0 -> 126 bytes deps/libzip/regress/testfile-cp437.zip | Bin 0 -> 130 bytes deps/libzip/regress/testfile-lzma.zip | Bin 0 -> 161 bytes deps/libzip/regress/testfile-plus-extra.zip | Bin 0 -> 164 bytes deps/libzip/regress/testfile-stored-dos.zip | Bin 0 -> 192 bytes deps/libzip/regress/testfile-xz.zip | Bin 0 -> 200 bytes deps/libzip/regress/testfile-zstd.zip | Bin 0 -> 160 bytes deps/libzip/regress/testfile.txt | 0 deps/libzip/regress/testfile.zip | Bin 0 -> 122 bytes deps/libzip/regress/testfile0.zip | Bin 0 -> 122 bytes deps/libzip/regress/testfile2014.zip | Bin 0 -> 122 bytes deps/libzip/regress/teststdin.zip | Bin 0 -> 200 bytes deps/libzip/regress/teststored.zip | Bin 0 -> 188 bytes deps/libzip/regress/tryopen.c | 113 ++ .../regress/unchange-delete-namelocate.test | 5 + .../regress/utf-8-standardization-input.zip | Bin 0 -> 285 bytes .../regress/utf-8-standardization-output.zip | Bin 0 -> 226 bytes .../libzip/regress/utf-8-standardization.test | 4 + .../regress/zip-in-archive-comment.test | 13 + .../libzip/regress/zip-in-archive-comment.zip | Bin 0 -> 320 bytes deps/libzip/regress/zip64-3mf.zip | Bin 0 -> 198 bytes deps/libzip/regress/zip64.zip | Bin 0 -> 198 bytes deps/libzip/regress/zip64_creation.test | 4 + .../libzip/regress/zip64_stored_creation.test | 4 + deps/libzip/regress/zip_read_fuzzer.cc | 48 + deps/libzip/regress/zip_read_fuzzer.dict | 3 + deps/libzip/regress/zipcmp_zip_dir.test | 15 + deps/libzip/regress/zipcmp_zip_dir.zip | Bin 0 -> 483 bytes deps/libzip/regress/ziptool_regress.c | 590 +++++++ deps/libzip/src/CMakeLists.txt | 14 + deps/libzip/src/diff_output.c | 106 ++ deps/libzip/src/diff_output.h | 28 + deps/libzip/src/getopt.c | 110 ++ deps/libzip/src/getopt.h | 51 + deps/libzip/src/zipcmp.c | 880 ++++++++++ deps/libzip/src/zipmerge.c | 336 ++++ deps/libzip/src/ziptool.c | 1029 ++++++++++++ deps/libzip/vstudio/readme.txt | 77 + deps/libzip/vstudio/vsbuild.cmd | 185 +++ deps/libzip/vstudio/zlib/unpack_zlib_here.txt | 1 + doc/api/errors.md | 12 + doc/api/zlib.md | 146 ++ doc/contributing/maintaining-libzip.md | 40 + lib/internal/errors.js | 1 + lib/zlib.js | 410 ++++- node.gyp | 1 + node.gypi | 7 + src/node_archive.cc | 480 ++++++ src/node_binding.cc | 1 + src/node_errors.h | 3 + src/node_zlib.cc | 45 + test/fixtures/corepack.zip | Bin 0 -> 625393 bytes .../test-zip-add-precompressed-file.js | 21 + .../test-zip-add-uncompressed-file.js | 19 + .../test-zip-err-zip-opening-failed.js | 15 + test/parallel/test-zip-list-archive.js | 69 + test/parallel/test-zip-memory-leaks.js | 48 + test/parallel/test-zip-new-archive.js | 21 + 847 files changed, 71553 insertions(+), 6 deletions(-) create mode 100644 deps/libzip/.clang-format create mode 100644 deps/libzip/.gitattributes create mode 100644 deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md create mode 100644 deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md create mode 100644 deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md create mode 100644 deps/libzip/.github/workflows/CIFuzz.yml create mode 100644 deps/libzip/.github/workflows/build.yml create mode 100644 deps/libzip/.github/workflows/codeql-analysis.yml create mode 100644 deps/libzip/.gitignore create mode 100644 deps/libzip/API-CHANGES.md create mode 100644 deps/libzip/AUTHORS create mode 100644 deps/libzip/CMakeLists.txt create mode 100644 deps/libzip/INSTALL.md create mode 100644 deps/libzip/LICENSE create mode 100644 deps/libzip/NEWS.md create mode 100644 deps/libzip/README.md create mode 100644 deps/libzip/SECURITY.md create mode 100644 deps/libzip/THANKS create mode 100644 deps/libzip/TODO.md create mode 100755 deps/libzip/android/do.sh create mode 100644 deps/libzip/android/docker/Dockerfile create mode 100644 deps/libzip/android/readme.txt create mode 100644 deps/libzip/appveyor.yml create mode 100644 deps/libzip/cmake-compat/CMakePushCheckState.cmake create mode 100644 deps/libzip/cmake-compat/CheckLibraryExists.cmake create mode 100644 deps/libzip/cmake-compat/CheckSymbolExists.cmake create mode 100644 deps/libzip/cmake-compat/FindBZip2.cmake create mode 100644 deps/libzip/cmake-compat/FindGnuTLS.cmake create mode 100644 deps/libzip/cmake-compat/FindLibLZMA.cmake create mode 100644 deps/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake create mode 100644 deps/libzip/cmake-compat/FindPackageMessage.cmake create mode 100644 deps/libzip/cmake-compat/SelectLibraryConfigurations.cmake create mode 100644 deps/libzip/cmake-config.h.in create mode 100644 deps/libzip/cmake-zipconf.h.in create mode 100644 deps/libzip/cmake/Dist.cmake create mode 100644 deps/libzip/cmake/FindMbedTLS.cmake create mode 100644 deps/libzip/cmake/FindNettle.cmake create mode 100644 deps/libzip/cmake/FindZstd.cmake create mode 100644 deps/libzip/custom/config.h create mode 100644 deps/libzip/examples/CMakeLists.txt create mode 100644 deps/libzip/examples/add-compressed-data.c create mode 100644 deps/libzip/examples/autoclose-archive.c create mode 100644 deps/libzip/examples/in-memory.c create mode 100644 deps/libzip/examples/windows-open.c create mode 100644 deps/libzip/lib/CMakeLists.txt create mode 100644 deps/libzip/lib/compat.h create mode 100644 deps/libzip/lib/config.h create mode 100644 deps/libzip/lib/zip.h create mode 100644 deps/libzip/lib/zip_add.c create mode 100644 deps/libzip/lib/zip_add_dir.c create mode 100644 deps/libzip/lib/zip_add_entry.c create mode 100644 deps/libzip/lib/zip_algorithm_bzip2.c create mode 100644 deps/libzip/lib/zip_algorithm_deflate.c create mode 100644 deps/libzip/lib/zip_algorithm_xz.c create mode 100644 deps/libzip/lib/zip_algorithm_zstd.c create mode 100644 deps/libzip/lib/zip_buffer.c create mode 100644 deps/libzip/lib/zip_close.c create mode 100644 deps/libzip/lib/zip_crypto.h create mode 100644 deps/libzip/lib/zip_crypto_commoncrypto.c create mode 100644 deps/libzip/lib/zip_crypto_commoncrypto.h create mode 100644 deps/libzip/lib/zip_crypto_gnutls.c create mode 100644 deps/libzip/lib/zip_crypto_gnutls.h create mode 100644 deps/libzip/lib/zip_crypto_mbedtls.c create mode 100644 deps/libzip/lib/zip_crypto_mbedtls.h create mode 100644 deps/libzip/lib/zip_crypto_openssl.c create mode 100644 deps/libzip/lib/zip_crypto_openssl.h create mode 100644 deps/libzip/lib/zip_crypto_win.c create mode 100644 deps/libzip/lib/zip_crypto_win.h create mode 100644 deps/libzip/lib/zip_delete.c create mode 100644 deps/libzip/lib/zip_dir_add.c create mode 100644 deps/libzip/lib/zip_dirent.c create mode 100644 deps/libzip/lib/zip_discard.c create mode 100644 deps/libzip/lib/zip_entry.c create mode 100644 deps/libzip/lib/zip_err_str.c create mode 100644 deps/libzip/lib/zip_error.c create mode 100644 deps/libzip/lib/zip_error_clear.c create mode 100644 deps/libzip/lib/zip_error_get.c create mode 100644 deps/libzip/lib/zip_error_get_sys_type.c create mode 100644 deps/libzip/lib/zip_error_strerror.c create mode 100644 deps/libzip/lib/zip_error_to_str.c create mode 100644 deps/libzip/lib/zip_extra_field.c create mode 100644 deps/libzip/lib/zip_extra_field_api.c create mode 100644 deps/libzip/lib/zip_fclose.c create mode 100644 deps/libzip/lib/zip_fdopen.c create mode 100644 deps/libzip/lib/zip_file_add.c create mode 100644 deps/libzip/lib/zip_file_error_clear.c create mode 100644 deps/libzip/lib/zip_file_error_get.c create mode 100644 deps/libzip/lib/zip_file_get_comment.c create mode 100644 deps/libzip/lib/zip_file_get_external_attributes.c create mode 100644 deps/libzip/lib/zip_file_get_offset.c create mode 100644 deps/libzip/lib/zip_file_rename.c create mode 100644 deps/libzip/lib/zip_file_replace.c create mode 100644 deps/libzip/lib/zip_file_set_comment.c create mode 100644 deps/libzip/lib/zip_file_set_encryption.c create mode 100644 deps/libzip/lib/zip_file_set_external_attributes.c create mode 100644 deps/libzip/lib/zip_file_set_mtime.c create mode 100644 deps/libzip/lib/zip_file_strerror.c create mode 100644 deps/libzip/lib/zip_fopen.c create mode 100644 deps/libzip/lib/zip_fopen_encrypted.c create mode 100644 deps/libzip/lib/zip_fopen_index.c create mode 100644 deps/libzip/lib/zip_fopen_index_encrypted.c create mode 100644 deps/libzip/lib/zip_fread.c create mode 100644 deps/libzip/lib/zip_fseek.c create mode 100644 deps/libzip/lib/zip_ftell.c create mode 100644 deps/libzip/lib/zip_get_archive_comment.c create mode 100644 deps/libzip/lib/zip_get_archive_flag.c create mode 100644 deps/libzip/lib/zip_get_encryption_implementation.c create mode 100644 deps/libzip/lib/zip_get_file_comment.c create mode 100644 deps/libzip/lib/zip_get_name.c create mode 100644 deps/libzip/lib/zip_get_num_entries.c create mode 100644 deps/libzip/lib/zip_get_num_files.c create mode 100644 deps/libzip/lib/zip_hash.c create mode 100644 deps/libzip/lib/zip_io_util.c create mode 100644 deps/libzip/lib/zip_libzip_version.c create mode 100644 deps/libzip/lib/zip_memdup.c create mode 100644 deps/libzip/lib/zip_name_locate.c create mode 100644 deps/libzip/lib/zip_new.c create mode 100644 deps/libzip/lib/zip_node_ext.c create mode 100644 deps/libzip/lib/zip_open.c create mode 100644 deps/libzip/lib/zip_pkware.c create mode 100644 deps/libzip/lib/zip_progress.c create mode 100644 deps/libzip/lib/zip_random_unix.c create mode 100644 deps/libzip/lib/zip_random_uwp.c create mode 100644 deps/libzip/lib/zip_random_win32.c create mode 100644 deps/libzip/lib/zip_rename.c create mode 100644 deps/libzip/lib/zip_replace.c create mode 100644 deps/libzip/lib/zip_set_archive_comment.c create mode 100644 deps/libzip/lib/zip_set_archive_flag.c create mode 100644 deps/libzip/lib/zip_set_default_password.c create mode 100644 deps/libzip/lib/zip_set_file_comment.c create mode 100644 deps/libzip/lib/zip_set_file_compression.c create mode 100644 deps/libzip/lib/zip_set_name.c create mode 100644 deps/libzip/lib/zip_source_accept_empty.c create mode 100644 deps/libzip/lib/zip_source_begin_write.c create mode 100644 deps/libzip/lib/zip_source_begin_write_cloning.c create mode 100644 deps/libzip/lib/zip_source_buffer.c create mode 100644 deps/libzip/lib/zip_source_call.c create mode 100644 deps/libzip/lib/zip_source_close.c create mode 100644 deps/libzip/lib/zip_source_commit_write.c create mode 100644 deps/libzip/lib/zip_source_compress.c create mode 100644 deps/libzip/lib/zip_source_crc.c create mode 100644 deps/libzip/lib/zip_source_error.c create mode 100644 deps/libzip/lib/zip_source_file.h create mode 100644 deps/libzip/lib/zip_source_file_common.c create mode 100644 deps/libzip/lib/zip_source_file_stdio.c create mode 100644 deps/libzip/lib/zip_source_file_stdio.h create mode 100644 deps/libzip/lib/zip_source_file_stdio_named.c create mode 100644 deps/libzip/lib/zip_source_file_win32.c create mode 100644 deps/libzip/lib/zip_source_file_win32.h create mode 100644 deps/libzip/lib/zip_source_file_win32_ansi.c create mode 100644 deps/libzip/lib/zip_source_file_win32_named.c create mode 100644 deps/libzip/lib/zip_source_file_win32_utf16.c create mode 100644 deps/libzip/lib/zip_source_file_win32_utf8.c create mode 100644 deps/libzip/lib/zip_source_free.c create mode 100644 deps/libzip/lib/zip_source_function.c create mode 100644 deps/libzip/lib/zip_source_get_file_attributes.c create mode 100644 deps/libzip/lib/zip_source_is_deleted.c create mode 100644 deps/libzip/lib/zip_source_layered.c create mode 100644 deps/libzip/lib/zip_source_open.c create mode 100644 deps/libzip/lib/zip_source_pass_to_lower_layer.c create mode 100644 deps/libzip/lib/zip_source_pkware_decode.c create mode 100644 deps/libzip/lib/zip_source_pkware_encode.c create mode 100644 deps/libzip/lib/zip_source_read.c create mode 100644 deps/libzip/lib/zip_source_remove.c create mode 100644 deps/libzip/lib/zip_source_rollback_write.c create mode 100644 deps/libzip/lib/zip_source_seek.c create mode 100644 deps/libzip/lib/zip_source_seek_write.c create mode 100644 deps/libzip/lib/zip_source_stat.c create mode 100644 deps/libzip/lib/zip_source_supports.c create mode 100644 deps/libzip/lib/zip_source_tell.c create mode 100644 deps/libzip/lib/zip_source_tell_write.c create mode 100644 deps/libzip/lib/zip_source_window.c create mode 100644 deps/libzip/lib/zip_source_winzip_aes_decode.c create mode 100644 deps/libzip/lib/zip_source_winzip_aes_encode.c create mode 100644 deps/libzip/lib/zip_source_write.c create mode 100644 deps/libzip/lib/zip_source_zip.c create mode 100644 deps/libzip/lib/zip_source_zip_new.c create mode 100644 deps/libzip/lib/zip_stat.c create mode 100644 deps/libzip/lib/zip_stat_index.c create mode 100644 deps/libzip/lib/zip_stat_init.c create mode 100644 deps/libzip/lib/zip_strerror.c create mode 100644 deps/libzip/lib/zip_string.c create mode 100644 deps/libzip/lib/zip_unchange.c create mode 100644 deps/libzip/lib/zip_unchange_all.c create mode 100644 deps/libzip/lib/zip_unchange_archive.c create mode 100644 deps/libzip/lib/zip_unchange_data.c create mode 100644 deps/libzip/lib/zip_utf-8.c create mode 100644 deps/libzip/lib/zip_winzip_aes.c create mode 100644 deps/libzip/lib/zipconf.h create mode 100644 deps/libzip/lib/zipint.h create mode 100644 deps/libzip/libzip-config.cmake.in create mode 100644 deps/libzip/libzip.gyp create mode 100644 deps/libzip/libzip.pc.in create mode 100644 deps/libzip/man/CMakeLists.txt create mode 100644 deps/libzip/man/ZIP_SOURCE_GET_ARGS.html create mode 100644 deps/libzip/man/ZIP_SOURCE_GET_ARGS.man create mode 100644 deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc create mode 100755 deps/libzip/man/fix-man-links.sh create mode 100755 deps/libzip/man/handle_links create mode 100644 deps/libzip/man/libzip.html create mode 100644 deps/libzip/man/libzip.man create mode 100644 deps/libzip/man/libzip.mdoc create mode 100644 deps/libzip/man/links create mode 100755 deps/libzip/man/make_zip_errors.sh create mode 100755 deps/libzip/man/mkdocset.pl create mode 100644 deps/libzip/man/nih-man.css create mode 100644 deps/libzip/man/update-html.cmake create mode 100644 deps/libzip/man/update-man.cmake create mode 100644 deps/libzip/man/zip_add.html create mode 100644 deps/libzip/man/zip_add.man create mode 100644 deps/libzip/man/zip_add.mdoc create mode 100644 deps/libzip/man/zip_add_dir.html create mode 100644 deps/libzip/man/zip_add_dir.man create mode 100644 deps/libzip/man/zip_add_dir.mdoc create mode 100644 deps/libzip/man/zip_close.html create mode 100644 deps/libzip/man/zip_close.man create mode 100644 deps/libzip/man/zip_close.mdoc create mode 100644 deps/libzip/man/zip_compression_method_supported.html create mode 100644 deps/libzip/man/zip_compression_method_supported.man create mode 100644 deps/libzip/man/zip_compression_method_supported.mdoc create mode 100644 deps/libzip/man/zip_delete.html create mode 100644 deps/libzip/man/zip_delete.man create mode 100644 deps/libzip/man/zip_delete.mdoc create mode 100644 deps/libzip/man/zip_dir_add.html create mode 100644 deps/libzip/man/zip_dir_add.man create mode 100644 deps/libzip/man/zip_dir_add.mdoc create mode 100644 deps/libzip/man/zip_discard.html create mode 100644 deps/libzip/man/zip_discard.man create mode 100644 deps/libzip/man/zip_discard.mdoc create mode 100644 deps/libzip/man/zip_encryption_method_supported.html create mode 100644 deps/libzip/man/zip_encryption_method_supported.man create mode 100644 deps/libzip/man/zip_encryption_method_supported.mdoc create mode 100644 deps/libzip/man/zip_error_clear.html create mode 100644 deps/libzip/man/zip_error_clear.man create mode 100644 deps/libzip/man/zip_error_clear.mdoc create mode 100644 deps/libzip/man/zip_error_code_system.html create mode 100644 deps/libzip/man/zip_error_code_system.man create mode 100644 deps/libzip/man/zip_error_code_system.mdoc create mode 100644 deps/libzip/man/zip_error_code_zip.html create mode 100644 deps/libzip/man/zip_error_code_zip.man create mode 100644 deps/libzip/man/zip_error_code_zip.mdoc create mode 100644 deps/libzip/man/zip_error_fini.html create mode 100644 deps/libzip/man/zip_error_fini.man create mode 100644 deps/libzip/man/zip_error_fini.mdoc create mode 100644 deps/libzip/man/zip_error_get.html create mode 100644 deps/libzip/man/zip_error_get.man create mode 100644 deps/libzip/man/zip_error_get.mdoc create mode 100644 deps/libzip/man/zip_error_get_sys_type.html create mode 100644 deps/libzip/man/zip_error_get_sys_type.man create mode 100644 deps/libzip/man/zip_error_get_sys_type.mdoc create mode 100644 deps/libzip/man/zip_error_init.html create mode 100644 deps/libzip/man/zip_error_init.man create mode 100644 deps/libzip/man/zip_error_init.mdoc create mode 100644 deps/libzip/man/zip_error_set.html create mode 100644 deps/libzip/man/zip_error_set.man create mode 100644 deps/libzip/man/zip_error_set.mdoc create mode 100644 deps/libzip/man/zip_error_set_from_source.mdoc create mode 100644 deps/libzip/man/zip_error_strerror.html create mode 100644 deps/libzip/man/zip_error_strerror.man create mode 100644 deps/libzip/man/zip_error_strerror.mdoc create mode 100644 deps/libzip/man/zip_error_system_type.html create mode 100644 deps/libzip/man/zip_error_system_type.man create mode 100644 deps/libzip/man/zip_error_system_type.mdoc create mode 100644 deps/libzip/man/zip_error_to_data.html create mode 100644 deps/libzip/man/zip_error_to_data.man create mode 100644 deps/libzip/man/zip_error_to_data.mdoc create mode 100644 deps/libzip/man/zip_error_to_str.html create mode 100644 deps/libzip/man/zip_error_to_str.man create mode 100644 deps/libzip/man/zip_error_to_str.mdoc create mode 100644 deps/libzip/man/zip_errors.html create mode 100644 deps/libzip/man/zip_errors.man create mode 100644 deps/libzip/man/zip_errors.mdoc create mode 100644 deps/libzip/man/zip_fclose.html create mode 100644 deps/libzip/man/zip_fclose.man create mode 100644 deps/libzip/man/zip_fclose.mdoc create mode 100644 deps/libzip/man/zip_fdopen.html create mode 100644 deps/libzip/man/zip_fdopen.man create mode 100644 deps/libzip/man/zip_fdopen.mdoc create mode 100644 deps/libzip/man/zip_file_add.html create mode 100644 deps/libzip/man/zip_file_add.man create mode 100644 deps/libzip/man/zip_file_add.mdoc create mode 100644 deps/libzip/man/zip_file_attributes_init.html create mode 100644 deps/libzip/man/zip_file_attributes_init.man create mode 100644 deps/libzip/man/zip_file_attributes_init.mdoc create mode 100644 deps/libzip/man/zip_file_extra_field_delete.html create mode 100644 deps/libzip/man/zip_file_extra_field_delete.man create mode 100644 deps/libzip/man/zip_file_extra_field_delete.mdoc create mode 100644 deps/libzip/man/zip_file_extra_field_get.html create mode 100644 deps/libzip/man/zip_file_extra_field_get.man create mode 100644 deps/libzip/man/zip_file_extra_field_get.mdoc create mode 100644 deps/libzip/man/zip_file_extra_field_set.html create mode 100644 deps/libzip/man/zip_file_extra_field_set.man create mode 100644 deps/libzip/man/zip_file_extra_field_set.mdoc create mode 100644 deps/libzip/man/zip_file_extra_fields_count.html create mode 100644 deps/libzip/man/zip_file_extra_fields_count.man create mode 100644 deps/libzip/man/zip_file_extra_fields_count.mdoc create mode 100644 deps/libzip/man/zip_file_get_comment.html create mode 100644 deps/libzip/man/zip_file_get_comment.man create mode 100644 deps/libzip/man/zip_file_get_comment.mdoc create mode 100644 deps/libzip/man/zip_file_get_error.html create mode 100644 deps/libzip/man/zip_file_get_error.man create mode 100644 deps/libzip/man/zip_file_get_error.mdoc create mode 100644 deps/libzip/man/zip_file_get_external_attributes.html create mode 100644 deps/libzip/man/zip_file_get_external_attributes.man create mode 100644 deps/libzip/man/zip_file_get_external_attributes.mdoc create mode 100644 deps/libzip/man/zip_file_rename.html create mode 100644 deps/libzip/man/zip_file_rename.man create mode 100644 deps/libzip/man/zip_file_rename.mdoc create mode 100644 deps/libzip/man/zip_file_set_comment.html create mode 100644 deps/libzip/man/zip_file_set_comment.man create mode 100644 deps/libzip/man/zip_file_set_comment.mdoc create mode 100644 deps/libzip/man/zip_file_set_encryption.html create mode 100644 deps/libzip/man/zip_file_set_encryption.man create mode 100644 deps/libzip/man/zip_file_set_encryption.mdoc create mode 100644 deps/libzip/man/zip_file_set_external_attributes.html create mode 100644 deps/libzip/man/zip_file_set_external_attributes.man create mode 100644 deps/libzip/man/zip_file_set_external_attributes.mdoc create mode 100644 deps/libzip/man/zip_file_set_mtime.html create mode 100644 deps/libzip/man/zip_file_set_mtime.man create mode 100644 deps/libzip/man/zip_file_set_mtime.mdoc create mode 100644 deps/libzip/man/zip_file_strerror.html create mode 100644 deps/libzip/man/zip_file_strerror.man create mode 100644 deps/libzip/man/zip_file_strerror.mdoc create mode 100644 deps/libzip/man/zip_fopen.html create mode 100644 deps/libzip/man/zip_fopen.man create mode 100644 deps/libzip/man/zip_fopen.mdoc create mode 100644 deps/libzip/man/zip_fopen_encrypted.html create mode 100644 deps/libzip/man/zip_fopen_encrypted.man create mode 100644 deps/libzip/man/zip_fopen_encrypted.mdoc create mode 100644 deps/libzip/man/zip_fread.html create mode 100644 deps/libzip/man/zip_fread.man create mode 100644 deps/libzip/man/zip_fread.mdoc create mode 100644 deps/libzip/man/zip_fseek.html create mode 100644 deps/libzip/man/zip_fseek.man create mode 100644 deps/libzip/man/zip_fseek.mdoc create mode 100644 deps/libzip/man/zip_ftell.html create mode 100644 deps/libzip/man/zip_ftell.man create mode 100644 deps/libzip/man/zip_ftell.mdoc create mode 100644 deps/libzip/man/zip_get_archive_comment.html create mode 100644 deps/libzip/man/zip_get_archive_comment.man create mode 100644 deps/libzip/man/zip_get_archive_comment.mdoc create mode 100644 deps/libzip/man/zip_get_archive_flag.html create mode 100644 deps/libzip/man/zip_get_archive_flag.man create mode 100644 deps/libzip/man/zip_get_archive_flag.mdoc create mode 100644 deps/libzip/man/zip_get_error.html create mode 100644 deps/libzip/man/zip_get_error.man create mode 100644 deps/libzip/man/zip_get_error.mdoc create mode 100644 deps/libzip/man/zip_get_file_comment.html create mode 100644 deps/libzip/man/zip_get_file_comment.man create mode 100644 deps/libzip/man/zip_get_file_comment.mdoc create mode 100644 deps/libzip/man/zip_get_name.html create mode 100644 deps/libzip/man/zip_get_name.man create mode 100644 deps/libzip/man/zip_get_name.mdoc create mode 100644 deps/libzip/man/zip_get_num_entries.html create mode 100644 deps/libzip/man/zip_get_num_entries.man create mode 100644 deps/libzip/man/zip_get_num_entries.mdoc create mode 100644 deps/libzip/man/zip_get_num_files.html create mode 100644 deps/libzip/man/zip_get_num_files.man create mode 100644 deps/libzip/man/zip_get_num_files.mdoc create mode 100644 deps/libzip/man/zip_libzip_version.html create mode 100644 deps/libzip/man/zip_libzip_version.man create mode 100644 deps/libzip/man/zip_libzip_version.mdoc create mode 100644 deps/libzip/man/zip_name_locate.html create mode 100644 deps/libzip/man/zip_name_locate.man create mode 100644 deps/libzip/man/zip_name_locate.mdoc create mode 100644 deps/libzip/man/zip_open.html create mode 100644 deps/libzip/man/zip_open.man create mode 100644 deps/libzip/man/zip_open.mdoc create mode 100644 deps/libzip/man/zip_register_cancel_callback_with_state.html create mode 100644 deps/libzip/man/zip_register_cancel_callback_with_state.man create mode 100644 deps/libzip/man/zip_register_cancel_callback_with_state.mdoc create mode 100644 deps/libzip/man/zip_register_progress_callback.html create mode 100644 deps/libzip/man/zip_register_progress_callback.man create mode 100644 deps/libzip/man/zip_register_progress_callback.mdoc create mode 100644 deps/libzip/man/zip_register_progress_callback_with_state.html create mode 100644 deps/libzip/man/zip_register_progress_callback_with_state.man create mode 100644 deps/libzip/man/zip_register_progress_callback_with_state.mdoc create mode 100644 deps/libzip/man/zip_rename.html create mode 100644 deps/libzip/man/zip_rename.man create mode 100644 deps/libzip/man/zip_rename.mdoc create mode 100644 deps/libzip/man/zip_set_archive_comment.html create mode 100644 deps/libzip/man/zip_set_archive_comment.man create mode 100644 deps/libzip/man/zip_set_archive_comment.mdoc create mode 100644 deps/libzip/man/zip_set_archive_flag.html create mode 100644 deps/libzip/man/zip_set_archive_flag.man create mode 100644 deps/libzip/man/zip_set_archive_flag.mdoc create mode 100644 deps/libzip/man/zip_set_default_password.html create mode 100644 deps/libzip/man/zip_set_default_password.man create mode 100644 deps/libzip/man/zip_set_default_password.mdoc create mode 100644 deps/libzip/man/zip_set_file_comment.html create mode 100644 deps/libzip/man/zip_set_file_comment.man create mode 100644 deps/libzip/man/zip_set_file_comment.mdoc create mode 100644 deps/libzip/man/zip_set_file_compression.html create mode 100644 deps/libzip/man/zip_set_file_compression.man create mode 100644 deps/libzip/man/zip_set_file_compression.mdoc create mode 100644 deps/libzip/man/zip_source.html create mode 100644 deps/libzip/man/zip_source.man create mode 100644 deps/libzip/man/zip_source.mdoc create mode 100644 deps/libzip/man/zip_source_begin_write.html create mode 100644 deps/libzip/man/zip_source_begin_write.man create mode 100644 deps/libzip/man/zip_source_begin_write.mdoc create mode 100644 deps/libzip/man/zip_source_buffer.html create mode 100644 deps/libzip/man/zip_source_buffer.man create mode 100644 deps/libzip/man/zip_source_buffer.mdoc create mode 100644 deps/libzip/man/zip_source_buffer_fragment.html create mode 100644 deps/libzip/man/zip_source_buffer_fragment.man create mode 100644 deps/libzip/man/zip_source_buffer_fragment.mdoc create mode 100644 deps/libzip/man/zip_source_close.html create mode 100644 deps/libzip/man/zip_source_close.man create mode 100644 deps/libzip/man/zip_source_close.mdoc create mode 100644 deps/libzip/man/zip_source_commit_write.html create mode 100644 deps/libzip/man/zip_source_commit_write.man create mode 100644 deps/libzip/man/zip_source_commit_write.mdoc create mode 100644 deps/libzip/man/zip_source_error.html create mode 100644 deps/libzip/man/zip_source_error.man create mode 100644 deps/libzip/man/zip_source_error.mdoc create mode 100644 deps/libzip/man/zip_source_file.html create mode 100644 deps/libzip/man/zip_source_file.man create mode 100644 deps/libzip/man/zip_source_file.mdoc create mode 100644 deps/libzip/man/zip_source_filep.html create mode 100644 deps/libzip/man/zip_source_filep.man create mode 100644 deps/libzip/man/zip_source_filep.mdoc create mode 100644 deps/libzip/man/zip_source_free.html create mode 100644 deps/libzip/man/zip_source_free.man create mode 100644 deps/libzip/man/zip_source_free.mdoc create mode 100644 deps/libzip/man/zip_source_function.html create mode 100644 deps/libzip/man/zip_source_function.man create mode 100644 deps/libzip/man/zip_source_function.mdoc create mode 100644 deps/libzip/man/zip_source_is_deleted.html create mode 100644 deps/libzip/man/zip_source_is_deleted.man create mode 100644 deps/libzip/man/zip_source_is_deleted.mdoc create mode 100644 deps/libzip/man/zip_source_keep.html create mode 100644 deps/libzip/man/zip_source_keep.man create mode 100644 deps/libzip/man/zip_source_keep.mdoc create mode 100644 deps/libzip/man/zip_source_layered.html create mode 100644 deps/libzip/man/zip_source_layered.man create mode 100644 deps/libzip/man/zip_source_layered.mdoc create mode 100644 deps/libzip/man/zip_source_make_command_bitmap.html create mode 100644 deps/libzip/man/zip_source_make_command_bitmap.man create mode 100644 deps/libzip/man/zip_source_make_command_bitmap.mdoc create mode 100644 deps/libzip/man/zip_source_open.html create mode 100644 deps/libzip/man/zip_source_open.man create mode 100644 deps/libzip/man/zip_source_open.mdoc create mode 100644 deps/libzip/man/zip_source_pass_to_lower_layer.mdoc create mode 100644 deps/libzip/man/zip_source_read.html create mode 100644 deps/libzip/man/zip_source_read.man create mode 100644 deps/libzip/man/zip_source_read.mdoc create mode 100644 deps/libzip/man/zip_source_rollback_write.html create mode 100644 deps/libzip/man/zip_source_rollback_write.man create mode 100644 deps/libzip/man/zip_source_rollback_write.mdoc create mode 100644 deps/libzip/man/zip_source_seek.html create mode 100644 deps/libzip/man/zip_source_seek.man create mode 100644 deps/libzip/man/zip_source_seek.mdoc create mode 100644 deps/libzip/man/zip_source_seek_compute_offset.html create mode 100644 deps/libzip/man/zip_source_seek_compute_offset.man create mode 100644 deps/libzip/man/zip_source_seek_compute_offset.mdoc create mode 100644 deps/libzip/man/zip_source_seek_write.html create mode 100644 deps/libzip/man/zip_source_seek_write.man create mode 100644 deps/libzip/man/zip_source_seek_write.mdoc create mode 100644 deps/libzip/man/zip_source_stat.html create mode 100644 deps/libzip/man/zip_source_stat.man create mode 100644 deps/libzip/man/zip_source_stat.mdoc create mode 100644 deps/libzip/man/zip_source_tell.html create mode 100644 deps/libzip/man/zip_source_tell.man create mode 100644 deps/libzip/man/zip_source_tell.mdoc create mode 100644 deps/libzip/man/zip_source_tell_write.html create mode 100644 deps/libzip/man/zip_source_tell_write.man create mode 100644 deps/libzip/man/zip_source_tell_write.mdoc create mode 100644 deps/libzip/man/zip_source_win32a.html create mode 100644 deps/libzip/man/zip_source_win32a.man create mode 100644 deps/libzip/man/zip_source_win32a.mdoc create mode 100644 deps/libzip/man/zip_source_win32handle.html create mode 100644 deps/libzip/man/zip_source_win32handle.man create mode 100644 deps/libzip/man/zip_source_win32handle.mdoc create mode 100644 deps/libzip/man/zip_source_win32w.html create mode 100644 deps/libzip/man/zip_source_win32w.man create mode 100644 deps/libzip/man/zip_source_win32w.mdoc create mode 100644 deps/libzip/man/zip_source_window.html create mode 100644 deps/libzip/man/zip_source_window.man create mode 100644 deps/libzip/man/zip_source_window.mdoc create mode 100644 deps/libzip/man/zip_source_write.html create mode 100644 deps/libzip/man/zip_source_write.man create mode 100644 deps/libzip/man/zip_source_write.mdoc create mode 100644 deps/libzip/man/zip_source_zip.html create mode 100644 deps/libzip/man/zip_source_zip.man create mode 100644 deps/libzip/man/zip_source_zip.mdoc create mode 100644 deps/libzip/man/zip_stat.html create mode 100644 deps/libzip/man/zip_stat.man create mode 100644 deps/libzip/man/zip_stat.mdoc create mode 100644 deps/libzip/man/zip_stat_init.html create mode 100644 deps/libzip/man/zip_stat_init.man create mode 100644 deps/libzip/man/zip_stat_init.mdoc create mode 100644 deps/libzip/man/zip_unchange.html create mode 100644 deps/libzip/man/zip_unchange.man create mode 100644 deps/libzip/man/zip_unchange.mdoc create mode 100644 deps/libzip/man/zip_unchange_all.html create mode 100644 deps/libzip/man/zip_unchange_all.man create mode 100644 deps/libzip/man/zip_unchange_all.mdoc create mode 100644 deps/libzip/man/zip_unchange_archive.html create mode 100644 deps/libzip/man/zip_unchange_archive.man create mode 100644 deps/libzip/man/zip_unchange_archive.mdoc create mode 100644 deps/libzip/man/zipcmp.html create mode 100644 deps/libzip/man/zipcmp.man create mode 100644 deps/libzip/man/zipcmp.mdoc create mode 100644 deps/libzip/man/zipmerge.html create mode 100644 deps/libzip/man/zipmerge.man create mode 100644 deps/libzip/man/zipmerge.mdoc create mode 100644 deps/libzip/man/ziptool.html create mode 100644 deps/libzip/man/ziptool.man create mode 100644 deps/libzip/man/ziptool.mdoc create mode 100644 deps/libzip/regress/CMakeLists.txt create mode 100644 deps/libzip/regress/NiHTest.pm create mode 100644 deps/libzip/regress/add_dir.test create mode 100644 deps/libzip/regress/add_from_buffer.test create mode 100644 deps/libzip/regress/add_from_file.test create mode 100644 deps/libzip/regress/add_from_file_duplicate.test create mode 100644 deps/libzip/regress/add_from_file_twice_duplicate.test create mode 100644 deps/libzip/regress/add_from_file_unchange.test create mode 100644 deps/libzip/regress/add_from_filep.c create mode 100644 deps/libzip/regress/add_from_filep.test create mode 100644 deps/libzip/regress/add_from_stdin.test create mode 100644 deps/libzip/regress/add_from_zip_closed.test create mode 100644 deps/libzip/regress/add_from_zip_deflated.test create mode 100644 deps/libzip/regress/add_from_zip_deflated2.test create mode 100644 deps/libzip/regress/add_from_zip_partial_deflated.test create mode 100644 deps/libzip/regress/add_from_zip_partial_stored.test create mode 100644 deps/libzip/regress/add_from_zip_stored.test create mode 100644 deps/libzip/regress/add_stored.test create mode 100644 deps/libzip/regress/add_stored_in_memory.test create mode 100644 deps/libzip/regress/bigstored.zh create mode 100644 deps/libzip/regress/bigzero-zip.zip create mode 100644 deps/libzip/regress/bogus.zip create mode 100644 deps/libzip/regress/broken.zip create mode 100644 deps/libzip/regress/buffer-fragment-read.test create mode 100644 deps/libzip/regress/buffer-fragment-write.test create mode 100644 deps/libzip/regress/can_clone_file.c create mode 100644 deps/libzip/regress/cancel_45.test create mode 100644 deps/libzip/regress/cancel_90.test create mode 100644 deps/libzip/regress/cleanup.cmake create mode 100644 deps/libzip/regress/clone-buffer-add.test create mode 100644 deps/libzip/regress/clone-buffer-delete.test create mode 100644 deps/libzip/regress/clone-buffer-replace.test create mode 100644 deps/libzip/regress/clone-fs-add.test create mode 100644 deps/libzip/regress/clone-fs-delete.test create mode 100644 deps/libzip/regress/clone-fs-replace.test create mode 100644 deps/libzip/regress/cm-default.test create mode 100644 deps/libzip/regress/cm-default.zip create mode 100644 deps/libzip/regress/count_entries.test create mode 100644 deps/libzip/regress/decrypt-correct-password-aes128.test create mode 100644 deps/libzip/regress/decrypt-correct-password-aes192.test create mode 100644 deps/libzip/regress/decrypt-correct-password-aes256.test create mode 100644 deps/libzip/regress/decrypt-correct-password-pkware-2.test create mode 100644 deps/libzip/regress/decrypt-correct-password-pkware.test create mode 100644 deps/libzip/regress/decrypt-no-password-aes256.test create mode 100644 deps/libzip/regress/decrypt-wrong-password-aes128.test create mode 100644 deps/libzip/regress/decrypt-wrong-password-aes192.test create mode 100644 deps/libzip/regress/decrypt-wrong-password-aes256.test create mode 100644 deps/libzip/regress/decrypt-wrong-password-pkware-2.test create mode 100644 deps/libzip/regress/decrypt-wrong-password-pkware.test create mode 100644 deps/libzip/regress/delete_add_same.test create mode 100644 deps/libzip/regress/delete_invalid.test create mode 100644 deps/libzip/regress/delete_last.test create mode 100644 deps/libzip/regress/delete_multiple_last.test create mode 100644 deps/libzip/regress/delete_multiple_partial.test create mode 100644 deps/libzip/regress/delete_renamed_rename.test create mode 100644 deps/libzip/regress/encrypt-1234.zip create mode 100644 deps/libzip/regress/encrypt-aes128-noentropy.zip create mode 100644 deps/libzip/regress/encrypt-aes128.zip create mode 100644 deps/libzip/regress/encrypt-aes192-noentropy.zip create mode 100644 deps/libzip/regress/encrypt-aes192.zip create mode 100644 deps/libzip/regress/encrypt-aes256-noentropy.zip create mode 100644 deps/libzip/regress/encrypt-aes256.zip create mode 100644 deps/libzip/regress/encrypt-none.zip create mode 100644 deps/libzip/regress/encrypt-pkware-noentropy-2.zip create mode 100644 deps/libzip/regress/encrypt-pkware-noentropy.zip create mode 100644 deps/libzip/regress/encrypt.test create mode 100644 deps/libzip/regress/encrypt.zip create mode 100644 deps/libzip/regress/encrypt_plus_extra.zip create mode 100644 deps/libzip/regress/encrypt_plus_extra_modified_c.zip create mode 100644 deps/libzip/regress/encrypt_plus_extra_modified_l.zip create mode 100644 deps/libzip/regress/encryption-nonrandom-aes128.test create mode 100644 deps/libzip/regress/encryption-nonrandom-aes192.test create mode 100644 deps/libzip/regress/encryption-nonrandom-aes256.test create mode 100644 deps/libzip/regress/encryption-nonrandom-pkware-2.test create mode 100644 deps/libzip/regress/encryption-nonrandom-pkware.test create mode 100644 deps/libzip/regress/encryption-remove.test create mode 100644 deps/libzip/regress/encryption-stat.test create mode 100644 deps/libzip/regress/extra_add.test create mode 100644 deps/libzip/regress/extra_add_multiple.test create mode 100644 deps/libzip/regress/extra_count.test create mode 100644 deps/libzip/regress/extra_count_by_id.test create mode 100644 deps/libzip/regress/extra_count_ignore_zip64.test create mode 100644 deps/libzip/regress/extra_delete.test create mode 100644 deps/libzip/regress/extra_delete_by_id.test create mode 100644 deps/libzip/regress/extra_field_align.test create mode 100644 deps/libzip/regress/extra_field_align_1-0.zip create mode 100644 deps/libzip/regress/extra_field_align_1-ef_00.zip create mode 100644 deps/libzip/regress/extra_field_align_1-ef_ff.zip create mode 100644 deps/libzip/regress/extra_field_align_1-ff.zip create mode 100644 deps/libzip/regress/extra_field_align_2-0.zip create mode 100644 deps/libzip/regress/extra_field_align_2-ef_00.zip create mode 100644 deps/libzip/regress/extra_field_align_2-ef_ff.zip create mode 100644 deps/libzip/regress/extra_field_align_2-ff.zip create mode 100644 deps/libzip/regress/extra_field_align_3-0.zip create mode 100644 deps/libzip/regress/extra_field_align_3-ef_00.zip create mode 100644 deps/libzip/regress/extra_field_align_3-ef_ff.zip create mode 100644 deps/libzip/regress/extra_field_align_3-ff.zip create mode 100644 deps/libzip/regress/extra_field_align_4-ff.zip create mode 100644 deps/libzip/regress/extra_get.test create mode 100644 deps/libzip/regress/extra_get_by_id.test create mode 100644 deps/libzip/regress/extra_set.test create mode 100644 deps/libzip/regress/extra_set_modify_c.test create mode 100644 deps/libzip/regress/extra_set_modify_l.test create mode 100644 deps/libzip/regress/fdopen_ok.test create mode 100644 deps/libzip/regress/file_comment_encmismatch.test create mode 100644 deps/libzip/regress/filename_duplicate.zip create mode 100644 deps/libzip/regress/filename_duplicate_empty.zip create mode 100644 deps/libzip/regress/filename_empty.zip create mode 100644 deps/libzip/regress/fileorder.zip create mode 100644 deps/libzip/regress/firstsecond-split-deflated.zip create mode 100644 deps/libzip/regress/firstsecond-split-stored.zip create mode 100644 deps/libzip/regress/firstsecond.zip create mode 100644 deps/libzip/regress/foo-stored.zip create mode 100644 deps/libzip/regress/fopen_multiple.test create mode 100644 deps/libzip/regress/fopen_multiple_reopen.test create mode 100644 deps/libzip/regress/fopen_unchanged.c create mode 100644 deps/libzip/regress/fopen_unchanged.test create mode 100644 deps/libzip/regress/fread.c create mode 100644 deps/libzip/regress/fread.test create mode 100644 deps/libzip/regress/fseek.c create mode 100644 deps/libzip/regress/fseek_deflated.test create mode 100644 deps/libzip/regress/fseek_fail.test create mode 100644 deps/libzip/regress/fseek_ok.test create mode 100644 deps/libzip/regress/fuzz_main.c create mode 100644 deps/libzip/regress/gap-add.zip create mode 100644 deps/libzip/regress/gap-delete.zip create mode 100644 deps/libzip/regress/gap-replace.zip create mode 100644 deps/libzip/regress/gap.zip create mode 100644 deps/libzip/regress/get_comment.test create mode 100644 deps/libzip/regress/hole.c create mode 100644 deps/libzip/regress/incons-archive-comment-longer.zip create mode 100644 deps/libzip/regress/incons-archive-comment-shorter.zip create mode 100644 deps/libzip/regress/incons-cdoffset.zip create mode 100644 deps/libzip/regress/incons-central-compression-method.zip create mode 100644 deps/libzip/regress/incons-central-compsize-larger-toolarge.zip create mode 100644 deps/libzip/regress/incons-central-compsize-larger.zip create mode 100644 deps/libzip/regress/incons-central-compsize-smaller.zip create mode 100644 deps/libzip/regress/incons-central-crc.zip create mode 100644 deps/libzip/regress/incons-central-date.zip create mode 100644 deps/libzip/regress/incons-central-file-comment-longer.zip create mode 100644 deps/libzip/regress/incons-central-file-comment-shorter.zip create mode 100644 deps/libzip/regress/incons-central-magic-bad.zip create mode 100644 deps/libzip/regress/incons-central-magic-bad2.zip create mode 100644 deps/libzip/regress/incons-central-size-larger.zip create mode 100644 deps/libzip/regress/incons-data.zip create mode 100644 deps/libzip/regress/incons-ef-central-size-wrong.zip create mode 100644 deps/libzip/regress/incons-ef-local-id-size.zip create mode 100644 deps/libzip/regress/incons-ef-local-id.zip create mode 100644 deps/libzip/regress/incons-ef-local-size.zip create mode 100644 deps/libzip/regress/incons-eocd-magic-bad.zip create mode 100644 deps/libzip/regress/incons-file-count-high.zip create mode 100644 deps/libzip/regress/incons-file-count-low.zip create mode 100644 deps/libzip/regress/incons-file-count-overflow.zip create mode 100644 deps/libzip/regress/incons-local-compression-method.zip create mode 100644 deps/libzip/regress/incons-local-compsize-larger.zip create mode 100644 deps/libzip/regress/incons-local-compsize-smaller.zip create mode 100644 deps/libzip/regress/incons-local-crc.zip create mode 100644 deps/libzip/regress/incons-local-filename-long.zip create mode 100644 deps/libzip/regress/incons-local-filename-missing.zip create mode 100644 deps/libzip/regress/incons-local-filename-short.zip create mode 100644 deps/libzip/regress/incons-local-filename.zip create mode 100644 deps/libzip/regress/incons-local-magic-bad.zip create mode 100644 deps/libzip/regress/incons-local-size-larger.zip create mode 100644 deps/libzip/regress/junk-at-end.zip create mode 100644 deps/libzip/regress/junk-at-start.zip create mode 100644 deps/libzip/regress/junk_at_end.test create mode 100644 deps/libzip/regress/junk_at_start.test create mode 100644 deps/libzip/regress/large-uncompressible create mode 100644 deps/libzip/regress/liboverride-test.c create mode 100644 deps/libzip/regress/liboverride.c create mode 100644 deps/libzip/regress/lzma-no-eos.zip create mode 100644 deps/libzip/regress/malloc.c create mode 100644 deps/libzip/regress/manyfiles-zip.zip create mode 100644 deps/libzip/regress/multidisk.zip create mode 100644 deps/libzip/regress/name_locate-cp437.test create mode 100644 deps/libzip/regress/name_locate-utf8.test create mode 100644 deps/libzip/regress/name_locate.test create mode 100644 deps/libzip/regress/nihtest.conf.in create mode 100644 deps/libzip/regress/nonrandomopen.c create mode 100644 deps/libzip/regress/nonrandomopentest.c create mode 100644 deps/libzip/regress/open_cons_extrabytes.test create mode 100644 deps/libzip/regress/open_empty.test create mode 100644 deps/libzip/regress/open_empty_2.test create mode 100644 deps/libzip/regress/open_extrabytes.test create mode 100644 deps/libzip/regress/open_file_count.test create mode 100644 deps/libzip/regress/open_filename_duplicate.test create mode 100644 deps/libzip/regress/open_filename_duplicate_consistency.test create mode 100644 deps/libzip/regress/open_filename_duplicate_empty.test create mode 100644 deps/libzip/regress/open_filename_duplicate_empty_consistency.test create mode 100644 deps/libzip/regress/open_filename_empty.test create mode 100644 deps/libzip/regress/open_incons.test create mode 100644 deps/libzip/regress/open_many_fail.test create mode 100644 deps/libzip/regress/open_many_ok.test create mode 100644 deps/libzip/regress/open_multidisk.test create mode 100644 deps/libzip/regress/open_new_but_exists.test create mode 100644 deps/libzip/regress/open_new_ok.test create mode 100644 deps/libzip/regress/open_nonarchive.test create mode 100644 deps/libzip/regress/open_nosuchfile.test create mode 100644 deps/libzip/regress/open_ok.test create mode 100644 deps/libzip/regress/open_too_short.test create mode 100644 deps/libzip/regress/open_truncate.test create mode 100644 deps/libzip/regress/open_zip64_3mf.test create mode 100644 deps/libzip/regress/open_zip64_ok.test create mode 100755 deps/libzip/regress/ossfuzz.sh create mode 100644 deps/libzip/regress/preload.test create mode 100644 deps/libzip/regress/progress.test create mode 100644 deps/libzip/regress/read_seek_read.test create mode 100644 deps/libzip/regress/rename_ascii.test create mode 100644 deps/libzip/regress/rename_cp437.test create mode 100644 deps/libzip/regress/rename_deleted.test create mode 100644 deps/libzip/regress/rename_fail.test create mode 100644 deps/libzip/regress/rename_ok.test create mode 100644 deps/libzip/regress/rename_ok.zip create mode 100644 deps/libzip/regress/rename_utf8.test create mode 100644 deps/libzip/regress/rename_utf8_encmismatch.test create mode 100644 deps/libzip/regress/reopen.test create mode 100644 deps/libzip/regress/reopen_partial.test create mode 100644 deps/libzip/regress/reopen_partial_rest.test create mode 100644 deps/libzip/regress/runtest.in create mode 100644 deps/libzip/regress/set_comment_all.test create mode 100644 deps/libzip/regress/set_comment_localonly.test create mode 100644 deps/libzip/regress/set_comment_removeglobal.test create mode 100644 deps/libzip/regress/set_comment_revert.test create mode 100644 deps/libzip/regress/set_compression_bzip2_to_deflate.test create mode 100644 deps/libzip/regress/set_compression_deflate_to_bzip2.test create mode 100644 deps/libzip/regress/set_compression_deflate_to_deflate.test create mode 100644 deps/libzip/regress/set_compression_deflate_to_store.test create mode 100644 deps/libzip/regress/set_compression_lzma_no_eos_to_store.test create mode 100644 deps/libzip/regress/set_compression_lzma_to_store.test create mode 100644 deps/libzip/regress/set_compression_store_to_bzip2.test create mode 100644 deps/libzip/regress/set_compression_store_to_deflate.test create mode 100644 deps/libzip/regress/set_compression_store_to_lzma.test create mode 100644 deps/libzip/regress/set_compression_store_to_store.test create mode 100644 deps/libzip/regress/set_compression_store_to_xz.test create mode 100644 deps/libzip/regress/set_compression_store_to_zstd.test create mode 100644 deps/libzip/regress/set_compression_unknown.test create mode 100644 deps/libzip/regress/set_compression_xz_to_store.test create mode 100644 deps/libzip/regress/set_compression_zstd_to_store.test create mode 100644 deps/libzip/regress/set_file_dostime.test create mode 100644 deps/libzip/regress/set_file_mtime.test create mode 100644 deps/libzip/regress/set_file_mtime_pkware.test create mode 100644 deps/libzip/regress/source_hole.c create mode 100644 deps/libzip/regress/stat_index_cp437_guess.test create mode 100644 deps/libzip/regress/stat_index_cp437_raw.test create mode 100644 deps/libzip/regress/stat_index_cp437_strict.test create mode 100644 deps/libzip/regress/stat_index_fileorder.test create mode 100644 deps/libzip/regress/stat_index_streamed.test create mode 100644 deps/libzip/regress/stat_index_streamed_zip64.test create mode 100644 deps/libzip/regress/stat_index_utf8_guess.test create mode 100644 deps/libzip/regress/stat_index_utf8_raw.test create mode 100644 deps/libzip/regress/stat_index_utf8_strict.test create mode 100644 deps/libzip/regress/stat_index_utf8_unmarked_strict.test create mode 100644 deps/libzip/regress/stat_index_zip64.test create mode 100644 deps/libzip/regress/stored-no-eos.zip create mode 100644 deps/libzip/regress/streamed-zip64.zip create mode 100644 deps/libzip/regress/streamed.zip create mode 100644 deps/libzip/regress/test-cp437-comment-utf-8.zip create mode 100644 deps/libzip/regress/test-cp437-fc-utf-8-filename.zip create mode 100644 deps/libzip/regress/test-cp437-fc.zip create mode 100644 deps/libzip/regress/test-cp437.zip create mode 100644 deps/libzip/regress/test-utf8-unmarked.zip create mode 100644 deps/libzip/regress/test-utf8.zip create mode 100644 deps/libzip/regress/test.zip create mode 100644 deps/libzip/regress/test2.zip create mode 100644 deps/libzip/regress/test_open_multiple.zip create mode 100644 deps/libzip/regress/testbuffer.zip create mode 100644 deps/libzip/regress/testbuffer_reopen.zip create mode 100644 deps/libzip/regress/testbzip2.zip create mode 100644 deps/libzip/regress/testchanged.zip create mode 100644 deps/libzip/regress/testchangedlocal.zip create mode 100644 deps/libzip/regress/testcomment.zip create mode 100644 deps/libzip/regress/testcomment13.zip create mode 100644 deps/libzip/regress/testcommentremoved.zip create mode 100644 deps/libzip/regress/testdeflated.zip create mode 100644 deps/libzip/regress/testdeflated2.zip create mode 100644 deps/libzip/regress/testdir.zip create mode 100644 deps/libzip/regress/testempty.zip create mode 100644 deps/libzip/regress/testextrabytes.zip create mode 100644 deps/libzip/regress/testfile-UTF8.zip create mode 100644 deps/libzip/regress/testfile-cp437.zip create mode 100644 deps/libzip/regress/testfile-lzma.zip create mode 100644 deps/libzip/regress/testfile-plus-extra.zip create mode 100644 deps/libzip/regress/testfile-stored-dos.zip create mode 100644 deps/libzip/regress/testfile-xz.zip create mode 100755 deps/libzip/regress/testfile-zstd.zip create mode 100755 deps/libzip/regress/testfile.txt create mode 100644 deps/libzip/regress/testfile.zip create mode 100644 deps/libzip/regress/testfile0.zip create mode 100644 deps/libzip/regress/testfile2014.zip create mode 100644 deps/libzip/regress/teststdin.zip create mode 100644 deps/libzip/regress/teststored.zip create mode 100644 deps/libzip/regress/tryopen.c create mode 100644 deps/libzip/regress/unchange-delete-namelocate.test create mode 100644 deps/libzip/regress/utf-8-standardization-input.zip create mode 100644 deps/libzip/regress/utf-8-standardization-output.zip create mode 100644 deps/libzip/regress/utf-8-standardization.test create mode 100644 deps/libzip/regress/zip-in-archive-comment.test create mode 100644 deps/libzip/regress/zip-in-archive-comment.zip create mode 100644 deps/libzip/regress/zip64-3mf.zip create mode 100644 deps/libzip/regress/zip64.zip create mode 100644 deps/libzip/regress/zip64_creation.test create mode 100644 deps/libzip/regress/zip64_stored_creation.test create mode 100644 deps/libzip/regress/zip_read_fuzzer.cc create mode 100644 deps/libzip/regress/zip_read_fuzzer.dict create mode 100644 deps/libzip/regress/zipcmp_zip_dir.test create mode 100644 deps/libzip/regress/zipcmp_zip_dir.zip create mode 100644 deps/libzip/regress/ziptool_regress.c create mode 100644 deps/libzip/src/CMakeLists.txt create mode 100644 deps/libzip/src/diff_output.c create mode 100644 deps/libzip/src/diff_output.h create mode 100644 deps/libzip/src/getopt.c create mode 100644 deps/libzip/src/getopt.h create mode 100644 deps/libzip/src/zipcmp.c create mode 100644 deps/libzip/src/zipmerge.c create mode 100644 deps/libzip/src/ziptool.c create mode 100644 deps/libzip/vstudio/readme.txt create mode 100644 deps/libzip/vstudio/vsbuild.cmd create mode 100644 deps/libzip/vstudio/zlib/unpack_zlib_here.txt create mode 100644 doc/contributing/maintaining-libzip.md create mode 100644 src/node_archive.cc create mode 100644 test/fixtures/corepack.zip create mode 100644 test/parallel/test-zip-add-precompressed-file.js create mode 100644 test/parallel/test-zip-add-uncompressed-file.js create mode 100644 test/parallel/test-zip-err-zip-opening-failed.js create mode 100644 test/parallel/test-zip-list-archive.js create mode 100644 test/parallel/test-zip-memory-leaks.js create mode 100644 test/parallel/test-zip-new-archive.js diff --git a/configure.py b/configure.py index c1d8815fc024ee..048a7347d9d777 100755 --- a/configure.py +++ b/configure.py @@ -265,6 +265,12 @@ default=None, help='link to a shared libuv DLL instead of static linking') +shared_optgroup.add_argument('--shared-libzip', + action='store_true', + dest='shared_libzip', + default=None, + help='link to a shared libzip DLL instead of static linking') + shared_optgroup.add_argument('--shared-libuv-includes', action='store', dest='shared_libuv_includes', @@ -2005,6 +2011,7 @@ def make_bin_override(): configure_node_lib_files(output) configure_napi(output) configure_library('zlib', output) +configure_library('libzip', output) configure_library('http_parser', output) configure_library('libuv', output) configure_library('brotli', output, pkgname=['libbrotlidec', 'libbrotlienc']) diff --git a/deps/libzip/.clang-format b/deps/libzip/.clang-format new file mode 100644 index 00000000000000..8bb62b8c2ce02b --- /dev/null +++ b/deps/libzip/.clang-format @@ -0,0 +1,12 @@ +BasedOnStyle: LLVM +IndentWidth: 4 +ColumnLimit: 2000 +AlwaysBreakAfterReturnType: TopLevelDefinitions +KeepEmptyLinesAtTheStartOfBlocks: false +MaxEmptyLinesToKeep: 2 +BreakBeforeBraces: Custom +BraceWrapping: + BeforeElse: true +AlignEscapedNewlines: Left +UseTab: Never +#PPDirectiveIndentStyle: AfterHash diff --git a/deps/libzip/.gitattributes b/deps/libzip/.gitattributes new file mode 100644 index 00000000000000..652f4bb5cbe27c --- /dev/null +++ b/deps/libzip/.gitattributes @@ -0,0 +1,11 @@ +.gitattributes export-ignore +.gitignore export-ignore +.travis.yml export-ignore +create-cmake-config.h.in.pl export-ignore +docs export-ignore +man/fix-man-links.sh export-ignore +man/make_zip_errors.sh export-ignore +man/mkdocset.pl export-ignore +man/nih-man.css export-ignore +vstudio export-ignore +developer-xcode export-ignore diff --git a/deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md b/deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 00000000000000..86c107807e6a75 --- /dev/null +++ b/deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,32 @@ +--- +name: Bug Report +about: Report where libzip didn't behave like you expected. +title: '' +labels: bug +assignees: '' + +--- + +**Describe the Bug** +A clear and concise description of what the bug is. + +**Expected Behavior** +A clear and concise description of what you expected to happen. + +**Observed Behavior** +A clear and concise description of what actually happened. + +**To Reproduce** +Short program or code snippet that reproduces the problem. + +**libzip Version** +Version of libzip or revision repository used. + +**Operating System** +Operating system and version, used compiler. + +**Test Files** +If applicable, attach and describe zip archives that trigger the problem. + +**Additional context** +Add any other context about the problem here. diff --git a/deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md b/deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md new file mode 100644 index 00000000000000..45c8a7a72d26c5 --- /dev/null +++ b/deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md @@ -0,0 +1,25 @@ +--- +name: Compile Error +about: Report when libzip does not compile. +title: '' +labels: compile +assignees: '' + +--- + +**Compiler Error** +Output from the compiler, including exact and complete error message, file name and line number. + +**libzip Version** +Version of libzip or revision repository used. + +**Operating System and Compiler** +The operating system and compiler used, including version number. + +Also, any flags passed to `cmake`. + +**Autodetected Configuration** +Attach `CmakeCache.txt` from your build directory. This list everything `cmake` detected on your system. + +**Additional context** +Add any other context about the problem here. diff --git a/deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md b/deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 00000000000000..c23381e02290d0 --- /dev/null +++ b/deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,22 @@ +--- +name: Feature Request +about: Suggest an idea for this project. +title: '' +labels: enhancement +assignees: '' + +--- + +**Description** +A clear and concise description of what you want to achieve, why the current features are insufficient, and why you think it is generally useful. + +Also, have you checked whether the feature is already mentioned in TODO.md? If so, only submit a new issue if you expand on it. + +**Solution** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context about the feature request here. diff --git a/deps/libzip/.github/workflows/CIFuzz.yml b/deps/libzip/.github/workflows/CIFuzz.yml new file mode 100644 index 00000000000000..c68160a9d09ee0 --- /dev/null +++ b/deps/libzip/.github/workflows/CIFuzz.yml @@ -0,0 +1,23 @@ +name: CIFuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'libzip' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'libzip' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() + with: + name: artifacts + path: ./out/artifacts diff --git a/deps/libzip/.github/workflows/build.yml b/deps/libzip/.github/workflows/build.yml new file mode 100644 index 00000000000000..5f1cf5e9d1ce74 --- /dev/null +++ b/deps/libzip/.github/workflows/build.yml @@ -0,0 +1,53 @@ +name: build +on: [push] + +jobs: + all: + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }}${{ matrix.name_extra }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + cmake_extra: [""] + name_extra: [""] + include: + - os: windows-latest + cmake_extra: "-T ClangCl" + name_extra: " clang-cl" + steps: + - name: checkout + uses: actions/checkout@v2 + - name: install dependencies (Linux) + if: ${{ runner.os == 'Linux' }} + run: | + sudo apt-get install libzstd-dev + - name: install dependencies (Windows) + if: ${{ runner.os == 'Windows' }} + uses: lukka/run-vcpkg@v7 + id: runvcpkg + with: + vcpkgGitCommitId: f93ba152d55e1d243160e690bc302ffe8638358e + vcpkgTriplet: x64-windows + vcpkgArguments: zlib bzip2 liblzma zstd + - name: prepare build directory + run: | + cmake -E make_directory ${{runner.workspace}}/build + - name: configure (Unix) + if: ${{ runner.os != 'Windows' }} + working-directory: ${{runner.workspace}}/build + run: | + cmake ${{ matrix.cmake_extra }} ${{github.workspace}} + - name: configure (Windows) + if: ${{ runner.os == 'Windows' }} + working-directory: ${{runner.workspace}}/build + run: | + cmake ${{ matrix.cmake_extra }} -DCMAKE_TOOLCHAIN_FILE=${{env.VCPKG_ROOT}}/scripts/buildsystems/vcpkg.cmake ${{github.workspace}} + - name: build + working-directory: ${{runner.workspace}}/build + run: | + cmake --build . --config Release + - name: test + working-directory: ${{runner.workspace}}/build + run: | + ctest -v -C Release diff --git a/deps/libzip/.github/workflows/codeql-analysis.yml b/deps/libzip/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000000000..5facdf99b2dfa1 --- /dev/null +++ b/deps/libzip/.github/workflows/codeql-analysis.yml @@ -0,0 +1,66 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +name: "CodeQL" + +on: + push: + branches: [master] + pull_request: + # The branches below must be a subset of the branches above + branches: [master] + schedule: + - cron: '0 10 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # â„¹ï¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœï¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/deps/libzip/.gitignore b/deps/libzip/.gitignore new file mode 100644 index 00000000000000..32b2df603ccf68 --- /dev/null +++ b/deps/libzip/.gitignore @@ -0,0 +1,11 @@ +/.cache +.DS_Store +/build* +/developer-xcode/libzip.xcodeproj/project.xcworkspace/xcuserdata/ +/developer-xcode/libzip.xcodeproj/xcuserdata/ +*~ +*.tar.gz +*.tar.xz +/.clangd +/compile_commands.json +/cmake-build-debug diff --git a/deps/libzip/API-CHANGES.md b/deps/libzip/API-CHANGES.md new file mode 100644 index 00000000000000..24e3d8e1ab9ce8 --- /dev/null +++ b/deps/libzip/API-CHANGES.md @@ -0,0 +1,162 @@ +# libzip API changes + +This file describes changes in the libzip API and how to adapt your +code for them. + +You can define `ZIP_DISABLE_DEPRECATED` before including `` to hide +prototypes for deprecated functions, to find out about functions that +might be removed at some point. + +## Changed in libzip-1.0 + +### new type `zip_error_t` + +Error information is stored in the newly public type `zip_error_t`. Use +this to access information about an error, instead of the deprecated +functions that operated on two ints. + +deprecated functions: +- `zip_error_get_sys_type()` +- `zip_error_get()` +- `zip_error_to_str()` +- `zip_file_error_get()` + +See their man pages for instructions on how to replace them. + +The most common affected use is `zip_open`. The new recommended usage +is: + +```c +int err; +if ((za = zip_open(archive, flags, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error)); + zip_error_fini(&error); +} +``` + +### more typedefs + +The following typedefs have been added for better readability: + +```c +typedef struct zip zip_t; +typedef struct zip_file zip_file_t; +typedef struct zip_source zip_source_t; +typedef struct zip_stat zip_stat_t; +``` + +This means you can use "`zip_t`" instead of "`struct zip`", etc. + + +### torrentzip support removed + +torrentzip depends on a particular zlib version which is by now quite +old. + +## Changed in libzip-0.11 + +### new type `zip_flags_t` + +The functions which have flags now use the `zip_flags_t` type for this. +All old flags fit; you need only to adapt code if you were saving flags in a +local variable. Use `zip_flags_t` for such a variable. +This affects: +- `zip_fopen()` +- `zip_fopen_encrypted()` +- `zip_fopen_index()` +- `zip_fopen_index_encrypted()` +- `zip_get_archive_comment()` +- `zip_get_archive_flag()` +- `zip_get_num_entries()` +- `zip_get_name()` +- `zip_name_locate()` +- `zip_set_archive_flag()` +- `zip_source_zip()` +- `zip_stat()` +- `zip_stat_index()` + +#### `ZIP_FL_*`, `ZIP_AFL_*`, `ZIP_STAT_*` are now unsigned constants + +To match the new `zip_flags_t` type. + +#### `zip_add()`, `zip_add_dir()` + +These functions were replaced with `zip_file_add()` and `zip_dir_add()`, respectively, +to add a flags argument. + +#### `zip_rename()`, `zip_replace()` + +These functions were replaced with `zip_file_rename()` and `zip_file_replace()`, +respectively, to add a flags argument. + +#### `zip_get_file_comment()` + +This function was replaced with `zip_file_get_comment()`; one argument was promoted from +`int` to `zip_uint32_t`, the other is now a `zip_flags_t`. + +#### `zip_set_file_comment()` + +This function was replaced with `zip_file_set_comment()`; an argument was promoted from +`int` to `zip_uint16_t`, and a `zip_flags_t` argument was added. + +### integer type size changes + +Some argument and return values were not the right size or sign. + +#### `zip_name_locate()` + +The return value was `int`, which can be too small. The function now returns `zip_int64_t`. + + +#### `zip_get_num_entries()` + +The return type is now signed, to allow signaling errors. + +#### `zip_set_archive_comment()` + +The last argument changed from `int` to `zip_uint16_t`. + +### extra field handling rewritten + +The `zip_get_file_extra()` and `zip_set_file_extra()` functions were removed. +They only worked on the whole extra field set. + +Instead, you can now set, get, count, and delete each extra field separately, +using the functions: +- `zip_file_extra_field_delete()` +- `zip_file_extra_field_delete_by_id()` +- `zip_file_extra_field_get()` +- `zip_file_extra_field_get_by_id()` +- `zip_file_extra_fields_count()` +- `zip_file_extra_fields_count_by_id()` +- `zip_file_extra_field_set()` + +Please read the corresponding man pages for details. + +### new functions + +#### `zip_discard()` + +The new `zip_discard()` function closes an archive without committing the +scheduled changes. + +#### `zip_set_file_compression()` + +The new `zip_set_file_compression()` function allows setting compression +levels for files. + +### argument changes + +#### file names + +File names arguments are now allowed to be `NULL` to have an empty file name. +This mostly affects `zip_file_add()`, `zip_dir_add()`, and `zip_file_rename()`. + +For `zip_get_name()`, `zip_file_get_comment()`, and `zip_get_archive_comment()`, if +the file name or comment is empty, a string of length 0 is returned. +`NULL` is returned for errors only. + +Previously, `NULL` was returned for empty/unset file names and comments and +errors, leaving no way to differentiate between the two. diff --git a/deps/libzip/AUTHORS b/deps/libzip/AUTHORS new file mode 100644 index 00000000000000..a33707b01d6dff --- /dev/null +++ b/deps/libzip/AUTHORS @@ -0,0 +1,2 @@ +Dieter Baron +Thomas Klausner diff --git a/deps/libzip/CMakeLists.txt b/deps/libzip/CMakeLists.txt new file mode 100644 index 00000000000000..33c4af645ceca0 --- /dev/null +++ b/deps/libzip/CMakeLists.txt @@ -0,0 +1,490 @@ +cmake_minimum_required(VERSION 3.0.2) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +if (${CMAKE_VERSION} VERSION_LESS "3.17.0") + list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake-compat) +endif() + +project(libzip + VERSION 1.9.2 + LANGUAGES C) + +option(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" ON) +option(ENABLE_GNUTLS "Enable use of GnuTLS" ON) +option(ENABLE_MBEDTLS "Enable use of mbed TLS" ON) +option(ENABLE_OPENSSL "Enable use of OpenSSL" ON) +option(ENABLE_WINDOWS_CRYPTO "Enable use of Windows cryptography libraries" ON) + +option(ENABLE_BZIP2 "Enable use of BZip2" ON) +option(ENABLE_LZMA "Enable use of LZMA" ON) +option(ENABLE_ZSTD "Enable use of Zstandard" ON) + +option(ENABLE_FDOPEN "Enable zip_fdopen, which is not allowed in Microsoft CRT secure libraries" ON) + +option(BUILD_TOOLS "Build tools in the src directory (zipcmp, zipmerge, ziptool)" ON) +option(BUILD_REGRESS "Build regression tests" ON) +option(BUILD_EXAMPLES "Build examples" ON) +option(BUILD_DOC "Build documentation" ON) + +include(CheckFunctionExists) +include(CheckIncludeFiles) +include(CheckLibraryExists) +include(CheckSymbolExists) +include(CheckTypeSize) +include(CheckCSourceRuns) +include(CheckCSourceCompiles) +include(CheckStructHasMember) +include(TestBigEndian) +include(GNUInstallDirs) + +if(ENABLE_COMMONCRYPTO) + check_include_files(CommonCrypto/CommonCrypto.h COMMONCRYPTO_FOUND) +endif() +if(ENABLE_GNUTLS) + find_package(Nettle 3.0) + find_package(GnuTLS) +endif() +if(ENABLE_MBEDTLS) + find_package(MbedTLS 1.0) +endif() +if(ENABLE_OPENSSL) + find_package(OpenSSL) +endif() +if(WIN32) + if(ENABLE_WINDOWS_CRYPTO) + set(WINDOWS_CRYPTO_FOUND TRUE) + endif() +endif() + +option(BUILD_SHARED_LIBS "Build shared libraries" ON) +option(LIBZIP_DO_INSTALL "Install libzip and the related files" ON) + +option(SHARED_LIB_VERSIONNING "Add SO version in .so build" ON) + +find_program(MDOCTOOL NAMES mandoc groff) +if (MDOCTOOL) + set(DOCUMENTATION_FORMAT "mdoc" CACHE STRING "Documentation format") +else() + find_program(MANTOOL NAMES nroff) + if (MANTOOL) + set(DOCUMENTATION_FORMAT "man" CACHE STRING "Documentation format") + else() + set(DOCUMENTATION_FORMAT "html" CACHE STRING "Documentation format") + endif() +endif() + +include(Dist) +Dist(${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION}) + +#ADD_CUSTOM_TARGET(uninstall +# COMMAND cat ${PROJECT_BINARY_DIR}/install_manifest.txt | xargs rm +# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +# ) + +if(BUILD_SHARED_LIBS) + set(HAVE_SHARED TRUE) +else() + set(ZIP_STATIC TRUE) +endif() + +# Checks + +# Request ISO C secure library functions (memcpy_s &c) +list(APPEND CMAKE_REQUIRED_DEFINITIONS -D__STDC_WANT_LIB_EXT1__=1) + +check_function_exists(_close HAVE__CLOSE) +check_function_exists(_dup HAVE__DUP) +check_function_exists(_fdopen HAVE__FDOPEN) +check_function_exists(_fileno HAVE__FILENO) +check_function_exists(_setmode HAVE__SETMODE) +check_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF) +check_symbol_exists(_snprintf_s stdio.h HAVE__SNPRINTF_S) +check_symbol_exists(_snwprintf_s stdio.h HAVE__SNWPRINTF_S) +check_function_exists(_strdup HAVE__STRDUP) +check_symbol_exists(_stricmp string.h HAVE__STRICMP) +check_function_exists(_strtoi64 HAVE__STRTOI64) +check_function_exists(_strtoui64 HAVE__STRTOUI64) +check_function_exists(_unlink HAVE__UNLINK) +check_function_exists(arc4random HAVE_ARC4RANDOM) +check_function_exists(clonefile HAVE_CLONEFILE) +check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO) +check_function_exists(explicit_memset HAVE_EXPLICIT_MEMSET) +check_function_exists(fchmod HAVE_FCHMOD) +check_function_exists(fileno HAVE_FILENO) +check_function_exists(fseeko HAVE_FSEEKO) +check_function_exists(ftello HAVE_FTELLO) +check_function_exists(getprogname HAVE_GETPROGNAME) +check_symbol_exists(localtime_r time.h HAVE_LOCALTIME_R) +check_symbol_exists(localtime_s time.h HAVE_LOCALTIME_S) +check_function_exists(memcpy_s HAVE_MEMCPY_S) +check_function_exists(setmode HAVE_SETMODE) +check_symbol_exists(snprintf stdio.h HAVE_SNPRINTF) +check_symbol_exists(snprintf_s stdio.h HAVE_SNPRINTF_S) +check_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP) +check_function_exists(strdup HAVE_STRDUP) +check_function_exists(strerror_s HAVE_STRERROR_S) +check_function_exists(strerrorlen_s HAVE_STRERRORLEN_S) +check_function_exists(stricmp HAVE_STRICMP) +check_function_exists(strncpy_s HAVE_STRNCPY_S) +check_function_exists(strtoll HAVE_STRTOLL) +check_function_exists(strtoull HAVE_STRTOULL) + +check_include_files("sys/types.h;sys/stat.h;fts.h" HAVE_FTS_H) +# fts functions may be in external library +if(HAVE_FTS_H) + check_function_exists(fts_open HAVE_FTS_OPEN) + if(NOT HAVE_FTS_OPEN) + check_library_exists(fts fts_open "" HAVE_LIB_FTS) + else(NOT HAVE_FTS_OPEN) + set(HAVE_LIB_FTS "" CACHE INTERNAL "") + endif(NOT HAVE_FTS_OPEN) +else(HAVE_FTS_H) + set(HAVE_LIB_FTS "" CACHE INTERNAL "") +endif(HAVE_FTS_H) + +if(HAVE_LIB_FTS) + set(FTS_LIB fts CACHE INTERNAL "") +else() + set(FTS_LIB "" CACHE INTERNAL "") +endif() + +check_include_files(stdbool.h HAVE_STDBOOL_H) +check_include_files(strings.h HAVE_STRINGS_H) +check_include_files(unistd.h HAVE_UNISTD_H) + +check_include_files(inttypes.h HAVE_INTTYPES_H_LIBZIP) +check_include_files(stdint.h HAVE_STDINT_H_LIBZIP) +check_include_files(sys/types.h HAVE_SYS_TYPES_H_LIBZIP) + +# TODO: fix test +# this test does not find __progname even when it exists +#check_symbol_exists(__progname stdlib.h HAVE___PROGNAME) + +check_type_size(__int8 __INT8_LIBZIP) +check_type_size(int8_t INT8_T_LIBZIP) +check_type_size(uint8_t UINT8_T_LIBZIP) +check_type_size(__int16 __INT16_LIBZIP) +check_type_size(int16_t INT16_T_LIBZIP) +check_type_size(uint16_t UINT16_T_LIBZIP) +check_type_size(__int32 __INT32_LIBZIP) +check_type_size(int32_t INT32_T_LIBZIP) +check_type_size(uint32_t UINT32_T_LIBZIP) +check_type_size(__int64 __INT64_LIBZIP) +check_type_size(int64_t INT64_T_LIBZIP) +check_type_size(uint64_t UINT64_T_LIBZIP) +check_type_size("short" SHORT_LIBZIP) +check_type_size("int" INT_LIBZIP) +check_type_size("long" LONG_LIBZIP) +check_type_size("long long" LONG_LONG_LIBZIP) +check_type_size("off_t" SIZEOF_OFF_T) +check_type_size("size_t" SIZEOF_SIZE_T) + +check_c_source_compiles("#include +#include +int main(int argc, char *argv[]) { unsigned long x = FICLONERANGE; }" HAVE_FICLONERANGE) + +check_c_source_compiles(" +int foo(char * _Nullable bar); +int main(int argc, char *argv[]) { }" HAVE_NULLABLE) + +test_big_endian(WORDS_BIGENDIAN) + +find_package(ZLIB 1.1.2 REQUIRED) +# so developers on systems where zlib is named differently (Windows, sometimes) +# can override the name used in the pkg-config file +if (NOT ZLIB_LINK_LIBRARY_NAME) + set(ZLIB_LINK_LIBRARY_NAME "z") + + # Get the correct name in common cases + list(LENGTH ZLIB_LIBRARIES N_ZLIB_LIBRARIES) + if(N_ZLIB_LIBRARIES EQUAL 1) + set(ZLIB_FILENAME ${ZLIB_LIBRARIES}) + elseif(N_ZLIB_LIBRARIES EQUAL 4) + # ZLIB_LIBRARIES might have the target_link_library() format like + # "optimized;path/to/zlib.lib;debug;path/to/zlibd.lib". Use the 'optimized' + # case unless we know we are in a Debug build. + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + list(FIND ZLIB_LIBRARIES "debug" ZLIB_LIBRARIES_INDEX_OF_CONFIG) + else() + list(FIND ZLIB_LIBRARIES "optimized" ZLIB_LIBRARIES_INDEX_OF_CONFIG) + endif() + if(ZLIB_LIBRARIES_INDEX_OF_CONFIG GREATER_EQUAL 0) + math(EXPR ZLIB_FILENAME_INDEX "${ZLIB_LIBRARIES_INDEX_OF_CONFIG}+1") + list(GET ZLIB_LIBRARIES ${ZLIB_FILENAME_INDEX} ZLIB_FILENAME) + endif() + endif() + if(ZLIB_FILENAME) + get_filename_component(ZLIB_FILENAME ${ZLIB_FILENAME} NAME_WE) + string(REGEX REPLACE "^lib" "" ZLIB_LINK_LIBRARY_NAME ${ZLIB_FILENAME}) + endif() +endif(NOT ZLIB_LINK_LIBRARY_NAME) + +if(ENABLE_BZIP2) + find_package(BZip2) + if(BZIP2_FOUND) + set(HAVE_LIBBZ2 1) + else() + message(WARNING "-- bzip2 library not found; bzip2 support disabled") + endif(BZIP2_FOUND) +endif(ENABLE_BZIP2) + +if(ENABLE_LZMA) + find_package(LibLZMA 5.2) + if(LIBLZMA_FOUND) + set(HAVE_LIBLZMA 1) + else() + message(WARNING "-- lzma library not found; lzma/xz support disabled") + endif(LIBLZMA_FOUND) +endif(ENABLE_LZMA) + +if(ENABLE_ZSTD) + find_package(Zstd 1.3.6) + if(Zstd_FOUND) + set(HAVE_LIBZSTD 1) + else() + message(WARNING "-- zstd library not found; zstandard support disabled") + endif(Zstd_FOUND) +endif(ENABLE_ZSTD) + +if (COMMONCRYPTO_FOUND) + set(HAVE_CRYPTO 1) + set(HAVE_COMMONCRYPTO 1) +elseif (WINDOWS_CRYPTO_FOUND) + set(HAVE_CRYPTO 1) + set(HAVE_WINDOWS_CRYPTO 1) +elseif (GNUTLS_FOUND AND NETTLE_FOUND) + set(HAVE_CRYPTO 1) + set(HAVE_GNUTLS 1) +elseif (OPENSSL_FOUND) + set(HAVE_CRYPTO 1) + set(HAVE_OPENSSL 1) +elseif (MBEDTLS_FOUND) + set(HAVE_CRYPTO 1) + set(HAVE_MBEDTLS 1) +endif() + +if ((ENABLE_COMMONCRYPTO OR ENABLE_GNUTLS OR ENABLE_MBEDTLS OR ENABLE_OPENSSL OR ENABLE_WINDOWS_CRYPTO) AND NOT HAVE_CRYPTO) + message(WARNING "-- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows Cryptography found; AES support disabled") +endif() + +if(MSVC) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) + add_compile_definitions(_CRT_NONSTDC_NO_DEPRECATE) +endif(MSVC) + +if(WIN32) + if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) + add_compile_definitions(MS_UWP) + endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) +endif(WIN32) + +# rpath handling: use rpath in installed binaries +if(NOT CMAKE_SYSTEM_NAME MATCHES Linux) + set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +endif() + +# for code completion frameworks +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# Testing +ENABLE_TESTING() + +# Targets +ADD_SUBDIRECTORY(lib) + +if(BUILD_DOC) + ADD_SUBDIRECTORY(man) +endif() + +if(BUILD_TOOLS) + ADD_SUBDIRECTORY(src) +else(BUILD_TOOLS) + if(BUILD_REGRESS) + message(WARNING "-- tools build has been disabled, but they are needed for regression tests; regression testing disabled") + set(BUILD_REGRESS OFF) + endif(BUILD_REGRESS) +endif() + +include(FindPerl) + +if(BUILD_REGRESS AND NOT PERL_FOUND) + message(WARNING "-- perl not found, regression testing disabled") + set(BUILD_REGRESS OFF) +endif() + +if(BUILD_REGRESS) + add_subdirectory(regress) +endif() + +if(BUILD_EXAMPLES) + add_subdirectory(examples) +endif() + + +# pkgconfig file +file(RELATIVE_PATH pc_relative_bindir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_BINDIR}) +set(bindir "\${prefix}/${pc_relative_bindir}") +file(RELATIVE_PATH pc_relative_libdir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_LIBDIR}) +set(libdir "\${prefix}/${pc_relative_libdir}") +file(RELATIVE_PATH pc_relative_includedir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +set(includedir "\${prefix}/${pc_relative_includedir}") +if(CMAKE_SYSTEM_NAME MATCHES BSD) + set(PKG_CONFIG_RPATH "-Wl,-R\${libdir}") +endif(CMAKE_SYSTEM_NAME MATCHES BSD) +get_target_property(LIBS_PRIVATE zip LINK_LIBRARIES) +foreach(LIB ${LIBS_PRIVATE}) + if(LIB MATCHES "^/") + get_filename_component(LIB ${LIB} NAME_WE) + string(REGEX REPLACE "^lib" "" LIB ${LIB}) + endif() + set(LIBS "${LIBS} -l${LIB}") +endforeach() +STRING(CONCAT zlib_link_name "-l" ${ZLIB_LINK_LIBRARY_NAME}) +string(REGEX REPLACE "-lBZip2::BZip2" "-lbz2" LIBS ${LIBS}) +string(REGEX REPLACE "-lLibLZMA::LibLZMA" "-llzma" LIBS ${LIBS}) +string(REGEX REPLACE "-lZstd::Zstd" "-lzstd" LIBS ${LIBS}) +string(REGEX REPLACE "-lOpenSSL::Crypto" "-lssl -lcrypto" LIBS ${LIBS}) +string(REGEX REPLACE "-lZLIB::ZLIB" ${zlib_link_name} LIBS ${LIBS}) +string(REGEX REPLACE "-lGnuTLS::GnuTLS" "-lgnutls" LIBS ${LIBS}) +string(REGEX REPLACE "-lNettle::Nettle" "-lnettle" LIBS ${LIBS}) +configure_file(libzip.pc.in libzip.pc @ONLY) +if(LIBZIP_DO_INSTALL) + install(FILES ${PROJECT_BINARY_DIR}/libzip.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() + +# fixed size integral types + +if(HAVE_INTTYPES_H_LIBZIP) + set(LIBZIP_TYPES_INCLUDE "#if !defined(__STDC_FORMAT_MACROS) +#define __STDC_FORMAT_MACROS 1 +#endif +#include ") +elseif(HAVE_STDINT_H_LIBZIP) + set(LIBZIP_TYPES_INCLUDE "#include ") +elseif(HAVE_SYS_TYPES_H_LIBZIP) + set(LIBZIP_TYPES_INCLUDE "#include ") +endif() + +if(HAVE_INT8_T_LIBZIP) + set(ZIP_INT8_T int8_t) +elseif(HAVE___INT8_LIBZIP) + set(ZIP_INT8_T __int8) +else() + set(ZIP_INT8_T "signed char") +endif() + +if(HAVE_UINT8_T_LIBZIP) + set(ZIP_UINT8_T uint8_t) +elseif(HAVE___INT8_LIBZIP) + set(ZIP_UINT8_T "unsigned __int8") +else() + set(ZIP_UINT8_T "unsigned char") +endif() + +if(HAVE_INT16_T_LIBZIP) + set(ZIP_INT16_T int16_t) +elseif(HAVE___INT16_LIBZIP) + set(INT16_T_LIBZIP __int16) +elseif(SHORT_LIBZIP EQUAL 2) + set(INT16_T_LIBZIP short) +endif() + +if(HAVE_UINT16_T_LIBZIP) + set(ZIP_UINT16_T uint16_t) +elseif(HAVE___INT16_LIBZIP) + set(UINT16_T_LIBZIP "unsigned __int16") +elseif(SHORT_LIBZIP EQUAL 2) + set(UINT16_T_LIBZIP "unsigned short") +endif() + +if(HAVE_INT32_T_LIBZIP) + set(ZIP_INT32_T int32_t) +elseif(HAVE___INT32_LIBZIP) + set(ZIP_INT32_T __int32) +elseif(INT_LIBZIP EQUAL 4) + set(ZIP_INT32_T int) +elseif(LONG_LIBZIP EQUAL 4) + set(ZIP_INT32_T long) +endif() + +if(HAVE_UINT32_T_LIBZIP) + set(ZIP_UINT32_T uint32_t) +elseif(HAVE___INT32_LIBZIP) + set(ZIP_UINT32_T "unsigned __int32") +elseif(INT_LIBZIP EQUAL 4) + set(ZIP_UINT32_T "unsigned int") +elseif(LONG_LIBZIP EQUAL 4) + set(ZIP_UINT32_T "unsigned long") +endif() + +if(HAVE_INT64_T_LIBZIP) + set(ZIP_INT64_T int64_t) +elseif(HAVE___INT64_LIBZIP) + set(ZIP_INT64_T __int64) +elseif(LONG_LIBZIP EQUAL 8) + set(ZIP_INT64_T long) +elseif(LONG_LONG_LIBZIP EQUAL 8) + set(ZIP_INT64_T "long long") +endif() + +if(HAVE_UINT64_T_LIBZIP) + set(ZIP_UINT64_T uint64_t) +elseif(HAVE___INT64_LIBZIP) + set(ZIP_UINT64_T "unsigned __int64") +elseif(LONG_LIBZIP EQUAL 8) + set(ZIP_UINT64_T "unsigned long") +elseif(LONG_LONG_LIBZIP EQUAL 8) + set(ZIP_UINT64_T "unsigned long long") +endif() + +if(HAVE_NULLABLE) + set(ZIP_NULLABLE_DEFINES) +else() + set(ZIP_NULLABLE_DEFINES "#define _Nullable +#define _Nonnull") +endif() + +# write out config file +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake-config.h.in ${PROJECT_BINARY_DIR}/config.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake-zipconf.h.in ${PROJECT_BINARY_DIR}/zipconf.h) + +# for tests + +set(srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress) +set(abs_srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress) +set(top_builddir ${PROJECT_BINARY_DIR}) # used to find config.h + +configure_file(regress/nihtest.conf.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/nihtest.conf @ONLY) +file(COPY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/nihtest.conf + DESTINATION ${PROJECT_BINARY_DIR}/regress + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + +configure_file(regress/runtest.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest @ONLY) +file(COPY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest + DESTINATION ${PROJECT_BINARY_DIR}/regress + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + ) + +# create package config file +include(CMakePackageConfigHelpers) +write_basic_package_version_file("${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" + COMPATIBILITY AnyNewerVersion) + +configure_package_config_file("${PROJECT_NAME}-config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libzip) + +if(LIBZIP_DO_INSTALL) + # Add targets to the build-tree export set + export(TARGETS zip + FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake") + + # installation + install(FILES ${PROJECT_BINARY_DIR}/zipconf.h DESTINATION include) + install(FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} + ) + install(EXPORT ${PROJECT_NAME}-targets NAMESPACE libzip:: FILE ${PROJECT_NAME}-targets.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} + ) +endif() diff --git a/deps/libzip/INSTALL.md b/deps/libzip/INSTALL.md new file mode 100644 index 00000000000000..5112182ecee533 --- /dev/null +++ b/deps/libzip/INSTALL.md @@ -0,0 +1,69 @@ +libzip uses [cmake](https://cmake.org) to build. + +For running the tests, you need to have [perl](https://www.perl.org). + +You'll need [zlib](http://www.zlib.net/) (at least version 1.1.2). It +comes with most operating systems. + +For supporting bzip2-compressed zip archives, you need +[bzip2](http://bzip.org/). + +For supporting lzma- and xz-compressed zip archives, you need +[liblzma](https://tukaani.org/xz/) which is part of xz, at least version 5.2. + +For supporting zstd-compressed zip archives, you need +[zstd](https://github.com/facebook/zstd/). + +For AES (encryption) support, you need one of these cryptographic libraries, +listed in order of preference: + +- Apple's CommonCrypto (available on macOS and iOS) +- [GnuTLS](https://www.gnutls.org/) and [Nettle](https://www.lysator.liu.se/~nisse/nettle/) (at least nettle 3.0) +- [mbed TLS](https://tls.mbed.org/) +- [OpenSSL](https://www.openssl.org/) >= 1.0. +- Microsoft Windows Cryptography Framework + +If you don't want a library even if it is installed, you can +pass `-DENABLE_=OFF` to cmake, where `` is one of +`COMMONCRYPTO`, `GNUTLS`, `MBEDTLS`, or `OPENSSL`. + +The basic usage is +```sh +mkdir build +cd build +cmake .. +make +make test +make install +``` + +Some useful parameters you can pass to `cmake` with `-Dparameter=value`: + +- `BUILD_SHARED_LIBS`: set to `ON` or `OFF` to enable/disable building + of shared libraries, defaults to `ON` +- `CMAKE_INSTALL_PREFIX`: for setting the installation path +- `DOCUMENTATION_FORMAT`: choose one of `man`, `mdoc`, and `html` for + the installed documentation (default: decided by cmake depending on + available tools) +- `LIBZIP_DO_INSTALL`: If you include libzip as a subproject, link it + statically and do not want to let it install its files, set this + variable to `OFF`. Defaults to `ON`. + +If you want to compile with custom `CFLAGS`, set them in the environment +before running `cmake`: +```sh +CFLAGS=-DMY_CUSTOM_FLAG cmake .. +``` + +If you are compiling on a system with a small stack size, add +`-DZIP_ALLOCATE_BUFFER` to `CFLAGS`. + +If you are building on a 32-bit Linux system it might be necessary +to define `_FILE_OFFSET_BITS` to `64`. Your distro will need to provide +a `fts.h` file that is new enough to support this, or the build +will break in `zipcmp`. + +You can get verbose build output with by passing `VERBOSE=1` to +`make`. + +You can also check the [cmake FAQ](https://gitlab.kitware.com/cmake/community/-/wikis/FAQ). diff --git a/deps/libzip/LICENSE b/deps/libzip/LICENSE new file mode 100644 index 00000000000000..fa706096111ba4 --- /dev/null +++ b/deps/libzip/LICENSE @@ -0,0 +1,31 @@ +Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + +The authors can be contacted at + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/deps/libzip/NEWS.md b/deps/libzip/NEWS.md new file mode 100644 index 00000000000000..96c92a811c9036 --- /dev/null +++ b/deps/libzip/NEWS.md @@ -0,0 +1,319 @@ +# 1.10 [Unreleased] + +* Make support for layered sources public. +* Allow reading changed file data. +* Fix handling of files of size 4294967295. +* `zipmerge`: copy extra fields. +* `zipmerge`: add option to keep files uncompressed. +* CMake: add detection of mbedTLS version 3. +* Use ISO C secure library functions, if available. +* Fix reading/writing compressed data with buffers > 4GiB. + + +# 1.9.2 [2022-06-28] + +* Fix version number in header file. + + +# 1.9.1 [2022-06-28] + +* Fix `zip_file_is_seekable()`. + + +# 1.9.0 [2022-06-13] + +* Add `zip_file_is_seekable()`. +* Improve compatibility with WinAES. +* Fix encoding handling in `zip_name_locate()`. +* Add option to `zipcmp` to output summary of changes. +* Various bug fixes and documentation improvements. + + +# 1.8.0 [2021-06-18] + +* Add support for zstd (Zstandard) compression. +* Add support for lzma (ID 14) compression. +* Add `zip_source_window_create()`. +* Add `zip_source_zip_create()` variant to `zip_source_zip()`. +* Allow method specific `comp_flags` in `zip_set_file_compression()`. +* Allow `zip_source_tell()` on sources that don't support seeking and `zip_ftell()` on compressed data. +* Provide more details for consistency check errors. +* Improve output of `zipcmp`. +* In `zipcmp`, don’t ignore empty directories when comparing directory listing. +* Treat empty string as no password given in `zip_file_set_encryption()`, `zip_fopen_encrypted()`, and `zip_set_default_password()`. + + +# 1.7.3 [2020-07-15] + +* Support cmake < 3.17 again. +* Fix pkgconfig file (regression in 1.7.2). + + +# 1.7.2 [2020-07-11] + +* Fixes for the CMake `find_project()` files. +* libzip moved to the CMake `libzip::` `NAMESPACE`. +* CMake usage best practice cleanups. + + +# 1.7.1 [2020-06-13] + +* Restore `LIBZIP_VERSION_{MAJOR,MINOR,MICRO}` symbols. +* Fixes warnings reported by PVS-Studio. +* Add `LIBZIP_DO_INSTALL` build setting to make it easier to use + libzip as subproject. + + +# 1.7.0 [2020-06-05] + +* Add support for encrypting using traditional PKWare encryption. +* Add `zip_compression_method_supported()`. +* Add `zip_encryption_method_supported()`. +* Add the `ZIP_SOURCE_GET_FILE_ATTRIBUTES` source command. +* Refactor stdio file backend. +* Add CMake find_project() support. + + +# 1.6.1 [2020-02-03] + +* Bugfix for double-free in `zipcmp(1)` during cleanup. + + +# 1.6.0 [2020-01-24] + +* Avoid using `umask()` since it's not thread-safe. +* Set close-on-exec flag when opening files. +* Do not accept empty files as valid zip archives any longer. +* Add support for XZ compressed files (using liblzma). +* Add support for cancelling while closing zip archives. +* Add support for setting the time in the on-disk format. + + +# 1.5.2 [2019-03-12] + +* Fix bug in AES encryption affecting certain file sizes +* Keep file permissions when modifying zip archives +* Support systems with small stack size. +* Support mbed TLS as crypto backend. +* Add nullability annotations. + + +# 1.5.1 [2018-04-11] + +* Choose format of installed documentation based on available tools. +* Fix visibility of symbols. +* Fix zipcmp directory support. +* Don't set RPATH on Linux. +* Use Libs.private for link dependencies in pkg-config file. +* Fix build with LibreSSL. +* Various bugfixes. + + +# 1.5.0 [2018-03-11] + +* Use standard cryptographic library instead of custom AES implementation. + This also simplifies the license. +* Use `clang-format` to format the source code. +* More Windows improvements. + + +# 1.4.0 [2017-12-29] + +* Improve build with cmake +* Retire autoconf/automake build system +* Add `zip_source_buffer_fragment()`. +* Add support to clone unchanged beginning of archive (instead of rewriting it). + Supported for buffer sources and on Apple File System. +* Add support for Microsoft Universal Windows Platform. + + +# 1.3.2 [2017-11-20] + +* Fix bug introduced in last: zip_t was erroneously freed if zip_close() failed. + + +# 1.3.1 [2017-11-19] + +* Install zipconf.h into ${PREFIX}/include +* Add zip_libzip_version() +* Fix AES tests on Linux + + +# 1.3.0 [2017-09-02] + +* Support bzip2 compressed zip archives +* Improve file progress callback code +* Fix zip_fdopen() +* CVE-2017-12858: Fix double free() +* CVE-2017-14107: Improve EOCD64 parsing + + +# 1.2.0 [2017-02-19] + +* Support for AES encryption (Winzip version), both encryption + and decryption +* Support legacy zip files with >64k entries +* Fix seeking in zip_source_file if start > 0 +* Add zip_fseek() for seeking in uncompressed data +* Add zip_ftell() for telling position in uncompressed data +* Add zip_register_progress_callback() for UI updates during zip_close() + + +# 1.1.3 [2016-05-28] + +* Fix build on Windows when using autoconf + + +# 1.1.2 [2016-02-19] + +* Improve support for 3MF files + + +# 1.1.1 [2016-02-07] + +* Build fixes for Linux +* Fix some warnings reported by PVS-Studio + + +# 1.1 [2016-01-26] + +* ziptool(1): command line tool to modify zip archives +* Speedups for archives with many entries +* Coverity fixes +* Better APK support +* Support for running tests on Windows +* More build fixes for Windows +* Portability fixes +* Documentation improvements + + +# 1.0.1 [2015-05-04] + +* Build fixes for Windows + + +# 1.0 [2015-05-03] + +* Implemented an I/O abstraction layer +* Added support for native Windows API for files +* Added support for setting the last modification time for a file +* Added a new type zip_error_t for errors +* Added more typedefs for structs +* Torrentzip support was removed +* CVE-2015-2331 was fixed +* Addressed all Coverity CIDs + + +# 0.11.2 [2013-12-19] + +* Support querying/setting operating system and external attributes +* For newly added files, set operating system to UNIX, permissions + to 0666 (0777 for directories) +* Fix bug when writing zip archives containing files bigger than 4GB + + +# 0.11.1 [2013-04-27] + +* Fix bugs in zip_set_file_compression() +* Include Xcode build infrastructure + + +# 0.11 [2013-03-23] + +* Added Zip64 support (large file support) +* Added UTF-8 support for file names, file comments, and archive comments +* Changed API for name and comment related functions for UTF-8 support +* Added zip_discard() +* Added ZIP_TRUNCATE for zip_open() +* Added zip_set_file_compression() +* Added API for accessing and modifying extra fields +* Improved API type consistency +* Use gcc4's visibility __attribute__ +* More changes for Windows support +* Additional test cases + + +# 0.10.1 [2012-03-20] + +* Fixed CVE-2012-1162 +* Fixed CVE-2012-1163 + + +# 0.10 [2010-03-18] + +* Added zip_get_num_entries(), deprecated zip_get_num_files() +* Better windows support +* Support for traditional PKWARE encryption added +* Fix opening archives with more than 65535 entries +* Fix some memory leaks +* Fix cmake build and installation +* Fix memory leak in error case in zip_open() +* Fixed CVE-2011-0421 (no security implications though) +* More documentation + + +# 0.9.3 [2010-02-01] + +* Include m4/ directory in distribution; some packagers need it + + +# 0.9.2 [2010-01-31] + +* Avoid passing uninitialized data to deflate() +* Fix memory leak when closing zip archives + + +# 0.9.1 [2010-01-24] + +* Fix infinite loop on reading some broken files +* Optimization in time conversion (don't call localtime()) +* Clear data descriptor flag in central directory, fixing Open Office files +* Allow more than 64k entries + + +# 0.9 [2008-07-25] + +* on Windows, explicitly set dllimport/dllexport +* remove erroneous references to GPL +* add support for torrentzip +* new functions: zip_get_archive_flag, zip_set_archive_flag +* zip_source_zip: add flag to force recompression +* zip_sorce_file: only keep file open while reading from it + + +# 0.8 [2007-06-06] + +* fix for zip archives larger than 2GiB +* fix zip_error_strerror to include libzip error string +* add support for reading streamed zip files +* new functions: zip_add_dir, zip_error_clear, zip_file_error_clear +* add basic support for building with CMake (incomplete) + + +# 0.7.1 [2006-05-18] + +* bugfix for zip_close + + +# 0.7 [2006-05-06] + +* struct zip_stat increased for future encryption support +* zip_add return value changed (now returns new index of added file) +* shared library major bump because of previous two +* added functions for reading and writing file and archive comments + New functions: zip_get_archive_comment, zip_get_file_comment, + zip_set_archive_comment, zip_set_file_comment, zip_unchange_archive + + +# 0.6.1 [2005-07-14] + +* various bug fixes + + +# 0.6 [2005-06-09] + +* first standalone release +* changed license to three-clause BSD +* overhauled API +* added man pages +* install zipcmp and zipmerge diff --git a/deps/libzip/README.md b/deps/libzip/README.md new file mode 100644 index 00000000000000..2ca60e1d7c45f4 --- /dev/null +++ b/deps/libzip/README.md @@ -0,0 +1,34 @@ +This is libzip, a C library for reading, creating, and modifying +zip and zip64 archives. Files can be added from data buffers, files, +or compressed data copied directly from other zip archives. Changes +made without closing the archive can be reverted. Decryption and +encryption of Winzip AES and legacy PKware encrypted files is +supported. + +libzip is fully documented via man pages. HTML versions of the man +pages are on [libzip.org](https://libzip.org/documentation/) and +in the [man](man) directory. You can start with +[libzip(3)](https://libzip.org/documentation/libzip.html), which +lists +all others. Example source code is in the [examples](examples) and +[src](src) subdirectories. + +See the [INSTALL.md](INSTALL.md) file for installation instructions and +dependencies. + +If you have developed an application using libzip, you can find out +about API changes and how to adapt your code for them in the included +file [API-CHANGES.md](API-CHANGES.md). + +If you make a binary distribution, please include a pointer to the +distribution site: +> https://libzip.org/ + +The latest version can always be found there. The official repository +is at [github](https://github.com/nih-at/libzip/). + +If you want to reach the authors in private, use . + +[![Github Actions Build Status](https://github.com/nih-at/libzip/workflows/build/badge.svg)](https://github.com/nih-at/libzip/actions?query=workflow%3Abuild) +[![Appveyor Build status](https://ci.appveyor.com/api/projects/status/f1bqqt9djvf22f5g?svg=true)](https://ci.appveyor.com/project/nih-at/libzip) +[![Coverity Status](https://scan.coverity.com/projects/127/badge.svg)](https://scan.coverity.com/projects/libzip) diff --git a/deps/libzip/SECURITY.md b/deps/libzip/SECURITY.md new file mode 100644 index 00000000000000..67c84eb1d729b0 --- /dev/null +++ b/deps/libzip/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +We are not maintaining multiple branches, so all fixes will be committed to head and included in the next release. + +We take great care to maintain backwards compatibility, so we expect our users to use the latest version. + +## Reporting a Vulnerability + +You can reach us per email at info@libzip.org. + +For less sensitive reports, you can also open an issue or pull request on GitHub. diff --git a/deps/libzip/THANKS b/deps/libzip/THANKS new file mode 100644 index 00000000000000..5adf6a965b3537 --- /dev/null +++ b/deps/libzip/THANKS @@ -0,0 +1,149 @@ +Thanks to Info-ZIP for info on the DOS-time/date conversion code, +and some other general information gathered from their sources. + +Thanks to these people for suggestions, testing, and bug reports: + +ag2s20150909 +Agostino Sarubbo +Alberto Spin +Alexander Galanin +Alexandr Shadchin +Alexey Bykov +Andreas Deininger +Andreas Falkenhahn +Andrew Brampton +Andrew Molyneux +Ankur Kothari +Antonin Décimo +Arseniy Terekhin +BALATON Zoltan +Benjamin Gilbert +Beuc +Boaz Stolk +Bogdan +Brian 'geeknik' Carpenter +Carl Mastrangelo +Cédric Tabin +celan69 +Charlie Li +Chris Nehren +Christoph Cullmann +Christoph M. Becker +Coverity +cryi +ctenter-scs +Dane Springmeyer +Daniel Russel +Ларионов Даниил +David Demelier +Dean Ellis +Declan Moran +Del Merritt +Devin Davila +Dmytro Rybachenko +Eelco Dolstra +Elvis Angelaccio +Erwin Haid +Eun-cheol Joo +Fabrice Fontaine +Filip Niksic +Florian Delizy +Force Charlie +François Simon +Frederik Ramm +gk7huki +Gerard ODonnell +Giovanni +Hanno Böck +HeeMyung +Heiko Becker +Heiko Hund +hongjunwang +Ilya Voronin +Info-ZIP group +Ivan Kolesnikov +Jan Weiß +Jay Freeman (saurik) +jloqfjgk@github +Joachim Reichel +João Custódio +Joel Ebrahimi +Jono Spiro +Julien Matthey +Julien Schueller +Justin Cohen +kensington +Keith Jones +Khaled Mardam-Bey +Kohei Yoshida +Krzesimir Nowak +Leith Bade +Lubomir I. Ivanov +Lucas Bustamante +Maël Nison +Mark A. Tsuchida +Martin Buchholz +Martin Herkt +Martin Szulecki +Michael Balzer +Michael Beck +Michael Heimpold +MichaÅ‚ Janiszewski +Michal Vyskocil +Mikhail Gusarov . +Miklos Vajna +Morris Hafner +Muhammad Arslan Kabeer +Oliver Kaiser +Oliver Kuckertz +OSS-Fuzz Team +Ørjan Malde +Pascal Terjan +Patrick Spendrin +Paul Harris +Paul Sheppard +Pavel Raiskup +Pierre Joye +Pierre-Louis Cabelguen +PW Hu +RafaÅ‚ Mikrut +Randy +Remi Collet +rezso +Richard Schütz +Rick Carback +Rikard Falkeborn +Robert Norris +Roberto Tirabassi +robhz786 +Roland Ortloff +Rosen Penev +Ryan Burns +Sam Sappenfield +scribam +Sebastian Kemper +Sebastian Schmitt +Sergei Ozerov +shenlebantongying +Simon Talbot +SpaceIm +Stephen Bryant +Tabata Shintaro +Tarmo Pikaro +Taylor C. Richberger +TC +Thomas Debesse +Tim Lunn +Timo Warns +Timofey +Tom Callaway +Tomas Hoger +Tomáš Malý +Torsten Paul +Transporter +Vassili Courzakis +Vitaly Murashev +William Lee +William Ouwehand +Wojciech Michalski +Wolfgang Glunz diff --git a/deps/libzip/TODO.md b/deps/libzip/TODO.md new file mode 100644 index 00000000000000..141c3db91e3053 --- /dev/null +++ b/deps/libzip/TODO.md @@ -0,0 +1,184 @@ +## Before next release + +## Other + +- split `zip_source_t` in main part and reference so we can keep track which reference called open and we can invalidate references if the underlying source gets invalidated (e. g. by `zip_close`). +- Support extended timestamp extra field (0x5455): mtime overrides dos mtime from dirent, function to get/set all three. +- Add support for torrentzip. + +## Prefixes + +For example for adding extractors for self-extracting zip archives. +````c +zip_set_archive_prefix(struct zip *za, const zip_uint8_t *data, zip_uint64_t length); +const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp); +```` + +## Compression + +* add lzma2 support +* add deflate64 support (https://github.com/madler/zlib/blob/master/contrib/infback9/infback9.h) + +## API Issues + +* Add `zip_file_use_password` to set per-file password to use if libzip needs to decrypt the file (e.g. when changing encryption or compression method). + +* `zip_get_archive_comment` has `int *lenp` argument. Cleaner would be `zip_uint32_t *`. + rename and fix. which other functions for naming consistency? +* rename remaining `zip_XXX_{file,archive}_*` to `zip_{file,archive}_XXX_*`? +* compression/crypt implementations: how to set error code on failure +* compression/crypt error messages a la `ZIP_ER_ZLIB` (no detailed info passing) + +## Features + +* consistently use `_zip_crypto_clear()` for passwords +* support setting extra fields from `zip_source` + * introduce layers of extra fields: + * original + * from `zip_source` + * manually set + * when querying extra fields, search all of them in reverse order + * add whiteout (deleted) flag + * allow invalid data flag, used when computing extra field size before writing data + * new command `ZIP_SOURCE_EXTRA_FIELDS` + * no support for multiple copies of same extra field +* delete all extra fields during `zip_replace()` +* function to copy file from one archive to another +* set `O_CLOEXEC` flag after fopen and mkstemp +* `zip_file_set_mtime()`: support InfoZIP time stamps +* support streaming output (creating new archive to e.g. stdout) +* add function to read/set ASCII file flag +* `zip_commit()` (to finish changes without closing archive) +* add custom compression function support +* `zip_source_zip()`: allow rewinding +* `zipcmp`: add option for file content comparison +* `zipcmp`: add more paranoid checks: + * external attributes/opsys + * last_mod + * version needed/made by + * general purpose bit flags +* add more consistency checks: + * for stored files, test compressed = uncompressed + * data descriptor + * local headers come before central dir +* support for old compression methods? + +## Bugs + +* ensure that nentries is small enough not to cause overflow (size_t for entry, uint64 for CD on disk) +* check for limits imposed by format (central dir size, file size, extra fields, ...) +* `_zip_u2d_time()`: handle `localtime(3)` failure +* POSIX: `zip_open()`: check whether file can be created and fail if not +* fix inconsistent usage of valid flags (not checked in many places) +* `cdr == NULL` -> `ER_NOENT` vs. `idx > cdir->nentry` -> `ER_INVAL` inconsistent (still there?) + +## Cleanup + +* go over cdir parser and rename various offset/size variables to make it clearer +* use bool +* use `ZIP_SOURCE_SUPPORTS_{READABLE,SEEKABLE,WRITABLE}` +* use `zip_source_seek_compute_offset()` +* get rid of `zip_get_{compression,encryption}_implementation()` +* use `zip_*int*_t` internally +* `zip_source_file()`: don't allow write if start/len specify a part of the file + +## Documentation + +* document valid file paths +* document: `zip_source_write()`: length can't be > `ZIP_INT64_MAX` +* document: `ZIP_SOURCE_CLOSE` implementation can't return error +* keep error codes in man pages in sync +* document error codes in new man pages + +## Infrastructure + +* review guidelines/community standards + - [Linux Foundation Core Infrastructure Initiative Best Practices](https://bestpractices.coreinfrastructure.org/) + - [Readme Maturity Level](https://github.com/LappleApple/feedmereadmes/blob/master/README-maturity-model.md) + - [Github Community Profile](https://github.com/nih-at/libzip/community) +* test different crypto backends with GitHub actions. +* improve man page formatting of tagged lists on webpage (`
`) +* rewrite `make_zip_errors.sh` in cmake +* script to check if all exported symbols are marked with `ZIP_EXTERN`, add to `make distcheck` + +## macOS / iOS framework + +* get cmake to optionally build frameworks + +## Test Case Issues + +* add test cases for all ZIP_INCONS detail errors +* `incons-local-filename-short.zzip` doesn't test short filename, since extra fields fail to parse. +* test error cases with special source + - tell it which command should fail + - use it both as source for `zip_add` and `zip_open_from_source` + - `ziptool_regress`: + - `-e error_spec`: source containing zip fails depending on `error_spec` + - `add_with_error name content error_spec`: add content to archive, where source fails depending on `error_spec` + - `add_file_with_error name file_to_add offset len error_spec`: add file to archive, len bytes starting from offset, where source fails depending on `error_spec` + - `error_spec`: + - source command that fails + - error code that source returns + - conditions that must be met for error to trigger + - Nth call of command + - read/write: total byte count so far + - state of source (opened, EOF reached, ...) +* test for zipcmp reading directory (requires fts) +* add test case for clone with files > 4k +* consider testing for malloc/realloc failures +* Winzip AES support + * test cases decryption: <=20, >20, stat for both + * test cases encryption: no password, default password, file-specific password, 128/192/256, <=20, >20 + * support testing on macOS +* add test cases for lots of files (including too many) +* add test cases for holes (between files, between files and cdir, between cdir and eocd, + zip64 where appropriate) +* test seek in `zip_source_crc_create()` +* test cases for `set_extra*`, `delete_extra*`, `*extra_field*` +* test cases for in memory archives + * add + * delete + * delete all + * modify +* use gcov output to increase test coverage +* add test case to change values for newly added files (name, compression method, comment, mtime, . . .) +* `zip_open()` file less than `EOCDLEN` bytes long +* test calls against old API +* rename file to dir/ and vice versa (fails) +* fix comment test to be newline insensitive +* check if http://bugs.python.org/issue20078 provides ideas for new tests + +* (`add`, `replace`) + * add to empty zip + * add to existing zip + * add w/ existing file name [E] + * replace ok + * replace w/ illegal index [E] + * replace w/ deleted name [E] + * unchange added/replaced file +* (`close`) + * copy zip file + * open copy + * rename, delete, replace, add w/ new name, add w/ deleted name + * close + * zipcmp copy expected + * remove copy +* (`error_get) +* (`error_get_sys_type`) +* (`error_to_str`) +* (`extra_fields`) +* (`file_error_get`) +* (`file_strerror`) +* (`replace`) +* (`source_buffer`) +* (`source_file`) +* (`source_filep`) +* (`source_free`) +* (`source_function`) +* (`source_zip`) +* (`strerror`) +* (`unchange`) +* (`unchange_all`) +* `open(ZIP_RDONLY)` +* I/O abstraction layer + * `zip_open_from_source` +* read two zip entries interleaved diff --git a/deps/libzip/android/do.sh b/deps/libzip/android/do.sh new file mode 100755 index 00000000000000..c9cf192085e78b --- /dev/null +++ b/deps/libzip/android/do.sh @@ -0,0 +1,63 @@ + +# Author: Declan Moran +# www.silverglint.com +# Thanks to damaex (https://github.com/damaex), for significant contributions + +ANDROID_NDK_ROOT=/home/android/android-ndk-r19c + +INSTALL_DIR=install +BUILD_DIR=build +START_DIR=$(pwd) + +rm -rf $INSTALL_DIR +rm -rf $BUILD_DIR +mkdir -p $BUILD_DIR #"${ANDROID_TARGET_PLATFORM}" + +#-------------------------------------------------------------------- +build_it() +{ + # builds either a static or shared lib depending on parm passed (ON or OFF) + want_shared=$1 + + cmake -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=$(pwd)../../${INSTALL_DIR}/${ANDROID_TARGET_PLATFORM} \ + -DANDROID_ABI=${ANDROID_TARGET_PLATFORM} \ + -DENABLE_OPENSSL:BOOL=OFF \ + -DENABLE_COMMONCRYPTO:BOOL=OFF \ + -DENABLE_GNUTLS:BOOL=OFF \ + -DENABLE_MBEDTLS:BOOL=OFF \ + -DENABLE_OPENSSL:BOOL=OFF \ + -DENABLE_WINDOWS_CRYPTO:BOOL=OFF \ + -DBUILD_TOOLS:BOOL=OFF \ + -DBUILD_REGRESS:BOOL=OFF \ + -DBUILD_EXAMPLES:BOOL=OFF \ + -DBUILD_SHARED_LIBS:BOOL=$want_shared \ + -DBUILD_DOC:BOOL=OFF \ + -DANDROID_TOOLCHAIN=clang cmake -H.. -B$BUILD_DIR/${ANDROID_TARGET_PLATFORM} + + #run make with all system threads and install + cd $BUILD_DIR/${ANDROID_TARGET_PLATFORM} + make install -j$(nproc --all) + cd $START_DIR + } + +#-------------------------------------------------------------------- +for ANDROID_TARGET_PLATFORM in armeabi-v7a arm64-v8a x86 x86_64 +do + echo "Building libzip for ${ANDROID_TARGET_PLATFORM}" + + build_it ON + build_it OFF + + if [ $? -ne 0 ]; then + echo "Error executing: cmake" + exit 1 + fi + + + if [ $? -ne 0 ]; then + echo "Error executing make install for platform: ${ANDROID_TARGET_PLATFORM}" + exit 1 + fi + +done diff --git a/deps/libzip/android/docker/Dockerfile b/deps/libzip/android/docker/Dockerfile new file mode 100644 index 00000000000000..5532bde28bf2ce --- /dev/null +++ b/deps/libzip/android/docker/Dockerfile @@ -0,0 +1,122 @@ +# Version: 1.0 + +# Dockerfile for building libzip for android +# https://github.com/dec1/libzip.git +# creates docker container with all tools, libraries and sources required to build libzip for android. + +# Author: Declan Moran +# www.silverglint.com + + +# Usage: +#--------- +# download the libzip repository +# > git clone https://github.com/dec1/libzip.git +# > cd libzip +# +# build docker image "my_img_zip" from the dockerfile in "docker" dir +# > docker build -t my_img_zip ./android/docker +# +# run docker container "my_ctr_zip" from this image, mounting the current dir. (Need to pass absolute host paths to mount volume- hence "pwd") +# > docker run -v $(pwd):/home/docker-share/libzip -it --entrypoint=/bin/bash --name my_ctr_zip my_img_zip +# +# Now inside docker container +# $ cd /home/docker-share/libzip/android +# +# Modify ./do.sh (on host), to match the boost and android ndk versions/paths in the "Configure here" section below +# Build from running docker container. +# $./do.sh +# +# "./build" dir contains required build, but owned by root. chown to your username/group +# > sudo chown -R : ./build +# > sudo chown -R : ./install +# +# Exit container, when build is finished. +# $ exit +# + + + + +FROM ubuntu:18.04 + + +## -------------------------------------------------------------------- +## Configure here +# --------------------------------------------------------------------- +# --------------------------------------------------------------------- +# Here you can speciofy exactly what android ndk (and sdk) version you want to use. + + + +# (2) Android SDK +# https://developer.android.com/studio#downloads +ARG SDK_URL_BASE=https://dl.google.com/android/repository +ARG SDK_FILE=sdk-tools-linux-4333796.zip + +# the sdk platform to use +# https://developer.android.com/guide/topics/manifest/uses-sdk-element +ARG ANDROID_SDK_PLATFORM_VERS="platforms;android-28" + + + +# (3) Android NDK +# https://developer.android.com/ndk/downloads +ARG NDK_URL_BASE=https://dl.google.com/android/repository +ARG NDK_FILE=android-ndk-r19c-linux-x86_64.zip +# --------------------------------------------------------------------- +## -------------------------------------------------------------------- + +RUN apt-get update +RUN apt-get -y dist-upgrade + + +# for downloading archives +RUN apt-get -y install wget + +# for unzipping downloaded android archives +RUN apt-get -y install zip +RUN apt-get -y install cmake + +RUN apt-get -y install lib32z1 + + +# need this this to install some (32 bit) prerequisites for android builds +RUN dpkg --add-architecture i386 +RUN apt-get update +RUN apt-get -y dist-upgrade +RUN apt-get install -y libc6:i386 libncurses5:i386 libstdc++6:i386 libbz2-1.0:i386 + + +# need c compiler to set up create boost build system (before building boost with it and android toolchain) +RUN apt-get -y install build-essential +RUN apt-get -y install libc6-dev-i386 +RUN apt-get -y install clang + +RUN apt-get -y install openjdk-8-jdk +#-------------------------------------- + +ARG ANDROID_HOME=/home/android +WORKDIR ${ANDROID_HOME} + + +# SDK +# ---- +# download android sdk command line tools +RUN wget ${SDK_URL_BASE}/$SDK_FILE +RUN unzip $SDK_FILE + +ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools + + +RUN yes | sdkmanager --licenses + +RUN sdkmanager "platform-tools" $ANDROID_SDK_PLATFORM_VERS +#RUN sdkmanager "platform-tools" "platforms;android-28" + + +# NDK +# ---- +RUN wget ${NDK_URL_BASE}/$NDK_FILE +RUN unzip $NDK_FILE + diff --git a/deps/libzip/android/readme.txt b/deps/libzip/android/readme.txt new file mode 100644 index 00000000000000..dadc4b4791688b --- /dev/null +++ b/deps/libzip/android/readme.txt @@ -0,0 +1,13 @@ + +Cross compile libzip for android. +-------------------------------- +Modify "do.sh" as appropriate if you need to specify a different ndk dir or wish to specify different build parameters + +Prerequisites for the development machine - see docker/Dockerfile + +You can either set you host machine up with these prerequisites or simply use docker (in which case you need not install anything on your host machine except docker itself). + +See "Usage" in docker/Dockerfile for detailed instructions. + + +Please note: The libzip development team does not use Android, so this script is provided as is, as we cannot properly maintain it. We will, however, gladly accept fixes and try to work with users to resolve any issues they may have. diff --git a/deps/libzip/appveyor.yml b/deps/libzip/appveyor.yml new file mode 100644 index 00000000000000..21d645619da96d --- /dev/null +++ b/deps/libzip/appveyor.yml @@ -0,0 +1,81 @@ +os: +- Visual Studio 2017 + +environment: + matrix: + - GENERATOR: "Visual Studio 15 2017 Win64" + TRIPLET: x64-windows + CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off" + CMAKE_CONFIG: Release + RUN_TESTS: yes +# - GENERATOR: "Visual Studio 15 2017 Win64" +# TRIPLET: x64-windows +# CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off" +# CMAKE_CONFIG: Debug +# RUN_TESTS: yes + - GENERATOR: "Visual Studio 15 2017 Win64" + TRIPLET: x64-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0" + CMAKE_CONFIG: Release + RUN_TESTS: no + - GENERATOR: "Visual Studio 15 2017" + TRIPLET: x86-windows + CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off" + CMAKE_CONFIG: Release + RUN_TESTS: yes +# - GENERATOR: "Visual Studio 15 2017" +# TRIPLET: x86-windows +# CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off" +# CMAKE_CONFIG: Debug +# RUN_TESTS: yes + - GENERATOR: "Visual Studio 15 2017" + TRIPLET: x86-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0" + CMAKE_CONFIG: Release + RUN_TESTS: no + - GENERATOR: "Visual Studio 15 2017 ARM" + TRIPLET: arm-windows + CMAKE_OPTS: "-DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + - GENERATOR: "Visual Studio 15 2017 ARM" + TRIPLET: arm-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + - GENERATOR: "Visual Studio 15 2017" + TRIPLET: arm64-windows + CMAKE_OPTS: "-AARM64 -DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + - GENERATOR: "Visual Studio 15 2017" + TRIPLET: arm64-uwp + CMAKE_OPTS: "-AARM64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + +before_build: + cmd: >- + vcpkg install zlib:%TRIPLET% bzip2:%TRIPLET% liblzma:%TRIPLET% zstd:%TRIPLET% + + mkdir build + + cd build + + cmake -DCMAKE_TOOLCHAIN_FILE=C:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake .. -G "%GENERATOR%" %CMAKE_OPTS% + + appveyor PushArtifact config.h + + appveyor PushArtifact CMakeCache.txt + +build_script: + cmd: >- + cmake --build . --config %CMAKE_CONFIG% --target INSTALL + + cmake --build . --config %CMAKE_CONFIG% + +test_script: + cmd: >- + set VERBOSE=yes + + IF %RUN_TESTS%==yes ( ctest -C %CMAKE_CONFIG% --output-on-failure ) diff --git a/deps/libzip/cmake-compat/CMakePushCheckState.cmake b/deps/libzip/cmake-compat/CMakePushCheckState.cmake new file mode 100644 index 00000000000000..3e519ee512f542 --- /dev/null +++ b/deps/libzip/cmake-compat/CMakePushCheckState.cmake @@ -0,0 +1,91 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +CMakePushCheckState +------------------- + + + +This module defines three macros: ``CMAKE_PUSH_CHECK_STATE()`` +``CMAKE_POP_CHECK_STATE()`` and ``CMAKE_RESET_CHECK_STATE()`` These macros can +be used to save, restore and reset (i.e., clear contents) the state of +the variables ``CMAKE_REQUIRED_FLAGS``, ``CMAKE_REQUIRED_DEFINITIONS``, +``CMAKE_REQUIRED_LINK_OPTIONS``, ``CMAKE_REQUIRED_LIBRARIES``, +``CMAKE_REQUIRED_INCLUDES`` and ``CMAKE_EXTRA_INCLUDE_FILES`` used by the +various Check-files coming with CMake, like e.g. ``check_function_exists()`` +etc. +The variable contents are pushed on a stack, pushing multiple times is +supported. This is useful e.g. when executing such tests in a Find-module, +where they have to be set, but after the Find-module has been executed they +should have the same value as they had before. + +``CMAKE_PUSH_CHECK_STATE()`` macro receives optional argument ``RESET``. +Whether it's specified, ``CMAKE_PUSH_CHECK_STATE()`` will set all +``CMAKE_REQUIRED_*`` variables to empty values, same as +``CMAKE_RESET_CHECK_STATE()`` call will do. + +Usage: + +.. code-block:: cmake + + cmake_push_check_state(RESET) + set(CMAKE_REQUIRED_DEFINITIONS -DSOME_MORE_DEF) + check_function_exists(...) + cmake_reset_check_state() + set(CMAKE_REQUIRED_DEFINITIONS -DANOTHER_DEF) + check_function_exists(...) + cmake_pop_check_state() +#]=======================================================================] + +macro(CMAKE_RESET_CHECK_STATE) + + set(CMAKE_EXTRA_INCLUDE_FILES) + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_DEFINITIONS) + set(CMAKE_REQUIRED_LINK_OPTIONS) + set(CMAKE_REQUIRED_LIBRARIES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_QUIET) + +endmacro() + +macro(CMAKE_PUSH_CHECK_STATE) + + if(NOT DEFINED _CMAKE_PUSH_CHECK_STATE_COUNTER) + set(_CMAKE_PUSH_CHECK_STATE_COUNTER 0) + endif() + + math(EXPR _CMAKE_PUSH_CHECK_STATE_COUNTER "${_CMAKE_PUSH_CHECK_STATE_COUNTER}+1") + + set(_CMAKE_EXTRA_INCLUDE_FILES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_EXTRA_INCLUDE_FILES}) + set(_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_INCLUDES}) + set(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_DEFINITIONS}) + set(_CMAKE_REQUIRED_LINK_OPTIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_LINK_OPTIONS}) + set(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_LIBRARIES}) + set(_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_FLAGS}) + set(_CMAKE_REQUIRED_QUIET_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER} ${CMAKE_REQUIRED_QUIET}) + + if (${ARGC} GREATER 0 AND "${ARGV0}" STREQUAL "RESET") + cmake_reset_check_state() + endif() + +endmacro() + +macro(CMAKE_POP_CHECK_STATE) + +# don't pop more than we pushed + if("${_CMAKE_PUSH_CHECK_STATE_COUNTER}" GREATER "0") + + set(CMAKE_EXTRA_INCLUDE_FILES ${_CMAKE_EXTRA_INCLUDE_FILES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + set(CMAKE_REQUIRED_INCLUDES ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + set(CMAKE_REQUIRED_DEFINITIONS ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + set(CMAKE_REQUIRED_LINK_OPTIONS ${_CMAKE_REQUIRED_LINK_OPTIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + set(CMAKE_REQUIRED_LIBRARIES ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + set(CMAKE_REQUIRED_FLAGS ${_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + set(CMAKE_REQUIRED_QUIET ${_CMAKE_REQUIRED_QUIET_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}}) + + math(EXPR _CMAKE_PUSH_CHECK_STATE_COUNTER "${_CMAKE_PUSH_CHECK_STATE_COUNTER}-1") + endif() + +endmacro() diff --git a/deps/libzip/cmake-compat/CheckLibraryExists.cmake b/deps/libzip/cmake-compat/CheckLibraryExists.cmake new file mode 100644 index 00000000000000..76901ab618a8f3 --- /dev/null +++ b/deps/libzip/cmake-compat/CheckLibraryExists.cmake @@ -0,0 +1,102 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +CheckLibraryExists +------------------ + +Check if the function exists. + +.. command:: CHECK_LIBRARY_EXISTS + + .. code-block:: cmake + + CHECK_LIBRARY_EXISTS(LIBRARY FUNCTION LOCATION VARIABLE) + + :: + + LIBRARY - the name of the library you are looking for + FUNCTION - the name of the function + LOCATION - location where the library should be found + VARIABLE - variable to store the result + Will be created as an internal cache variable. + + + +The following variables may be set before calling this macro to modify +the way the check is run: + +:: + + CMAKE_REQUIRED_FLAGS = string of compile command line flags + CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) + CMAKE_REQUIRED_LINK_OPTIONS = list of options to pass to link command + CMAKE_REQUIRED_LIBRARIES = list of libraries to link + CMAKE_REQUIRED_QUIET = execute quietly without messages +#]=======================================================================] + +if(__CheckLibraryExists_cmake__) + return() +endif() +set(__CheckLibraryExists_cmake__ TRUE) + +macro(CHECK_LIBRARY_EXISTS LIBRARY FUNCTION LOCATION VARIABLE) + if(NOT DEFINED "${VARIABLE}") + set(MACRO_CHECK_LIBRARY_EXISTS_DEFINITION + "-DCHECK_FUNCTION_EXISTS=${FUNCTION} ${CMAKE_REQUIRED_FLAGS}") + if(NOT CMAKE_REQUIRED_QUIET) + message(CHECK_START "Looking for ${FUNCTION} in ${LIBRARY}") + endif() + set(CHECK_LIBRARY_EXISTS_LINK_OPTIONS) + if(CMAKE_REQUIRED_LINK_OPTIONS) + set(CHECK_LIBRARY_EXISTS_LINK_OPTIONS + LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS}) + endif() + set(CHECK_LIBRARY_EXISTS_LIBRARIES ${LIBRARY}) + if(CMAKE_REQUIRED_LIBRARIES) + set(CHECK_LIBRARY_EXISTS_LIBRARIES + ${CHECK_LIBRARY_EXISTS_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES}) + endif() + + if(CMAKE_C_COMPILER_LOADED) + set(_cle_source ${CMAKE_ROOT}/Modules/CheckFunctionExists.c) + elseif(CMAKE_CXX_COMPILER_LOADED) + set(_cle_source ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckLibraryExists/CheckFunctionExists.cxx) + configure_file(${CMAKE_ROOT}/Modules/CheckFunctionExists.c "${_cle_source}" COPYONLY) + else() + message(FATAL_ERROR "CHECK_FUNCTION_EXISTS needs either C or CXX language enabled") + endif() + + try_compile(${VARIABLE} + ${CMAKE_BINARY_DIR} + ${_cle_source} + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + ${CHECK_LIBRARY_EXISTS_LINK_OPTIONS} + LINK_LIBRARIES ${CHECK_LIBRARY_EXISTS_LIBRARIES} + CMAKE_FLAGS + -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION} + -DLINK_DIRECTORIES:STRING=${LOCATION} + OUTPUT_VARIABLE OUTPUT) + unset(_cle_source) + + if(${VARIABLE}) + if(NOT CMAKE_REQUIRED_QUIET) + message(CHECK_PASS "found") + endif() + set(${VARIABLE} 1 CACHE INTERNAL "Have library ${LIBRARY}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the function ${FUNCTION} exists in the ${LIBRARY} " + "passed with the following output:\n" + "${OUTPUT}\n\n") + else() + if(NOT CMAKE_REQUIRED_QUIET) + message(CHECK_FAIL "not found") + endif() + set(${VARIABLE} "" CACHE INTERNAL "Have library ${LIBRARY}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the function ${FUNCTION} exists in the ${LIBRARY} " + "failed with the following output:\n" + "${OUTPUT}\n\n") + endif() + endif() +endmacro() diff --git a/deps/libzip/cmake-compat/CheckSymbolExists.cmake b/deps/libzip/cmake-compat/CheckSymbolExists.cmake new file mode 100644 index 00000000000000..79d3d7d7854897 --- /dev/null +++ b/deps/libzip/cmake-compat/CheckSymbolExists.cmake @@ -0,0 +1,169 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +CheckSymbolExists +----------------- + +Provides a macro to check if a symbol exists as a function, variable, +or macro in ``C``. + +.. command:: check_symbol_exists + + .. code-block:: cmake + + check_symbol_exists( ) + + Check that the ```` is available after including given header + ```` and store the result in a ````. Specify the list + of files in one argument as a semicolon-separated list. + ```` will be created as an internal cache variable. + +If the header files define the symbol as a macro it is considered +available and assumed to work. If the header files declare the symbol +as a function or variable then the symbol must also be available for +linking (so intrinsics may not be detected). +If the symbol is a type, enum value, or intrinsic it will not be recognized +(consider using :module:`CheckTypeSize` or :module:`CheckCSourceCompiles`). +If the check needs to be done in C++, consider using +:module:`CheckCXXSymbolExists` instead. + +The following variables may be set before calling this macro to modify +the way the check is run: + +``CMAKE_REQUIRED_FLAGS`` + string of compile command line flags. +``CMAKE_REQUIRED_DEFINITIONS`` + a :ref:`;-list ` of macros to define (-DFOO=bar). +``CMAKE_REQUIRED_INCLUDES`` + a :ref:`;-list ` of header search paths to pass to + the compiler. +``CMAKE_REQUIRED_LINK_OPTIONS`` + a :ref:`;-list ` of options to add to the link command. +``CMAKE_REQUIRED_LIBRARIES`` + a :ref:`;-list ` of libraries to add to the link + command. See policy :policy:`CMP0075`. +``CMAKE_REQUIRED_QUIET`` + execute quietly without messages. + +For example: + +.. code-block:: cmake + + include(CheckSymbolExists) + + # Check for macro SEEK_SET + check_symbol_exists(SEEK_SET "stdio.h" HAVE_SEEK_SET) + # Check for function fopen + check_symbol_exists(fopen "stdio.h" HAVE_FOPEN) +#]=======================================================================] + +if(__CheckSymbolExists_cmake__) + return() +endif() +set(__CheckSymbolExists_cmake__ TRUE) + +cmake_policy(PUSH) +cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced + +macro(CHECK_SYMBOL_EXISTS SYMBOL FILES VARIABLE) + if(CMAKE_C_COMPILER_LOADED) + __CHECK_SYMBOL_EXISTS_IMPL("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.c" "${SYMBOL}" "${FILES}" "${VARIABLE}" ) + elseif(CMAKE_CXX_COMPILER_LOADED) + __CHECK_SYMBOL_EXISTS_IMPL("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.cxx" "${SYMBOL}" "${FILES}" "${VARIABLE}" ) + else() + message(FATAL_ERROR "CHECK_SYMBOL_EXISTS needs either C or CXX language enabled") + endif() +endmacro() + +macro(__CHECK_SYMBOL_EXISTS_IMPL SOURCEFILE SYMBOL FILES VARIABLE) + if(NOT DEFINED "${VARIABLE}" OR "x${${VARIABLE}}" STREQUAL "x${VARIABLE}") + set(CMAKE_CONFIGURABLE_FILE_CONTENT "/* */\n") + set(MACRO_CHECK_SYMBOL_EXISTS_FLAGS ${CMAKE_REQUIRED_FLAGS}) + if(CMAKE_REQUIRED_LINK_OPTIONS) + set(CHECK_SYMBOL_EXISTS_LINK_OPTIONS + LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS}) + else() + set(CHECK_SYMBOL_EXISTS_LINK_OPTIONS) + endif() + if(CMAKE_REQUIRED_LIBRARIES) + set(CHECK_SYMBOL_EXISTS_LIBS + LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + else() + set(CHECK_SYMBOL_EXISTS_LIBS) + endif() + if(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_SYMBOL_EXISTS_INCLUDES + "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") + else() + set(CMAKE_SYMBOL_EXISTS_INCLUDES) + endif() + foreach(FILE ${FILES}) + string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT + "#include <${FILE}>\n") + endforeach() + string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT " +int main(int argc, char** argv) +{ + (void)argv;") + set(_CSE_CHECK_NON_MACRO "return ((int*)(&${SYMBOL}))[argc];") + if("${SYMBOL}" MATCHES "^[a-zA-Z_][a-zA-Z0-9_]*$") + # The SYMBOL has a legal macro name. Test whether it exists as a macro. + string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT " +#ifndef ${SYMBOL} + ${_CSE_CHECK_NON_MACRO} +#else + (void)argc; + return 0; +#endif") + else() + # The SYMBOL cannot be a macro (e.g., a template function). + string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT " + ${_CSE_CHECK_NON_MACRO}") + endif() + string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT " +}") + unset(_CSE_CHECK_NON_MACRO) + + configure_file("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in" + "${SOURCEFILE}" @ONLY) + + if(NOT CMAKE_REQUIRED_QUIET) + message(CHECK_START "Looking for ${SYMBOL}") + endif() + try_compile(${VARIABLE} + ${CMAKE_BINARY_DIR} + "${SOURCEFILE}" + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + ${CHECK_SYMBOL_EXISTS_LINK_OPTIONS} + ${CHECK_SYMBOL_EXISTS_LIBS} + CMAKE_FLAGS + -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_SYMBOL_EXISTS_FLAGS} + "${CMAKE_SYMBOL_EXISTS_INCLUDES}" + OUTPUT_VARIABLE OUTPUT) + if(${VARIABLE}) + if(NOT CMAKE_REQUIRED_QUIET) + message(CHECK_PASS "found") + endif() + set(${VARIABLE} 1 CACHE INTERNAL "Have symbol ${SYMBOL}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the ${SYMBOL} " + "exist passed with the following output:\n" + "${OUTPUT}\nFile ${SOURCEFILE}:\n" + "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n") + else() + if(NOT CMAKE_REQUIRED_QUIET) + message(CHECK_FAIL "not found") + endif() + set(${VARIABLE} "" CACHE INTERNAL "Have symbol ${SYMBOL}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the ${SYMBOL} " + "exist failed with the following output:\n" + "${OUTPUT}\nFile ${SOURCEFILE}:\n" + "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n") + endif() + unset(CMAKE_CONFIGURABLE_FILE_CONTENT) + endif() +endmacro() + +cmake_policy(POP) diff --git a/deps/libzip/cmake-compat/FindBZip2.cmake b/deps/libzip/cmake-compat/FindBZip2.cmake new file mode 100644 index 00000000000000..98ab72cd85ce51 --- /dev/null +++ b/deps/libzip/cmake-compat/FindBZip2.cmake @@ -0,0 +1,104 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindBZip2 +--------- + +Try to find BZip2 + +IMPORTED Targets +^^^^^^^^^^^^^^^^ + +This module defines :prop_tgt:`IMPORTED` target ``BZip2::BZip2``, if +BZip2 has been found. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module defines the following variables: + +``BZIP2_FOUND`` + system has BZip2 +``BZIP2_INCLUDE_DIRS`` + the BZip2 include directories +``BZIP2_LIBRARIES`` + Link these to use BZip2 +``BZIP2_NEED_PREFIX`` + this is set if the functions are prefixed with ``BZ2_`` +``BZIP2_VERSION_STRING`` + the version of BZip2 found + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``BZIP2_INCLUDE_DIR`` + the BZip2 include directory +#]=======================================================================] + +set(_BZIP2_PATHS PATHS + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\GnuWin32\\Bzip2;InstallPath]" + ) + +find_path(BZIP2_INCLUDE_DIR bzlib.h ${_BZIP2_PATHS} PATH_SUFFIXES include) + +if (NOT BZIP2_LIBRARIES) + find_library(BZIP2_LIBRARY_RELEASE NAMES bz2 bzip2 libbz2 libbzip2 ${_BZIP2_PATHS} PATH_SUFFIXES lib) + find_library(BZIP2_LIBRARY_DEBUG NAMES bz2d bzip2d libbz2d libbzip2d ${_BZIP2_PATHS} PATH_SUFFIXES lib) + + include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) + SELECT_LIBRARY_CONFIGURATIONS(BZIP2) +else () + file(TO_CMAKE_PATH "${BZIP2_LIBRARIES}" BZIP2_LIBRARIES) +endif () + +if (BZIP2_INCLUDE_DIR AND EXISTS "${BZIP2_INCLUDE_DIR}/bzlib.h") + file(STRINGS "${BZIP2_INCLUDE_DIR}/bzlib.h" BZLIB_H REGEX "bzip2/libbzip2 version [0-9]+\\.[^ ]+ of [0-9]+ ") + string(REGEX REPLACE ".* bzip2/libbzip2 version ([0-9]+\\.[^ ]+) of [0-9]+ .*" "\\1" BZIP2_VERSION_STRING "${BZLIB_H}") +endif () + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(BZip2 + REQUIRED_VARS BZIP2_LIBRARIES BZIP2_INCLUDE_DIR + VERSION_VAR BZIP2_VERSION_STRING) + +if (BZIP2_FOUND) + set(BZIP2_INCLUDE_DIRS ${BZIP2_INCLUDE_DIR}) + include(${CMAKE_CURRENT_LIST_DIR}/CheckSymbolExists.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake) + cmake_push_check_state() + set(CMAKE_REQUIRED_QUIET ${BZip2_FIND_QUIETLY}) + set(CMAKE_REQUIRED_INCLUDES ${BZIP2_INCLUDE_DIR}) + set(CMAKE_REQUIRED_LIBRARIES ${BZIP2_LIBRARIES}) + CHECK_SYMBOL_EXISTS(BZ2_bzCompressInit "bzlib.h" BZIP2_NEED_PREFIX) + cmake_pop_check_state() + + if(NOT TARGET BZip2::BZip2) + add_library(BZip2::BZip2 UNKNOWN IMPORTED) + set_target_properties(BZip2::BZip2 PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${BZIP2_INCLUDE_DIRS}") + + if(BZIP2_LIBRARY_RELEASE) + set_property(TARGET BZip2::BZip2 APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(BZip2::BZip2 PROPERTIES + IMPORTED_LOCATION_RELEASE "${BZIP2_LIBRARY_RELEASE}") + endif() + + if(BZIP2_LIBRARY_DEBUG) + set_property(TARGET BZip2::BZip2 APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(BZip2::BZip2 PROPERTIES + IMPORTED_LOCATION_DEBUG "${BZIP2_LIBRARY_DEBUG}") + endif() + + if(NOT BZIP2_LIBRARY_RELEASE AND NOT BZIP2_LIBRARY_DEBUG) + set_property(TARGET BZip2::BZip2 APPEND PROPERTY + IMPORTED_LOCATION "${BZIP2_LIBRARY}") + endif() + endif() +endif () + +mark_as_advanced(BZIP2_INCLUDE_DIR) diff --git a/deps/libzip/cmake-compat/FindGnuTLS.cmake b/deps/libzip/cmake-compat/FindGnuTLS.cmake new file mode 100644 index 00000000000000..819f0001215bb1 --- /dev/null +++ b/deps/libzip/cmake-compat/FindGnuTLS.cmake @@ -0,0 +1,82 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindGnuTLS +---------- + +Find the GNU Transport Layer Security library (gnutls) + +IMPORTED Targets +^^^^^^^^^^^^^^^^ + +This module defines :prop_tgt:`IMPORTED` target ``GnuTLS::GnuTLS``, if +gnutls has been found. + +Result Variables +^^^^^^^^^^^^^^^^ + +``GNUTLS_FOUND`` + System has gnutls +``GNUTLS_INCLUDE_DIR`` + The gnutls include directory +``GNUTLS_LIBRARIES`` + The libraries needed to use gnutls +``GNUTLS_DEFINITIONS`` + Compiler switches required for using gnutls +``GNUTLS_VERSION`` + version of gnutls. +#]=======================================================================] + +# Note that this doesn't try to find the gnutls-extra package. + + +if (GNUTLS_INCLUDE_DIR AND GNUTLS_LIBRARY) + # in cache already + set(gnutls_FIND_QUIETLY TRUE) +endif () + +if (NOT WIN32) + # try using pkg-config to get the directories and then use these values + # in the find_path() and find_library() calls + # also fills in GNUTLS_DEFINITIONS, although that isn't normally useful + find_package(PkgConfig QUIET) + PKG_CHECK_MODULES(PC_GNUTLS QUIET gnutls) + set(GNUTLS_DEFINITIONS ${PC_GNUTLS_CFLAGS_OTHER}) + set(GNUTLS_VERSION ${PC_GNUTLS_VERSION}) + # keep for backward compatibility + set(GNUTLS_VERSION_STRING ${PC_GNUTLS_VERSION}) +endif () + +find_path(GNUTLS_INCLUDE_DIR gnutls/gnutls.h + HINTS + ${PC_GNUTLS_INCLUDEDIR} + ${PC_GNUTLS_INCLUDE_DIRS} + ) + +find_library(GNUTLS_LIBRARY NAMES gnutls libgnutls + HINTS + ${PC_GNUTLS_LIBDIR} + ${PC_GNUTLS_LIBRARY_DIRS} + ) + +mark_as_advanced(GNUTLS_INCLUDE_DIR GNUTLS_LIBRARY) + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GnuTLS + REQUIRED_VARS GNUTLS_LIBRARY GNUTLS_INCLUDE_DIR + VERSION_VAR GNUTLS_VERSION_STRING) + +if(GNUTLS_FOUND) + set(GNUTLS_LIBRARIES ${GNUTLS_LIBRARY}) + set(GNUTLS_INCLUDE_DIRS ${GNUTLS_INCLUDE_DIR}) + + if(NOT TARGET GnuTLS::GnuTLS) + add_library(GnuTLS::GnuTLS UNKNOWN IMPORTED) + set_target_properties(GnuTLS::GnuTLS PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GNUTLS_INCLUDE_DIRS}" + INTERFACE_COMPILE_DEFINITIONS "${GNUTLS_DEFINITIONS}" + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${GNUTLS_LIBRARIES}") + endif() +endif() diff --git a/deps/libzip/cmake-compat/FindLibLZMA.cmake b/deps/libzip/cmake-compat/FindLibLZMA.cmake new file mode 100644 index 00000000000000..200d6bf8d69413 --- /dev/null +++ b/deps/libzip/cmake-compat/FindLibLZMA.cmake @@ -0,0 +1,124 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindLibLZMA +----------- + +Find LZMA compression algorithm headers and library. + + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines :prop_tgt:`IMPORTED` target ``LibLZMA::LibLZMA``, if +liblzma has been found. + +Result variables +^^^^^^^^^^^^^^^^ + +This module will set the following variables in your project: + +``LIBLZMA_FOUND`` + True if liblzma headers and library were found. +``LIBLZMA_INCLUDE_DIRS`` + Directory where liblzma headers are located. +``LIBLZMA_LIBRARIES`` + Lzma libraries to link against. +``LIBLZMA_HAS_AUTO_DECODER`` + True if lzma_auto_decoder() is found (required). +``LIBLZMA_HAS_EASY_ENCODER`` + True if lzma_easy_encoder() is found (required). +``LIBLZMA_HAS_LZMA_PRESET`` + True if lzma_lzma_preset() is found (required). +``LIBLZMA_VERSION_MAJOR`` + The major version of lzma +``LIBLZMA_VERSION_MINOR`` + The minor version of lzma +``LIBLZMA_VERSION_PATCH`` + The patch version of lzma +``LIBLZMA_VERSION_STRING`` + version number as a string (ex: "5.0.3") +#]=======================================================================] + +find_path(LIBLZMA_INCLUDE_DIR lzma.h ) +if(NOT LIBLZMA_LIBRARY) + find_library(LIBLZMA_LIBRARY_RELEASE NAMES lzma liblzma PATH_SUFFIXES lib) + find_library(LIBLZMA_LIBRARY_DEBUG NAMES lzmad liblzmad PATH_SUFFIXES lib) + include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) + select_library_configurations(LIBLZMA) +else() + file(TO_CMAKE_PATH "${LIBLZMA_LIBRARY}" LIBLZMA_LIBRARY) +endif() + +if(LIBLZMA_INCLUDE_DIR AND EXISTS "${LIBLZMA_INCLUDE_DIR}/lzma/version.h") + file(STRINGS "${LIBLZMA_INCLUDE_DIR}/lzma/version.h" LIBLZMA_HEADER_CONTENTS REGEX "#define LZMA_VERSION_[A-Z]+ [0-9]+") + + string(REGEX REPLACE ".*#define LZMA_VERSION_MAJOR ([0-9]+).*" "\\1" LIBLZMA_VERSION_MAJOR "${LIBLZMA_HEADER_CONTENTS}") + string(REGEX REPLACE ".*#define LZMA_VERSION_MINOR ([0-9]+).*" "\\1" LIBLZMA_VERSION_MINOR "${LIBLZMA_HEADER_CONTENTS}") + string(REGEX REPLACE ".*#define LZMA_VERSION_PATCH ([0-9]+).*" "\\1" LIBLZMA_VERSION_PATCH "${LIBLZMA_HEADER_CONTENTS}") + + set(LIBLZMA_VERSION_STRING "${LIBLZMA_VERSION_MAJOR}.${LIBLZMA_VERSION_MINOR}.${LIBLZMA_VERSION_PATCH}") + unset(LIBLZMA_HEADER_CONTENTS) +endif() + +# We're using new code known now as XZ, even library still been called LZMA +# it can be found in http://tukaani.org/xz/ +# Avoid using old codebase +if (LIBLZMA_LIBRARY) + include(${CMAKE_CURRENT_LIST_DIR}/CheckLibraryExists.cmake) + set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET}) + set(CMAKE_REQUIRED_QUIET ${LibLZMA_FIND_QUIETLY}) + if(NOT LIBLZMA_LIBRARY_RELEASE AND NOT LIBLZMA_LIBRARY_DEBUG) + set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY}) + elseif(LIBLZMA_LIBRARY_RELEASE) + set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY_RELEASE}) + elseif(LIBLZMA_LIBRARY_DEBUG) + set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY_DEBUG}) + endif() + CHECK_LIBRARY_EXISTS(${LIBLZMA_LIBRARY_check} lzma_auto_decoder "" LIBLZMA_HAS_AUTO_DECODER) + CHECK_LIBRARY_EXISTS(${LIBLZMA_LIBRARY_check} lzma_easy_encoder "" LIBLZMA_HAS_EASY_ENCODER) + CHECK_LIBRARY_EXISTS(${LIBLZMA_LIBRARY_check} lzma_lzma_preset "" LIBLZMA_HAS_LZMA_PRESET) + unset(LIBLZMA_LIBRARY_check) + set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE}) +endif () + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +find_package_handle_standard_args(LibLZMA REQUIRED_VARS LIBLZMA_LIBRARY + LIBLZMA_INCLUDE_DIR + LIBLZMA_HAS_AUTO_DECODER + LIBLZMA_HAS_EASY_ENCODER + LIBLZMA_HAS_LZMA_PRESET + VERSION_VAR LIBLZMA_VERSION_STRING + ) +mark_as_advanced( LIBLZMA_INCLUDE_DIR LIBLZMA_LIBRARY ) + +if (LIBLZMA_FOUND) + set(LIBLZMA_LIBRARIES ${LIBLZMA_LIBRARY}) + set(LIBLZMA_INCLUDE_DIRS ${LIBLZMA_INCLUDE_DIR}) + if(NOT TARGET LibLZMA::LibLZMA) + add_library(LibLZMA::LibLZMA UNKNOWN IMPORTED) + set_target_properties(LibLZMA::LibLZMA PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${LIBLZMA_INCLUDE_DIR} + IMPORTED_LINK_INTERFACE_LANGUAGES C) + + if(LIBLZMA_LIBRARY_RELEASE) + set_property(TARGET LibLZMA::LibLZMA APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(LibLZMA::LibLZMA PROPERTIES + IMPORTED_LOCATION_RELEASE "${LIBLZMA_LIBRARY_RELEASE}") + endif() + + if(LIBLZMA_LIBRARY_DEBUG) + set_property(TARGET LibLZMA::LibLZMA APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(LibLZMA::LibLZMA PROPERTIES + IMPORTED_LOCATION_DEBUG "${LIBLZMA_LIBRARY_DEBUG}") + endif() + + if(NOT LIBLZMA_LIBRARY_RELEASE AND NOT LIBLZMA_LIBRARY_DEBUG) + set_target_properties(LibLZMA::LibLZMA PROPERTIES + IMPORTED_LOCATION "${LIBLZMA_LIBRARY}") + endif() + endif() +endif () diff --git a/deps/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake b/deps/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake new file mode 100644 index 00000000000000..a078049e2bb6b4 --- /dev/null +++ b/deps/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,453 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageHandleStandardArgs +----------------------------- + +This module provides a function intended to be used in :ref:`Find Modules` +implementing :command:`find_package()` calls. It handles the +``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``. +It also sets the ``_FOUND`` variable. The package is +considered found if all variables listed contain valid results, e.g. +valid filepaths. + +.. command:: find_package_handle_standard_args + + There are two signatures:: + + find_package_handle_standard_args( + (DEFAULT_MSG|) + ... + ) + + find_package_handle_standard_args( + [FOUND_VAR ] + [REQUIRED_VARS ...] + [VERSION_VAR ] + [HANDLE_COMPONENTS] + [CONFIG_MODE] + [NAME_MISMATCHED] + [REASON_FAILURE_MESSAGE ] + [FAIL_MESSAGE ] + ) + + The ``_FOUND`` variable will be set to ``TRUE`` if all + the variables ``...`` are valid and any optional + constraints are satisfied, and ``FALSE`` otherwise. A success or + failure message may be displayed based on the results and on + whether the ``REQUIRED`` and/or ``QUIET`` option was given to + the :command:`find_package` call. + + The options are: + + ``(DEFAULT_MSG|)`` + In the simple signature this specifies the failure message. + Use ``DEFAULT_MSG`` to ask for a default message to be computed + (recommended). Not valid in the full signature. + + ``FOUND_VAR `` + Obsolete. Specifies either ``_FOUND`` or + ``_FOUND`` as the result variable. This exists only + for compatibility with older versions of CMake and is now ignored. + Result variables of both names are always set for compatibility. + + ``REQUIRED_VARS ...`` + Specify the variables which are required for this package. + These may be named in the generated failure message asking the + user to set the missing variable values. Therefore these should + typically be cache entries such as ``FOO_LIBRARY`` and not output + variables like ``FOO_LIBRARIES``. + + ``VERSION_VAR `` + Specify the name of a variable that holds the version of the package + that has been found. This version will be checked against the + (potentially) specified required version given to the + :command:`find_package` call, including its ``EXACT`` option. + The default messages include information about the required + version and the version which has been actually found, both + if the version is ok or not. + + ``HANDLE_COMPONENTS`` + Enable handling of package components. In this case, the command + will report which components have been found and which are missing, + and the ``_FOUND`` variable will be set to ``FALSE`` + if any of the required components (i.e. not the ones listed after + the ``OPTIONAL_COMPONENTS`` option of :command:`find_package`) are + missing. + + ``CONFIG_MODE`` + Specify that the calling find module is a wrapper around a + call to ``find_package( NO_MODULE)``. This implies + a ``VERSION_VAR`` value of ``_VERSION``. The command + will automatically check whether the package configuration file + was found. + + ``REASON_FAILURE_MESSAGE `` + Specify a custom message of the reason for the failure which will be + appended to the default generated message. + + ``FAIL_MESSAGE `` + Specify a custom failure message instead of using the default + generated message. Not recommended. + + ``NAME_MISMATCHED`` + Indicate that the ```` does not match + ``${CMAKE_FIND_PACKAGE_NAME}``. This is usually a mistake and raises a + warning, but it may be intentional for usage of the command for components + of a larger package. + +Example for the simple signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibXml2 DEFAULT_MSG + LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) + +The ``LibXml2`` package is considered to be found if both +``LIBXML2_LIBRARY`` and ``LIBXML2_INCLUDE_DIR`` are valid. +Then also ``LibXml2_FOUND`` is set to ``TRUE``. If it is not found +and ``REQUIRED`` was used, it fails with a +:command:`message(FATAL_ERROR)`, independent whether ``QUIET`` was +used or not. If it is found, success will be reported, including +the content of the first ````. On repeated CMake runs, +the same message will not be printed again. + +.. note:: + + If ```` does not match ``CMAKE_FIND_PACKAGE_NAME`` for the + calling module, a warning that there is a mismatch is given. The + ``FPHSA_NAME_MISMATCHED`` variable may be set to bypass the warning if using + the old signature and the ``NAME_MISMATCHED`` argument using the new + signature. To avoid forcing the caller to require newer versions of CMake for + usage, the variable's value will be used if defined when the + ``NAME_MISMATCHED`` argument is not passed for the new signature (but using + both is an error).. + +Example for the full signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibArchive + REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR + VERSION_VAR LibArchive_VERSION) + +In this case, the ``LibArchive`` package is considered to be found if +both ``LibArchive_LIBRARY`` and ``LibArchive_INCLUDE_DIR`` are valid. +Also the version of ``LibArchive`` will be checked by using the version +contained in ``LibArchive_VERSION``. Since no ``FAIL_MESSAGE`` is given, +the default messages will be printed. + +Another example for the full signature: + +.. code-block:: cmake + + find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) + find_package_handle_standard_args(Automoc4 CONFIG_MODE) + +In this case, a ``FindAutmoc4.cmake`` module wraps a call to +``find_package(Automoc4 NO_MODULE)`` and adds an additional search +directory for ``automoc4``. Then the call to +``find_package_handle_standard_args`` produces a proper success/failure +message. +#]=======================================================================] + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + set (__msg "${_msg}") + if (FPHSA_REASON_FAILURE_MESSAGE) + string(APPEND __msg "\n Reason given by package: ${FPHSA_REASON_FAILURE_MESSAGE}\n") + endif() + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${__msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${__msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing:${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + string(APPEND configsText "\n ${filename} (version ${version})") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + if (FPHSA_REASON_FAILURE_MESSAGE) + string(PREPEND FPHSA_REASON_FAILURE_MESSAGE "${${_NAME}_NOT_FOUND_MESSAGE}\n ") + else() + set(FPHSA_REASON_FAILURE_MESSAGE "${${_NAME}_NOT_FOUND_MESSAGE}") + endif() + else() + string(APPEND configsText "\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + + # Set up the arguments for `cmake_parse_arguments`. + set(options CONFIG_MODE HANDLE_COMPONENTS NAME_MISMATCHED) + set(oneValueArgs FAIL_MESSAGE REASON_FAILURE_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + + # Check whether we are in 'simple' or 'extended' mode: + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + unset(FPHSA_NAME_MISMATCHED_override) + if (DEFINED FPHSA_NAME_MISMATCHED) + # If the variable NAME_MISMATCHED variable is set, error if it is passed as + # an argument. The former is for old signatures, the latter is for new + # signatures. + list(FIND ARGN "NAME_MISMATCHED" name_mismatched_idx) + if (NOT name_mismatched_idx EQUAL "-1") + message(FATAL_ERROR + "The `NAME_MISMATCHED` argument may only be specified by the argument or " + "the variable, not both.") + endif () + + # But use the variable if it is not an argument to avoid forcing minimum + # CMake version bumps for calling modules. + set(FPHSA_NAME_MISMATCHED_override "${FPHSA_NAME_MISMATCHED}") + endif () + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + cmake_parse_arguments(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + endif() + + if (DEFINED FPHSA_NAME_MISMATCHED_override) + set(FPHSA_NAME_MISMATCHED "${FPHSA_NAME_MISMATCHED_override}") + endif () + + if (DEFINED CMAKE_FIND_PACKAGE_NAME + AND NOT FPHSA_NAME_MISMATCHED + AND NOT _NAME STREQUAL CMAKE_FIND_PACKAGE_NAME) + message(AUTHOR_WARNING + "The package name passed to `find_package_handle_standard_args` " + "(${_NAME}) does not match the name of the calling package " + "(${CMAKE_FIND_PACKAGE_NAME}). This can lead to problems in calling " + "code that expects `find_package` result variables (e.g., `_FOUND`) " + "to follow a certain pattern.") + endif () + +# now that we collected all arguments, process them + + if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + set(_FOUND_VAR_UPPER ${_NAME_UPPER}_FOUND) + set(_FOUND_VAR_MIXED ${_NAME}_FOUND) + if(FPHSA_FOUND_VAR STREQUAL _FOUND_VAR_MIXED OR FPHSA_FOUND_VAR STREQUAL _FOUND_VAR_UPPER) + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_FOUND_VAR_MIXED}\" and \"${_FOUND_VAR_UPPER}\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + set(FPHSA_FOUND_${_NAME} TRUE) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(FPHSA_FOUND_${_NAME} FALSE) + string(APPEND MISSING_VARS " ${_CURRENT_VAR}") + else() + string(APPEND DETAILS "[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(FPHSA_FOUND_${_NAME}) + set(${_NAME}_FOUND TRUE) + set(${_NAME_UPPER}_FOUND TRUE) + else() + set(${_NAME}_FOUND FALSE) + set(${_NAME_UPPER}_FOUND FALSE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components:") + endif() + string(APPEND FOUND_COMPONENTS_MSG " ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components:") + endif() + string(APPEND MISSING_COMPONENTS_MSG " ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + string(APPEND MISSING_VARS " ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + string(APPEND DETAILS "[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + + # check with DEFINED here as the requested or found version may be "0" + if (DEFINED ${_NAME}_FIND_VERSION) + if(DEFINED ${FPHSA_VERSION_VAR}) + set(_FOUND_VERSION ${${FPHSA_VERSION_VAR}}) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + # count the dots in the version string + string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${_FOUND_VERSION}") + # add one dot because there is one dot more than there are components + string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS) + if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT) + # Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT + # is at most 4 here. Therefore a simple lookup table is used. + if (${_NAME}_FIND_VERSION_COUNT EQUAL 1) + set(_VERSION_REGEX "[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2) + set(_VERSION_REGEX "[^.]*\\.[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3) + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*") + else () + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*") + endif () + string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${_FOUND_VERSION}") + unset(_VERSION_REGEX) + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + unset(_VERSION_HEAD) + else () + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + endif () + unset(_VERSION_DOTS) + + else() # minimum version specified: + if (${_NAME}_FIND_VERSION VERSION_GREATER _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${_FOUND_VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + # Check with DEFINED as the found version may be 0. + if(DEFINED ${FPHSA_VERSION_VAR}) + set(VERSION_MSG "(found version \"${${FPHSA_VERSION_VAR}}\")") + endif() + endif () + + if(VERSION_OK) + string(APPEND DETAILS "[v${${FPHSA_VERSION_VAR}}(${${_NAME}_FIND_VERSION})]") + else() + set(${_NAME}_FOUND FALSE) + endif() + + + # print the result: + if (${_NAME}_FOUND) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_NAME}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) + set(${_NAME_UPPER}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) +endfunction() diff --git a/deps/libzip/cmake-compat/FindPackageMessage.cmake b/deps/libzip/cmake-compat/FindPackageMessage.cmake new file mode 100644 index 00000000000000..0628b9816911e8 --- /dev/null +++ b/deps/libzip/cmake-compat/FindPackageMessage.cmake @@ -0,0 +1,48 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageMessage +------------------ + +.. code-block:: cmake + + find_package_message( "message for user" "find result details") + +This function is intended to be used in FindXXX.cmake modules files. +It will print a message once for each unique find result. This is +useful for telling the user where a package was found. The first +argument specifies the name (XXX) of the package. The second argument +specifies the message to display. The third argument lists details +about the find result so that if they change the message will be +displayed again. The macro also obeys the QUIET argument to the +find_package command. + +Example: + +.. code-block:: cmake + + if(X11_FOUND) + find_package_message(X11 "Found X11: ${X11_X11_LIB}" + "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") + else() + ... + endif() +#]=======================================================================] + +function(find_package_message pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REPLACE "\n" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/deps/libzip/cmake-compat/SelectLibraryConfigurations.cmake b/deps/libzip/cmake-compat/SelectLibraryConfigurations.cmake new file mode 100644 index 00000000000000..4c0e9a8c0a2f29 --- /dev/null +++ b/deps/libzip/cmake-compat/SelectLibraryConfigurations.cmake @@ -0,0 +1,80 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +SelectLibraryConfigurations +--------------------------- + +.. code-block:: cmake + + select_library_configurations(basename) + +This macro takes a library base name as an argument, and will choose +good values for the variables + +:: + + basename_LIBRARY + basename_LIBRARIES + basename_LIBRARY_DEBUG + basename_LIBRARY_RELEASE + +depending on what has been found and set. + +If only ``basename_LIBRARY_RELEASE`` is defined, ``basename_LIBRARY`` will +be set to the release value, and ``basename_LIBRARY_DEBUG`` will be set +to ``basename_LIBRARY_DEBUG-NOTFOUND``. If only ``basename_LIBRARY_DEBUG`` +is defined, then ``basename_LIBRARY`` will take the debug value, and +``basename_LIBRARY_RELEASE`` will be set to ``basename_LIBRARY_RELEASE-NOTFOUND``. + +If the generator supports configuration types, then ``basename_LIBRARY`` +and ``basename_LIBRARIES`` will be set with debug and optimized flags +specifying the library to be used for the given configuration. If no +build type has been set or the generator in use does not support +configuration types, then ``basename_LIBRARY`` and ``basename_LIBRARIES`` +will take only the release value, or the debug value if the release one +is not set. +#]=======================================================================] + +# This macro was adapted from the FindQt4 CMake module and is maintained by Will +# Dicharry . + +macro(select_library_configurations basename) + if(NOT ${basename}_LIBRARY_RELEASE) + set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + if(NOT ${basename}_LIBRARY_DEBUG) + set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + + get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND + NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND + ( _isMultiConfig OR CMAKE_BUILD_TYPE ) ) + # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for + # single-config generators, set optimized and debug libraries + set( ${basename}_LIBRARY "" ) + foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE ) + list( APPEND ${basename}_LIBRARY optimized "${_libname}" ) + endforeach() + foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG ) + list( APPEND ${basename}_LIBRARY debug "${_libname}" ) + endforeach() + elseif( ${basename}_LIBRARY_RELEASE ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} ) + elseif( ${basename}_LIBRARY_DEBUG ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} ) + else() + set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND") + endif() + + set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" ) + + if( ${basename}_LIBRARY ) + set( ${basename}_FOUND TRUE ) + endif() + + mark_as_advanced( ${basename}_LIBRARY_RELEASE + ${basename}_LIBRARY_DEBUG + ) +endmacro() diff --git a/deps/libzip/cmake-config.h.in b/deps/libzip/cmake-config.h.in new file mode 100644 index 00000000000000..e3a726725b82e1 --- /dev/null +++ b/deps/libzip/cmake-config.h.in @@ -0,0 +1,73 @@ +#ifndef HAD_CONFIG_H +#define HAD_CONFIG_H +#ifndef _HAD_ZIPCONF_H +#include "zipconf.h" +#endif +/* BEGIN DEFINES */ +#cmakedefine ENABLE_FDOPEN +#cmakedefine HAVE___PROGNAME +#cmakedefine HAVE__CLOSE +#cmakedefine HAVE__DUP +#cmakedefine HAVE__FDOPEN +#cmakedefine HAVE__FILENO +#cmakedefine HAVE__SETMODE +#cmakedefine HAVE__SNPRINTF +#cmakedefine HAVE__SNPRINTF_S +#cmakedefine HAVE__SNWPRINTF_S +#cmakedefine HAVE__STRDUP +#cmakedefine HAVE__STRICMP +#cmakedefine HAVE__STRTOI64 +#cmakedefine HAVE__STRTOUI64 +#cmakedefine HAVE__UMASK +#cmakedefine HAVE__UNLINK +#cmakedefine HAVE_ARC4RANDOM +#cmakedefine HAVE_CLONEFILE +#cmakedefine HAVE_COMMONCRYPTO +#cmakedefine HAVE_CRYPTO +#cmakedefine HAVE_FICLONERANGE +#cmakedefine HAVE_FILENO +#cmakedefine HAVE_FCHMOD +#cmakedefine HAVE_FSEEKO +#cmakedefine HAVE_FTELLO +#cmakedefine HAVE_GETPROGNAME +#cmakedefine HAVE_GNUTLS +#cmakedefine HAVE_LIBBZ2 +#cmakedefine HAVE_LIBLZMA +#cmakedefine HAVE_LIBZSTD +#cmakedefine HAVE_LOCALTIME_R +#cmakedefine HAVE_LOCALTIME_S +#cmakedefine HAVE_MEMCPY_S +#cmakedefine HAVE_MBEDTLS +#cmakedefine HAVE_MKSTEMP +#cmakedefine HAVE_NULLABLE +#cmakedefine HAVE_OPENSSL +#cmakedefine HAVE_SETMODE +#cmakedefine HAVE_SNPRINTF +#cmakedefine HAVE_SNPRINTF_S +#cmakedefine HAVE_STRCASECMP +#cmakedefine HAVE_STRDUP +#cmakedefine HAVE_STRERROR_S +#cmakedefine HAVE_STRERRORLEN_S +#cmakedefine HAVE_STRICMP +#cmakedefine HAVE_STRNCPY_S +#cmakedefine HAVE_STRTOLL +#cmakedefine HAVE_STRTOULL +#cmakedefine HAVE_STRUCT_TM_TM_ZONE +#cmakedefine HAVE_STDBOOL_H +#cmakedefine HAVE_STRINGS_H +#cmakedefine HAVE_UNISTD_H +#cmakedefine HAVE_WINDOWS_CRYPTO +#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T} +#cmakedefine SIZEOF_SIZE_T ${SIZEOF_SIZE_T} +#cmakedefine HAVE_DIRENT_H +#cmakedefine HAVE_FTS_H +#cmakedefine HAVE_NDIR_H +#cmakedefine HAVE_SYS_DIR_H +#cmakedefine HAVE_SYS_NDIR_H +#cmakedefine WORDS_BIGENDIAN +#cmakedefine HAVE_SHARED +/* END DEFINES */ +#define PACKAGE "@CMAKE_PROJECT_NAME@" +#define VERSION "@CMAKE_PROJECT_VERSION@" + +#endif /* HAD_CONFIG_H */ diff --git a/deps/libzip/cmake-zipconf.h.in b/deps/libzip/cmake-zipconf.h.in new file mode 100644 index 00000000000000..b88ed267fa1252 --- /dev/null +++ b/deps/libzip/cmake-zipconf.h.in @@ -0,0 +1,47 @@ +#ifndef _HAD_ZIPCONF_H +#define _HAD_ZIPCONF_H + +/* + zipconf.h -- platform specific include file + + This file was generated automatically by CMake + based on ../cmake-zipconf.h.in. + */ + +#define LIBZIP_VERSION "${libzip_VERSION}" +#define LIBZIP_VERSION_MAJOR ${libzip_VERSION_MAJOR} +#define LIBZIP_VERSION_MINOR ${libzip_VERSION_MINOR} +#define LIBZIP_VERSION_MICRO ${libzip_VERSION_PATCH} + +#cmakedefine ZIP_STATIC + +${ZIP_NULLABLE_DEFINES} + +${LIBZIP_TYPES_INCLUDE} + +typedef ${ZIP_INT8_T} zip_int8_t; +typedef ${ZIP_UINT8_T} zip_uint8_t; +typedef ${ZIP_INT16_T} zip_int16_t; +typedef ${ZIP_UINT16_T} zip_uint16_t; +typedef ${ZIP_INT32_T} zip_int32_t; +typedef ${ZIP_UINT32_T} zip_uint32_t; +typedef ${ZIP_INT64_T} zip_int64_t; +typedef ${ZIP_UINT64_T} zip_uint64_t; + +#define ZIP_INT8_MIN (-ZIP_INT8_MAX-1) +#define ZIP_INT8_MAX 0x7f +#define ZIP_UINT8_MAX 0xff + +#define ZIP_INT16_MIN (-ZIP_INT16_MAX-1) +#define ZIP_INT16_MAX 0x7fff +#define ZIP_UINT16_MAX 0xffff + +#define ZIP_INT32_MIN (-ZIP_INT32_MAX-1L) +#define ZIP_INT32_MAX 0x7fffffffL +#define ZIP_UINT32_MAX 0xffffffffLU + +#define ZIP_INT64_MIN (-ZIP_INT64_MAX-1LL) +#define ZIP_INT64_MAX 0x7fffffffffffffffLL +#define ZIP_UINT64_MAX 0xffffffffffffffffULL + +#endif /* zipconf.h */ diff --git a/deps/libzip/cmake/Dist.cmake b/deps/libzip/cmake/Dist.cmake new file mode 100644 index 00000000000000..d2adf9f6c87059 --- /dev/null +++ b/deps/libzip/cmake/Dist.cmake @@ -0,0 +1,83 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +Dist +------- + +Provide ``dist`` and ``distcheck`` targets similar to +autoconf/automake functionality. + +The ``dist`` target creates tarballs of the project in ``.tar.gz`` and +``.tar.xz`` formats. + +The ``distcheck`` target extracts one of created tarballs, builds the +software using its defaults, and runs the tests. + +Both targets use Unix shell commands. + +The Dist target takes one argument, the file name (before the extension). + +The ``distcheck`` target creates (and removes) ``${ARCHIVE_NAME}-build`` +and ``${ARCHIVE_NAME}-dest``. + +#]=======================================================================] +function(Dist ARCHIVE_NAME) + if(NOT TARGET dist AND NOT TARGET distcheck) + add_custom_target(dist + COMMAND git config tar.tar.xz.command "xz -c" + COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz HEAD + COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.xz HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + add_custom_target(distcheck + COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest 2>/dev/null || true + COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest + COMMAND ${CMAKE_COMMAND} -E tar xf ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz + COMMAND chmod -R u-w ${ARCHIVE_NAME} + COMMAND mkdir ${ARCHIVE_NAME}-build + COMMAND mkdir ${ARCHIVE_NAME}-dest + COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${ARCHIVE_NAME}-dest ${ARCHIVE_NAME} -B ${ARCHIVE_NAME}-build + COMMAND make -C ${ARCHIVE_NAME}-build -j4 + COMMAND make -C ${ARCHIVE_NAME}-build test + COMMAND make -C ${ARCHIVE_NAME}-build install + # COMMAND make -C ${ARCHIVE_NAME}-build uninstall + # COMMAND if [ `find ${ARCHIVE_NAME}-dest ! -type d | wc -l` -ne 0 ]; then echo leftover files in ${ARCHIVE_NAME}-dest; false; fi + COMMAND make -C ${ARCHIVE_NAME}-build clean + COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest + COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest + COMMAND echo "${ARCHIVE_NAME}.tar.gz is ready for distribution." + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + add_dependencies(distcheck dist) + endif() +endfunction() diff --git a/deps/libzip/cmake/FindMbedTLS.cmake b/deps/libzip/cmake/FindMbedTLS.cmake new file mode 100644 index 00000000000000..5a6ef9d734e1ff --- /dev/null +++ b/deps/libzip/cmake/FindMbedTLS.cmake @@ -0,0 +1,141 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindMbedTLS +------- + +Finds the Mbed TLS library. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``MbedTLS::MbedTLS`` + The Mbed TLS library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``MbedTLS_FOUND`` + True if the system has the Mbed TLS library. +``MbedTLS_VERSION`` + The version of the Mbed TLS library which was found. +``MbedTLS_INCLUDE_DIRS`` + Include directories needed to use Mbed TLS. +``MbedTLS_LIBRARIES`` + Libraries needed to link to Mbed TLS. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``MbedTLS_INCLUDE_DIR`` + The directory containing ``mbedtls/aes.h``. +``MbedTLS_LIBRARY`` + The path to the Mbed TLS library. + +#]=======================================================================] + +# I'm not aware of a pkg-config file for mbedtls as of 2020/07/08. +#find_package(PkgConfig) +#pkg_check_modules(PC_MbedTLS QUIET mbedtls) + +find_path(MbedTLS_INCLUDE_DIR + NAMES mbedtls/aes.h +# PATHS ${PC_MbedTLS_INCLUDE_DIRS} +) +find_library(MbedTLS_LIBRARY + NAMES mbedcrypto +# PATHS ${PC_MbedTLS_LIBRARY_DIRS} +) + +# Extract version information from the header file +if(MbedTLS_INCLUDE_DIR) + # for major version 3 + if(EXISTS ${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h) + file(STRINGS ${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h _ver_line + REGEX "^#define MBEDTLS_VERSION_STRING *\"[0-9]+\\.[0-9]+\\.[0-9]+\"" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" + MbedTLS_VERSION "${_ver_line}") + unset(_ver_line) + # for major version 2 + elseif(EXISTS ${MbedTLS_INCLUDE_DIR}/mbedtls/version.h) + file(STRINGS ${MbedTLS_INCLUDE_DIR}/mbedtls/version.h _ver_line + REGEX "^#define MBEDTLS_VERSION_STRING *\"[0-9]+\\.[0-9]+\\.[0-9]+\"" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" + MbedTLS_VERSION "${_ver_line}") + unset(_ver_line) + else() + if(PC_MbedTLS_VERSION) + set(MbedTLS_VERSION ${PC_MbedTLS_VERSION}) + else() + # version unknown + set(MbedTLS_VERSION "0.0") + endif() + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MbedTLS + FOUND_VAR MbedTLS_FOUND + REQUIRED_VARS + MbedTLS_LIBRARY + MbedTLS_INCLUDE_DIR + VERSION_VAR MbedTLS_VERSION +) + +if(MbedTLS_FOUND) + set(MbedTLS_LIBRARIES ${MbedTLS_LIBRARY}) + set(MbedTLS_INCLUDE_DIRS ${MbedTLS_INCLUDE_DIR}) +# set(MbedTLS_DEFINITIONS ${PC_MbedTLS_CFLAGS_OTHER}) +endif() + +if(MbedTLS_FOUND AND NOT TARGET MbedTLS::MbedTLS) + add_library(MbedTLS::MbedTLS UNKNOWN IMPORTED) + set_target_properties(MbedTLS::MbedTLS PROPERTIES + IMPORTED_LOCATION "${MbedTLS_LIBRARY}" +# INTERFACE_COMPILE_OPTIONS "${PC_MbedTLS_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${MbedTLS_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced( + MbedTLS_INCLUDE_DIR + MbedTLS_LIBRARY + ) diff --git a/deps/libzip/cmake/FindNettle.cmake b/deps/libzip/cmake/FindNettle.cmake new file mode 100644 index 00000000000000..8f0deb0142a124 --- /dev/null +++ b/deps/libzip/cmake/FindNettle.cmake @@ -0,0 +1,141 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindNettle +------- + +Finds the Nettle library. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``Nettle::Nettle`` + The Nettle library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Nettle_FOUND`` + True if the system has the Nettle library. +``Nettle_VERSION`` + The version of the Nettle library which was found. +``Nettle_INCLUDE_DIRS`` + Include directories needed to use Nettle. +``Nettle_LIBRARIES`` + Libraries needed to link to Nettle. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Nettle_INCLUDE_DIR`` + The directory containing ``nettle/aes.h``. +``Nettle_LIBRARY`` + The path to the Nettle library. + +#]=======================================================================] + +find_package(PkgConfig) +pkg_check_modules(PC_Nettle QUIET nettle) + +find_path(Nettle_INCLUDE_DIR + NAMES nettle/aes.h nettle/md5.h nettle/pbkdf2.h nettle/ripemd160.h nettle/sha.h + PATHS ${PC_Nettle_INCLUDE_DIRS} +) +find_library(Nettle_LIBRARY + NAMES nettle + PATHS ${PC_Nettle_LIBRARY_DIRS} +) + +# Extract version information from the header file +if(Nettle_INCLUDE_DIR) + # This file only exists in nettle>=3.0 + if(EXISTS ${Nettle_INCLUDE_DIR}/nettle/version.h) + file(STRINGS ${Nettle_INCLUDE_DIR}/nettle/version.h _ver_major_line + REGEX "^#define NETTLE_VERSION_MAJOR *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + Nettle_MAJOR_VERSION "${_ver_major_line}") + file(STRINGS ${Nettle_INCLUDE_DIR}/nettle/version.h _ver_minor_line + REGEX "^#define NETTLE_VERSION_MINOR *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + Nettle_MINOR_VERSION "${_ver_minor_line}") + set(Nettle_VERSION "${Nettle_MAJOR_VERSION}.${Nettle_MINOR_VERSION}") + unset(_ver_major_line) + unset(_ver_minor_line) + else() + if(PC_Nettle_VERSION) + set(Nettle_VERSION ${PC_Nettle_VERSION}) + else() + set(Nettle_VERSION "1.0") + endif() + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Nettle + FOUND_VAR Nettle_FOUND + REQUIRED_VARS + Nettle_LIBRARY + Nettle_INCLUDE_DIR + VERSION_VAR Nettle_VERSION +) + +if(Nettle_FOUND) + set(Nettle_LIBRARIES ${Nettle_LIBRARY}) + set(Nettle_INCLUDE_DIRS ${Nettle_INCLUDE_DIR}) + set(Nettle_DEFINITIONS ${PC_Nettle_CFLAGS_OTHER}) +endif() + +if(Nettle_FOUND AND NOT TARGET Nettle::Nettle) + add_library(Nettle::Nettle UNKNOWN IMPORTED) + set_target_properties(Nettle::Nettle PROPERTIES + IMPORTED_LOCATION "${Nettle_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${PC_Nettle_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Nettle_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced( + Nettle_INCLUDE_DIR + Nettle_LIBRARY +) + +# compatibility variables +set(Nettle_VERSION_STRING ${Nettle_VERSION}) diff --git a/deps/libzip/cmake/FindZstd.cmake b/deps/libzip/cmake/FindZstd.cmake new file mode 100644 index 00000000000000..a7baa554200d21 --- /dev/null +++ b/deps/libzip/cmake/FindZstd.cmake @@ -0,0 +1,135 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindZstd +------- + +Finds the Zstandard (zstd) library. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``Zstd::Zstd`` + The Zstandard library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Zstd_FOUND`` + True if the system has the Zstandard library. +``Zstd_VERSION`` + The version of the Zstandard library which was found. +``Zstd_INCLUDE_DIRS`` + Include directories needed to use Zstandard. +``Zstd_LIBRARIES`` + Libraries needed to link to Zstandard. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Zstd_INCLUDE_DIR`` + The directory containing ``zstd.h``. +``Zstd_LIBRARY`` + The path to the Zstandard library. + +#]=======================================================================] + +find_package(PkgConfig) +pkg_check_modules(PC_Zstd QUIET zstd) + +find_path(Zstd_INCLUDE_DIR + NAMES zstd.h + PATHS ${PC_Zstd_INCLUDE_DIRS} +) +find_library(Zstd_LIBRARY + NAMES zstd + PATHS ${PC_Zstd_LIBRARY_DIRS} +) + +# Extract version information from the header file +if(Zstd_INCLUDE_DIR) + file(STRINGS ${Zstd_INCLUDE_DIR}/zstd.h _ver_major_line + REGEX "^#define ZSTD_VERSION_MAJOR *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + Zstd_MAJOR_VERSION "${_ver_major_line}") + file(STRINGS ${Zstd_INCLUDE_DIR}/zstd.h _ver_minor_line + REGEX "^#define ZSTD_VERSION_MINOR *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + Zstd_MINOR_VERSION "${_ver_minor_line}") + file(STRINGS ${Zstd_INCLUDE_DIR}/zstd.h _ver_release_line + REGEX "^#define ZSTD_VERSION_RELEASE *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + Zstd_RELEASE_VERSION "${_ver_release_line}") + set(Zstd_VERSION "${Zstd_MAJOR_VERSION}.${Zstd_MINOR_VERSION}.${Zstd_RELEASE_VERSION}") + unset(_ver_major_line) + unset(_ver_minor_line) + unset(_ver_release_line) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Zstd + FOUND_VAR Zstd_FOUND + REQUIRED_VARS + Zstd_LIBRARY + Zstd_INCLUDE_DIR + VERSION_VAR Zstd_VERSION +) + +if(Zstd_FOUND) + set(Zstd_LIBRARIES ${Zstd_LIBRARY}) + set(Zstd_INCLUDE_DIRS ${Zstd_INCLUDE_DIR}) + set(Zstd_DEFINITIONS ${PC_Zstd_CFLAGS_OTHER}) +endif() + +if(Zstd_FOUND AND NOT TARGET Zstd::Zstd) + add_library(Zstd::Zstd UNKNOWN IMPORTED) + set_target_properties(Zstd::Zstd PROPERTIES + IMPORTED_LOCATION "${Zstd_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${PC_Zstd_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Zstd_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced( + Zstd_INCLUDE_DIR + Zstd_LIBRARY +) diff --git a/deps/libzip/custom/config.h b/deps/libzip/custom/config.h new file mode 100644 index 00000000000000..e752d7c8603b56 --- /dev/null +++ b/deps/libzip/custom/config.h @@ -0,0 +1,73 @@ +#ifndef HAD_CONFIG_H +#define HAD_CONFIG_H +#ifndef _HAD_ZIPCONF_H +#include "zipconf.h" +#endif +/* BEGIN DEFINES */ +#define ENABLE_FDOPEN +/* #undef HAVE___PROGNAME */ +/* #undef HAVE__CLOSE */ +/* #undef HAVE__DUP */ +/* #undef HAVE__FDOPEN */ +/* #undef HAVE__FILENO */ +/* #undef HAVE__SETMODE */ +/* #undef HAVE__SNPRINTF */ +/* #undef HAVE__SNPRINTF_S */ +/* #undef HAVE__SNWPRINTF_S */ +/* #undef HAVE__STRDUP */ +/* #undef HAVE__STRICMP */ +/* #undef HAVE__STRTOI64 */ +/* #undef HAVE__STRTOUI64 */ +/* #undef HAVE__UMASK */ +/* #undef HAVE__UNLINK */ +#define HAVE_ARC4RANDOM +#define HAVE_CLONEFILE +/* #undef HAVE_COMMONCRYPTO */ +/* #undef HAVE_CRYPTO */ +/* #undef HAVE_FICLONERANGE */ +#define HAVE_FILENO +#define HAVE_FCHMOD +#define HAVE_FSEEKO +#define HAVE_FTELLO +#define HAVE_GETPROGNAME +/* #undef HAVE_GNUTLS */ +/* #undef HAVE_LIBBZ2 */ +/* #undef HAVE_LIBLZMA */ +/* #undef HAVE_LIBZSTD */ +#define HAVE_LOCALTIME_R +/* #undef HAVE_LOCALTIME_S */ +/* #undef HAVE_MEMCPY_S */ +/* #undef HAVE_MBEDTLS */ +/* #undef HAVE_MKSTEMP */ +#define HAVE_Lolol +/* #undef HAVE_OPENSSL */ +#define HAVE_SETMODE +#define HAVE_SNPRINTF +/* #undef HAVE_SNPRINTF_S */ +#define HAVE_STRCASECMP +#define HAVE_STRDUP +/* #undef HAVE_STRERROR_S */ +/* #undef HAVE_STRERRORLEN_S */ +/* #undef HAVE_STRICMP */ +/* #undef HAVE_STRNCPY_S */ +#define HAVE_STRTOLL +#define HAVE_STRTOULL +/* #undef HAVE_STRUCT_TM_TM_ZONE */ +#define HAVE_STDBOOL_H +#define HAVE_STRINGS_H +#define HAVE_UNISTD_H +/* #undef HAVE_WINDOWS_CRYPTO */ +#define SIZEOF_OFF_T 8 +#define SIZEOF_SIZE_T 8 +/* #undef HAVE_DIRENT_H */ +#define HAVE_FTS_H +/* #undef HAVE_NDIR_H */ +/* #undef HAVE_SYS_DIR_H */ +/* #undef HAVE_SYS_NDIR_H */ +/* #undef WORDS_BIGENDIAN */ +#define HAVE_SHARED +/* END DEFINES */ +#define PACKAGE "libzip" +#define VERSION "1.9.2" + +#endif /* HAD_CONFIG_H */ diff --git a/deps/libzip/examples/CMakeLists.txt b/deps/libzip/examples/CMakeLists.txt new file mode 100644 index 00000000000000..008323236cc7db --- /dev/null +++ b/deps/libzip/examples/CMakeLists.txt @@ -0,0 +1,5 @@ +foreach(PROGRAM add-compressed-data autoclose-archive in-memory) + add_executable(${PROGRAM} ${PROGRAM}.c) + target_link_libraries(${PROGRAM} zip) + target_include_directories(${PROGRAM} PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) +endforeach() diff --git a/deps/libzip/examples/add-compressed-data.c b/deps/libzip/examples/add-compressed-data.c new file mode 100644 index 00000000000000..432a4605b0aade --- /dev/null +++ b/deps/libzip/examples/add-compressed-data.c @@ -0,0 +1,171 @@ +/* + add-compressed-data.c -- add already compressed file to zip archive + Copyright (C) 2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + This layered source can be used to add pre-compressed data to a zip archive. + The data is taken from the lower layer source. + Metadata (uncompressed size, crc, compression method) must be provided by the caller. +*/ + +#include +#include +#include + +#include + +struct ctx { + zip_uint64_t uncompressed_size; + zip_uint32_t crc; + zip_uint32_t compression_method; +}; + +zip_int64_t callback(zip_source_t* src, void *ud, void* data, zip_uint64_t length, zip_source_cmd_t command) { + struct ctx* ctx = (struct ctx*)ud; + + switch (command) { + case ZIP_SOURCE_FREE: + /* Free our context. */ + free(ctx); + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st = (zip_stat_t *)data; + /* Fix metadata with provided values. */ + if (st->valid & ZIP_STAT_SIZE) { + st->comp_size = st->size; + st->valid |= ZIP_STAT_COMP_SIZE; + } + st->size = ctx->uncompressed_size; + st->crc = ctx->crc; + st->comp_method = ctx->compression_method; + st->valid |= ZIP_STAT_COMP_METHOD | ZIP_STAT_SIZE | ZIP_STAT_CRC; + + return 0; + } + + default: + /* For all other commands, use default implementation */ + return zip_source_pass_to_lower_layer(src, data, length, command); + } +} + +zip_source_t* create_layered_compressed_source(zip_source_t* source, zip_uint64_t uncompressed_size, zip_uint32_t crc, zip_uint32_t compression_method, zip_error_t *error) { + struct ctx* ctx = (struct ctx*)malloc(sizeof(*ctx)); + zip_source_t *compressed_source; + + /* Allocate context. */ + if (ctx == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + /* Initialize context */ + ctx->compression_method = compression_method; + ctx->uncompressed_size = uncompressed_size; + ctx->crc = crc; + + /* Create layered source using our callback and context. */ + compressed_source = zip_source_layered_create(source, callback, ctx, error); + + /* In case of error, free context. */ + if (compressed_source == NULL) { + free(ctx); + } + + return compressed_source; +} + + +/* This is the information needed to add pre-compressed data to a zip archive. data must be compressed in a format compatible with Zip (e.g. no gzip header for deflate). */ + +zip_uint16_t compression_method = ZIP_CM_DEFLATE; +zip_uint64_t uncompressed_size = 60; +zip_uint32_t crc = 0xb0354048; +zip_uint8_t data[] = { + 0x4B, 0x4C, 0x44, 0x06, 0x5C, 0x49, 0x28, 0x80, + 0x2B, 0x11, 0x55 ,0x36, 0x19, 0x05, 0x70, 0x01, + 0x00 +}; + + +int +main(int argc, char *argv[]) { + const char *archive; + zip_source_t *src, *src_comp; + zip_t *za; + int err; + + if (argc != 2) { + fprintf(stderr, "usage: %s archive\n", argv[0]); + return 1; + } + archive = argv[1]; + + if ((za = zip_open(archive, ZIP_CREATE, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", argv[0], archive, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + /* The data can come from any source. To keep the example simple, it is provided in a static buffer here. */ + if ((src = zip_source_buffer(za, data, sizeof(data), 0)) == NULL) { + fprintf(stderr, "%s: cannot create buffer source: %s\n", argv[0], zip_strerror(za)); + zip_discard(za); + exit(1); + } + + zip_error_t error; + if ((src_comp = create_layered_compressed_source(src, uncompressed_size, crc, compression_method, &error)) == NULL) { + fprintf(stderr, "%s: cannot create layered source: %s\n", argv[0], zip_error_strerror(&error)); + zip_source_free(src); + zip_discard(za); + exit(1); + } + + if ((zip_add(za, "precompressed", src_comp)) < 0) { + fprintf(stderr, "%s: cannot add precompressed file: %s\n", argv[0], zip_strerror(za)); + zip_source_free(src_comp); + zip_discard(za); + exit(1); + } + + if ((zip_close(za)) < 0) { + fprintf(stderr, "%s: cannot close archive '%s': %s\n", argv[0], archive, zip_strerror(za)); + zip_discard(za); + exit(1); + } + + exit(0); +} diff --git a/deps/libzip/examples/autoclose-archive.c b/deps/libzip/examples/autoclose-archive.c new file mode 100644 index 00000000000000..29d96c06befc02 --- /dev/null +++ b/deps/libzip/examples/autoclose-archive.c @@ -0,0 +1,160 @@ +/* + autoclose-archive.c -- automatically close archive when source is closed + Copyright (C) 2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + This example layered source takes ownership of a zip archive and discards it when the source is freed. + It can be used to add files from various zip archives without having to keep track of them yourself. +*/ + + +#include +#include +#include + +#include + +struct ctx { + zip_t* archive; +}; + +zip_int64_t callback(zip_source_t* src, void *ud, void* data, zip_uint64_t length, zip_source_cmd_t command) { + struct ctx* ctx = (struct ctx*)ud; + + switch (command) { + case ZIP_SOURCE_FREE: + /* Close zip archive we took ownership of */ + zip_discard(ctx->archive); + /* Free our own context */ + free(ctx); + return 0; + + default: + /* For all other commands, use default implementation */ + return zip_source_pass_to_lower_layer(src, data, length, command); + } +} + +zip_source_t* create_layered_autoclose(zip_source_t* source, zip_t *archive, zip_error_t *error) { + struct ctx* ctx = (struct ctx*)malloc(sizeof(*ctx)); + zip_source_t *autoclose_source; + + /* Allocate context. */ + if (ctx == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + /* Initialize context */ + ctx->archive = archive; + + /* Create layered source using our callback and context. */ + autoclose_source = zip_source_layered_create(source, callback, ctx, error); + + /* In case of error, free context. */ + if (autoclose_source == NULL) { + free(ctx); + } + + return autoclose_source; +} + + +int +main(int argc, char *argv[]) { + const char *destination_archive, *source_archive, *source_file; + zip_int64_t index; + zip_source_t *src, *src_autoclose; + zip_t *z_source, *z_destination; + int err; + + if (argc != 4) { + fprintf(stderr, "usage: %s destination-archive source-archive source-file\n", argv[0]); + return 1; + } + destination_archive = argv[1]; + source_archive = argv[2]; + source_file = argv[3]; + + + if ((z_source = zip_open(source_archive, 0, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", argv[0], source_archive, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + if ((index = zip_name_locate(z_source, source_file, 0)) < 0) { + fprintf(stderr, "%s: cannot find file '%s' in '%s': %s\n", argv[0], source_file, source_archive, zip_strerror(z_source)); + zip_discard(z_source); + exit(1); + + } + if ((src = zip_source_zip(z_source, z_source, index, 0, 0, -1)) == NULL) { + fprintf(stderr, "%s: cannot open file '%s' in '%s': %s\n", argv[0], source_file, source_archive, zip_strerror(z_source)); + zip_discard(z_source); + exit(1); + } + + zip_error_t error; + if ((src_autoclose = create_layered_autoclose(src, z_source, &error)) == NULL) { + fprintf(stderr, "%s: cannot create layered source: %s\n", argv[0], zip_error_strerror(&error)); + zip_source_free(src); + zip_discard(z_source); + exit(1); + } + + if ((z_destination = zip_open(destination_archive, ZIP_CREATE, &err)) == NULL) { + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", argv[0], destination_archive, zip_error_strerror(&error)); + zip_error_fini(&error); + zip_source_free(src_autoclose); // freeing src_autoclose closes z_source + exit(1); + } + + + if ((zip_add(z_destination, source_file, src_autoclose)) < 0) { + fprintf(stderr, "%s: cannot add file: %s\n", argv[0], zip_strerror(z_source)); + zip_source_free(src_autoclose); + zip_discard(z_destination); + exit(1); + } + + if ((zip_close(z_destination)) < 0) { + fprintf(stderr, "%s: cannot close archive '%s': %s\n", argv[0], destination_archive, zip_strerror(z_source)); + zip_discard(z_destination); + exit(1); + } + + exit(0); +} diff --git a/deps/libzip/examples/in-memory.c b/deps/libzip/examples/in-memory.c new file mode 100644 index 00000000000000..e022a0b2407de3 --- /dev/null +++ b/deps/libzip/examples/in-memory.c @@ -0,0 +1,217 @@ +/* + in-memory.c -- modify zip file in memory + Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include + +#include + +static int +get_data(void **datap, size_t *sizep, const char *archive) { + /* example implementation that reads data from file */ + struct stat st; + FILE *fp; + + if ((fp = fopen(archive, "rb")) == NULL) { + if (errno != ENOENT) { + fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno)); + return -1; + } + + *datap = NULL; + *sizep = 0; + + return 0; + } + + if (fstat(fileno(fp), &st) < 0) { + fprintf(stderr, "can't stat %s: %s\n", archive, strerror(errno)); + fclose(fp); + return -1; + } + + if ((*datap = malloc((size_t)st.st_size)) == NULL) { + fprintf(stderr, "can't allocate buffer\n"); + fclose(fp); + return -1; + } + + if (fread(*datap, 1, (size_t)st.st_size, fp) < (size_t)st.st_size) { + fprintf(stderr, "can't read %s: %s\n", archive, strerror(errno)); + free(*datap); + fclose(fp); + return -1; + } + + fclose(fp); + + *sizep = (size_t)st.st_size; + return 0; +} + +static int +modify_archive(zip_t *za) { + /* modify the archive */ + return 0; +} + + +static int +use_data(void *data, size_t size, const char *archive) { + /* example implementation that writes data to file */ + FILE *fp; + + if (data == NULL) { + if (remove(archive) < 0 && errno != ENOENT) { + fprintf(stderr, "can't remove %s: %s\n", archive, strerror(errno)); + return -1; + } + return 0; + } + + if ((fp = fopen(archive, "wb")) == NULL) { + fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno)); + return -1; + } + if (fwrite(data, 1, size, fp) < size) { + fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno)); + fclose(fp); + return -1; + } + if (fclose(fp) < 0) { + fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno)); + return -1; + } + + return 0; +} + + +int +main(int argc, char *argv[]) { + const char *archive; + zip_source_t *src; + zip_t *za; + zip_error_t error; + void *data; + size_t size; + + if (argc < 2) { + fprintf(stderr, "usage: %s archive\n", argv[0]); + return 1; + } + archive = argv[1]; + + /* get buffer with zip archive inside */ + if (get_data(&data, &size, archive) < 0) { + return 1; + } + + zip_error_init(&error); + /* create source from buffer */ + if ((src = zip_source_buffer_create(data, size, 1, &error)) == NULL) { + fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error)); + free(data); + zip_error_fini(&error); + return 1; + } + + /* open zip archive from source */ + if ((za = zip_open_from_source(src, 0, &error)) == NULL) { + fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error)); + zip_source_free(src); + zip_error_fini(&error); + return 1; + } + zip_error_fini(&error); + + /* we'll want to read the data back after zip_close */ + zip_source_keep(src); + + /* modify archive */ + modify_archive(za); + + /* close archive */ + if (zip_close(za) < 0) { + fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za)); + return 1; + } + + + /* copy new archive to buffer */ + + if (zip_source_is_deleted(src)) { + /* new archive is empty, thus no data */ + data = NULL; + } + else { + zip_stat_t zst; + + if (zip_source_stat(src, &zst) < 0) { + fprintf(stderr, "can't stat source: %s\n", zip_error_strerror(zip_source_error(src))); + return 1; + } + + size = zst.size; + + if (zip_source_open(src) < 0) { + fprintf(stderr, "can't open source: %s\n", zip_error_strerror(zip_source_error(src))); + return 1; + } + if ((data = malloc(size)) == NULL) { + fprintf(stderr, "malloc failed: %s\n", strerror(errno)); + zip_source_close(src); + return 1; + } + if ((zip_uint64_t)zip_source_read(src, data, size) < size) { + fprintf(stderr, "can't read data from source: %s\n", zip_error_strerror(zip_source_error(src))); + zip_source_close(src); + free(data); + return 1; + } + zip_source_close(src); + } + + /* we're done with src */ + zip_source_free(src); + + /* use new data */ + use_data(data, size, archive); + + free(data); + + return 0; +} diff --git a/deps/libzip/examples/windows-open.c b/deps/libzip/examples/windows-open.c new file mode 100644 index 00000000000000..67902484ef3132 --- /dev/null +++ b/deps/libzip/examples/windows-open.c @@ -0,0 +1,60 @@ +/* + windows-open.c -- open zip archive using Windows UTF-16/Unicode file name + Copyright (C) 2015-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +zip_t * +windows_open(const wchar_t *name, int flags) { + zip_source_t *src; + zip_t *za; + zip_error_t error; + + zip_error_init(&error); + /* create source from buffer */ + if ((src = zip_source_win32w_create(name, 0, -1, &error)) == NULL) { + fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error)); + zip_error_fini(&error); + return NULL; + } + + /* open zip archive from source */ + if ((za = zip_open_from_source(src, flags, &error)) == NULL) { + fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error)); + zip_source_free(src); + zip_error_fini(&error); + return NULL; + } + zip_error_fini(&error); + + return za; +} diff --git a/deps/libzip/lib/CMakeLists.txt b/deps/libzip/lib/CMakeLists.txt new file mode 100644 index 00000000000000..b4df8b0688fbf1 --- /dev/null +++ b/deps/libzip/lib/CMakeLists.txt @@ -0,0 +1,242 @@ +include(CheckFunctionExists) + +set(CMAKE_C_VISIBILITY_PRESET hidden) + +add_library(zip + zip_add.c + zip_add_dir.c + zip_add_entry.c + zip_algorithm_deflate.c + zip_buffer.c + zip_close.c + zip_delete.c + zip_dir_add.c + zip_dirent.c + zip_discard.c + zip_entry.c + zip_error.c + zip_error_clear.c + zip_error_get.c + zip_error_get_sys_type.c + zip_error_strerror.c + zip_error_to_str.c + zip_extra_field.c + zip_extra_field_api.c + zip_fclose.c + zip_fdopen.c + zip_file_add.c + zip_file_error_clear.c + zip_file_error_get.c + zip_file_get_comment.c + zip_file_get_external_attributes.c + zip_file_get_offset.c + zip_file_rename.c + zip_file_replace.c + zip_file_set_comment.c + zip_file_set_encryption.c + zip_file_set_external_attributes.c + zip_file_set_mtime.c + zip_file_strerror.c + zip_fopen.c + zip_fopen_encrypted.c + zip_fopen_index.c + zip_fopen_index_encrypted.c + zip_fread.c + zip_fseek.c + zip_ftell.c + zip_get_archive_comment.c + zip_get_archive_flag.c + zip_get_encryption_implementation.c + zip_get_file_comment.c + zip_get_name.c + zip_get_num_entries.c + zip_get_num_files.c + zip_hash.c + zip_io_util.c + zip_libzip_version.c + zip_memdup.c + zip_name_locate.c + zip_new.c + zip_open.c + zip_pkware.c + zip_progress.c + zip_rename.c + zip_replace.c + zip_set_archive_comment.c + zip_set_archive_flag.c + zip_set_default_password.c + zip_set_file_comment.c + zip_set_file_compression.c + zip_set_name.c + zip_source_accept_empty.c + zip_source_begin_write.c + zip_source_begin_write_cloning.c + zip_source_buffer.c + zip_source_call.c + zip_source_close.c + zip_source_commit_write.c + zip_source_compress.c + zip_source_crc.c + zip_source_error.c + zip_source_file_common.c + zip_source_file_stdio.c + zip_source_free.c + zip_source_function.c + zip_source_get_file_attributes.c + zip_source_is_deleted.c + zip_source_layered.c + zip_source_open.c + zip_source_pass_to_lower_layer.c + zip_source_pkware_decode.c + zip_source_pkware_encode.c + zip_source_read.c + zip_source_remove.c + zip_source_rollback_write.c + zip_source_seek.c + zip_source_seek_write.c + zip_source_stat.c + zip_source_supports.c + zip_source_tell.c + zip_source_tell_write.c + zip_source_window.c + zip_source_write.c + zip_source_zip.c + zip_source_zip_new.c + zip_stat.c + zip_stat_index.c + zip_stat_init.c + zip_strerror.c + zip_string.c + zip_unchange.c + zip_unchange_all.c + zip_unchange_archive.c + zip_unchange_data.c + zip_utf-8.c + ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c + ) +add_library(libzip::zip ALIAS zip) + +if(WIN32) + target_sources(zip PRIVATE + zip_source_file_win32.c + zip_source_file_win32_named.c + zip_source_file_win32_utf16.c + zip_source_file_win32_utf8.c + ) + if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) + target_sources(zip PRIVATE zip_random_uwp.c) + else() + target_sources(zip PRIVATE zip_source_file_win32_ansi.c zip_random_win32.c) + target_link_libraries(zip PRIVATE advapi32) + endif() +else(WIN32) + target_sources(zip PRIVATE + zip_source_file_stdio_named.c + zip_random_unix.c + ) +endif(WIN32) + +if(HAVE_LIBBZ2) + target_sources(zip PRIVATE zip_algorithm_bzip2.c) + target_link_libraries(zip PRIVATE BZip2::BZip2) +endif() + +if(HAVE_LIBLZMA) + target_sources(zip PRIVATE zip_algorithm_xz.c) + target_link_libraries(zip PRIVATE LibLZMA::LibLZMA) +endif() + +if(HAVE_LIBZSTD) + target_sources(zip PRIVATE zip_algorithm_zstd.c) + target_link_libraries(zip PRIVATE Zstd::Zstd) +endif() + +if(HAVE_COMMONCRYPTO) + target_sources(zip PRIVATE zip_crypto_commoncrypto.c) +elseif(HAVE_WINDOWS_CRYPTO) + target_sources(zip PRIVATE zip_crypto_win.c) + target_link_libraries(zip PRIVATE bcrypt) +elseif(HAVE_GNUTLS) + target_sources(zip PRIVATE zip_crypto_gnutls.c) + target_link_libraries(zip PRIVATE GnuTLS::GnuTLS Nettle::Nettle) +elseif(HAVE_OPENSSL) + target_sources(zip PRIVATE zip_crypto_openssl.c) + target_link_libraries(zip PRIVATE OpenSSL::Crypto) +elseif(HAVE_MBEDTLS) + target_sources(zip PRIVATE zip_crypto_mbedtls.c) + target_link_libraries(zip PRIVATE MbedTLS::MbedTLS) +endif() + +if(HAVE_CRYPTO) + target_sources(zip PRIVATE zip_winzip_aes.c zip_source_winzip_aes_decode.c zip_source_winzip_aes_encode.c) +endif() + +if(SHARED_LIB_VERSIONNING) + set_target_properties(zip PROPERTIES VERSION 5.5 SOVERSION 5) +endif() + +target_link_libraries(zip PRIVATE ZLIB::ZLIB) +target_include_directories(zip + PUBLIC + $ + $ + $ + ) + +if(LIBZIP_DO_INSTALL) + install(TARGETS zip + EXPORT ${PROJECT_NAME}-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(FILES zip.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif() + +# create zip_err_str.h from zip.h +file(READ ${PROJECT_SOURCE_DIR}/lib/zip.h zip_h) +string(REGEX MATCHALL "#define ZIP_ER_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" zip_h_err ${zip_h}) +file(READ ${PROJECT_SOURCE_DIR}/lib/zipint.h zipint_h) +string(REGEX MATCHALL "#define ZIP_ER_DETAIL_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" zipint_h_err ${zipint_h}) +set(zip_err_str [=[ +/* + This file was generated automatically by CMake + from zip.h and zipint.h\; make changes there. +*/ + +#include "zipint.h" + +#define L ZIP_ET_LIBZIP +#define N ZIP_ET_NONE +#define S ZIP_ET_SYS +#define Z ZIP_ET_ZLIB + +#define E ZIP_DETAIL_ET_ENTRY +#define G ZIP_DETAIL_ET_GLOBAL + +const struct _zip_err_info _zip_err_str[] = { +]=]) +set(zip_err_type) +foreach(errln ${zip_h_err}) + string(REGEX MATCH "#define ZIP_ER_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln}) + string(REGEX MATCH "([L|N|S|Z]+) ([-0-9a-zA-Z,, ']*)" err_t_tt "${CMAKE_MATCH_3}") + string(STRIP "${CMAKE_MATCH_2}" err_t_tt) + string(APPEND zip_err_str " { ${CMAKE_MATCH_1}, \"${err_t_tt}\" },\n") +endforeach() +string(APPEND zip_err_str [=[}\; + +const int _zip_err_str_count = sizeof(_zip_err_str)/sizeof(_zip_err_str[0])\; + +const struct _zip_err_info _zip_err_details[] = { +]=]) +foreach(errln ${zipint_h_err}) + string(REGEX MATCH "#define ZIP_ER_DETAIL_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln}) + string(REGEX MATCH "([E|G]+) ([-0-9a-zA-Z, ']*)" err_t_tt "${CMAKE_MATCH_3}") + string(STRIP "${CMAKE_MATCH_2}" err_t_tt) + string(APPEND zip_err_str " { ${CMAKE_MATCH_1}, \"${err_t_tt}\" },\n") +endforeach() +string(APPEND zip_err_str [=[}\; + +const int _zip_err_details_count = sizeof(_zip_err_details)/sizeof(_zip_err_details[0])\; +]=]) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c ${zip_err_str}) diff --git a/deps/libzip/lib/compat.h b/deps/libzip/lib/compat.h new file mode 100644 index 00000000000000..384a611ff6a336 --- /dev/null +++ b/deps/libzip/lib/compat.h @@ -0,0 +1,240 @@ +#ifndef _HAD_LIBZIP_COMPAT_H +#define _HAD_LIBZIP_COMPAT_H + +/* + compat.h -- compatibility defines. + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipconf.h" + +#include "config.h" + +/* to have *_MAX definitions for all types when compiling with g++ */ +#define __STDC_LIMIT_MACROS + +/* to have ISO C secure library functions */ +#define __STDC_WANT_LIB_EXT1__ 1 + +#ifdef _WIN32 +#ifndef ZIP_EXTERN +#ifndef ZIP_STATIC +#define ZIP_EXTERN __declspec(dllexport) +#endif +#endif +/* for dup(), close(), etc. */ +#include +#endif + +#ifdef HAVE_STDBOOL_H +#include +#else +typedef char bool; +#define true 1 +#define false 0 +#endif + +#include + +/* at least MinGW does not provide EOPNOTSUPP, see + * http://sourceforge.net/p/mingw/bugs/263/ + */ +#ifndef EOPNOTSUPP +#define EOPNOTSUPP EINVAL +#endif + +/* at least MinGW does not provide EOVERFLOW, see + * http://sourceforge.net/p/mingw/bugs/242/ + */ +#ifndef EOVERFLOW +#define EOVERFLOW EFBIG +#endif + +/* not supported on at least Windows */ +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +#ifdef _WIN32 +#if defined(HAVE__CLOSE) +#define close _close +#endif +#if defined(HAVE__DUP) +#define dup _dup +#endif +/* crashes reported when using fdopen instead of _fdopen on Windows/Visual Studio 10/Win64 */ +#if defined(HAVE__FDOPEN) +#define fdopen _fdopen +#endif +#if !defined(HAVE_FILENO) && defined(HAVE__FILENO) +#define fileno _fileno +#endif +#if !defined(HAVE_SNPRINTF) && defined(HAVE__SNPRINTF) +#define snprintf _snprintf +#endif +#if !defined(HAVE__SNWPRINTF_S) +#define _snwprintf_s(buf, bufsz, len, fmt, ...) (_snwprintf((buf), (len), (fmt), __VA_ARGS__)) +#endif +#if defined(HAVE__STRDUP) +#if !defined(HAVE_STRDUP) || defined(_WIN32) +#undef strdup +#define strdup _strdup +#endif +#endif +#if !defined(HAVE__SETMODE) && defined(HAVE_SETMODE) +#define _setmode setmode +#endif +#if !defined(HAVE_STRTOLL) && defined(HAVE__STRTOI64) +#define strtoll _strtoi64 +#endif +#if !defined(HAVE_STRTOULL) && defined(HAVE__STRTOUI64) +#define strtoull _strtoui64 +#endif +#if defined(HAVE__UNLINK) +#define unlink _unlink +#endif +#endif + +#ifndef HAVE_FSEEKO +#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) +#endif + +#ifndef HAVE_FTELLO +#define ftello(s) ((long)ftell((s))) +#endif + +#ifdef HAVE_LOCALTIME_S +#ifdef _WIN32 +/* Windows is incompatible to the C11 standard, hurray! */ +#define zip_localtime(t, tm) (localtime_s((tm), (t)) == 0 ? tm : NULL) +#else +#define zip_localtime localtime_s +#endif +#else +#ifdef HAVE_LOCALTIME_R +#define zip_localtime localtime_r +#else +#define zip_localtime(t, tm) (localtime(t)) +#endif +#endif + +#ifndef HAVE_MEMCPY_S +#define memcpy_s(dest, destsz, src, count) (memcpy((dest), (src), (count)) == NULL) +#endif + +#ifndef HAVE_SNPRINTF_S +#ifdef HAVE__SNPRINTF_S +#define snprintf_s(buf, bufsz, fmt, ...) (_snprintf_s((buf), (bufsz), (bufsz), (fmt), __VA_ARGS__)) +#else +#define snprintf_s snprintf +#endif +#endif + +#if !defined(HAVE_STRCASECMP) +#if defined(HAVE__STRICMP) +#define strcasecmp _stricmp +#elif defined(HAVE_STRICMP) +#define strcasecmp stricmp +#endif +#endif + +#ifndef HAVE_STRNCPY_S +#define strncpy_s(dest, destsz, src, count) (strncpy((dest), (src), (count)), 0) +#endif + +#ifndef HAVE_STRERROR_S +#define strerrorlen_s(errnum) (strlen(strerror(errnum))) +#define strerror_s(buf, bufsz, errnum) ((void)strncpy_s((buf), (bufsz), strerror(errnum), (bufsz)), (buf)[(bufsz)-1] = '\0', strerrorlen_s(errnum) >= (bufsz)) +#else +#ifndef HAVE_STRERRORLEN_S +#define strerrorlen_s(errnum) 8192 +#endif +#endif + +#if SIZEOF_OFF_T == 8 +#define ZIP_OFF_MAX ZIP_INT64_MAX +#define ZIP_OFF_MIN ZIP_INT64_MIN +#elif SIZEOF_OFF_T == 4 +#define ZIP_OFF_MAX ZIP_INT32_MAX +#define ZIP_OFF_MIN ZIP_INT32_MIN +#elif SIZEOF_OFF_T == 2 +#define ZIP_OFF_MAX ZIP_INT16_MAX +#define ZIP_OFF_MIN ZIP_INT16_MIN +#else +#error unsupported size of off_t +#endif + +#if defined(HAVE_FTELLO) && defined(HAVE_FSEEKO) +#define ZIP_FSEEK_MAX ZIP_OFF_MAX +#define ZIP_FSEEK_MIN ZIP_OFF_MIN +#else +#include +#define ZIP_FSEEK_MAX LONG_MAX +#define ZIP_FSEEK_MIN LONG_MIN +#endif + +#ifndef SIZE_MAX +#if SIZEOF_SIZE_T == 8 +#define SIZE_MAX ZIP_INT64_MAX +#elif SIZEOF_SIZE_T == 4 +#define SIZE_MAX ZIP_INT32_MAX +#elif SIZEOF_SIZE_T == 2 +#define SIZE_MAX ZIP_INT16_MAX +#else +#error unsupported size of size_t +#endif +#endif + +#ifndef PRId64 +#ifdef _MSC_VER +#define PRId64 "I64d" +#else +#define PRId64 "lld" +#endif +#endif + +#ifndef PRIu64 +#ifdef _MSC_VER +#define PRIu64 "I64u" +#else +#define PRIu64 "llu" +#endif +#endif + +#ifndef S_ISDIR +#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISREG +#define S_ISREG(mode) (((mode)&S_IFMT) == S_IFREG) +#endif + +#endif /* compat.h */ diff --git a/deps/libzip/lib/config.h b/deps/libzip/lib/config.h new file mode 100644 index 00000000000000..f31e2e9dd3a101 --- /dev/null +++ b/deps/libzip/lib/config.h @@ -0,0 +1,73 @@ +#ifndef HAD_CONFIG_H +#define HAD_CONFIG_H +#ifndef _HAD_ZIPCONF_H +#include "zipconf.h" +#endif +/* BEGIN DEFINES */ +/* #undef ENABLE_FDOPEN */ +/* #undef HAVE___PROGNAME */ +/* #undef HAVE__CLOSE */ +/* #undef HAVE__DUP */ +/* #undef HAVE__FDOPEN */ +/* #undef HAVE__FILENO */ +/* #undef HAVE__SETMODE */ +/* #undef HAVE__SNPRINTF */ +/* #undef HAVE__SNPRINTF_S */ +/* #undef HAVE__SNWPRINTF_S */ +/* #undef HAVE__STRDUP */ +/* #undef HAVE__STRICMP */ +/* #undef HAVE__STRTOI64 */ +/* #undef HAVE__STRTOUI64 */ +/* #undef HAVE__UMASK */ +/* #undef HAVE__UNLINK */ +#define HAVE_ARC4RANDOM +/* #undef HAVE_CLONEFILE */ +/* #undef HAVE_COMMONCRYPTO */ +/* #undef HAVE_CRYPTO */ +/* #undef HAVE_FICLONERANGE */ +/* #undef HAVE_FILENO */ +/* #undef HAVE_FCHMOD */ +#define HAVE_FSEEKO +#define HAVE_FTELLO +/* #undef HAVE_GETPROGNAME */ +/* #undef HAVE_GNUTLS */ +/* #undef HAVE_LIBBZ2 */ +/* #undef HAVE_LIBLZMA */ +/* #undef HAVE_LIBZSTD */ +/* #undef HAVE_LOCALTIME_R */ +/* #undef HAVE_LOCALTIME_S */ +/* #undef HAVE_MEMCPY_S */ +/* #undef HAVE_MBEDTLS */ +/* #undef HAVE_MKSTEMP */ +/* #undef HAVE_NULLABLE */ +/* #undef HAVE_OPENSSL */ +/* #undef HAVE_SETMODE */ +#define HAVE_SNPRINTF +/* #undef HAVE_SNPRINTF_S */ +#define HAVE_STRCASECMP +#define HAVE_STRDUP +/* #undef HAVE_STRERROR_S */ +/* #undef HAVE_STRERRORLEN_S */ +/* #undef HAVE_STRICMP */ +/* #undef HAVE_STRNCPY_S */ +#define HAVE_STRTOLL +#define HAVE_STRTOULL +/* #undef HAVE_STRUCT_TM_TM_ZONE */ +#define HAVE_STDBOOL_H +#define HAVE_STRINGS_H +#define HAVE_UNISTD_H +/* #undef HAVE_WINDOWS_CRYPTO */ +#define SIZEOF_OFF_T 8 +#define SIZEOF_SIZE_T 8 +/* #undef HAVE_DIRENT_H */ +/* #undef HAVE_FTS_H */ +/* #undef HAVE_NDIR_H */ +/* #undef HAVE_SYS_DIR_H */ +/* #undef HAVE_SYS_NDIR_H */ +/* #undef WORDS_BIGENDIAN */ +/* #undef HAVE_SHARED */ +/* END DEFINES */ +#define PACKAGE "libzip" +#define VERSION "1.9.2" + +#endif /* HAD_CONFIG_H */ diff --git a/deps/libzip/lib/zip.h b/deps/libzip/lib/zip.h new file mode 100644 index 00000000000000..a4c4d201d9521b --- /dev/null +++ b/deps/libzip/lib/zip.h @@ -0,0 +1,494 @@ +#ifndef _HAD_ZIP_H +#define _HAD_ZIP_H + +/* + zip.h -- exported declarations. + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* fix autoindent */ +#endif +#endif + +#include + +#ifndef ZIP_EXTERN +#ifndef ZIP_STATIC +#ifdef _WIN32 +#define ZIP_EXTERN __declspec(dllimport) +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ZIP_EXTERN __attribute__((visibility("default"))) +#else +#define ZIP_EXTERN +#endif +#else +#define ZIP_EXTERN +#endif +#endif + +#include +#include +#include + +/* flags for zip_open */ + +#define ZIP_CREATE 1 +#define ZIP_EXCL 2 +#define ZIP_CHECKCONS 4 +#define ZIP_TRUNCATE 8 +#define ZIP_RDONLY 16 + + +/* flags for zip_name_locate, zip_fopen, zip_stat, ... */ + +#define ZIP_FL_NOCASE 1u /* ignore case on name lookup */ +#define ZIP_FL_NODIR 2u /* ignore directory component */ +#define ZIP_FL_COMPRESSED 4u /* read compressed data */ +#define ZIP_FL_UNCHANGED 8u /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */ +#define ZIP_FL_ENCRYPTED 32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */ +#define ZIP_FL_ENC_GUESS 0u /* guess string encoding (is default) */ +#define ZIP_FL_ENC_RAW 64u /* get unmodified string */ +#define ZIP_FL_ENC_STRICT 128u /* follow specification strictly */ +#define ZIP_FL_LOCAL 256u /* in local header */ +#define ZIP_FL_CENTRAL 512u /* in central directory */ +/* 1024u reserved for internal use */ +#define ZIP_FL_ENC_UTF_8 2048u /* string is UTF-8 encoded */ +#define ZIP_FL_ENC_CP437 4096u /* string is CP437 encoded */ +#define ZIP_FL_OVERWRITE 8192u /* zip_file_add: if file with name exists, overwrite (replace) it */ + +/* archive global flags flags */ + +#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */ + + +/* create a new extra field */ + +#define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX +#define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX + + +/* libzip error codes */ + +#define ZIP_ER_OK 0 /* N No error */ +#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */ +#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */ +#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */ +#define ZIP_ER_SEEK 4 /* S Seek error */ +#define ZIP_ER_READ 5 /* S Read error */ +#define ZIP_ER_WRITE 6 /* S Write error */ +#define ZIP_ER_CRC 7 /* N CRC error */ +#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */ +#define ZIP_ER_NOENT 9 /* N No such file */ +#define ZIP_ER_EXISTS 10 /* N File already exists */ +#define ZIP_ER_OPEN 11 /* S Can't open file */ +#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */ +#define ZIP_ER_ZLIB 13 /* Z Zlib error */ +#define ZIP_ER_MEMORY 14 /* N Malloc failure */ +#define ZIP_ER_CHANGED 15 /* N Entry has been changed */ +#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */ +#define ZIP_ER_EOF 17 /* N Premature end of file */ +#define ZIP_ER_INVAL 18 /* N Invalid argument */ +#define ZIP_ER_NOZIP 19 /* N Not a zip archive */ +#define ZIP_ER_INTERNAL 20 /* N Internal error */ +#define ZIP_ER_INCONS 21 /* L Zip archive inconsistent */ +#define ZIP_ER_REMOVE 22 /* S Can't remove file */ +#define ZIP_ER_DELETED 23 /* N Entry has been deleted */ +#define ZIP_ER_ENCRNOTSUPP 24 /* N Encryption method not supported */ +#define ZIP_ER_RDONLY 25 /* N Read-only archive */ +#define ZIP_ER_NOPASSWD 26 /* N No password provided */ +#define ZIP_ER_WRONGPASSWD 27 /* N Wrong password provided */ +#define ZIP_ER_OPNOTSUPP 28 /* N Operation not supported */ +#define ZIP_ER_INUSE 29 /* N Resource still in use */ +#define ZIP_ER_TELL 30 /* S Tell error */ +#define ZIP_ER_COMPRESSED_DATA 31 /* N Compressed data invalid */ +#define ZIP_ER_CANCELLED 32 /* N Operation cancelled */ +#define ZIP_ER_DATA_LENGTH 33 /* N Unexpected length of data */ + +/* type of system error value */ + +#define ZIP_ET_NONE 0 /* sys_err unused */ +#define ZIP_ET_SYS 1 /* sys_err is errno */ +#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ +#define ZIP_ET_LIBZIP 3 /* sys_err is libzip error code */ + +/* compression methods */ + +#define ZIP_CM_DEFAULT -1 /* better of deflate or store */ +#define ZIP_CM_STORE 0 /* stored (uncompressed) */ +#define ZIP_CM_SHRINK 1 /* shrunk */ +#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */ +#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */ +#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */ +#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */ +#define ZIP_CM_IMPLODE 6 /* imploded */ +/* 7 - Reserved for Tokenizing compression algorithm */ +#define ZIP_CM_DEFLATE 8 /* deflated */ +#define ZIP_CM_DEFLATE64 9 /* deflate64 */ +#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ +/* 11 - Reserved by PKWARE */ +#define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */ +/* 13 - Reserved by PKWARE */ +#define ZIP_CM_LZMA 14 /* LZMA (EFS) */ +/* 15-17 - Reserved by PKWARE */ +#define ZIP_CM_TERSE 18 /* compressed using IBM TERSE (new) */ +#define ZIP_CM_LZ77 19 /* IBM LZ77 z Architecture (PFS) */ +/* 20 - old value for Zstandard */ +#define ZIP_CM_LZMA2 33 +#define ZIP_CM_ZSTD 93 /* Zstandard compressed data */ +#define ZIP_CM_XZ 95 /* XZ compressed data */ +#define ZIP_CM_JPEG 96 /* Compressed Jpeg data */ +#define ZIP_CM_WAVPACK 97 /* WavPack compressed data */ +#define ZIP_CM_PPMD 98 /* PPMd version I, Rev 1 */ + +/* encryption methods */ + +#define ZIP_EM_NONE 0 /* not encrypted */ +#define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */ +#if 0 /* Strong Encryption Header not parsed yet */ +#define ZIP_EM_DES 0x6601 /* strong encryption: DES */ +#define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */ +#define ZIP_EM_3DES_168 0x6603 +#define ZIP_EM_3DES_112 0x6609 +#define ZIP_EM_PKZIP_AES_128 0x660e +#define ZIP_EM_PKZIP_AES_192 0x660f +#define ZIP_EM_PKZIP_AES_256 0x6610 +#define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */ +#define ZIP_EM_RC4 0x6801 +#endif +#define ZIP_EM_AES_128 0x0101 /* Winzip AES encryption */ +#define ZIP_EM_AES_192 0x0102 +#define ZIP_EM_AES_256 0x0103 +#define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */ + +#define ZIP_OPSYS_DOS 0x00u +#define ZIP_OPSYS_AMIGA 0x01u +#define ZIP_OPSYS_OPENVMS 0x02u +#define ZIP_OPSYS_UNIX 0x03u +#define ZIP_OPSYS_VM_CMS 0x04u +#define ZIP_OPSYS_ATARI_ST 0x05u +#define ZIP_OPSYS_OS_2 0x06u +#define ZIP_OPSYS_MACINTOSH 0x07u +#define ZIP_OPSYS_Z_SYSTEM 0x08u +#define ZIP_OPSYS_CPM 0x09u +#define ZIP_OPSYS_WINDOWS_NTFS 0x0au +#define ZIP_OPSYS_MVS 0x0bu +#define ZIP_OPSYS_VSE 0x0cu +#define ZIP_OPSYS_ACORN_RISC 0x0du +#define ZIP_OPSYS_VFAT 0x0eu +#define ZIP_OPSYS_ALTERNATE_MVS 0x0fu +#define ZIP_OPSYS_BEOS 0x10u +#define ZIP_OPSYS_TANDEM 0x11u +#define ZIP_OPSYS_OS_400 0x12u +#define ZIP_OPSYS_OS_X 0x13u + +#define ZIP_OPSYS_DEFAULT ZIP_OPSYS_UNIX + + +enum zip_source_cmd { + ZIP_SOURCE_OPEN, /* prepare for reading */ + ZIP_SOURCE_READ, /* read data */ + ZIP_SOURCE_CLOSE, /* reading is done */ + ZIP_SOURCE_STAT, /* get meta information */ + ZIP_SOURCE_ERROR, /* get error information */ + ZIP_SOURCE_FREE, /* cleanup and free resources */ + ZIP_SOURCE_SEEK, /* set position for reading */ + ZIP_SOURCE_TELL, /* get read position */ + ZIP_SOURCE_BEGIN_WRITE, /* prepare for writing */ + ZIP_SOURCE_COMMIT_WRITE, /* writing is done */ + ZIP_SOURCE_ROLLBACK_WRITE, /* discard written changes */ + ZIP_SOURCE_WRITE, /* write data */ + ZIP_SOURCE_SEEK_WRITE, /* set position for writing */ + ZIP_SOURCE_TELL_WRITE, /* get write position */ + ZIP_SOURCE_SUPPORTS, /* check whether source supports command */ + ZIP_SOURCE_REMOVE, /* remove file */ + ZIP_SOURCE_RESERVED_1, /* previously used internally */ + ZIP_SOURCE_BEGIN_WRITE_CLONING, /* like ZIP_SOURCE_BEGIN_WRITE, but keep part of original file */ + ZIP_SOURCE_ACCEPT_EMPTY, /* whether empty files are valid archives */ + ZIP_SOURCE_GET_FILE_ATTRIBUTES, /* get additional file attributes */ + ZIP_SOURCE_SUPPORTS_REOPEN /* allow reading from changed entry */ +}; +typedef enum zip_source_cmd zip_source_cmd_t; + +#define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd) (((zip_int64_t)1) << (cmd)) + +#define ZIP_SOURCE_CHECK_SUPPORTED(supported, cmd) (((supported) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd)) != 0) + +/* clang-format off */ + +#define ZIP_SOURCE_SUPPORTS_READABLE (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_OPEN) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_READ) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_CLOSE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_STAT) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ERROR) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_FREE)) + +#define ZIP_SOURCE_SUPPORTS_SEEKABLE (ZIP_SOURCE_SUPPORTS_READABLE \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS)) + +#define ZIP_SOURCE_SUPPORTS_WRITABLE (ZIP_SOURCE_SUPPORTS_SEEKABLE \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_COMMIT_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ROLLBACK_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_REMOVE)) + +/* clang-format on */ + +/* for use by sources */ +struct zip_source_args_seek { + zip_int64_t offset; + int whence; +}; + +typedef struct zip_source_args_seek zip_source_args_seek_t; +#define ZIP_SOURCE_GET_ARGS(type, data, len, error) ((len) < sizeof(type) ? zip_error_set((error), ZIP_ER_INVAL, 0), (type *)NULL : (type *)(data)) + + +/* error information */ +/* use zip_error_*() to access */ +struct zip_error { + int zip_err; /* libzip error code (ZIP_ER_*) */ + int sys_err; /* copy of errno (E*) or zlib error code */ + char *_Nullable str; /* string representation or NULL */ +}; + +#define ZIP_STAT_NAME 0x0001u +#define ZIP_STAT_INDEX 0x0002u +#define ZIP_STAT_SIZE 0x0004u +#define ZIP_STAT_COMP_SIZE 0x0008u +#define ZIP_STAT_MTIME 0x0010u +#define ZIP_STAT_CRC 0x0020u +#define ZIP_STAT_COMP_METHOD 0x0040u +#define ZIP_STAT_ENCRYPTION_METHOD 0x0080u +#define ZIP_STAT_FLAGS 0x0100u + +struct zip_stat { + zip_uint64_t valid; /* which fields have valid values */ + const char *_Nullable name; /* name of the file */ + zip_uint64_t index; /* index within archive */ + zip_uint64_t size; /* size of file (uncompressed) */ + zip_uint64_t comp_size; /* size of file (compressed) */ + time_t mtime; /* modification time */ + zip_uint32_t crc; /* crc of file data */ + zip_uint16_t comp_method; /* compression method used */ + zip_uint16_t encryption_method; /* encryption method used */ + zip_uint32_t flags; /* reserved for future use */ +}; + +struct zip_buffer_fragment { + zip_uint8_t *_Nonnull data; + zip_uint64_t length; +}; + +struct zip_file_attributes { + zip_uint64_t valid; /* which fields have valid values */ + zip_uint8_t version; /* version of this struct, currently 1 */ + zip_uint8_t host_system; /* host system on which file was created */ + zip_uint8_t ascii; /* flag whether file is ASCII text */ + zip_uint8_t version_needed; /* minimum version needed to extract file */ + zip_uint32_t external_file_attributes; /* external file attributes (host-system specific) */ + zip_uint16_t general_purpose_bit_flags; /* general purpose big flags, only some bits are honored */ + zip_uint16_t general_purpose_bit_mask; /* which bits in general_purpose_bit_flags are valid */ +}; + +#define ZIP_FILE_ATTRIBUTES_HOST_SYSTEM 0x0001u +#define ZIP_FILE_ATTRIBUTES_ASCII 0x0002u +#define ZIP_FILE_ATTRIBUTES_VERSION_NEEDED 0x0004u +#define ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES 0x0008u +#define ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS 0x0010u + +struct zip; +struct zip_file; +struct zip_source; + +typedef struct zip zip_t; +typedef struct zip_error zip_error_t; +typedef struct zip_file zip_file_t; +typedef struct zip_file_attributes zip_file_attributes_t; +typedef struct zip_source zip_source_t; +typedef struct zip_stat zip_stat_t; +typedef struct zip_buffer_fragment zip_buffer_fragment_t; + +typedef zip_uint32_t zip_flags_t; + +typedef zip_int64_t (*zip_source_callback)(void *_Nullable, void *_Nullable, zip_uint64_t, zip_source_cmd_t); +typedef zip_int64_t (*zip_source_layered_callback)(zip_source_t *_Nonnull, void *_Nullable, void *_Nullable, zip_uint64_t, enum zip_source_cmd); +typedef void (*zip_progress_callback)(zip_t *_Nonnull, double, void *_Nullable); +typedef int (*zip_cancel_callback)(zip_t *_Nonnull, void *_Nullable); + +#ifndef ZIP_DISABLE_DEPRECATED +typedef void (*zip_progress_callback_t)(double); +ZIP_EXTERN void zip_register_progress_callback(zip_t *_Nonnull, zip_progress_callback_t _Nullable); /* use zip_register_progress_callback_with_state */ + +ZIP_EXTERN zip_int64_t zip_add(zip_t *_Nonnull, const char *_Nonnull, zip_source_t *_Nonnull); /* use zip_file_add */ +ZIP_EXTERN zip_int64_t zip_add_dir(zip_t *_Nonnull, const char *_Nonnull); /* use zip_dir_add */ +ZIP_EXTERN const char *_Nullable zip_get_file_comment(zip_t *_Nonnull, zip_uint64_t, int *_Nullable, int); /* use zip_file_get_comment */ +ZIP_EXTERN int zip_get_num_files(zip_t *_Nonnull); /* use zip_get_num_entries instead */ +ZIP_EXTERN int zip_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull); /* use zip_file_rename */ +ZIP_EXTERN int zip_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull); /* use zip_file_replace */ +ZIP_EXTERN int zip_set_file_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, int); /* use zip_file_set_comment */ +ZIP_EXTERN int zip_error_get_sys_type(int); /* use zip_error_system_type */ +ZIP_EXTERN void zip_error_get(zip_t *_Nonnull, int *_Nullable, int *_Nullable); /* use zip_get_error, zip_error_code_zip / zip_error_code_system */ +ZIP_EXTERN int zip_error_to_str(char *_Nonnull, zip_uint64_t, int, int); /* use zip_error_init_with_code / zip_error_strerror */ +ZIP_EXTERN void zip_file_error_get(zip_file_t *_Nonnull, int *_Nullable, int *_Nullable); /* use zip_file_get_error, zip_error_code_zip / zip_error_code_system */ +#endif + +ZIP_EXTERN int zip_close(zip_t *_Nonnull); +ZIP_EXTERN int zip_delete(zip_t *_Nonnull, zip_uint64_t); +ZIP_EXTERN zip_int64_t zip_dir_add(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN void zip_discard(zip_t *_Nonnull); + +ZIP_EXTERN zip_error_t *_Nonnull zip_get_error(zip_t *_Nonnull); +ZIP_EXTERN void zip_error_clear(zip_t *_Nonnull); +ZIP_EXTERN int zip_error_code_zip(const zip_error_t *_Nonnull); +ZIP_EXTERN int zip_error_code_system(const zip_error_t *_Nonnull); +ZIP_EXTERN void zip_error_fini(zip_error_t *_Nonnull); +ZIP_EXTERN void zip_error_init(zip_error_t *_Nonnull); +ZIP_EXTERN void zip_error_init_with_code(zip_error_t *_Nonnull, int); +ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int); +ZIP_EXTERN void zip_error_set_from_source(zip_error_t *_Nonnull, zip_source_t *_Nullable); +ZIP_EXTERN const char *_Nonnull zip_error_strerror(zip_error_t *_Nonnull); +ZIP_EXTERN int zip_error_system_type(const zip_error_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_error_to_data(const zip_error_t *_Nonnull, void *_Nonnull, zip_uint64_t); + +ZIP_EXTERN int zip_fclose(zip_file_t *_Nonnull); +ZIP_EXTERN zip_t *_Nullable zip_fdopen(int, int, int *_Nullable); +ZIP_EXTERN zip_int64_t zip_file_add(zip_t *_Nonnull, const char *_Nonnull, zip_source_t *_Nonnull, zip_flags_t); +ZIP_EXTERN void zip_file_attributes_init(zip_file_attributes_t *_Nonnull); +ZIP_EXTERN void zip_file_error_clear(zip_file_t *_Nonnull); +ZIP_EXTERN int zip_file_extra_field_delete(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_extra_field_delete_by_id(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_extra_field_set(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *_Nullable, zip_uint16_t, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(zip_t *_Nonnull, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *_Nullable zip_file_extra_field_get(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t *_Nullable, zip_uint16_t *_Nullable, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *_Nullable zip_file_extra_field_get_by_id(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *_Nullable, zip_flags_t); +ZIP_EXTERN const char *_Nullable zip_file_get_comment(zip_t *_Nonnull, zip_uint64_t, zip_uint32_t *_Nullable, zip_flags_t); +ZIP_EXTERN zip_error_t *_Nonnull zip_file_get_error(zip_file_t *_Nonnull); +ZIP_EXTERN int zip_file_get_external_attributes(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t *_Nullable, zip_uint32_t *_Nullable); +ZIP_EXTERN int zip_file_is_seekable(zip_file_t *_Nonnull); +ZIP_EXTERN int zip_file_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN int zip_file_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull, zip_flags_t); +ZIP_EXTERN int zip_file_set_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_set_dostime(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_set_encryption(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, const char *_Nullable); +ZIP_EXTERN int zip_file_set_external_attributes(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t, zip_uint32_t); +ZIP_EXTERN int zip_file_set_mtime(zip_t *_Nonnull, zip_uint64_t, time_t, zip_flags_t); +ZIP_EXTERN const char *_Nonnull zip_file_strerror(zip_file_t *_Nonnull); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen_encrypted(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t, const char *_Nullable); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen_index(zip_t *_Nonnull, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen_index_encrypted(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, const char *_Nullable); +ZIP_EXTERN zip_int64_t zip_fread(zip_file_t *_Nonnull, void *_Nonnull, zip_uint64_t); +ZIP_EXTERN zip_int8_t zip_fseek(zip_file_t *_Nonnull, zip_int64_t, int); +ZIP_EXTERN zip_int64_t zip_ftell(zip_file_t *_Nonnull); +ZIP_EXTERN const char *_Nullable zip_get_archive_comment(zip_t *_Nonnull, int *_Nullable, zip_flags_t); +ZIP_EXTERN int zip_get_archive_flag(zip_t *_Nonnull, zip_flags_t, zip_flags_t); +ZIP_EXTERN const char *_Nullable zip_get_name(zip_t *_Nonnull, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_get_num_entries(zip_t *_Nonnull, zip_flags_t); +ZIP_EXTERN const char *_Nonnull zip_libzip_version(void); +ZIP_EXTERN zip_int64_t zip_name_locate(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN zip_t *_Nullable zip_open(const char *_Nonnull, int, int *_Nullable); +ZIP_EXTERN zip_t *_Nullable zip_open_from_source(zip_source_t *_Nonnull, int, zip_error_t *_Nullable); +ZIP_EXTERN int zip_register_progress_callback_with_state(zip_t *_Nonnull, double, zip_progress_callback _Nullable, void (*_Nullable)(void *_Nullable), void *_Nullable); +ZIP_EXTERN int zip_register_cancel_callback_with_state(zip_t *_Nonnull, zip_cancel_callback _Nullable, void (*_Nullable)(void *_Nullable), void *_Nullable); +ZIP_EXTERN int zip_set_archive_comment(zip_t *_Nonnull, const char *_Nullable, zip_uint16_t); +ZIP_EXTERN int zip_set_archive_flag(zip_t *_Nonnull, zip_flags_t, int); +ZIP_EXTERN int zip_set_default_password(zip_t *_Nonnull, const char *_Nullable); +ZIP_EXTERN int zip_set_file_compression(zip_t *_Nonnull, zip_uint64_t, zip_int32_t, zip_uint32_t); +ZIP_EXTERN int zip_source_begin_write(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_begin_write_cloning(zip_source_t *_Nonnull, zip_uint64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer(zip_t *_Nonnull, const void *_Nullable, zip_uint64_t, int); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer_create(const void *_Nullable, zip_uint64_t, int, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer_fragment(zip_t *_Nonnull, const zip_buffer_fragment_t *_Nonnull, zip_uint64_t, int); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer_fragment_create(const zip_buffer_fragment_t *_Nullable, zip_uint64_t, int, zip_error_t *_Nullable); +ZIP_EXTERN int zip_source_close(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_commit_write(zip_source_t *_Nonnull); +ZIP_EXTERN zip_error_t *_Nonnull zip_source_error(zip_source_t *_Nonnull); +ZIP_EXTERN zip_source_t *_Nullable zip_source_file(zip_t *_Nonnull, const char *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_file_create(const char *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_filep(zip_t *_Nonnull, FILE *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_filep_create(FILE *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN void zip_source_free(zip_source_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_function(zip_t *_Nonnull, zip_source_callback _Nonnull, void *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_function_create(zip_source_callback _Nonnull, void *_Nullable, zip_error_t *_Nullable); +ZIP_EXTERN int zip_source_get_file_attributes(zip_source_t *_Nonnull, zip_file_attributes_t *_Nonnull); +ZIP_EXTERN int zip_source_is_deleted(zip_source_t *_Nonnull); +ZIP_EXTERN void zip_source_keep(zip_source_t *_Nonnull); +ZIP_EXTERN zip_source_t *_Nullable zip_source_layered(zip_t *_Nullable, zip_source_t *_Nonnull, zip_source_layered_callback _Nonnull, void *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_layered_create(zip_source_t *_Nonnull, zip_source_layered_callback _Nonnull, void *_Nullable, zip_error_t *_Nullable); +ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t, ...); +ZIP_EXTERN int zip_source_open(zip_source_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_pass_to_lower_layer(zip_source_t *_Nonnull, void *_Nullable, zip_uint64_t, zip_source_cmd_t); +ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t *_Nonnull, void *_Nonnull, zip_uint64_t); +ZIP_EXTERN void zip_source_rollback_write(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_seek(zip_source_t *_Nonnull, zip_int64_t, int); +ZIP_EXTERN zip_int64_t zip_source_seek_compute_offset(zip_uint64_t, zip_uint64_t, void *_Nonnull, zip_uint64_t, zip_error_t *_Nullable); +ZIP_EXTERN int zip_source_seek_write(zip_source_t *_Nonnull, zip_int64_t, int); +ZIP_EXTERN int zip_source_stat(zip_source_t *_Nonnull, zip_stat_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_tell(zip_source_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t *_Nonnull); +#ifdef _WIN32 +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32a(zip_t *_Nonnull, const char *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32a_create(const char *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32handle(zip_t *_Nonnull, void *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32handle_create(void *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32w(zip_t *_Nonnull, const wchar_t *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32w_create(const wchar_t *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +#endif +ZIP_EXTERN zip_source_t *_Nullable zip_source_window_create(zip_source_t *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_int64_t zip_source_write(zip_source_t *_Nonnull, const void *_Nullable, zip_uint64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_zip(zip_t *_Nonnull, zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_zip_create(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN int zip_stat(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t, zip_stat_t *_Nonnull); +ZIP_EXTERN int zip_stat_index(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_stat_t *_Nonnull); +ZIP_EXTERN void zip_stat_init(zip_stat_t *_Nonnull); +ZIP_EXTERN const char *_Nonnull zip_strerror(zip_t *_Nonnull); +ZIP_EXTERN int zip_unchange(zip_t *_Nonnull, zip_uint64_t); +ZIP_EXTERN int zip_unchange_all(zip_t *_Nonnull); +ZIP_EXTERN int zip_unchange_archive(zip_t *_Nonnull); +ZIP_EXTERN int zip_compression_method_supported(zip_int32_t method, int compress); +ZIP_EXTERN int zip_encryption_method_supported(zip_uint16_t method, int encode); + +#ifdef __cplusplus +} +#endif + +#endif /* _HAD_ZIP_H */ diff --git a/deps/libzip/lib/zip_add.c b/deps/libzip/lib/zip_add.c new file mode 100644 index 00000000000000..9770139d6602ef --- /dev/null +++ b/deps/libzip/lib/zip_add.c @@ -0,0 +1,49 @@ +/* + zip_add.c -- add file via callback function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +/* + NOTE: Return type is signed so we can return -1 on error. + The index can not be larger than ZIP_INT64_MAX since the size + of the central directory cannot be larger than + ZIP_UINT64_MAX, and each entry is larger than 2 bytes. +*/ + +ZIP_EXTERN zip_int64_t +zip_add(zip_t *za, const char *name, zip_source_t *source) { + return zip_file_add(za, name, source, 0); +} diff --git a/deps/libzip/lib/zip_add_dir.c b/deps/libzip/lib/zip_add_dir.c new file mode 100644 index 00000000000000..c31fea365a4697 --- /dev/null +++ b/deps/libzip/lib/zip_add_dir.c @@ -0,0 +1,44 @@ +/* + zip_add_dir.c -- add directory + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +ZIP_EXTERN zip_int64_t +zip_add_dir(zip_t *za, const char *name) { + return zip_dir_add(za, name, 0); +} diff --git a/deps/libzip/lib/zip_add_entry.c b/deps/libzip/lib/zip_add_entry.c new file mode 100644 index 00000000000000..bf12dd54176ee2 --- /dev/null +++ b/deps/libzip/lib/zip_add_entry.c @@ -0,0 +1,80 @@ +/* + zip_add_entry.c -- create and init struct zip_entry + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_add_entry(zip_t *za) { + zip_uint64_t idx; + + if (za->nentry + 1 >= za->nentry_alloc) { + zip_entry_t *rentries; + zip_uint64_t nalloc = za->nentry_alloc; + zip_uint64_t additional_entries = 2 * nalloc; + zip_uint64_t realloc_size; + + if (additional_entries < 16) { + additional_entries = 16; + } + else if (additional_entries > 1024) { + additional_entries = 1024; + } + /* neither + nor * overflows can happen: nentry_alloc * sizeof(struct zip_entry) < UINT64_MAX */ + nalloc += additional_entries; + realloc_size = sizeof(struct zip_entry) * (size_t)nalloc; + + if (sizeof(struct zip_entry) * (size_t)za->nentry_alloc > realloc_size) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + rentries = (zip_entry_t *)realloc(za->entry, sizeof(struct zip_entry) * (size_t)nalloc); + if (!rentries) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + za->entry = rentries; + za->nentry_alloc = nalloc; + } + + idx = za->nentry++; + + _zip_entry_init(za->entry + idx); + + return (zip_int64_t)idx; +} diff --git a/deps/libzip/lib/zip_algorithm_bzip2.c b/deps/libzip/lib/zip_algorithm_bzip2.c new file mode 100644 index 00000000000000..7210c20f2a65dd --- /dev/null +++ b/deps/libzip/lib/zip_algorithm_bzip2.c @@ -0,0 +1,287 @@ +/* + zip_algorithm_bzip2.c -- bzip2 (de)compression routines + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include +#include +#include + +struct ctx { + zip_error_t *error; + bool compress; + int compression_flags; + bool end_of_input; + bz_stream zstr; +}; + + +static zip_uint64_t +maximum_compressed_size(zip_uint64_t uncompressed_size) { + zip_uint64_t compressed_size = (zip_uint64_t)((double)uncompressed_size * 1.006); + + if (compressed_size < uncompressed_size) { + return ZIP_UINT64_MAX; + } + return compressed_size; +} + + +static void * +allocate(bool compress, int compression_flags, zip_error_t *error) { + struct ctx *ctx; + + if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { + return NULL; + } + + ctx->error = error; + ctx->compress = compress; + ctx->compression_flags = compression_flags; + if (ctx->compression_flags < 1 || ctx->compression_flags > 9) { + ctx->compression_flags = 9; + } + ctx->end_of_input = false; + + ctx->zstr.bzalloc = NULL; + ctx->zstr.bzfree = NULL; + ctx->zstr.opaque = NULL; + + return ctx; +} + + +static void * +compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(true, compression_flags, error); +} + + +static void * +decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(false, compression_flags, error); +} + + +static void +deallocate(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + free(ctx); +} + + +static zip_uint16_t +general_purpose_bit_flags(void *ud) { + return 0; +} + + +static int +map_error(int ret) { + switch (ret) { + case BZ_FINISH_OK: + case BZ_FLUSH_OK: + case BZ_OK: + case BZ_RUN_OK: + case BZ_STREAM_END: + return ZIP_ER_OK; + + case BZ_DATA_ERROR: + case BZ_DATA_ERROR_MAGIC: + case BZ_UNEXPECTED_EOF: + return ZIP_ER_COMPRESSED_DATA; + + case BZ_MEM_ERROR: + return ZIP_ER_MEMORY; + + case BZ_PARAM_ERROR: + return ZIP_ER_INVAL; + + case BZ_CONFIG_ERROR: /* actually, bzip2 miscompiled */ + case BZ_IO_ERROR: + case BZ_OUTBUFF_FULL: + case BZ_SEQUENCE_ERROR: + return ZIP_ER_INTERNAL; + + default: + return ZIP_ER_INTERNAL; + } +} + +static bool +start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { + struct ctx *ctx = (struct ctx *)ud; + int ret; + + ctx->zstr.avail_in = 0; + ctx->zstr.next_in = NULL; + ctx->zstr.avail_out = 0; + ctx->zstr.next_out = NULL; + + if (ctx->compress) { + ret = BZ2_bzCompressInit(&ctx->zstr, ctx->compression_flags, 0, 30); + } + else { + ret = BZ2_bzDecompressInit(&ctx->zstr, 0, 0); + } + + if (ret != BZ_OK) { + zip_error_set(ctx->error, map_error(ret), 0); + return false; + } + + return true; +} + + +static bool +end(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + int err; + + if (ctx->compress) { + err = BZ2_bzCompressEnd(&ctx->zstr); + } + else { + err = BZ2_bzDecompressEnd(&ctx->zstr); + } + + if (err != BZ_OK) { + zip_error_set(ctx->error, map_error(err), 0); + return false; + } + + return true; +} + + +static bool +input(void *ud, zip_uint8_t *data, zip_uint64_t length) { + struct ctx *ctx = (struct ctx *)ud; + + if (length > UINT_MAX || ctx->zstr.avail_in > 0) { + zip_error_set(ctx->error, ZIP_ER_INVAL, 0); + return false; + } + + ctx->zstr.avail_in = (unsigned int)length; + ctx->zstr.next_in = (char *)data; + + return true; +} + + +static void +end_of_input(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + ctx->end_of_input = true; +} + + +static zip_compression_status_t +process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { + struct ctx *ctx = (struct ctx *)ud; + unsigned int avail_out; + + int ret; + + if (ctx->zstr.avail_in == 0 && !ctx->end_of_input) { + *length = 0; + return ZIP_COMPRESSION_NEED_DATA; + } + + avail_out = (unsigned int)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.avail_out = avail_out; + ctx->zstr.next_out = (char *)data; + + if (ctx->compress) { + ret = BZ2_bzCompress(&ctx->zstr, ctx->end_of_input ? BZ_FINISH : BZ_RUN); + } + else { + ret = BZ2_bzDecompress(&ctx->zstr); + } + + *length = avail_out - ctx->zstr.avail_out; + + switch (ret) { + case BZ_FINISH_OK: /* compression */ + return ZIP_COMPRESSION_OK; + + case BZ_OK: /* decompression */ + case BZ_RUN_OK: /* compression */ + if (ctx->zstr.avail_in == 0) { + return ZIP_COMPRESSION_NEED_DATA; + } + return ZIP_COMPRESSION_OK; + + case BZ_STREAM_END: + return ZIP_COMPRESSION_END; + + default: + zip_error_set(ctx->error, map_error(ret), 0); + return ZIP_COMPRESSION_ERROR; + } +} + +/* clang-format off */ + +zip_compression_algorithm_t zip_algorithm_bzip2_compress = { + maximum_compressed_size, + compress_allocate, + deallocate, + general_purpose_bit_flags, + 46, + start, + end, + input, + end_of_input, + process +}; + + +zip_compression_algorithm_t zip_algorithm_bzip2_decompress = { + maximum_compressed_size, + decompress_allocate, + deallocate, + general_purpose_bit_flags, + 46, + start, + end, + input, + end_of_input, + process +}; + +/* clang-format on */ diff --git a/deps/libzip/lib/zip_algorithm_deflate.c b/deps/libzip/lib/zip_algorithm_deflate.c new file mode 100644 index 00000000000000..f9b7d67383aad2 --- /dev/null +++ b/deps/libzip/lib/zip_algorithm_deflate.c @@ -0,0 +1,267 @@ +/* + zip_algorithm_deflate.c -- deflate (de)compression routines + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include +#include +#include + +struct ctx { + zip_error_t *error; + bool compress; + int compression_flags; + bool end_of_input; + z_stream zstr; +}; + + +static zip_uint64_t +maximum_compressed_size(zip_uint64_t uncompressed_size) { + /* max deflate size increase: size + ceil(size/16k)*5+6 */ + + zip_uint64_t compressed_size = uncompressed_size + (uncompressed_size + 16383) / 16384 * 5 + 6; + + if (compressed_size < uncompressed_size) { + return ZIP_UINT64_MAX; + } + return compressed_size; +} + + +static void * +allocate(bool compress, int compression_flags, zip_error_t *error) { + struct ctx *ctx; + + if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ET_SYS, errno); + return NULL; + } + + ctx->error = error; + ctx->compress = compress; + ctx->compression_flags = compression_flags; + if (ctx->compression_flags < 1 || ctx->compression_flags > 9) { + ctx->compression_flags = Z_BEST_COMPRESSION; + } + ctx->end_of_input = false; + + ctx->zstr.zalloc = Z_NULL; + ctx->zstr.zfree = Z_NULL; + ctx->zstr.opaque = NULL; + + return ctx; +} + + +static void * +compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(true, compression_flags, error); +} + + +static void * +decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(false, compression_flags, error); +} + + +static void +deallocate(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + free(ctx); +} + + +static zip_uint16_t +general_purpose_bit_flags(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + if (!ctx->compress) { + return 0; + } + + if (ctx->compression_flags < 3) { + return 2 << 1; + } + else if (ctx->compression_flags > 7) { + return 1 << 1; + } + return 0; +} + + +static bool +start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { + struct ctx *ctx = (struct ctx *)ud; + int ret; + + ctx->zstr.avail_in = 0; + ctx->zstr.next_in = NULL; + ctx->zstr.avail_out = 0; + ctx->zstr.next_out = NULL; + + if (ctx->compress) { + /* negative value to tell zlib not to write a header */ + ret = deflateInit2(&ctx->zstr, ctx->compression_flags, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + } + else { + ret = inflateInit2(&ctx->zstr, -MAX_WBITS); + } + + if (ret != Z_OK) { + zip_error_set(ctx->error, ZIP_ER_ZLIB, ret); + return false; + } + + + return true; +} + + +static bool +end(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + int err; + + if (ctx->compress) { + err = deflateEnd(&ctx->zstr); + } + else { + err = inflateEnd(&ctx->zstr); + } + + if (err != Z_OK) { + zip_error_set(ctx->error, ZIP_ER_ZLIB, err); + return false; + } + + return true; +} + + +static bool +input(void *ud, zip_uint8_t *data, zip_uint64_t length) { + struct ctx *ctx = (struct ctx *)ud; + + if (length > UINT_MAX || ctx->zstr.avail_in > 0) { + zip_error_set(ctx->error, ZIP_ER_INVAL, 0); + return false; + } + + ctx->zstr.avail_in = (uInt)length; + ctx->zstr.next_in = (Bytef *)data; + + return true; +} + + +static void +end_of_input(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + ctx->end_of_input = true; +} + + +static zip_compression_status_t +process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { + struct ctx *ctx = (struct ctx *)ud; + uInt avail_out; + + int ret; + + avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.avail_out = avail_out; + ctx->zstr.next_out = (Bytef *)data; + + if (ctx->compress) { + ret = deflate(&ctx->zstr, ctx->end_of_input ? Z_FINISH : 0); + } + else { + ret = inflate(&ctx->zstr, Z_SYNC_FLUSH); + } + + *length = avail_out - ctx->zstr.avail_out; + + switch (ret) { + case Z_OK: + return ZIP_COMPRESSION_OK; + + case Z_STREAM_END: + return ZIP_COMPRESSION_END; + + case Z_BUF_ERROR: + if (ctx->zstr.avail_in == 0) { + return ZIP_COMPRESSION_NEED_DATA; + } + + /* fallthrough */ + + default: + zip_error_set(ctx->error, ZIP_ER_ZLIB, ret); + return ZIP_COMPRESSION_ERROR; + } +} + +/* clang-format off */ + +zip_compression_algorithm_t zip_algorithm_deflate_compress = { + maximum_compressed_size, + compress_allocate, + deallocate, + general_purpose_bit_flags, + 20, + start, + end, + input, + end_of_input, + process +}; + + +zip_compression_algorithm_t zip_algorithm_deflate_decompress = { + maximum_compressed_size, + decompress_allocate, + deallocate, + general_purpose_bit_flags, + 20, + start, + end, + input, + end_of_input, + process +}; + +/* clang-format on */ diff --git a/deps/libzip/lib/zip_algorithm_xz.c b/deps/libzip/lib/zip_algorithm_xz.c new file mode 100644 index 00000000000000..8d067a1be6091d --- /dev/null +++ b/deps/libzip/lib/zip_algorithm_xz.c @@ -0,0 +1,408 @@ +/* + zip_algorithm_xz.c -- LZMA/XZ (de)compression routines + Bazed on zip_algorithm_deflate.c -- deflate (de)compression routines + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include +#include +#include +#include + +enum header_state { INCOMPLETE, OUTPUT, DONE }; + +#define HEADER_BYTES_ZIP 9 +#define HEADER_MAGIC_LENGTH 4 +#define HEADER_MAGIC1_OFFSET 0 +#define HEADER_MAGIC2_OFFSET 2 +#define HEADER_SIZE_OFFSET 9 +#define HEADER_SIZE_LENGTH 8 +#define HEADER_PARAMETERS_LENGTH 5 +#define HEADER_LZMA_ALONE_LENGTH (HEADER_PARAMETERS_LENGTH + HEADER_SIZE_LENGTH) + +struct ctx { + zip_error_t *error; + bool compress; + zip_uint32_t compression_flags; + bool end_of_input; + lzma_stream zstr; + zip_uint16_t method; + /* header member is used for converting from zip to "lzma alone" + * format + * + * "lzma alone" file format starts with: + * 5 bytes lzma parameters + * 8 bytes uncompressed size + * compressed data + * + * zip archive on-disk format starts with + * 4 bytes magic (first two bytes vary, e.g. 0x0914 or 0x1002, next bytes are 0x0500) + * 5 bytes lzma parameters + * compressed data + * + * we read the data into a header of the form + * 4 bytes magic + * 5 bytes lzma parameters + * 8 bytes uncompressed size + */ + zip_uint8_t header[HEADER_MAGIC_LENGTH + HEADER_LZMA_ALONE_LENGTH]; + zip_uint8_t header_bytes_offset; + enum header_state header_state; + zip_uint64_t uncompresssed_size; +}; + + +static zip_uint64_t +maximum_compressed_size(zip_uint64_t uncompressed_size) { + /* + According to https://sourceforge.net/p/sevenzip/discussion/45797/thread/b6bd62f8/ + + 1) you can use + outSize = 1.10 * originalSize + 64 KB. + in most cases outSize is less then 1.02 from originalSize. + 2) You can try LZMA2, where + outSize can be = 1.001 * originalSize + 1 KB. + */ + /* 13 bytes added for lzma alone header */ + zip_uint64_t compressed_size = (zip_uint64_t)((double)uncompressed_size * 1.1) + 64 * 1024 + 13; + + if (compressed_size < uncompressed_size) { + return ZIP_UINT64_MAX; + } + return compressed_size; +} + + +static void * +allocate(bool compress, int compression_flags, zip_error_t *error, zip_uint16_t method) { + struct ctx *ctx; + + if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + ctx->error = error; + ctx->compress = compress; + if (compression_flags < 0 || compression_flags > 9) { + ctx->compression_flags = 6; /* default value */ + } else { + ctx->compression_flags = (zip_uint32_t)compression_flags; + } + ctx->compression_flags |= LZMA_PRESET_EXTREME; + ctx->end_of_input = false; + memset(ctx->header, 0, sizeof(ctx->header)); + ctx->header_bytes_offset = 0; + if (ZIP_CM_LZMA) { + ctx->header_state = INCOMPLETE; + } + else { + ctx->header_state = DONE; + } + memset(&ctx->zstr, 0, sizeof(ctx->zstr)); + ctx->method = method; + return ctx; +} + + +static void * +compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(true, compression_flags, error, method); +} + + +static void * +decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(false, compression_flags, error, method); +} + + +static void +deallocate(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + free(ctx); +} + + +static zip_uint16_t +general_purpose_bit_flags(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + if (!ctx->compress) { + return 0; + } + + if (ctx->method == ZIP_CM_LZMA) { + /* liblzma always returns an EOS/EOPM marker, see + * https://sourceforge.net/p/lzmautils/discussion/708858/thread/84c5dbb9/#a5e4/3764 */ + return 1 << 1; + } + return 0; +} + +static int +map_error(lzma_ret ret) { + switch (ret) { + case LZMA_DATA_ERROR: + case LZMA_UNSUPPORTED_CHECK: + return ZIP_ER_COMPRESSED_DATA; + + case LZMA_MEM_ERROR: + return ZIP_ER_MEMORY; + + case LZMA_OPTIONS_ERROR: + return ZIP_ER_INVAL; + + default: + return ZIP_ER_INTERNAL; + } +} + + +static bool +start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { + struct ctx *ctx = (struct ctx *)ud; + lzma_ret ret; + + lzma_options_lzma opt_lzma; + lzma_lzma_preset(&opt_lzma, ctx->compression_flags); + lzma_filter filters[] = { + {.id = (ctx->method == ZIP_CM_LZMA ? LZMA_FILTER_LZMA1 : LZMA_FILTER_LZMA2), .options = &opt_lzma}, + {.id = LZMA_VLI_UNKNOWN, .options = NULL}, + }; + + ctx->zstr.avail_in = 0; + ctx->zstr.next_in = NULL; + ctx->zstr.avail_out = 0; + ctx->zstr.next_out = NULL; + + if (ctx->compress) { + if (ctx->method == ZIP_CM_LZMA) + ret = lzma_alone_encoder(&ctx->zstr, filters[0].options); + else + ret = lzma_stream_encoder(&ctx->zstr, filters, LZMA_CHECK_CRC64); + } + else { + if (ctx->method == ZIP_CM_LZMA) + ret = lzma_alone_decoder(&ctx->zstr, UINT64_MAX); + else + ret = lzma_stream_decoder(&ctx->zstr, UINT64_MAX, LZMA_CONCATENATED); + } + + if (ret != LZMA_OK) { + zip_error_set(ctx->error, map_error(ret), 0); + return false; + } + + /* If general purpose bits 1 & 2 are both zero, write real uncompressed size in header. */ + if ((attributes->valid & ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS) && (attributes->general_purpose_bit_mask & 0x6) == 0x6 && (attributes->general_purpose_bit_flags & 0x06) == 0 && (st->valid & ZIP_STAT_SIZE)) { + ctx->uncompresssed_size = st->size; + } + else { + ctx->uncompresssed_size = ZIP_UINT64_MAX; + } + + return true; +} + + +static bool +end(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + lzma_end(&ctx->zstr); + return true; +} + + +static bool +input(void *ud, zip_uint8_t *data, zip_uint64_t length) { + struct ctx *ctx = (struct ctx *)ud; + + if (length > UINT_MAX || ctx->zstr.avail_in > 0) { + zip_error_set(ctx->error, ZIP_ER_INVAL, 0); + return false; + } + + /* For decompression of LZMA1: Have we read the full "lzma alone" header yet? */ + if (ctx->method == ZIP_CM_LZMA && !ctx->compress && ctx->header_state == INCOMPLETE) { + /* if not, get more of the data */ + zip_uint8_t got = (zip_uint8_t)ZIP_MIN(HEADER_BYTES_ZIP - ctx->header_bytes_offset, length); + (void)memcpy_s(ctx->header + ctx->header_bytes_offset, sizeof(ctx->header) - ctx->header_bytes_offset, data, got); + ctx->header_bytes_offset += got; + length -= got; + data += got; + /* Do we have a complete header now? */ + if (ctx->header_bytes_offset == HEADER_BYTES_ZIP) { + Bytef empty_buffer[1]; + zip_buffer_t *buffer; + /* check magic */ + if (ctx->header[HEADER_MAGIC2_OFFSET] != 0x05 || ctx->header[HEADER_MAGIC2_OFFSET + 1] != 0x00) { + /* magic does not match */ + zip_error_set(ctx->error, ZIP_ER_COMPRESSED_DATA, 0); + return false; + } + /* set size of uncompressed data in "lzma alone" header to "unknown" */ + if ((buffer = _zip_buffer_new(ctx->header + HEADER_SIZE_OFFSET, HEADER_SIZE_LENGTH)) == NULL) { + zip_error_set(ctx->error, ZIP_ER_MEMORY, 0); + return false; + } + _zip_buffer_put_64(buffer, ctx->uncompresssed_size); + _zip_buffer_free(buffer); + /* Feed header into "lzma alone" decoder, for + * initialization; this should not produce output. */ + ctx->zstr.next_in = (void *)(ctx->header + HEADER_MAGIC_LENGTH); + ctx->zstr.avail_in = HEADER_LZMA_ALONE_LENGTH; + ctx->zstr.total_in = 0; + ctx->zstr.next_out = empty_buffer; + ctx->zstr.avail_out = sizeof(*empty_buffer); + ctx->zstr.total_out = 0; + /* this just initializes the decoder and does not produce output, so it consumes the complete header */ + if (lzma_code(&ctx->zstr, LZMA_RUN) != LZMA_OK || ctx->zstr.total_out > 0) { + zip_error_set(ctx->error, ZIP_ER_COMPRESSED_DATA, 0); + return false; + } + ctx->header_state = DONE; + } + } + ctx->zstr.avail_in = (uInt)length; + ctx->zstr.next_in = (Bytef *)data; + + return true; +} + + +static void +end_of_input(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + ctx->end_of_input = true; +} + + +static zip_compression_status_t +process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { + struct ctx *ctx = (struct ctx *)ud; + uInt avail_out; + lzma_ret ret; + /* for compression of LZMA1 */ + if (ctx->method == ZIP_CM_LZMA && ctx->compress) { + if (ctx->header_state == INCOMPLETE) { + /* write magic to output buffer */ + ctx->header[0] = 0x09; + ctx->header[1] = 0x14; + ctx->header[2] = 0x05; + ctx->header[3] = 0x00; + /* generate lzma parameters into output buffer */ + ctx->zstr.avail_out = HEADER_LZMA_ALONE_LENGTH; + ctx->zstr.next_out = ctx->header + HEADER_MAGIC_LENGTH; + ret = lzma_code(&ctx->zstr, LZMA_RUN); + if (ret != LZMA_OK || ctx->zstr.avail_out != 0) { + /* assume that the whole header will be provided with the first call to lzma_code */ + return ZIP_COMPRESSION_ERROR; + } + ctx->header_state = OUTPUT; + } + if (ctx->header_state == OUTPUT) { + /* write header */ + zip_uint8_t write_len = (zip_uint8_t)ZIP_MIN(HEADER_BYTES_ZIP - ctx->header_bytes_offset, *length); + (void)memcpy_s(data, *length, ctx->header + ctx->header_bytes_offset, write_len); + ctx->header_bytes_offset += write_len; + *length = write_len; + if (ctx->header_bytes_offset == HEADER_BYTES_ZIP) { + ctx->header_state = DONE; + } + return ZIP_COMPRESSION_OK; + } + } + + avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.avail_out = avail_out; + ctx->zstr.next_out = (Bytef *)data; + + ret = lzma_code(&ctx->zstr, ctx->end_of_input ? LZMA_FINISH : LZMA_RUN); + *length = avail_out - ctx->zstr.avail_out; + + switch (ret) { + case LZMA_OK: + return ZIP_COMPRESSION_OK; + + case LZMA_STREAM_END: + return ZIP_COMPRESSION_END; + + case LZMA_BUF_ERROR: + if (ctx->zstr.avail_in == 0) { + return ZIP_COMPRESSION_NEED_DATA; + } + + /* fallthrough */ + default: + zip_error_set(ctx->error, map_error(ret), 0); + return ZIP_COMPRESSION_ERROR; + } +} + +/* Version Required should be set to 63 (6.3) because this compression + method was only defined in appnote.txt version 6.3.8, but Winzip + does not unpack it if the value is not 20. */ + +/* clang-format off */ + +zip_compression_algorithm_t zip_algorithm_xz_compress = { + maximum_compressed_size, + compress_allocate, + deallocate, + general_purpose_bit_flags, + 20, + start, + end, + input, + end_of_input, + process +}; + + +zip_compression_algorithm_t zip_algorithm_xz_decompress = { + maximum_compressed_size, + decompress_allocate, + deallocate, + general_purpose_bit_flags, + 20, + start, + end, + input, + end_of_input, + process +}; + +/* clang-format on */ diff --git a/deps/libzip/lib/zip_algorithm_zstd.c b/deps/libzip/lib/zip_algorithm_zstd.c new file mode 100644 index 00000000000000..7a08fbbc2b2b37 --- /dev/null +++ b/deps/libzip/lib/zip_algorithm_zstd.c @@ -0,0 +1,294 @@ +/* + zip_algorithm_zstd.c -- zstd (de)compression routines + Copyright (C) 2020-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include +#include +#include +#include + +struct ctx { + zip_error_t *error; + bool compress; + int compression_flags; + bool end_of_input; + ZSTD_DStream *zdstream; + ZSTD_CStream *zcstream; + ZSTD_outBuffer out; + ZSTD_inBuffer in; +}; + +static zip_uint64_t +maximum_compressed_size(zip_uint64_t uncompressed_size) { + return ZSTD_compressBound(uncompressed_size); +} + + +static void * +allocate(bool compress, int compression_flags, zip_error_t *error) { + struct ctx *ctx; + + /* 0: let zstd choose */ + if (compression_flags < ZSTD_minCLevel() || compression_flags > ZSTD_maxCLevel()) { + compression_flags = 0; + } + + if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { + return NULL; + } + + ctx->error = error; + ctx->compress = compress; + ctx->compression_flags = compression_flags; + ctx->end_of_input = false; + + ctx->zdstream = NULL; + ctx->zcstream = NULL; + ctx->in.src = NULL; + ctx->in.pos = 0; + ctx->in.size = 0; + ctx->out.dst = NULL; + ctx->out.pos = 0; + ctx->out.size = 0; + + return ctx; +} + + +static void * +compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(true, compression_flags, error); +} + + +static void * +decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { + return allocate(false, compression_flags, error); +} + + +static void +deallocate(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + free(ctx); +} + + +static zip_uint16_t +general_purpose_bit_flags(void *ud) { + /* struct ctx *ctx = (struct ctx *)ud; */ + return 0; +} + +static int +map_error(size_t ret) { + switch (ret) { + case ZSTD_error_no_error: + return ZIP_ER_OK; + + case ZSTD_error_corruption_detected: + case ZSTD_error_checksum_wrong: + case ZSTD_error_dictionary_corrupted: + case ZSTD_error_dictionary_wrong: + return ZIP_ER_COMPRESSED_DATA; + + case ZSTD_error_memory_allocation: + return ZIP_ER_MEMORY; + + case ZSTD_error_parameter_unsupported: + case ZSTD_error_parameter_outOfBound: + return ZIP_ER_INVAL; + + default: + return ZIP_ER_INTERNAL; + } +} + + +static bool +start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { + struct ctx *ctx = (struct ctx *)ud; + ctx->in.src = NULL; + ctx->in.pos = 0; + ctx->in.size = 0; + ctx->out.dst = NULL; + ctx->out.pos = 0; + ctx->out.size = 0; + if (ctx->compress) { + size_t ret; + ctx->zcstream = ZSTD_createCStream(); + if (ctx->zcstream == NULL) { + zip_error_set(ctx->error, ZIP_ER_MEMORY, 0); + return false; + } + ret = ZSTD_initCStream(ctx->zcstream, ctx->compression_flags); + if (ZSTD_isError(ret)) { + zip_error_set(ctx->error, ZIP_ER_ZLIB, map_error(ret)); + return false; + } + } + else { + ctx->zdstream = ZSTD_createDStream(); + if (ctx->zdstream == NULL) { + zip_error_set(ctx->error, ZIP_ER_MEMORY, 0); + return false; + } + } + + return true; +} + + +static bool +end(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + size_t ret; + + if (ctx->compress) { + ret = ZSTD_freeCStream(ctx->zcstream); + ctx->zcstream = NULL; + } + else { + ret = ZSTD_freeDStream(ctx->zdstream); + ctx->zdstream = NULL; + } + + if (ZSTD_isError(ret)) { + zip_error_set(ctx->error, map_error(ret), 0); + return false; + } + + return true; +} + + +static bool +input(void *ud, zip_uint8_t *data, zip_uint64_t length) { + struct ctx *ctx = (struct ctx *)ud; + if (length > SIZE_MAX || ctx->in.pos != ctx->in.size) { + zip_error_set(ctx->error, ZIP_ER_INVAL, 0); + return false; + } + ctx->in.src = (const void *)data; + ctx->in.size = (size_t)length; + ctx->in.pos = 0; + return true; +} + + +static void +end_of_input(void *ud) { + struct ctx *ctx = (struct ctx *)ud; + + ctx->end_of_input = true; +} + + +static zip_compression_status_t +process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { + struct ctx *ctx = (struct ctx *)ud; + + size_t ret; + + if (ctx->in.pos == ctx->in.size && !ctx->end_of_input) { + *length = 0; + return ZIP_COMPRESSION_NEED_DATA; + } + + ctx->out.dst = data; + ctx->out.pos = 0; + ctx->out.size = ZIP_MIN(SIZE_MAX, *length); + + if (ctx->compress) { + if (ctx->in.pos == ctx->in.size && ctx->end_of_input) { + ret = ZSTD_endStream(ctx->zcstream, &ctx->out); + if (ret == 0) { + *length = ctx->out.pos; + return ZIP_COMPRESSION_END; + } + } + else { + ret = ZSTD_compressStream(ctx->zcstream, &ctx->out, &ctx->in); + } + } + else { + ret = ZSTD_decompressStream(ctx->zdstream, &ctx->out, &ctx->in); + } + if (ZSTD_isError(ret)) { + zip_error_set(ctx->error, map_error(ret), 0); + return ZIP_COMPRESSION_ERROR; + } + + *length = ctx->out.pos; + if (ctx->in.pos == ctx->in.size) { + return ZIP_COMPRESSION_NEED_DATA; + } + + return ZIP_COMPRESSION_OK; +} + +/* Version Required should be set to 63 (6.3) because this compression + method was only defined in appnote.txt version 6.3.7, but Winzip + does not unpack it if the value is not 20. */ + +/* clang-format off */ + +zip_compression_algorithm_t zip_algorithm_zstd_compress = { + maximum_compressed_size, + compress_allocate, + deallocate, + general_purpose_bit_flags, + 20, + start, + end, + input, + end_of_input, + process +}; + + +zip_compression_algorithm_t zip_algorithm_zstd_decompress = { + maximum_compressed_size, + decompress_allocate, + deallocate, + general_purpose_bit_flags, + 20, + start, + end, + input, + end_of_input, + process +}; + +/* clang-format on */ diff --git a/deps/libzip/lib/zip_buffer.c b/deps/libzip/lib/zip_buffer.c new file mode 100644 index 00000000000000..e2103f04ce3d5f --- /dev/null +++ b/deps/libzip/lib/zip_buffer.c @@ -0,0 +1,337 @@ +/* + zip_buffer.c -- bounds checked access to memory buffer + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "zipint.h" + +zip_uint8_t * +_zip_buffer_data(zip_buffer_t *buffer) { + return buffer->data; +} + + +void +_zip_buffer_free(zip_buffer_t *buffer) { + if (buffer == NULL) { + return; + } + + if (buffer->free_data) { + free(buffer->data); + } + + free(buffer); +} + + +bool +_zip_buffer_eof(zip_buffer_t *buffer) { + return buffer->ok && buffer->offset == buffer->size; +} + + +zip_uint8_t * +_zip_buffer_get(zip_buffer_t *buffer, zip_uint64_t length) { + zip_uint8_t *data; + + data = _zip_buffer_peek(buffer, length); + + if (data != NULL) { + buffer->offset += length; + } + + return data; +} + + +zip_uint16_t +_zip_buffer_get_16(zip_buffer_t *buffer) { + zip_uint8_t *data = _zip_buffer_get(buffer, 2); + + if (data == NULL) { + return 0; + } + + return (zip_uint16_t)(data[0] + (data[1] << 8)); +} + + +zip_uint32_t +_zip_buffer_get_32(zip_buffer_t *buffer) { + zip_uint8_t *data = _zip_buffer_get(buffer, 4); + + if (data == NULL) { + return 0; + } + + return ((((((zip_uint32_t)data[3] << 8) + data[2]) << 8) + data[1]) << 8) + data[0]; +} + + +zip_uint64_t +_zip_buffer_get_64(zip_buffer_t *buffer) { + zip_uint8_t *data = _zip_buffer_get(buffer, 8); + + if (data == NULL) { + return 0; + } + + return ((zip_uint64_t)data[7] << 56) + ((zip_uint64_t)data[6] << 48) + ((zip_uint64_t)data[5] << 40) + ((zip_uint64_t)data[4] << 32) + ((zip_uint64_t)data[3] << 24) + ((zip_uint64_t)data[2] << 16) + ((zip_uint64_t)data[1] << 8) + (zip_uint64_t)data[0]; +} + + +zip_uint8_t +_zip_buffer_get_8(zip_buffer_t *buffer) { + zip_uint8_t *data = _zip_buffer_get(buffer, 1); + + if (data == NULL) { + return 0; + } + + return data[0]; +} + + +zip_uint64_t +_zip_buffer_left(zip_buffer_t *buffer) { + return buffer->ok ? buffer->size - buffer->offset : 0; +} + + +zip_uint64_t +_zip_buffer_read(zip_buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length) { + zip_uint64_t copied; + + if (_zip_buffer_left(buffer) < length) { + length = _zip_buffer_left(buffer); + } + + copied = 0; + while (copied < length) { + size_t n = ZIP_MIN(length - copied, SIZE_MAX); + (void)memcpy_s(data + copied, n, _zip_buffer_get(buffer, n), n); + copied += n; + } + + return copied; +} + + +zip_buffer_t * +_zip_buffer_new(zip_uint8_t *data, zip_uint64_t size) { + bool free_data = (data == NULL); + zip_buffer_t *buffer; + +#if ZIP_UINT64_MAX > SIZE_MAX + if (size > SIZE_MAX) { + return NULL; + } +#endif + + if (data == NULL) { + if ((data = (zip_uint8_t *)malloc((size_t)size)) == NULL) { + return NULL; + } + } + + if ((buffer = (zip_buffer_t *)malloc(sizeof(*buffer))) == NULL) { + if (free_data) { + free(data); + } + return NULL; + } + + buffer->ok = true; + buffer->data = data; + buffer->size = size; + buffer->offset = 0; + buffer->free_data = free_data; + + return buffer; +} + + +zip_buffer_t * +_zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error) { + zip_buffer_t *buffer; + + if ((buffer = _zip_buffer_new(buf, size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (_zip_read(src, buffer->data, size, error) < 0) { + _zip_buffer_free(buffer); + return NULL; + } + + return buffer; +} + + +zip_uint64_t +_zip_buffer_offset(zip_buffer_t *buffer) { + return buffer->ok ? buffer->offset : 0; +} + + +bool +_zip_buffer_ok(zip_buffer_t *buffer) { + return buffer->ok; +} + + +zip_uint8_t * +_zip_buffer_peek(zip_buffer_t *buffer, zip_uint64_t length) { + zip_uint8_t *data; + + if (!buffer->ok || buffer->offset + length < length || buffer->offset + length > buffer->size) { + buffer->ok = false; + return NULL; + } + + data = buffer->data + buffer->offset; + return data; +} + +int +_zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length) { + zip_uint8_t *dst = _zip_buffer_get(buffer, length); + + if (dst == NULL) { + return -1; + } + + (void)memcpy_s(dst, length, src, length); + return 0; +} + + +int +_zip_buffer_put_16(zip_buffer_t *buffer, zip_uint16_t i) { + zip_uint8_t *data = _zip_buffer_get(buffer, 2); + + if (data == NULL) { + return -1; + } + + data[0] = (zip_uint8_t)(i & 0xff); + data[1] = (zip_uint8_t)((i >> 8) & 0xff); + + return 0; +} + + +int +_zip_buffer_put_32(zip_buffer_t *buffer, zip_uint32_t i) { + zip_uint8_t *data = _zip_buffer_get(buffer, 4); + + if (data == NULL) { + return -1; + } + + data[0] = (zip_uint8_t)(i & 0xff); + data[1] = (zip_uint8_t)((i >> 8) & 0xff); + data[2] = (zip_uint8_t)((i >> 16) & 0xff); + data[3] = (zip_uint8_t)((i >> 24) & 0xff); + + return 0; +} + + +int +_zip_buffer_put_64(zip_buffer_t *buffer, zip_uint64_t i) { + zip_uint8_t *data = _zip_buffer_get(buffer, 8); + + if (data == NULL) { + return -1; + } + + data[0] = (zip_uint8_t)(i & 0xff); + data[1] = (zip_uint8_t)((i >> 8) & 0xff); + data[2] = (zip_uint8_t)((i >> 16) & 0xff); + data[3] = (zip_uint8_t)((i >> 24) & 0xff); + data[4] = (zip_uint8_t)((i >> 32) & 0xff); + data[5] = (zip_uint8_t)((i >> 40) & 0xff); + data[6] = (zip_uint8_t)((i >> 48) & 0xff); + data[7] = (zip_uint8_t)((i >> 56) & 0xff); + + return 0; +} + + +int +_zip_buffer_put_8(zip_buffer_t *buffer, zip_uint8_t i) { + zip_uint8_t *data = _zip_buffer_get(buffer, 1); + + if (data == NULL) { + return -1; + } + + data[0] = i; + + return 0; +} + + +int +_zip_buffer_set_offset(zip_buffer_t *buffer, zip_uint64_t offset) { + if (offset > buffer->size) { + buffer->ok = false; + return -1; + } + + buffer->ok = true; + buffer->offset = offset; + + return 0; +} + + +int +_zip_buffer_skip(zip_buffer_t *buffer, zip_uint64_t length) { + zip_uint64_t offset = buffer->offset + length; + + if (offset < buffer->offset) { + buffer->ok = false; + return -1; + } + return _zip_buffer_set_offset(buffer, offset); +} + +zip_uint64_t +_zip_buffer_size(zip_buffer_t *buffer) { + return buffer->size; +} diff --git a/deps/libzip/lib/zip_close.c b/deps/libzip/lib/zip_close.c new file mode 100644 index 00000000000000..83e11a0c41cd46 --- /dev/null +++ b/deps/libzip/lib/zip_close.c @@ -0,0 +1,714 @@ +/* + zip_close.c -- close zip archive and update changes + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +#include +#include +#ifdef _WIN32 +#include +#include +#endif + + +static int add_data(zip_t *, zip_source_t *, zip_dirent_t *, zip_uint32_t); +static int copy_data(zip_t *, zip_uint64_t); +static int copy_source(zip_t *, zip_source_t *, zip_int64_t); +static int write_cdir(zip_t *, const zip_filelist_t *, zip_uint64_t); +static int write_data_descriptor(zip_t *za, const zip_dirent_t *dirent, int is_zip64); + +ZIP_EXTERN int +zip_close(zip_t *za) { + zip_uint64_t i, j, survivors, unchanged_offset; + zip_int64_t off; + int error; + zip_filelist_t *filelist; + int changed; + + if (za == NULL) + return -1; + + changed = _zip_changed(za, &survivors); + + /* don't create zip files with no entries */ + if (survivors == 0) { + if ((za->open_flags & ZIP_TRUNCATE) || changed) { + if (zip_source_remove(za->src) < 0) { + if (!((zip_error_code_zip(zip_source_error(za->src)) == ZIP_ER_REMOVE) && (zip_error_code_system(zip_source_error(za->src)) == ENOENT))) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + } + } + zip_discard(za); + return 0; + } + + if (!changed) { + zip_discard(za); + return 0; + } + + if (survivors > za->nentry) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((filelist = (zip_filelist_t *)malloc(sizeof(filelist[0]) * (size_t)survivors)) == NULL) + return -1; + + unchanged_offset = ZIP_UINT64_MAX; + /* create list of files with index into original archive */ + for (i = j = 0; i < za->nentry; i++) { + if (za->entry[i].orig != NULL && ZIP_ENTRY_HAS_CHANGES(&za->entry[i])) { + unchanged_offset = ZIP_MIN(unchanged_offset, za->entry[i].orig->offset); + } + if (za->entry[i].deleted) { + continue; + } + + if (j >= survivors) { + free(filelist); + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + filelist[j].idx = i; + j++; + } + if (j < survivors) { + free(filelist); + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((zip_source_supports(za->src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE_CLONING)) == 0) { + unchanged_offset = 0; + } + else { + if (unchanged_offset == ZIP_UINT64_MAX) { + /* we're keeping all file data, find the end of the last one */ + zip_uint64_t last_index = ZIP_UINT64_MAX; + unchanged_offset = 0; + + for (i = 0; i < za->nentry; i++) { + if (za->entry[i].orig != NULL) { + if (za->entry[i].orig->offset >= unchanged_offset) { + unchanged_offset = za->entry[i].orig->offset; + last_index = i; + } + } + } + if (last_index != ZIP_UINT64_MAX) { + if ((unchanged_offset = _zip_file_get_end(za, last_index, &za->error)) == 0) { + free(filelist); + return -1; + } + } + } + if (unchanged_offset > 0) { + if (zip_source_begin_write_cloning(za->src, unchanged_offset) < 0) { + /* cloning not supported, need to copy everything */ + unchanged_offset = 0; + } + } + } + if (unchanged_offset == 0) { + if (zip_source_begin_write(za->src) < 0) { + zip_error_set_from_source(&za->error, za->src); + free(filelist); + return -1; + } + } + + if (_zip_progress_start(za->progress) != 0) { + zip_error_set(&za->error, ZIP_ER_CANCELLED, 0); + zip_source_rollback_write(za->src); + free(filelist); + return -1; + } + error = 0; + for (j = 0; j < survivors; j++) { + int new_data; + zip_entry_t *entry; + zip_dirent_t *de; + + if (_zip_progress_subrange(za->progress, (double)j / (double)survivors, (double)(j + 1) / (double)survivors) != 0) { + zip_error_set(&za->error, ZIP_ER_CANCELLED, 0); + error = 1; + break; + } + + i = filelist[j].idx; + entry = za->entry + i; + + if (entry->orig != NULL && entry->orig->offset < unchanged_offset) { + /* already implicitly copied by cloning */ + continue; + } + + new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_ENCRYPTION_METHOD)); + + /* create new local directory entry */ + if (entry->changes == NULL) { + if ((entry->changes = _zip_dirent_clone(entry->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + error = 1; + break; + } + } + de = entry->changes; + + if (_zip_read_local_ef(za, i) < 0) { + error = 1; + break; + } + + if ((off = zip_source_tell_write(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + error = 1; + break; + } + de->offset = (zip_uint64_t)off; + + if (new_data) { + zip_source_t *zs; + + zs = NULL; + if (!ZIP_ENTRY_DATA_CHANGED(entry)) { + if ((zs = _zip_source_zip_new(za, i, ZIP_FL_UNCHANGED, 0, 0, NULL, &za->error)) == NULL) { + error = 1; + break; + } + } + + /* add_data writes dirent */ + if (add_data(za, zs ? zs : entry->source, de, entry->changes ? entry->changes->changed : 0) < 0) { + error = 1; + if (zs) + zip_source_free(zs); + break; + } + if (zs) + zip_source_free(zs); + } + else { + zip_uint64_t offset; + + if (de->encryption_method != ZIP_EM_TRAD_PKWARE) { + /* when copying data, all sizes are known -> no data descriptor needed */ + /* except for PKWare encryption, where removing the data descriptor breaks password validation */ + de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR; + } + if (_zip_dirent_write(za, de, ZIP_FL_LOCAL) < 0) { + error = 1; + break; + } + if ((offset = _zip_file_get_offset(za, i, &za->error)) == 0) { + error = 1; + break; + } + if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) { + zip_error_set_from_source(&za->error, za->src); + error = 1; + break; + } + if (copy_data(za, de->comp_size) < 0) { + error = 1; + break; + } + + if (de->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { + if (write_data_descriptor(za, de, _zip_dirent_needs_zip64(de, 0)) < 0) { + error = 1; + break; + } + } + } + } + + if (!error) { + if (write_cdir(za, filelist, survivors) < 0) + error = 1; + } + + free(filelist); + + if (!error) { + if (zip_source_commit_write(za->src) != 0) { + zip_error_set_from_source(&za->error, za->src); + error = 1; + } + _zip_progress_end(za->progress); + } + + if (error) { + zip_source_rollback_write(za->src); + return -1; + } + + zip_discard(za); + + return 0; +} + + +static int +add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { + zip_int64_t offstart, offdata, offend, data_length; + zip_stat_t st; + zip_file_attributes_t attributes; + zip_source_t *src_final, *src_tmp; + int ret; + int is_zip64; + zip_flags_t flags; + bool needs_recompress, needs_decompress, needs_crc, needs_compress, needs_reencrypt, needs_decrypt, needs_encrypt; + + if (zip_source_stat(src, &st) < 0) { + zip_error_set_from_source(&za->error, src); + return -1; + } + + if ((st.valid & ZIP_STAT_COMP_METHOD) == 0) { + st.valid |= ZIP_STAT_COMP_METHOD; + st.comp_method = ZIP_CM_STORE; + } + + if (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != ZIP_CM_STORE) + de->comp_method = st.comp_method; + else if (de->comp_method == ZIP_CM_STORE && (st.valid & ZIP_STAT_SIZE)) { + st.valid |= ZIP_STAT_COMP_SIZE; + st.comp_size = st.size; + } + else { + /* we'll recompress */ + st.valid &= ~ZIP_STAT_COMP_SIZE; + } + + if ((st.valid & ZIP_STAT_ENCRYPTION_METHOD) == 0) { + st.valid |= ZIP_STAT_ENCRYPTION_METHOD; + st.encryption_method = ZIP_EM_NONE; + } + + flags = ZIP_EF_LOCAL; + + if ((st.valid & ZIP_STAT_SIZE) == 0) { + flags |= ZIP_FL_FORCE_ZIP64; + data_length = -1; + } + else { + de->uncomp_size = st.size; + /* this is technically incorrect (copy_source counts compressed data), but it's the best we have */ + data_length = (zip_int64_t)st.size; + + if ((st.valid & ZIP_STAT_COMP_SIZE) == 0) { + zip_uint64_t max_compressed_size; + zip_uint16_t compression_method = ZIP_CM_ACTUAL(de->comp_method); + + if (compression_method == ZIP_CM_STORE) { + max_compressed_size = st.size; + } + else { + zip_compression_algorithm_t *algorithm = _zip_get_compression_algorithm(compression_method, true); + if (algorithm == NULL) { + max_compressed_size = ZIP_UINT64_MAX; + } + else { + max_compressed_size = algorithm->maximum_compressed_size(st.size); + } + } + + if (max_compressed_size > 0xffffffffu) { + flags |= ZIP_FL_FORCE_ZIP64; + } + } + else { + de->comp_size = st.comp_size; + data_length = (zip_int64_t)st.comp_size; + } + } + + if ((offstart = zip_source_tell_write(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + + /* as long as we don't support non-seekable output, clear data descriptor bit */ + de->bitflags &= (zip_uint16_t)~ZIP_GPBF_DATA_DESCRIPTOR; + if ((is_zip64 = _zip_dirent_write(za, de, flags)) < 0) { + return -1; + } + + needs_recompress = st.comp_method != ZIP_CM_ACTUAL(de->comp_method); + needs_decompress = needs_recompress && (st.comp_method != ZIP_CM_STORE); + /* in these cases we can compute the CRC ourselves, so we do */ + needs_crc = (st.comp_method == ZIP_CM_STORE) || needs_decompress; + needs_compress = needs_recompress && (de->comp_method != ZIP_CM_STORE); + + needs_reencrypt = needs_recompress || (de->changed & ZIP_DIRENT_PASSWORD) || (de->encryption_method != st.encryption_method); + needs_decrypt = needs_reencrypt && (st.encryption_method != ZIP_EM_NONE); + needs_encrypt = needs_reencrypt && (de->encryption_method != ZIP_EM_NONE); + + src_final = src; + zip_source_keep(src_final); + + if (needs_decrypt) { + zip_encryption_implementation impl; + + if ((impl = _zip_get_encryption_implementation(st.encryption_method, ZIP_CODEC_DECODE)) == NULL) { + zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + zip_source_free(src_final); + return -1; + } + if ((src_tmp = impl(za, src_final, st.encryption_method, ZIP_CODEC_DECODE, za->default_password)) == NULL) { + /* error set by impl */ + zip_source_free(src_final); + return -1; + } + + zip_source_free(src_final); + src_final = src_tmp; + } + + if (needs_decompress) { + if ((src_tmp = zip_source_decompress(za, src_final, st.comp_method)) == NULL) { + zip_source_free(src_final); + return -1; + } + + zip_source_free(src_final); + src_final = src_tmp; + } + + if (needs_crc) { + if ((src_tmp = zip_source_crc_create(src_final, 0, &za->error)) == NULL) { + zip_source_free(src_final); + return -1; + } + + zip_source_free(src_final); + src_final = src_tmp; + } + + if (needs_compress) { + if ((src_tmp = zip_source_compress(za, src_final, de->comp_method, de->compression_level)) == NULL) { + zip_source_free(src_final); + return -1; + } + + zip_source_free(src_final); + src_final = src_tmp; + } + + + if (needs_encrypt) { + zip_encryption_implementation impl; + const char *password = NULL; + + if (de->password) { + password = de->password; + } + else if (za->default_password) { + password = za->default_password; + } + + if ((impl = _zip_get_encryption_implementation(de->encryption_method, ZIP_CODEC_ENCODE)) == NULL) { + zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + zip_source_free(src_final); + return -1; + } + + if (de->encryption_method == ZIP_EM_TRAD_PKWARE) { + de->bitflags |= ZIP_GPBF_DATA_DESCRIPTOR; + + /* PKWare encryption uses last_mod, make sure it gets the right value. */ + if (de->changed & ZIP_DIRENT_LAST_MOD) { + zip_stat_t st_mtime; + zip_stat_init(&st_mtime); + st_mtime.valid = ZIP_STAT_MTIME; + st_mtime.mtime = de->last_mod; + if ((src_tmp = _zip_source_window_new(src_final, 0, -1, &st_mtime, NULL, NULL, 0, &za->error)) == NULL) { + zip_source_free(src_final); + return -1; + } + zip_source_free(src_final); + src_final = src_tmp; + } + } + + if ((src_tmp = impl(za, src_final, de->encryption_method, ZIP_CODEC_ENCODE, password)) == NULL) { + /* error set by impl */ + zip_source_free(src_final); + return -1; + } + + zip_source_free(src_final); + src_final = src_tmp; + } + + + if ((offdata = zip_source_tell_write(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + + ret = copy_source(za, src_final, data_length); + + if (zip_source_stat(src_final, &st) < 0) { + zip_error_set_from_source(&za->error, src_final); + ret = -1; + } + + if (zip_source_get_file_attributes(src_final, &attributes) != 0) { + zip_error_set_from_source(&za->error, src_final); + ret = -1; + } + + zip_source_free(src_final); + + if (ret < 0) { + return -1; + } + + if ((offend = zip_source_tell_write(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + + if (zip_source_seek_write(za->src, offstart, SEEK_SET) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + + if ((st.valid & (ZIP_STAT_COMP_METHOD | ZIP_STAT_CRC | ZIP_STAT_SIZE)) != (ZIP_STAT_COMP_METHOD | ZIP_STAT_CRC | ZIP_STAT_SIZE)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((de->changed & ZIP_DIRENT_LAST_MOD) == 0) { + if (st.valid & ZIP_STAT_MTIME) + de->last_mod = st.mtime; + else + time(&de->last_mod); + } + de->comp_method = st.comp_method; + de->crc = st.crc; + de->uncomp_size = st.size; + de->comp_size = (zip_uint64_t)(offend - offdata); + _zip_dirent_apply_attributes(de, &attributes, (flags & ZIP_FL_FORCE_ZIP64) != 0, changed); + + if ((ret = _zip_dirent_write(za, de, flags)) < 0) + return -1; + + if (is_zip64 != ret) { + /* Zip64 mismatch between preliminary file header written before data and final file header written afterwards */ + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if (zip_source_seek_write(za->src, offend, SEEK_SET) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + + if (de->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { + if (write_data_descriptor(za, de, is_zip64) < 0) { + return -1; + } + } + + return 0; +} + + +static int +copy_data(zip_t *za, zip_uint64_t len) { + DEFINE_BYTE_ARRAY(buf, BUFSIZE); + double total = (double)len; + + if (!byte_array_init(buf, BUFSIZE)) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + while (len > 0) { + zip_uint64_t n = ZIP_MIN(len, BUFSIZE); + + if (_zip_read(za->src, buf, n, &za->error) < 0) { + byte_array_fini(buf); + return -1; + } + + if (_zip_write(za, buf, n) < 0) { + byte_array_fini(buf); + return -1; + } + + len -= n; + + if (_zip_progress_update(za->progress, (total - (double)len) / total) != 0) { + zip_error_set(&za->error, ZIP_ER_CANCELLED, 0); + return -1; + } + } + + byte_array_fini(buf); + return 0; +} + + +static int +copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { + DEFINE_BYTE_ARRAY(buf, BUFSIZE); + zip_int64_t n, current; + int ret; + + if (zip_source_open(src) < 0) { + zip_error_set_from_source(&za->error, src); + return -1; + } + + if (!byte_array_init(buf, BUFSIZE)) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + ret = 0; + current = 0; + while ((n = zip_source_read(src, buf, BUFSIZE)) > 0) { + if (_zip_write(za, buf, (zip_uint64_t)n) < 0) { + ret = -1; + break; + } + if (n == BUFSIZE && za->progress && data_length > 0) { + current += n; + if (_zip_progress_update(za->progress, (double)current / (double)data_length) != 0) { + zip_error_set(&za->error, ZIP_ER_CANCELLED, 0); + ret = -1; + break; + } + } + } + + if (n < 0) { + zip_error_set_from_source(&za->error, src); + ret = -1; + } + + byte_array_fini(buf); + + zip_source_close(src); + + return ret; +} + +static int +write_cdir(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors) { + if (zip_source_tell_write(za->src) < 0) { + return -1; + } + + if (_zip_cdir_write(za, filelist, survivors) < 0) { + return -1; + } + + if (zip_source_tell_write(za->src) < 0) { + return -1; + } + + return 0; +} + + +int +_zip_changed(const zip_t *za, zip_uint64_t *survivorsp) { + int changed; + zip_uint64_t i, survivors; + + changed = 0; + survivors = 0; + + if (za->comment_changed || za->ch_flags != za->flags) { + changed = 1; + } + + for (i = 0; i < za->nentry; i++) { + if (ZIP_ENTRY_HAS_CHANGES(&za->entry[i])) { + changed = 1; + } + if (!za->entry[i].deleted) { + survivors++; + } + } + + if (survivorsp) { + *survivorsp = survivors; + } + + return changed; +} + +static int +write_data_descriptor(zip_t *za, const zip_dirent_t *de, int is_zip64) { + zip_buffer_t *buffer = _zip_buffer_new(NULL, MAX_DATA_DESCRIPTOR_LENGTH); + int ret = 0; + + if (buffer == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + _zip_buffer_put(buffer, DATADES_MAGIC, 4); + _zip_buffer_put_32(buffer, de->crc); + if (is_zip64) { + _zip_buffer_put_64(buffer, de->comp_size); + _zip_buffer_put_64(buffer, de->uncomp_size); + } + else { + _zip_buffer_put_32(buffer, (zip_uint32_t)de->comp_size); + _zip_buffer_put_32(buffer, (zip_uint32_t)de->uncomp_size); + } + + if (!_zip_buffer_ok(buffer)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + ret = -1; + } + else { + ret = _zip_write(za, _zip_buffer_data(buffer), _zip_buffer_offset(buffer)); + } + + _zip_buffer_free(buffer); + + return ret; +} diff --git a/deps/libzip/lib/zip_crypto.h b/deps/libzip/lib/zip_crypto.h new file mode 100644 index 00000000000000..0d74d1a41e819a --- /dev/null +++ b/deps/libzip/lib/zip_crypto.h @@ -0,0 +1,54 @@ +/* + zip_crypto.h -- crypto definitions + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HAD_ZIP_CRYPTO_H +#define HAD_ZIP_CRYPTO_H + +#define ZIP_CRYPTO_SHA1_LENGTH 20 +#define ZIP_CRYPTO_AES_BLOCK_LENGTH 16 + +#if defined(HAVE_WINDOWS_CRYPTO) +#include "zip_crypto_win.h" +#elif defined(HAVE_COMMONCRYPTO) +#include "zip_crypto_commoncrypto.h" +#elif defined(HAVE_GNUTLS) +#include "zip_crypto_gnutls.h" +#elif defined(HAVE_OPENSSL) +#include "zip_crypto_openssl.h" +#elif defined(HAVE_MBEDTLS) +#include "zip_crypto_mbedtls.h" +#else +#error "no crypto backend found" +#endif + +#endif /* HAD_ZIP_CRYPTO_H */ diff --git a/deps/libzip/lib/zip_crypto_commoncrypto.c b/deps/libzip/lib/zip_crypto_commoncrypto.c new file mode 100644 index 00000000000000..b198be563058c8 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_commoncrypto.c @@ -0,0 +1,110 @@ +/* + zip_crypto_commoncrypto.c -- CommonCrypto wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + +#include "zip_crypto.h" + +#include +#include + +void +_zip_crypto_aes_free(_zip_crypto_aes_t *aes) { + if (aes == NULL) { + return; + } + + CCCryptorRelease(aes); +} + + +bool +_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) { + size_t len; + CCCryptorUpdate(aes, in, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, ZIP_CRYPTO_AES_BLOCK_LENGTH, &len); + return true; +} + + +_zip_crypto_aes_t * +_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) { + _zip_crypto_aes_t *aes; + CCCryptorStatus ret; + + ret = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, kCCOptionECBMode, key, key_size / 8, NULL, &aes); + + switch (ret) { + case kCCSuccess: + return aes; + + case kCCMemoryFailure: + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + + case kCCParamError: + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + + default: + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } +} + + +void +_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { + if (hmac == NULL) { + return; + } + + _zip_crypto_clear(hmac, sizeof(*hmac)); + free(hmac); +} + + +_zip_crypto_hmac_t * +_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) { + _zip_crypto_hmac_t *hmac; + + if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + CCHmacInit(hmac, kCCHmacAlgSHA1, secret, secret_length); + + return hmac; +} diff --git a/deps/libzip/lib/zip_crypto_commoncrypto.h b/deps/libzip/lib/zip_crypto_commoncrypto.h new file mode 100644 index 00000000000000..01828cc64e432a --- /dev/null +++ b/deps/libzip/lib/zip_crypto_commoncrypto.h @@ -0,0 +1,53 @@ +/* + zip_crypto_commoncrypto.h -- definitions for CommonCrypto wrapper. + Copyright (C) 2018 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HAD_ZIP_CRYPTO_COMMONCRYPTO_H +#define HAD_ZIP_CRYPTO_COMMONCRYPTO_H + +#include + +#define _zip_crypto_aes_t struct _CCCryptor +#define _zip_crypto_hmac_t CCHmacContext + +void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); +bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out); +_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error); + +#define _zip_crypto_hmac(hmac, data, length) (CCHmacUpdate((hmac), (data), (length)), true) +void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac); +_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error); +#define _zip_crypto_hmac_output(hmac, data) (CCHmacFinal((hmac), (data)), true) + +#define _zip_crypto_pbkdf2(key, key_length, salt, salt_length, iterations, output, output_length) (CCKeyDerivationPBKDF(kCCPBKDF2, (const char *)(key), (key_length), (salt), (salt_length), kCCPRFHmacAlgSHA1, (iterations), (output), (output_length)) == kCCSuccess) + +#endif /* HAD_ZIP_CRYPTO_COMMONCRYPTO_H */ diff --git a/deps/libzip/lib/zip_crypto_gnutls.c b/deps/libzip/lib/zip_crypto_gnutls.c new file mode 100644 index 00000000000000..1a25aa120e7d6c --- /dev/null +++ b/deps/libzip/lib/zip_crypto_gnutls.c @@ -0,0 +1,134 @@ +/* + zip_crypto_gnutls.c -- GnuTLS wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + +#include "zip_crypto.h" + +_zip_crypto_aes_t * +_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) { + _zip_crypto_aes_t *aes; + + if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + aes->key_size = key_size; + + switch (aes->key_size) { + case 128: + nettle_aes128_set_encrypt_key(&aes->ctx.ctx_128, key); + break; + case 192: + nettle_aes192_set_encrypt_key(&aes->ctx.ctx_192, key); + break; + case 256: + nettle_aes256_set_encrypt_key(&aes->ctx.ctx_256, key); + break; + default: + zip_error_set(error, ZIP_ER_INVAL, 0); + free(aes); + return NULL; + } + + return aes; +} + +bool +_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) { + switch (aes->key_size) { + case 128: + nettle_aes128_encrypt(&aes->ctx.ctx_128, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, in); + break; + case 192: + nettle_aes192_encrypt(&aes->ctx.ctx_192, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, in); + break; + case 256: + nettle_aes256_encrypt(&aes->ctx.ctx_256, ZIP_CRYPTO_AES_BLOCK_LENGTH, out, in); + break; + } + + return true; +} + +void +_zip_crypto_aes_free(_zip_crypto_aes_t *aes) { + if (aes == NULL) { + return; + } + + _zip_crypto_clear(aes, sizeof(*aes)); + free(aes); +} + + +_zip_crypto_hmac_t * +_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) { + _zip_crypto_hmac_t *hmac; + + if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (gnutls_hmac_init(hmac, GNUTLS_MAC_SHA1, secret, secret_length) < 0) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + free(hmac); + return NULL; + } + + return hmac; +} + + +void +_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { + zip_uint8_t buf[ZIP_CRYPTO_SHA1_LENGTH]; + + if (hmac == NULL) { + return; + } + + gnutls_hmac_deinit(*hmac, buf); + _zip_crypto_clear(hmac, sizeof(*hmac)); + free(hmac); +} + + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + return gnutls_rnd(GNUTLS_RND_KEY, buffer, length) == 0; +} diff --git a/deps/libzip/lib/zip_crypto_gnutls.h b/deps/libzip/lib/zip_crypto_gnutls.h new file mode 100644 index 00000000000000..dc8b97a4d21db4 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_gnutls.h @@ -0,0 +1,68 @@ +/* + zip_crypto_gnutls.h -- definitions for GnuTLS wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HAD_ZIP_CRYPTO_GNUTLS_H +#define HAD_ZIP_CRYPTO_GNUTLS_H + +#define HAVE_SECURE_RANDOM + +#include +#include + +#include + +#include + +typedef struct { + union { + struct aes128_ctx ctx_128; + struct aes192_ctx ctx_192; + struct aes256_ctx ctx_256; + } ctx; + zip_uint16_t key_size; +} _zip_crypto_aes_t; + +#define _zip_crypto_hmac_t gnutls_hmac_hd_t + +void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); +bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out); +_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error); + +#define _zip_crypto_hmac(hmac, data, length) (gnutls_hmac(*(hmac), (data), (length)) == 0) +void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac); +_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error); +#define _zip_crypto_hmac_output(hmac, data) (gnutls_hmac_output(*(hmac), (data)), true) + +#define _zip_crypto_pbkdf2(key, key_length, salt, salt_length, iterations, output, output_length) (pbkdf2_hmac_sha1((key_length), (key), (iterations), (salt_length), (salt), (output_length), (output)), true) + +#endif /* HAD_ZIP_CRYPTO_GNUTLS_H */ diff --git a/deps/libzip/lib/zip_crypto_mbedtls.c b/deps/libzip/lib/zip_crypto_mbedtls.c new file mode 100644 index 00000000000000..95ac89903674c6 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_mbedtls.c @@ -0,0 +1,162 @@ +/* + zip_crypto_mbedtls.c -- mbed TLS wrapper + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + +#include "zip_crypto.h" + +#include +#include +#include + +#include + +_zip_crypto_aes_t * +_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) { + _zip_crypto_aes_t *aes; + + if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + mbedtls_aes_init(aes); + mbedtls_aes_setkey_enc(aes, (const unsigned char *)key, (unsigned int)key_size); + + return aes; +} + +void +_zip_crypto_aes_free(_zip_crypto_aes_t *aes) { + if (aes == NULL) { + return; + } + + mbedtls_aes_free(aes); + free(aes); +} + + +_zip_crypto_hmac_t * +_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) { + _zip_crypto_hmac_t *hmac; + + if (secret_length > INT_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + mbedtls_md_init(hmac); + + if (mbedtls_md_setup(hmac, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + free(hmac); + return NULL; + } + + if (mbedtls_md_hmac_starts(hmac, (const unsigned char *)secret, (size_t)secret_length) != 0) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + free(hmac); + return NULL; + } + + return hmac; +} + + +void +_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { + if (hmac == NULL) { + return; + } + + mbedtls_md_free(hmac); + free(hmac); +} + + +bool +_zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, int iterations, zip_uint8_t *output, zip_uint64_t output_length) { + mbedtls_md_context_t sha1_ctx; + bool ok = true; + + mbedtls_md_init(&sha1_ctx); + + if (mbedtls_md_setup(&sha1_ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) { + ok = false; + } + + if (ok && mbedtls_pkcs5_pbkdf2_hmac(&sha1_ctx, (const unsigned char *)key, (size_t)key_length, (const unsigned char *)salt, (size_t)salt_length, (unsigned int)iterations, (uint32_t)output_length, (unsigned char *)output) != 0) { + ok = false; + } + + mbedtls_md_free(&sha1_ctx); + return ok; +} + + +typedef struct { + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; +} zip_random_context_t; + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + static zip_random_context_t *ctx = NULL; + const unsigned char *pers = "zip_crypto_mbedtls"; + + if (!ctx) { + ctx = (zip_random_context_t *)malloc(sizeof(zip_random_context_t)); + if (!ctx) { + return false; + } + mbedtls_entropy_init(&ctx->entropy); + mbedtls_ctr_drbg_init(&ctx->ctr_drbg); + if (mbedtls_ctr_drbg_seed(&ctx->ctr_drbg, mbedtls_entropy_func, &ctx->entropy, pers, strlen(pers)) != 0) { + mbedtls_ctr_drbg_free(&ctx->ctr_drbg); + mbedtls_entropy_free(&ctx->entropy); + free(ctx); + ctx = NULL; + return false; + } + } + + return mbedtls_ctr_drbg_random(&ctx->ctr_drbg, (unsigned char *)buffer, (size_t)length) == 0; +} diff --git a/deps/libzip/lib/zip_crypto_mbedtls.h b/deps/libzip/lib/zip_crypto_mbedtls.h new file mode 100644 index 00000000000000..1151fff757e2d5 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_mbedtls.h @@ -0,0 +1,56 @@ +/* + zip_crypto_mbedtls.h -- definitions for mbedtls wrapper + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HAD_ZIP_CRYPTO_MBEDTLS_H +#define HAD_ZIP_CRYPTO_MBEDTLS_H + +#define HAVE_SECURE_RANDOM + +#include +#include + +#define _zip_crypto_aes_t mbedtls_aes_context +#define _zip_crypto_hmac_t mbedtls_md_context_t + +_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error); +#define _zip_crypto_aes_encrypt_block(aes, in, out) (mbedtls_aes_crypt_ecb((aes), MBEDTLS_AES_ENCRYPT, (in), (out)) == 0) +void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); + +_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error); +#define _zip_crypto_hmac(hmac, data, length) (mbedtls_md_hmac_update((hmac), (data), (length)) == 0) +#define _zip_crypto_hmac_output(hmac, data) (mbedtls_md_hmac_finish((hmac), (data)) == 0) +void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac); + +bool _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, int iterations, zip_uint8_t *output, zip_uint64_t output_length); + +#endif /* HAD_ZIP_CRYPTO_MBEDTLS_H */ diff --git a/deps/libzip/lib/zip_crypto_openssl.c b/deps/libzip/lib/zip_crypto_openssl.c new file mode 100644 index 00000000000000..acbfe4bc626b98 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_openssl.c @@ -0,0 +1,184 @@ +/* + zip_crypto_openssl.c -- OpenSSL wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + +#include "zip_crypto.h" + +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x1010000fL || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x02070000fL) +#define USE_OPENSSL_1_0_API +#endif + + +_zip_crypto_aes_t * +_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) { + _zip_crypto_aes_t *aes; + const EVP_CIPHER* cipher_type; + + switch (key_size) { + case 128: + cipher_type = EVP_aes_128_ecb(); + break; + case 192: + cipher_type = EVP_aes_192_ecb(); + break; + case 256: + cipher_type = EVP_aes_256_ecb(); + break; + default: + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } + +#ifdef USE_OPENSSL_1_0_API + if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + memset(aes, 0, sizeof(*aes)); +#else + if ((aes = EVP_CIPHER_CTX_new()) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } +#endif + + if (EVP_EncryptInit_ex(aes, cipher_type, NULL, key, NULL) != 1) { +#ifdef USE_OPENSSL_1_0_API + free(aes); +#else + EVP_CIPHER_CTX_free(aes); +#endif + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } + + return aes; +} + +void +_zip_crypto_aes_free(_zip_crypto_aes_t *aes) { + if (aes == NULL) { + return; + } + +#ifdef USE_OPENSSL_1_0_API + EVP_CIPHER_CTX_cleanup(aes); + _zip_crypto_clear(aes, sizeof(*aes)); + free(aes); +#else + EVP_CIPHER_CTX_free(aes); +#endif +} + + +bool +_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) { + int len; + if (EVP_EncryptUpdate(aes, out, &len, in, ZIP_CRYPTO_AES_BLOCK_LENGTH) != 1) { + return false; + } + return true; +} + + +_zip_crypto_hmac_t * +_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) { + _zip_crypto_hmac_t *hmac; + + if (secret_length > INT_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + +#ifdef USE_OPENSSL_1_0_API + if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + HMAC_CTX_init(hmac); +#else + if ((hmac = HMAC_CTX_new()) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } +#endif + + if (HMAC_Init_ex(hmac, secret, (int)secret_length, EVP_sha1(), NULL) != 1) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); +#ifdef USE_OPENSSL_1_0_API + free(hmac); +#else + HMAC_CTX_free(hmac); +#endif + return NULL; + } + + return hmac; +} + + +void +_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { + if (hmac == NULL) { + return; + } + +#ifdef USE_OPENSSL_1_0_API + HMAC_CTX_cleanup(hmac); + _zip_crypto_clear(hmac, sizeof(*hmac)); + free(hmac); +#else + HMAC_CTX_free(hmac); +#endif +} + + +bool +_zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data) { + unsigned int length; + + return HMAC_Final(hmac, data, &length) == 1; +} + + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + return RAND_bytes(buffer, length) == 1; +} diff --git a/deps/libzip/lib/zip_crypto_openssl.h b/deps/libzip/lib/zip_crypto_openssl.h new file mode 100644 index 00000000000000..030e67ed301af0 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_openssl.h @@ -0,0 +1,56 @@ +/* + zip_crypto_openssl.h -- definitions for OpenSSL wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HAD_ZIP_CRYPTO_OPENSSL_H +#define HAD_ZIP_CRYPTO_OPENSSL_H + +#define HAVE_SECURE_RANDOM + +#include +#include + +#define _zip_crypto_aes_t EVP_CIPHER_CTX +#define _zip_crypto_hmac_t HMAC_CTX + +void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); +bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out); +_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error); + +#define _zip_crypto_hmac(hmac, data, length) (HMAC_Update((hmac), (data), (length)) == 1) +void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac); +_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error); +bool _zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data); + +#define _zip_crypto_pbkdf2(key, key_length, salt, salt_length, iterations, output, output_length) (PKCS5_PBKDF2_HMAC_SHA1((const char *)(key), (key_length), (salt), (salt_length), (iterations), (output_length), (output))) + +#endif /* HAD_ZIP_CRYPTO_OPENSSL_H */ diff --git a/deps/libzip/lib/zip_crypto_win.c b/deps/libzip/lib/zip_crypto_win.c new file mode 100644 index 00000000000000..ee3ccc30a6af82 --- /dev/null +++ b/deps/libzip/lib/zip_crypto_win.c @@ -0,0 +1,495 @@ +/* + zip_crypto_win.c -- Windows Crypto API wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include + +#include "zipint.h" + +#include "zip_crypto.h" + +#define WIN32_LEAN_AND_MEAN +#define NOCRYPT + +#include + +#include + +#pragma comment(lib, "bcrypt.lib") + +/* + +This code is using the Cryptography API: Next Generation (CNG) +https://docs.microsoft.com/en-us/windows/desktop/seccng/cng-portal + +This API is supported on + - Windows Vista or later (client OS) + - Windows Server 2008 (server OS) + - Windows Embedded Compact 2013 (don't know about Windows Embedded Compact 7) + +The code was developed for Windows Embedded Compact 2013 (WEC2013), +but should be working for all of the above mentioned OSes. + +There are 2 restrictions for WEC2013, Windows Vista and Windows Server 2008: + +1.) The function "BCryptDeriveKeyPBKDF2" is not available + +I found some code which is implementing this function using the deprecated Crypto API here: +https://www.idrix.fr/Root/content/view/37/54/ + +I took this code and converted it to the newer CNG API. The original code was more +flexible, but this is not needed here so i refactored it a bit and just kept what is needed. + +The define "HAS_BCRYPTDERIVEKEYPBKDF2" controls whether "BCryptDeriveKeyPBKDF2" +of the CNG API is used or not. This define must not be set if you are compiling for WEC2013 or Windows Vista. + + +2.) "BCryptCreateHash" can't manage the memory needed for the hash object internally + +On Windows 7 or later it is possible to pass NULL for the hash object buffer. +This is not supported on WEC2013, so we have to handle the memory allocation/deallocation ourselves. +There is no #ifdef to control that, because this is working for all supported OSes. + +*/ + +#if !defined(WINCE) && !defined(__MINGW32__) +#define HAS_BCRYPTDERIVEKEYPBKDF2 +#endif + +#ifdef HAS_BCRYPTDERIVEKEYPBKDF2 + +bool +_zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, zip_uint16_t iterations, zip_uint8_t *output, zip_uint16_t output_length) { + BCRYPT_ALG_HANDLE hAlgorithm = NULL; + bool result; + + if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&hAlgorithm, BCRYPT_SHA1_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG))) { + return false; + } + + result = BCRYPT_SUCCESS(BCryptDeriveKeyPBKDF2(hAlgorithm, (PUCHAR)key, (ULONG)key_length, (PUCHAR)salt, salt_length, iterations, output, output_length, 0)); + + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + + return result; +} + +#else + +#include + +#define DIGEST_SIZE 20 +#define BLOCK_SIZE 64 + +typedef struct { + BCRYPT_ALG_HANDLE hAlgorithm; + BCRYPT_HASH_HANDLE hInnerHash; + BCRYPT_HASH_HANDLE hOuterHash; + ULONG cbHashObject; + PUCHAR pbInnerHash; + PUCHAR pbOuterHash; +} PRF_CTX; + +static void +hmacFree(PRF_CTX *pContext) { + if (pContext->hOuterHash) + BCryptDestroyHash(pContext->hOuterHash); + if (pContext->hInnerHash) + BCryptDestroyHash(pContext->hInnerHash); + free(pContext->pbOuterHash); + free(pContext->pbInnerHash); + if (pContext->hAlgorithm) + BCryptCloseAlgorithmProvider(pContext->hAlgorithm, 0); +} + +static BOOL +hmacPrecomputeDigest(BCRYPT_HASH_HANDLE hHash, PUCHAR pbPassword, DWORD cbPassword, BYTE mask) { + BYTE buffer[BLOCK_SIZE]; + DWORD i; + + if (cbPassword > BLOCK_SIZE) { + return FALSE; + } + + memset(buffer, mask, sizeof(buffer)); + + for (i = 0; i < cbPassword; ++i) { + buffer[i] = (char)(pbPassword[i] ^ mask); + } + + return BCRYPT_SUCCESS(BCryptHashData(hHash, buffer, sizeof(buffer), 0)); +} + +static BOOL +hmacInit(PRF_CTX *pContext, PUCHAR pbPassword, DWORD cbPassword) { + BOOL bStatus = FALSE; + ULONG cbResult; + BYTE key[DIGEST_SIZE]; + + if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&pContext->hAlgorithm, BCRYPT_SHA1_ALGORITHM, NULL, 0)) || !BCRYPT_SUCCESS(BCryptGetProperty(pContext->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&pContext->cbHashObject, sizeof(pContext->cbHashObject), &cbResult, 0)) || ((pContext->pbInnerHash = malloc(pContext->cbHashObject)) == NULL) || ((pContext->pbOuterHash = malloc(pContext->cbHashObject)) == NULL) || !BCRYPT_SUCCESS(BCryptCreateHash(pContext->hAlgorithm, &pContext->hInnerHash, pContext->pbInnerHash, pContext->cbHashObject, NULL, 0, 0)) || !BCRYPT_SUCCESS(BCryptCreateHash(pContext->hAlgorithm, &pContext->hOuterHash, pContext->pbOuterHash, pContext->cbHashObject, NULL, 0, 0))) { + goto hmacInit_end; + } + + if (cbPassword > BLOCK_SIZE) { + BCRYPT_HASH_HANDLE hHash = NULL; + PUCHAR pbHashObject = malloc(pContext->cbHashObject); + if (pbHashObject == NULL) { + goto hmacInit_end; + } + + bStatus = BCRYPT_SUCCESS(BCryptCreateHash(pContext->hAlgorithm, &hHash, pbHashObject, pContext->cbHashObject, NULL, 0, 0)) && BCRYPT_SUCCESS(BCryptHashData(hHash, pbPassword, cbPassword, 0)) && BCRYPT_SUCCESS(BCryptGetProperty(hHash, BCRYPT_HASH_LENGTH, (PUCHAR)&cbPassword, sizeof(cbPassword), &cbResult, 0)) && BCRYPT_SUCCESS(BCryptFinishHash(hHash, key, cbPassword, 0)); + + if (hHash) + BCryptDestroyHash(hHash); + free(pbHashObject); + + if (!bStatus) { + goto hmacInit_end; + } + + pbPassword = key; + } + + bStatus = hmacPrecomputeDigest(pContext->hInnerHash, pbPassword, cbPassword, 0x36) && hmacPrecomputeDigest(pContext->hOuterHash, pbPassword, cbPassword, 0x5C); + +hmacInit_end: + + if (bStatus == FALSE) + hmacFree(pContext); + + return bStatus; +} + +static BOOL +hmacCalculateInternal(BCRYPT_HASH_HANDLE hHashTemplate, PUCHAR pbData, DWORD cbData, PUCHAR pbOutput, DWORD cbOutput, DWORD cbHashObject) { + BOOL success = FALSE; + BCRYPT_HASH_HANDLE hHash = NULL; + PUCHAR pbHashObject = malloc(cbHashObject); + + if (pbHashObject == NULL) { + return FALSE; + } + + if (BCRYPT_SUCCESS(BCryptDuplicateHash(hHashTemplate, &hHash, pbHashObject, cbHashObject, 0))) { + success = BCRYPT_SUCCESS(BCryptHashData(hHash, pbData, cbData, 0)) && BCRYPT_SUCCESS(BCryptFinishHash(hHash, pbOutput, cbOutput, 0)); + + BCryptDestroyHash(hHash); + } + + free(pbHashObject); + + return success; +} + +static BOOL +hmacCalculate(PRF_CTX *pContext, PUCHAR pbData, DWORD cbData, PUCHAR pbDigest) { + DWORD cbResult; + DWORD cbHashObject; + + return BCRYPT_SUCCESS(BCryptGetProperty(pContext->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&cbHashObject, sizeof(cbHashObject), &cbResult, 0)) && hmacCalculateInternal(pContext->hInnerHash, pbData, cbData, pbDigest, DIGEST_SIZE, cbHashObject) && hmacCalculateInternal(pContext->hOuterHash, pbDigest, DIGEST_SIZE, pbDigest, DIGEST_SIZE, cbHashObject); +} + +static void +myxor(LPBYTE ptr1, LPBYTE ptr2, DWORD dwLen) { + while (dwLen--) + *ptr1++ ^= *ptr2++; +} + +BOOL +pbkdf2(PUCHAR pbPassword, ULONG cbPassword, PUCHAR pbSalt, ULONG cbSalt, DWORD cIterations, PUCHAR pbDerivedKey, ULONG cbDerivedKey) { + BOOL bStatus = FALSE; + DWORD l, r, dwULen, i, j; + BYTE Ti[DIGEST_SIZE]; + BYTE V[DIGEST_SIZE]; + LPBYTE U = malloc(max((cbSalt + 4), DIGEST_SIZE)); + PRF_CTX prfCtx = {0}; + + if (U == NULL) { + return FALSE; + } + + if (pbPassword == NULL || cbPassword == 0 || pbSalt == NULL || cbSalt == 0 || cIterations == 0 || pbDerivedKey == NULL || cbDerivedKey == 0) { + free(U); + return FALSE; + } + + if (!hmacInit(&prfCtx, pbPassword, cbPassword)) { + goto PBKDF2_end; + } + + l = (DWORD)ceil((double)cbDerivedKey / (double)DIGEST_SIZE); + r = cbDerivedKey - (l - 1) * DIGEST_SIZE; + + for (i = 1; i <= l; i++) { + ZeroMemory(Ti, DIGEST_SIZE); + for (j = 0; j < cIterations; j++) { + if (j == 0) { + /* construct first input for PRF */ + (void)memcpy_s(U, cbSalt, pbSalt, cbSalt); + U[cbSalt] = (BYTE)((i & 0xFF000000) >> 24); + U[cbSalt + 1] = (BYTE)((i & 0x00FF0000) >> 16); + U[cbSalt + 2] = (BYTE)((i & 0x0000FF00) >> 8); + U[cbSalt + 3] = (BYTE)((i & 0x000000FF)); + dwULen = cbSalt + 4; + } + else { + (void)memcpy_s(U, DIGEST_SIZE, V, DIGEST_SIZE); + dwULen = DIGEST_SIZE; + } + + if (!hmacCalculate(&prfCtx, U, dwULen, V)) { + goto PBKDF2_end; + } + + myxor(Ti, V, DIGEST_SIZE); + } + + if (i != l) { + (void)memcpy_s(&pbDerivedKey[(i - 1) * DIGEST_SIZE], cbDerivedKey - (i - 1) * DIGEST_SIZE, Ti, DIGEST_SIZE); + } + else { + /* Take only the first r bytes */ + (void)memcpy_s(&pbDerivedKey[(i - 1) * DIGEST_SIZE], cbDerivedKey - (i - 1) * DIGEST_SIZE, Ti, r); + } + } + + bStatus = TRUE; + +PBKDF2_end: + + hmacFree(&prfCtx); + free(U); + return bStatus; +} + +bool +_zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, zip_uint16_t iterations, zip_uint8_t *output, zip_uint16_t output_length) { + return (key_length <= ZIP_UINT32_MAX) && pbkdf2((PUCHAR)key, (ULONG)key_length, (PUCHAR)salt, salt_length, iterations, output, output_length); +} + +#endif + + +struct _zip_crypto_aes_s { + BCRYPT_ALG_HANDLE hAlgorithm; + BCRYPT_KEY_HANDLE hKey; + ULONG cbKeyObject; + PUCHAR pbKeyObject; +}; + +_zip_crypto_aes_t * +_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) { + _zip_crypto_aes_t *aes = (_zip_crypto_aes_t *)calloc(1, sizeof(*aes)); + + ULONG cbResult; + ULONG key_length = key_size / 8; + + if (aes == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&aes->hAlgorithm, BCRYPT_AES_ALGORITHM, NULL, 0))) { + _zip_crypto_aes_free(aes); + return NULL; + } + + if (!BCRYPT_SUCCESS(BCryptSetProperty(aes->hAlgorithm, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_ECB, sizeof(BCRYPT_CHAIN_MODE_ECB), 0))) { + _zip_crypto_aes_free(aes); + return NULL; + } + + if (!BCRYPT_SUCCESS(BCryptGetProperty(aes->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&aes->cbKeyObject, sizeof(aes->cbKeyObject), &cbResult, 0))) { + _zip_crypto_aes_free(aes); + return NULL; + } + + aes->pbKeyObject = malloc(aes->cbKeyObject); + if (aes->pbKeyObject == NULL) { + _zip_crypto_aes_free(aes); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (!BCRYPT_SUCCESS(BCryptGenerateSymmetricKey(aes->hAlgorithm, &aes->hKey, aes->pbKeyObject, aes->cbKeyObject, (PUCHAR)key, key_length, 0))) { + _zip_crypto_aes_free(aes); + return NULL; + } + + return aes; +} + +void +_zip_crypto_aes_free(_zip_crypto_aes_t *aes) { + if (aes == NULL) { + return; + } + + if (aes->hKey != NULL) { + BCryptDestroyKey(aes->hKey); + } + + if (aes->pbKeyObject != NULL) { + free(aes->pbKeyObject); + } + + if (aes->hAlgorithm != NULL) { + BCryptCloseAlgorithmProvider(aes->hAlgorithm, 0); + } + + free(aes); +} + +bool +_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) { + ULONG cbResult; + NTSTATUS status = BCryptEncrypt(aes->hKey, (PUCHAR)in, ZIP_CRYPTO_AES_BLOCK_LENGTH, NULL, NULL, 0, (PUCHAR)out, ZIP_CRYPTO_AES_BLOCK_LENGTH, &cbResult, 0); + return BCRYPT_SUCCESS(status); +} + +struct _zip_crypto_hmac_s { + BCRYPT_ALG_HANDLE hAlgorithm; + BCRYPT_HASH_HANDLE hHash; + DWORD cbHashObject; + PUCHAR pbHashObject; + DWORD cbHash; + PUCHAR pbHash; +}; + +/* https://code.msdn.microsoft.com/windowsdesktop/Hmac-Computation-Sample-11fe8ec1/sourcecode?fileId=42820&pathId=283874677 */ + +_zip_crypto_hmac_t * +_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) { + NTSTATUS status; + ULONG cbResult; + _zip_crypto_hmac_t *hmac; + + if (secret_length > INT_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + hmac = (_zip_crypto_hmac_t *)calloc(1, sizeof(*hmac)); + + if (hmac == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + status = BCryptOpenAlgorithmProvider(&hmac->hAlgorithm, BCRYPT_SHA1_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); + if (!BCRYPT_SUCCESS(status)) { + _zip_crypto_hmac_free(hmac); + return NULL; + } + + status = BCryptGetProperty(hmac->hAlgorithm, BCRYPT_OBJECT_LENGTH, (PUCHAR)&hmac->cbHashObject, sizeof(hmac->cbHashObject), &cbResult, 0); + if (!BCRYPT_SUCCESS(status)) { + _zip_crypto_hmac_free(hmac); + return NULL; + } + + hmac->pbHashObject = malloc(hmac->cbHashObject); + if (hmac->pbHashObject == NULL) { + _zip_crypto_hmac_free(hmac); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + status = BCryptGetProperty(hmac->hAlgorithm, BCRYPT_HASH_LENGTH, (PUCHAR)&hmac->cbHash, sizeof(hmac->cbHash), &cbResult, 0); + if (!BCRYPT_SUCCESS(status)) { + _zip_crypto_hmac_free(hmac); + return NULL; + } + + hmac->pbHash = malloc(hmac->cbHash); + if (hmac->pbHash == NULL) { + _zip_crypto_hmac_free(hmac); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + status = BCryptCreateHash(hmac->hAlgorithm, &hmac->hHash, hmac->pbHashObject, hmac->cbHashObject, (PUCHAR)secret, (ULONG)secret_length, 0); + if (!BCRYPT_SUCCESS(status)) { + _zip_crypto_hmac_free(hmac); + return NULL; + } + + return hmac; +} + +void +_zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { + if (hmac == NULL) { + return; + } + + if (hmac->hHash != NULL) { + BCryptDestroyHash(hmac->hHash); + } + + if (hmac->pbHash != NULL) { + free(hmac->pbHash); + } + + if (hmac->pbHashObject != NULL) { + free(hmac->pbHashObject); + } + + if (hmac->hAlgorithm) { + BCryptCloseAlgorithmProvider(hmac->hAlgorithm, 0); + } + + free(hmac); +} + +bool +_zip_crypto_hmac(_zip_crypto_hmac_t *hmac, zip_uint8_t *data, zip_uint64_t length) { + if (hmac == NULL || length > ULONG_MAX) { + return false; + } + + return BCRYPT_SUCCESS(BCryptHashData(hmac->hHash, data, (ULONG)length, 0)); +} + +bool +_zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data) { + if (hmac == NULL) { + return false; + } + + return BCRYPT_SUCCESS(BCryptFinishHash(hmac->hHash, data, hmac->cbHash, 0)); +} + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + return BCRYPT_SUCCESS(BCryptGenRandom(NULL, buffer, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG)); +} diff --git a/deps/libzip/lib/zip_crypto_win.h b/deps/libzip/lib/zip_crypto_win.h new file mode 100644 index 00000000000000..a533fe2df3c19c --- /dev/null +++ b/deps/libzip/lib/zip_crypto_win.h @@ -0,0 +1,53 @@ +/* + zip_crypto_win.h -- Windows Crypto API wrapper. + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HAD_ZIP_CRYPTO_WIN_H +#define HAD_ZIP_CRYPTO_WIN_H + +#define HAVE_SECURE_RANDOM + +typedef struct _zip_crypto_aes_s _zip_crypto_aes_t; +typedef struct _zip_crypto_hmac_s _zip_crypto_hmac_t; + +void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); +_zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error); +bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out); + +bool _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_uint8_t *salt, zip_uint16_t salt_length, zip_uint16_t iterations, zip_uint8_t *output, zip_uint16_t output_length); + +_zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error); +void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac); +bool _zip_crypto_hmac(_zip_crypto_hmac_t *hmac, zip_uint8_t *data, zip_uint64_t length); +bool _zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data); + +#endif /* HAD_ZIP_CRYPTO_WIN_H */ diff --git a/deps/libzip/lib/zip_delete.c b/deps/libzip/lib/zip_delete.c new file mode 100644 index 00000000000000..676c16bf2437d7 --- /dev/null +++ b/deps/libzip/lib/zip_delete.c @@ -0,0 +1,68 @@ +/* + zip_delete.c -- delete file from zip archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_delete(zip_t *za, zip_uint64_t idx) { + const char *name; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if ((name = _zip_get_name(za, idx, 0, &za->error)) == NULL) { + return -1; + } + + if (!_zip_hash_delete(za->names, (const zip_uint8_t *)name, &za->error)) { + return -1; + } + + /* allow duplicate file names, because the file will + * be removed directly afterwards */ + if (_zip_unchange(za, idx, 1) != 0) + return -1; + + za->entry[idx].deleted = 1; + + return 0; +} diff --git a/deps/libzip/lib/zip_dir_add.c b/deps/libzip/lib/zip_dir_add.c new file mode 100644 index 00000000000000..c01081916abcc4 --- /dev/null +++ b/deps/libzip/lib/zip_dir_add.c @@ -0,0 +1,92 @@ +/* + zip_dir_add.c -- add directory + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +ZIP_EXTERN zip_int64_t +zip_dir_add(zip_t *za, const char *name, zip_flags_t flags) { + size_t len; + zip_int64_t idx; + char *s; + zip_source_t *source; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (name == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + s = NULL; + len = strlen(name); + + if (name[len - 1] != '/') { + if (len > SIZE_MAX - 2 || (s = (char *)malloc(len + 2)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + (void)strncpy_s(s, len + 2, name, len); + s[len] = '/'; + s[len + 1] = '\0'; + } + + if ((source = zip_source_buffer(za, NULL, 0, 0)) == NULL) { + free(s); + return -1; + } + + idx = _zip_file_replace(za, ZIP_UINT64_MAX, s ? s : name, source, flags); + + free(s); + + if (idx < 0) + zip_source_free(source); + else { + if (zip_file_set_external_attributes(za, (zip_uint64_t)idx, 0, ZIP_OPSYS_DEFAULT, ZIP_EXT_ATTRIB_DEFAULT_DIR) < 0) { + zip_delete(za, (zip_uint64_t)idx); + return -1; + } + } + + return idx; +} diff --git a/deps/libzip/lib/zip_dirent.c b/deps/libzip/lib/zip_dirent.c new file mode 100644 index 00000000000000..7649553088a734 --- /dev/null +++ b/deps/libzip/lib/zip_dirent.c @@ -0,0 +1,1156 @@ +/* + zip_dirent.c -- read directory entry (local or central), clean dirent + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include +#include +#include + +#include "zipint.h" + +static zip_string_t *_zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str); +static zip_extra_field_t *_zip_ef_utf8(zip_uint16_t, zip_string_t *, zip_error_t *); +static bool _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error); + + +void +_zip_cdir_free(zip_cdir_t *cd) { + zip_uint64_t i; + + if (!cd) + return; + + for (i = 0; i < cd->nentry; i++) + _zip_entry_finalize(cd->entry + i); + free(cd->entry); + _zip_string_free(cd->comment); + free(cd); +} + + +zip_cdir_t * +_zip_cdir_new(zip_uint64_t nentry, zip_error_t *error) { + zip_cdir_t *cd; + + if ((cd = (zip_cdir_t *)malloc(sizeof(*cd))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + cd->entry = NULL; + cd->nentry = cd->nentry_alloc = 0; + cd->size = cd->offset = 0; + cd->comment = NULL; + cd->is_zip64 = false; + + if (!_zip_cdir_grow(cd, nentry, error)) { + _zip_cdir_free(cd); + return NULL; + } + + return cd; +} + + +bool +_zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *error) { + zip_uint64_t i, new_alloc; + zip_entry_t *new_entry; + + if (additional_entries == 0) { + return true; + } + + new_alloc = cd->nentry_alloc + additional_entries; + + if (new_alloc < additional_entries || new_alloc > SIZE_MAX / sizeof(*(cd->entry))) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + if ((new_entry = (zip_entry_t *)realloc(cd->entry, sizeof(*(cd->entry)) * (size_t)new_alloc)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + cd->entry = new_entry; + + for (i = cd->nentry; i < new_alloc; i++) { + _zip_entry_init(cd->entry + i); + } + + cd->nentry = cd->nentry_alloc = new_alloc; + + return true; +} + + +zip_int64_t +_zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors) { + zip_uint64_t offset, size; + zip_string_t *comment; + zip_uint8_t buf[EOCDLEN + EOCD64LEN + EOCD64LOCLEN]; + zip_buffer_t *buffer; + zip_int64_t off; + zip_uint64_t i; + bool is_zip64; + int ret; + + if ((off = zip_source_tell_write(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + offset = (zip_uint64_t)off; + + is_zip64 = false; + + for (i = 0; i < survivors; i++) { + zip_entry_t *entry = za->entry + filelist[i].idx; + + if ((ret = _zip_dirent_write(za, entry->changes ? entry->changes : entry->orig, ZIP_FL_CENTRAL)) < 0) + return -1; + if (ret) + is_zip64 = true; + } + + if ((off = zip_source_tell_write(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + size = (zip_uint64_t)off - offset; + + if (offset > ZIP_UINT32_MAX || survivors > ZIP_UINT16_MAX) + is_zip64 = true; + + + if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (is_zip64) { + _zip_buffer_put(buffer, EOCD64_MAGIC, 4); + _zip_buffer_put_64(buffer, EOCD64LEN - 12); + _zip_buffer_put_16(buffer, 45); + _zip_buffer_put_16(buffer, 45); + _zip_buffer_put_32(buffer, 0); + _zip_buffer_put_32(buffer, 0); + _zip_buffer_put_64(buffer, survivors); + _zip_buffer_put_64(buffer, survivors); + _zip_buffer_put_64(buffer, size); + _zip_buffer_put_64(buffer, offset); + _zip_buffer_put(buffer, EOCD64LOC_MAGIC, 4); + _zip_buffer_put_32(buffer, 0); + _zip_buffer_put_64(buffer, offset + size); + _zip_buffer_put_32(buffer, 1); + } + + _zip_buffer_put(buffer, EOCD_MAGIC, 4); + _zip_buffer_put_32(buffer, 0); + _zip_buffer_put_16(buffer, (zip_uint16_t)(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : survivors)); + _zip_buffer_put_16(buffer, (zip_uint16_t)(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : survivors)); + _zip_buffer_put_32(buffer, size >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)size); + _zip_buffer_put_32(buffer, offset >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)offset); + + comment = za->comment_changed ? za->comment_changes : za->comment_orig; + + _zip_buffer_put_16(buffer, (zip_uint16_t)(comment ? comment->length : 0)); + + if (!_zip_buffer_ok(buffer)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(buffer); + return -1; + } + + if (_zip_write(za, _zip_buffer_data(buffer), _zip_buffer_offset(buffer)) < 0) { + _zip_buffer_free(buffer); + return -1; + } + + _zip_buffer_free(buffer); + + if (comment) { + if (_zip_write(za, comment->raw, comment->length) < 0) { + return -1; + } + } + + return (zip_int64_t)size; +} + + +zip_dirent_t * +_zip_dirent_clone(const zip_dirent_t *sde) { + zip_dirent_t *tde; + + if ((tde = (zip_dirent_t *)malloc(sizeof(*tde))) == NULL) + return NULL; + + if (sde) + (void)memcpy_s(tde, sizeof(*tde), sde, sizeof(*sde)); + else + _zip_dirent_init(tde); + + tde->changed = 0; + tde->cloned = 1; + + return tde; +} + + +void +_zip_dirent_finalize(zip_dirent_t *zde) { + if (!zde->cloned || zde->changed & ZIP_DIRENT_FILENAME) { + _zip_string_free(zde->filename); + zde->filename = NULL; + } + if (!zde->cloned || zde->changed & ZIP_DIRENT_EXTRA_FIELD) { + _zip_ef_free(zde->extra_fields); + zde->extra_fields = NULL; + } + if (!zde->cloned || zde->changed & ZIP_DIRENT_COMMENT) { + _zip_string_free(zde->comment); + zde->comment = NULL; + } + if (!zde->cloned || zde->changed & ZIP_DIRENT_PASSWORD) { + if (zde->password) { + _zip_crypto_clear(zde->password, strlen(zde->password)); + } + free(zde->password); + zde->password = NULL; + } +} + + +void +_zip_dirent_free(zip_dirent_t *zde) { + if (zde == NULL) + return; + + _zip_dirent_finalize(zde); + free(zde); +} + + +void +_zip_dirent_init(zip_dirent_t *de) { + de->changed = 0; + de->local_extra_fields_read = 0; + de->cloned = 0; + + de->crc_valid = true; + de->version_madeby = 63 | (ZIP_OPSYS_DEFAULT << 8); + de->version_needed = 10; /* 1.0 */ + de->bitflags = 0; + de->comp_method = ZIP_CM_DEFAULT; + de->last_mod = 0; + de->crc = 0; + de->comp_size = 0; + de->uncomp_size = 0; + de->filename = NULL; + de->extra_fields = NULL; + de->comment = NULL; + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = ZIP_EXT_ATTRIB_DEFAULT; + de->offset = 0; + de->compression_level = 0; + de->encryption_method = ZIP_EM_NONE; + de->password = NULL; +} + + +bool +_zip_dirent_needs_zip64(const zip_dirent_t *de, zip_flags_t flags) { + if (de->uncomp_size >= ZIP_UINT32_MAX || de->comp_size >= ZIP_UINT32_MAX || ((flags & ZIP_FL_CENTRAL) && de->offset >= ZIP_UINT32_MAX)) + return true; + + return false; +} + + +zip_dirent_t * +_zip_dirent_new(void) { + zip_dirent_t *de; + + if ((de = (zip_dirent_t *)malloc(sizeof(*de))) == NULL) + return NULL; + + _zip_dirent_init(de); + return de; +} + + +/* _zip_dirent_read(zde, fp, bufp, left, localp, error): + Fills the zip directory entry zde. + + If buffer is non-NULL, data is taken from there; otherwise data is read from fp as needed. + + If local is true, it reads a local header instead of a central directory entry. + + Returns size of dirent read if successful. On error, error is filled in and -1 is returned. +*/ + +zip_int64_t +_zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error) { + zip_uint8_t buf[CDENTRYSIZE]; + zip_uint16_t dostime, dosdate; + zip_uint32_t size, variable_size; + zip_uint16_t filename_len, comment_len, ef_len; + + bool from_buffer = (buffer != NULL); + + size = local ? LENTRYSIZE : CDENTRYSIZE; + + if (buffer) { + if (_zip_buffer_left(buffer) < size) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + } + else { + if ((buffer = _zip_buffer_new_from_source(src, size, buf, error)) == NULL) { + return -1; + } + } + + if (memcmp(_zip_buffer_get(buffer, 4), (local ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + + /* convert buffercontents to zip_dirent */ + + _zip_dirent_init(zde); + if (!local) + zde->version_madeby = _zip_buffer_get_16(buffer); + else + zde->version_madeby = 0; + zde->version_needed = _zip_buffer_get_16(buffer); + zde->bitflags = _zip_buffer_get_16(buffer); + zde->comp_method = _zip_buffer_get_16(buffer); + + /* convert to time_t */ + dostime = _zip_buffer_get_16(buffer); + dosdate = _zip_buffer_get_16(buffer); + zde->last_mod = _zip_d2u_time(dostime, dosdate); + + zde->crc = _zip_buffer_get_32(buffer); + zde->comp_size = _zip_buffer_get_32(buffer); + zde->uncomp_size = _zip_buffer_get_32(buffer); + + filename_len = _zip_buffer_get_16(buffer); + ef_len = _zip_buffer_get_16(buffer); + + if (local) { + comment_len = 0; + zde->disk_number = 0; + zde->int_attrib = 0; + zde->ext_attrib = 0; + zde->offset = 0; + } + else { + comment_len = _zip_buffer_get_16(buffer); + zde->disk_number = _zip_buffer_get_16(buffer); + zde->int_attrib = _zip_buffer_get_16(buffer); + zde->ext_attrib = _zip_buffer_get_32(buffer); + zde->offset = _zip_buffer_get_32(buffer); + } + + if (!_zip_buffer_ok(buffer)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + + if (zde->bitflags & ZIP_GPBF_ENCRYPTED) { + if (zde->bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { + /* TODO */ + zde->encryption_method = ZIP_EM_UNKNOWN; + } + else { + zde->encryption_method = ZIP_EM_TRAD_PKWARE; + } + } + else { + zde->encryption_method = ZIP_EM_NONE; + } + + zde->filename = NULL; + zde->extra_fields = NULL; + zde->comment = NULL; + + variable_size = (zip_uint32_t)filename_len + (zip_uint32_t)ef_len + (zip_uint32_t)comment_len; + + if (from_buffer) { + if (_zip_buffer_left(buffer) < variable_size) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_VARIABLE_SIZE_OVERFLOW); + return -1; + } + } + else { + _zip_buffer_free(buffer); + + if ((buffer = _zip_buffer_new_from_source(src, variable_size, NULL, error)) == NULL) { + return -1; + } + } + + if (filename_len) { + zde->filename = _zip_read_string(buffer, src, filename_len, 1, error); + if (!zde->filename) { + if (zip_error_code_zip(error) == ZIP_ER_EOF) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_VARIABLE_SIZE_OVERFLOW); + } + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + + if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { + if (_zip_guess_encoding(zde->filename, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_UTF8_IN_FILENAME); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + } + } + + if (ef_len) { + zip_uint8_t *ef = _zip_read_data(buffer, src, ef_len, 0, error); + + if (ef == NULL) { + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + if (!_zip_ef_parse(ef, ef_len, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, &zde->extra_fields, error)) { + free(ef); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + free(ef); + if (local) + zde->local_extra_fields_read = 1; + } + + if (comment_len) { + zde->comment = _zip_read_string(buffer, src, comment_len, 0, error); + if (!zde->comment) { + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { + if (_zip_guess_encoding(zde->comment, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_UTF8_IN_COMMENT); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + } + } + + zde->filename = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_NAME, zde->filename); + zde->comment = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_COMMENT, zde->comment); + + /* Zip64 */ + + if (zde->uncomp_size == ZIP_UINT32_MAX || zde->comp_size == ZIP_UINT32_MAX || zde->offset == ZIP_UINT32_MAX) { + zip_uint16_t got_len; + const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error); + if (ef != NULL) { + if (!zip_dirent_process_ef_zip64(zde, ef, got_len, local, error)) { + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + } + } + + + if (!_zip_buffer_ok(buffer)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + if (!from_buffer) { + _zip_buffer_free(buffer); + } + + /* zip_source_seek / zip_source_tell don't support values > ZIP_INT64_MAX */ + if (zde->offset > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return -1; + } + + if (!_zip_dirent_process_winzip_aes(zde, error)) { + return -1; + } + + zde->extra_fields = _zip_ef_remove_internal(zde->extra_fields); + + return (zip_int64_t)size + (zip_int64_t)variable_size; +} + +bool zip_dirent_process_ef_zip64(zip_dirent_t* zde, const zip_uint8_t* ef, zip_uint64_t got_len, bool local, zip_error_t* error) { + zip_buffer_t *ef_buffer; + + if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + if (zde->uncomp_size == ZIP_UINT32_MAX) { + zde->uncomp_size = _zip_buffer_get_64(ef_buffer); + } + else if (local) { + /* From appnote.txt: This entry in the Local header MUST + include BOTH original and compressed file size fields. */ + (void)_zip_buffer_skip(ef_buffer, 8); /* error is caught by _zip_buffer_eof() call */ + } + if (zde->comp_size == ZIP_UINT32_MAX) { + zde->comp_size = _zip_buffer_get_64(ef_buffer); + } + if (!local) { + if (zde->offset == ZIP_UINT32_MAX) { + zde->offset = _zip_buffer_get_64(ef_buffer); + } + if (zde->disk_number == ZIP_UINT16_MAX) { + zde->disk_number = _zip_buffer_get_32(ef_buffer); + } + } + + if (!_zip_buffer_eof(ef_buffer)) { + /* accept additional fields if values match */ + bool ok = true; + switch (got_len) { + case 28: + _zip_buffer_set_offset(ef_buffer, 24); + if (zde->disk_number != _zip_buffer_get_32(ef_buffer)) { + ok = false; + } + /* fallthrough */ + case 24: + _zip_buffer_set_offset(ef_buffer, 0); + if ((zde->uncomp_size != _zip_buffer_get_64(ef_buffer)) || (zde->comp_size != _zip_buffer_get_64(ef_buffer)) || (zde->offset != _zip_buffer_get_64(ef_buffer))) { + ok = false; + } + break; + + default: + ok = false; + } + if (!ok) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_ZIP64_EF); + _zip_buffer_free(ef_buffer); + return false; + } + } + _zip_buffer_free(ef_buffer); + + return true; +} + + +static zip_string_t * +_zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str) { + zip_uint16_t ef_len; + zip_uint32_t ef_crc; + zip_buffer_t *buffer; + + const zip_uint8_t *ef = _zip_ef_get_by_id(de->extra_fields, &ef_len, id, 0, ZIP_EF_BOTH, NULL); + + if (ef == NULL || ef_len < 5 || ef[0] != 1) { + return str; + } + + if ((buffer = _zip_buffer_new((zip_uint8_t *)ef, ef_len)) == NULL) { + return str; + } + + _zip_buffer_get_8(buffer); + ef_crc = _zip_buffer_get_32(buffer); + + if (_zip_string_crc32(str) == ef_crc) { + zip_uint16_t len = (zip_uint16_t)_zip_buffer_left(buffer); + zip_string_t *ef_str = _zip_string_new(_zip_buffer_get(buffer, len), len, ZIP_FL_ENC_UTF_8, NULL); + + if (ef_str != NULL) { + _zip_string_free(str); + str = ef_str; + } + } + + _zip_buffer_free(buffer); + + return str; +} + + +static bool +_zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error) { + zip_uint16_t ef_len; + zip_buffer_t *buffer; + const zip_uint8_t *ef; + bool crc_valid; + zip_uint16_t enc_method; + + + if (de->comp_method != ZIP_CM_WINZIP_AES) { + return true; + } + + ef = _zip_ef_get_by_id(de->extra_fields, &ef_len, ZIP_EF_WINZIP_AES, 0, ZIP_EF_BOTH, NULL); + + if (ef == NULL || ef_len < 7) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_WINZIPAES_EF); + return false; + } + + if ((buffer = _zip_buffer_new((zip_uint8_t *)ef, ef_len)) == NULL) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return false; + } + + /* version */ + + crc_valid = true; + switch (_zip_buffer_get_16(buffer)) { + case 1: + break; + + case 2: + crc_valid = false; + /* TODO: When checking consistency, check that crc is 0. */ + break; + + default: + zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); + _zip_buffer_free(buffer); + return false; + } + + /* vendor */ + if (memcmp(_zip_buffer_get(buffer, 2), "AE", 2) != 0) { + zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); + _zip_buffer_free(buffer); + return false; + } + + /* mode */ + switch (_zip_buffer_get_8(buffer)) { + case 1: + enc_method = ZIP_EM_AES_128; + break; + case 2: + enc_method = ZIP_EM_AES_192; + break; + case 3: + enc_method = ZIP_EM_AES_256; + break; + default: + zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); + _zip_buffer_free(buffer); + return false; + } + + if (ef_len != 7) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_WINZIPAES_EF); + _zip_buffer_free(buffer); + return false; + } + + de->crc_valid = crc_valid; + de->encryption_method = enc_method; + de->comp_method = _zip_buffer_get_16(buffer); + + _zip_buffer_free(buffer); + return true; +} + + +zip_int32_t +_zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error) { + zip_int32_t size; + bool local = (flags & ZIP_EF_LOCAL) != 0; + int i; + zip_uint8_t b[6]; + zip_buffer_t *buffer; + + size = local ? LENTRYSIZE : CDENTRYSIZE; + + if (zip_source_seek(src, local ? 26 : 28, SEEK_CUR) < 0) { + zip_error_set_from_source(error, src); + return -1; + } + + if ((buffer = _zip_buffer_new_from_source(src, local ? 4 : 6, b, error)) == NULL) { + return -1; + } + + for (i = 0; i < (local ? 2 : 3); i++) { + size += _zip_buffer_get_16(buffer); + } + + if (!_zip_buffer_eof(buffer)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(buffer); + return -1; + } + + _zip_buffer_free(buffer); + return size; +} + + +/* _zip_dirent_write + Writes zip directory entry. + + If flags & ZIP_EF_LOCAL, it writes a local header instead of a central + directory entry. If flags & ZIP_EF_FORCE_ZIP64, a ZIP64 extra field is written, even if not needed. + + Returns 0 if successful, 1 if successful and wrote ZIP64 extra field. On error, error is filled in and -1 is + returned. +*/ + +int +_zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags) { + zip_uint16_t dostime, dosdate; + zip_encoding_type_t com_enc, name_enc; + zip_extra_field_t *ef; + zip_extra_field_t *ef64; + zip_uint32_t ef_total_size; + bool is_zip64; + bool is_really_zip64; + bool is_winzip_aes; + zip_uint8_t buf[CDENTRYSIZE]; + zip_buffer_t *buffer; + + ef = NULL; + + name_enc = _zip_guess_encoding(de->filename, ZIP_ENCODING_UNKNOWN); + com_enc = _zip_guess_encoding(de->comment, ZIP_ENCODING_UNKNOWN); + + if ((name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_ASCII) || (name_enc == ZIP_ENCODING_ASCII && com_enc == ZIP_ENCODING_UTF8_KNOWN) || (name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_UTF8_KNOWN)) + de->bitflags |= ZIP_GPBF_ENCODING_UTF_8; + else { + de->bitflags &= (zip_uint16_t)~ZIP_GPBF_ENCODING_UTF_8; + if (name_enc == ZIP_ENCODING_UTF8_KNOWN) { + ef = _zip_ef_utf8(ZIP_EF_UTF_8_NAME, de->filename, &za->error); + if (ef == NULL) + return -1; + } + if ((flags & ZIP_FL_LOCAL) == 0 && com_enc == ZIP_ENCODING_UTF8_KNOWN) { + zip_extra_field_t *ef2 = _zip_ef_utf8(ZIP_EF_UTF_8_COMMENT, de->comment, &za->error); + if (ef2 == NULL) { + _zip_ef_free(ef); + return -1; + } + ef2->next = ef; + ef = ef2; + } + } + + if (de->encryption_method == ZIP_EM_NONE) { + de->bitflags &= (zip_uint16_t)~ZIP_GPBF_ENCRYPTED; + } + else { + de->bitflags |= (zip_uint16_t)ZIP_GPBF_ENCRYPTED; + } + + is_really_zip64 = _zip_dirent_needs_zip64(de, flags); + is_zip64 = (flags & (ZIP_FL_LOCAL | ZIP_FL_FORCE_ZIP64)) == (ZIP_FL_LOCAL | ZIP_FL_FORCE_ZIP64) || is_really_zip64; + is_winzip_aes = de->encryption_method == ZIP_EM_AES_128 || de->encryption_method == ZIP_EM_AES_192 || de->encryption_method == ZIP_EM_AES_256; + + if (is_zip64) { + zip_uint8_t ef_zip64[EFZIP64SIZE]; + zip_buffer_t *ef_buffer = _zip_buffer_new(ef_zip64, sizeof(ef_zip64)); + if (ef_buffer == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_ef_free(ef); + return -1; + } + + if (flags & ZIP_FL_LOCAL) { + if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX) { + _zip_buffer_put_64(ef_buffer, de->uncomp_size); + _zip_buffer_put_64(ef_buffer, de->comp_size); + } + } + else { + if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX || de->offset > ZIP_UINT32_MAX) { + if (de->uncomp_size >= ZIP_UINT32_MAX) { + _zip_buffer_put_64(ef_buffer, de->uncomp_size); + } + if (de->comp_size >= ZIP_UINT32_MAX) { + _zip_buffer_put_64(ef_buffer, de->comp_size); + } + if (de->offset >= ZIP_UINT32_MAX) { + _zip_buffer_put_64(ef_buffer, de->offset); + } + } + } + + if (!_zip_buffer_ok(ef_buffer)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(ef_buffer); + _zip_ef_free(ef); + return -1; + } + + ef64 = _zip_ef_new(ZIP_EF_ZIP64, (zip_uint16_t)(_zip_buffer_offset(ef_buffer)), ef_zip64, ZIP_EF_BOTH); + _zip_buffer_free(ef_buffer); + ef64->next = ef; + ef = ef64; + } + + if (is_winzip_aes) { + zip_uint8_t data[EF_WINZIP_AES_SIZE]; + zip_buffer_t *ef_buffer = _zip_buffer_new(data, sizeof(data)); + zip_extra_field_t *ef_winzip; + + if (ef_buffer == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_ef_free(ef); + return -1; + } + + _zip_buffer_put_16(ef_buffer, 2); + _zip_buffer_put(ef_buffer, "AE", 2); + _zip_buffer_put_8(ef_buffer, (zip_uint8_t)(de->encryption_method & 0xff)); + _zip_buffer_put_16(ef_buffer, (zip_uint16_t)de->comp_method); + + if (!_zip_buffer_ok(ef_buffer)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(ef_buffer); + _zip_ef_free(ef); + return -1; + } + + ef_winzip = _zip_ef_new(ZIP_EF_WINZIP_AES, EF_WINZIP_AES_SIZE, data, ZIP_EF_BOTH); + _zip_buffer_free(ef_buffer); + ef_winzip->next = ef; + ef = ef_winzip; + } + + if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_ef_free(ef); + return -1; + } + + _zip_buffer_put(buffer, (flags & ZIP_FL_LOCAL) ? LOCAL_MAGIC : CENTRAL_MAGIC, 4); + + if ((flags & ZIP_FL_LOCAL) == 0) { + _zip_buffer_put_16(buffer, de->version_madeby); + } + _zip_buffer_put_16(buffer, ZIP_MAX(is_really_zip64 ? 45 : 0, de->version_needed)); + _zip_buffer_put_16(buffer, de->bitflags); + if (is_winzip_aes) { + _zip_buffer_put_16(buffer, ZIP_CM_WINZIP_AES); + } + else { + _zip_buffer_put_16(buffer, (zip_uint16_t)de->comp_method); + } + + _zip_u2d_time(de->last_mod, &dostime, &dosdate); + _zip_buffer_put_16(buffer, dostime); + _zip_buffer_put_16(buffer, dosdate); + + if (is_winzip_aes && de->uncomp_size < 20) { + _zip_buffer_put_32(buffer, 0); + } + else { + _zip_buffer_put_32(buffer, de->crc); + } + + if (((flags & ZIP_FL_LOCAL) == ZIP_FL_LOCAL) && ((de->comp_size >= ZIP_UINT32_MAX) || (de->uncomp_size >= ZIP_UINT32_MAX))) { + /* In local headers, if a ZIP64 EF is written, it MUST contain + * both compressed and uncompressed sizes (even if one of the + * two is smaller than 0xFFFFFFFF); on the other hand, those + * may only appear when the corresponding standard entry is + * 0xFFFFFFFF. (appnote.txt 4.5.3) */ + _zip_buffer_put_32(buffer, ZIP_UINT32_MAX); + _zip_buffer_put_32(buffer, ZIP_UINT32_MAX); + } + else { + if (de->comp_size < ZIP_UINT32_MAX) { + _zip_buffer_put_32(buffer, (zip_uint32_t)de->comp_size); + } + else { + _zip_buffer_put_32(buffer, ZIP_UINT32_MAX); + } + if (de->uncomp_size < ZIP_UINT32_MAX) { + _zip_buffer_put_32(buffer, (zip_uint32_t)de->uncomp_size); + } + else { + _zip_buffer_put_32(buffer, ZIP_UINT32_MAX); + } + } + + _zip_buffer_put_16(buffer, _zip_string_length(de->filename)); + /* TODO: check for overflow */ + ef_total_size = (zip_uint32_t)_zip_ef_size(de->extra_fields, flags) + (zip_uint32_t)_zip_ef_size(ef, ZIP_EF_BOTH); + _zip_buffer_put_16(buffer, (zip_uint16_t)ef_total_size); + + if ((flags & ZIP_FL_LOCAL) == 0) { + _zip_buffer_put_16(buffer, _zip_string_length(de->comment)); + _zip_buffer_put_16(buffer, (zip_uint16_t)de->disk_number); + _zip_buffer_put_16(buffer, de->int_attrib); + _zip_buffer_put_32(buffer, de->ext_attrib); + if (de->offset < ZIP_UINT32_MAX) + _zip_buffer_put_32(buffer, (zip_uint32_t)de->offset); + else + _zip_buffer_put_32(buffer, ZIP_UINT32_MAX); + } + + if (!_zip_buffer_ok(buffer)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(buffer); + _zip_ef_free(ef); + return -1; + } + + if (_zip_write(za, buf, _zip_buffer_offset(buffer)) < 0) { + _zip_buffer_free(buffer); + _zip_ef_free(ef); + return -1; + } + + _zip_buffer_free(buffer); + + if (de->filename) { + if (_zip_string_write(za, de->filename) < 0) { + _zip_ef_free(ef); + return -1; + } + } + + if (ef) { + if (_zip_ef_write(za, ef, ZIP_EF_BOTH) < 0) { + _zip_ef_free(ef); + return -1; + } + } + _zip_ef_free(ef); + if (de->extra_fields) { + if (_zip_ef_write(za, de->extra_fields, flags) < 0) { + return -1; + } + } + + if ((flags & ZIP_FL_LOCAL) == 0) { + if (de->comment) { + if (_zip_string_write(za, de->comment) < 0) { + return -1; + } + } + } + + + return is_zip64; +} + + +time_t +_zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate) { + struct tm tm; + + memset(&tm, 0, sizeof(tm)); + + /* let mktime decide if DST is in effect */ + tm.tm_isdst = -1; + + tm.tm_year = ((ddate >> 9) & 127) + 1980 - 1900; + tm.tm_mon = ((ddate >> 5) & 15) - 1; + tm.tm_mday = ddate & 31; + + tm.tm_hour = (dtime >> 11) & 31; + tm.tm_min = (dtime >> 5) & 63; + tm.tm_sec = (dtime << 1) & 62; + + return mktime(&tm); +} + + +static zip_extra_field_t * +_zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error) { + const zip_uint8_t *raw; + zip_uint32_t len; + zip_buffer_t *buffer; + zip_extra_field_t *ef; + + if ((raw = _zip_string_get(str, &len, ZIP_FL_ENC_RAW, NULL)) == NULL) { + /* error already set */ + return NULL; + } + + if (len + 5 > ZIP_UINT16_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); /* TODO: better error code? */ + return NULL; + } + + if ((buffer = _zip_buffer_new(NULL, len + 5)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + _zip_buffer_put_8(buffer, 1); + _zip_buffer_put_32(buffer, _zip_string_crc32(str)); + _zip_buffer_put(buffer, raw, len); + + if (!_zip_buffer_ok(buffer)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(buffer); + return NULL; + } + + ef = _zip_ef_new(id, (zip_uint16_t)(_zip_buffer_offset(buffer)), _zip_buffer_data(buffer), ZIP_EF_BOTH); + _zip_buffer_free(buffer); + + return ef; +} + + +zip_dirent_t * +_zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error) { + if (error == NULL) + error = &za->error; + + if (idx >= za->nentry) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) || za->entry[idx].changes == NULL) { + if (za->entry[idx].orig == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if (za->entry[idx].deleted && (flags & ZIP_FL_UNCHANGED) == 0) { + zip_error_set(error, ZIP_ER_DELETED, 0); + return NULL; + } + return za->entry[idx].orig; + } + else + return za->entry[idx].changes; +} + + +void +_zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate) { + struct tm *tpm; + struct tm tm; + tpm = zip_localtime(&intime, &tm); + if (tpm == NULL) { + /* if localtime fails, return an arbitrary date (1980-01-01 00:00:00) */ + *ddate = (1 << 5) + 1; + *dtime = 0; + return; + } + if (tpm->tm_year < 80) { + tpm->tm_year = 80; + } + + *ddate = (zip_uint16_t)(((tpm->tm_year + 1900 - 1980) << 9) + ((tpm->tm_mon + 1) << 5) + tpm->tm_mday); + *dtime = (zip_uint16_t)(((tpm->tm_hour) << 11) + ((tpm->tm_min) << 5) + ((tpm->tm_sec) >> 1)); +} + + +void +_zip_dirent_apply_attributes(zip_dirent_t *de, zip_file_attributes_t *attributes, bool force_zip64, zip_uint32_t changed) { + zip_uint16_t length; + + if (attributes->valid & ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS) { + zip_uint16_t mask = attributes->general_purpose_bit_mask & ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS_ALLOWED_MASK; + de->bitflags = (de->bitflags & ~mask) | (attributes->general_purpose_bit_flags & mask); + } + if (attributes->valid & ZIP_FILE_ATTRIBUTES_ASCII) { + de->int_attrib = (de->int_attrib & ~0x1) | (attributes->ascii ? 1 : 0); + } + /* manually set attributes are preferred over attributes provided by source */ + if ((changed & ZIP_DIRENT_ATTRIBUTES) == 0 && (attributes->valid & ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES)) { + de->ext_attrib = attributes->external_file_attributes; + } + + if (de->comp_method == ZIP_CM_LZMA) { + de->version_needed = 63; + } + else if (de->encryption_method == ZIP_EM_AES_128 || de->encryption_method == ZIP_EM_AES_192 || de->encryption_method == ZIP_EM_AES_256) { + de->version_needed = 51; + } + else if (de->comp_method == ZIP_CM_BZIP2) { + de->version_needed = 46; + } + else if (force_zip64 || _zip_dirent_needs_zip64(de, 0)) { + de->version_needed = 45; + } + else if (de->comp_method == ZIP_CM_DEFLATE || de->encryption_method == ZIP_EM_TRAD_PKWARE) { + de->version_needed = 20; + } + else if ((length = _zip_string_length(de->filename)) > 0 && de->filename->raw[length - 1] == '/') { + de->version_needed = 20; + } + else { + de->version_needed = 10; + } + + if (attributes->valid & ZIP_FILE_ATTRIBUTES_VERSION_NEEDED) { + de->version_needed = ZIP_MAX(de->version_needed, attributes->version_needed); + } + + de->version_madeby = 63 | (de->version_madeby & 0xff00); + if ((changed & ZIP_DIRENT_ATTRIBUTES) == 0 && (attributes->valid & ZIP_FILE_ATTRIBUTES_HOST_SYSTEM)) { + de->version_madeby = (de->version_madeby & 0xff) | (zip_uint16_t)(attributes->host_system << 8); + } +} diff --git a/deps/libzip/lib/zip_discard.c b/deps/libzip/lib/zip_discard.c new file mode 100644 index 00000000000000..d1dc4f8b0d14e4 --- /dev/null +++ b/deps/libzip/lib/zip_discard.c @@ -0,0 +1,80 @@ +/* + zip_discard.c -- discard and free struct zip + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +/* zip_discard: + frees the space allocated to a zipfile struct, and closes the + corresponding file. */ + +void +zip_discard(zip_t *za) { + zip_uint64_t i; + + if (za == NULL) + return; + + if (za->src) { + zip_source_close(za->src); + zip_source_free(za->src); + } + + free(za->default_password); + _zip_string_free(za->comment_orig); + _zip_string_free(za->comment_changes); + + _zip_hash_free(za->names); + + if (za->entry) { + for (i = 0; i < za->nentry; i++) + _zip_entry_finalize(za->entry + i); + free(za->entry); + } + + for (i = 0; i < za->nopen_source; i++) { + _zip_source_invalidate(za->open_source[i]); + } + free(za->open_source); + + _zip_progress_free(za->progress); + + zip_error_fini(&za->error); + + free(za); + + return; +} diff --git a/deps/libzip/lib/zip_entry.c b/deps/libzip/lib/zip_entry.c new file mode 100644 index 00000000000000..35a36e4a1613a9 --- /dev/null +++ b/deps/libzip/lib/zip_entry.c @@ -0,0 +1,51 @@ +/* + zip_entry.c -- struct zip_entry helper functions + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +void +_zip_entry_finalize(zip_entry_t *e) { + _zip_unchange_data(e); + _zip_dirent_free(e->orig); + _zip_dirent_free(e->changes); +} + + +void +_zip_entry_init(zip_entry_t *e) { + e->orig = NULL; + e->changes = NULL; + e->source = NULL; + e->deleted = 0; +} diff --git a/deps/libzip/lib/zip_err_str.c b/deps/libzip/lib/zip_err_str.c new file mode 100644 index 00000000000000..e46d75c229a3a0 --- /dev/null +++ b/deps/libzip/lib/zip_err_str.c @@ -0,0 +1,78 @@ +/* + This file was generated automatically by CMake + from zip.h and zipint.h; make changes there. +*/ + +#include "zipint.h" + +#define L ZIP_ET_LIBZIP +#define N ZIP_ET_NONE +#define S ZIP_ET_SYS +#define Z ZIP_ET_ZLIB + +#define E ZIP_DETAIL_ET_ENTRY +#define G ZIP_DETAIL_ET_GLOBAL + +const struct _zip_err_info _zip_err_str[] = { + { N, "No error" }, + { N, "Multi-disk zip archives not supported" }, + { S, "Renaming temporary file failed" }, + { S, "Closing zip archive failed" }, + { S, "Seek error" }, + { S, "Read error" }, + { S, "Write error" }, + { N, "CRC error" }, + { N, "Containing zip archive was closed" }, + { N, "No such file" }, + { N, "File already exists" }, + { S, "Can't open file" }, + { S, "Failure to create temporary file" }, + { Z, "Zlib error" }, + { N, "Malloc failure" }, + { N, "Entry has been changed" }, + { N, "Compression method not supported" }, + { N, "Premature end of file" }, + { N, "Invalid argument" }, + { N, "Not a zip archive" }, + { N, "Internal error" }, + { L, "Zip archive inconsistent" }, + { S, "Can't remove file" }, + { N, "Entry has been deleted" }, + { N, "Encryption method not supported" }, + { N, "Read-only archive" }, + { N, "No password provided" }, + { N, "Wrong password provided" }, + { N, "Operation not supported" }, + { N, "Resource still in use" }, + { S, "Tell error" }, + { N, "Compressed data invalid" }, + { N, "Operation cancelled" }, + { N, "Unexpected length of data" }, +}; + +const int _zip_err_str_count = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); + +const struct _zip_err_info _zip_err_details[] = { + { G, "no detail" }, + { G, "central directory overlaps EOCD, or there is space between them" }, + { G, "archive comment length incorrect" }, + { G, "central directory length invalid" }, + { E, "central header invalid" }, + { G, "central directory count of entries is incorrect" }, + { E, "local and central headers do not match" }, + { G, "wrong EOCD length" }, + { G, "EOCD64 overlaps EOCD, or there is space between them" }, + { G, "EOCD64 magic incorrect" }, + { G, "EOCD64 and EOCD do not match" }, + { G, "invalid value in central directory" }, + { E, "variable size fields overflow header" }, + { E, "invalid UTF-8 in filename" }, + { E, "invalid UTF-8 in comment" }, + { E, "invalid Zip64 extra field" }, + { E, "invalid WinZip AES extra field" }, + { E, "garbage at end of extra fields" }, + { E, "extra field length is invalid" }, + { E, "file length in header doesn't match actual file length" }, +}; + +const int _zip_err_details_count = sizeof(_zip_err_details)/sizeof(_zip_err_details[0]); diff --git a/deps/libzip/lib/zip_error.c b/deps/libzip/lib/zip_error.c new file mode 100644 index 00000000000000..c498e086054a7c --- /dev/null +++ b/deps/libzip/lib/zip_error.c @@ -0,0 +1,156 @@ +/* + zip_error.c -- zip_error_t helper functions + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_error_code_system(const zip_error_t *error) { + return error->sys_err; +} + + +ZIP_EXTERN int +zip_error_code_zip(const zip_error_t *error) { + return error->zip_err; +} + + +ZIP_EXTERN void +zip_error_fini(zip_error_t *err) { + free(err->str); + err->str = NULL; +} + + +ZIP_EXTERN void +zip_error_init(zip_error_t *err) { + err->zip_err = ZIP_ER_OK; + err->sys_err = 0; + err->str = NULL; +} + +ZIP_EXTERN void +zip_error_init_with_code(zip_error_t *error, int ze) { + zip_error_init(error); + error->zip_err = ze; + switch (zip_error_system_type(error)) { + case ZIP_ET_SYS: + case ZIP_ET_LIBZIP: + error->sys_err = errno; + break; + + default: + error->sys_err = 0; + break; + } +} + + +ZIP_EXTERN int +zip_error_system_type(const zip_error_t *error) { + if (error->zip_err < 0 || error->zip_err >= _zip_err_str_count) + return ZIP_ET_NONE; + + return _zip_err_str[error->zip_err].type; +} + + +void +_zip_error_clear(zip_error_t *err) { + if (err == NULL) + return; + + err->zip_err = ZIP_ER_OK; + err->sys_err = 0; +} + + +void +_zip_error_copy(zip_error_t *dst, const zip_error_t *src) { + if (dst == NULL) { + return; + } + + dst->zip_err = src->zip_err; + dst->sys_err = src->sys_err; +} + + +void +_zip_error_get(const zip_error_t *err, int *zep, int *sep) { + if (zep) + *zep = err->zip_err; + if (sep) { + if (zip_error_system_type(err) != ZIP_ET_NONE) + *sep = err->sys_err; + else + *sep = 0; + } +} + + +void +zip_error_set(zip_error_t *err, int ze, int se) { + if (err) { + err->zip_err = ze; + err->sys_err = se; + } +} + + +void +zip_error_set_from_source(zip_error_t *err, zip_source_t *src) { + if (src == NULL) { + zip_error_set(err, ZIP_ER_INVAL, 0); + return; + } + + _zip_error_copy(err, zip_source_error(src)); +} + + +zip_int64_t +zip_error_to_data(const zip_error_t *error, void *data, zip_uint64_t length) { + int *e = (int *)data; + + if (length < sizeof(int) * 2) { + return -1; + } + + e[0] = zip_error_code_zip(error); + e[1] = zip_error_code_system(error); + return sizeof(int) * 2; +} diff --git a/deps/libzip/lib/zip_error_clear.c b/deps/libzip/lib/zip_error_clear.c new file mode 100644 index 00000000000000..94ff5062d57a11 --- /dev/null +++ b/deps/libzip/lib/zip_error_clear.c @@ -0,0 +1,44 @@ +/* + zip_error_clear.c -- clear zip error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN void +zip_error_clear(zip_t *za) { + if (za == NULL) + return; + + _zip_error_clear(&za->error); +} diff --git a/deps/libzip/lib/zip_error_get.c b/deps/libzip/lib/zip_error_get.c new file mode 100644 index 00000000000000..c0418f0d0c1e76 --- /dev/null +++ b/deps/libzip/lib/zip_error_get.c @@ -0,0 +1,54 @@ +/* + zip_error_get.c -- get zip error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN void +zip_error_get(zip_t *za, int *zep, int *sep) { + _zip_error_get(&za->error, zep, sep); +} + + +ZIP_EXTERN zip_error_t * +zip_get_error(zip_t *za) { + return &za->error; +} + + +ZIP_EXTERN zip_error_t * +zip_file_get_error(zip_file_t *f) { + return &f->error; +} diff --git a/deps/libzip/lib/zip_error_get_sys_type.c b/deps/libzip/lib/zip_error_get_sys_type.c new file mode 100644 index 00000000000000..a22ffb03679dc4 --- /dev/null +++ b/deps/libzip/lib/zip_error_get_sys_type.c @@ -0,0 +1,45 @@ +/* + zip_error_get_sys_type.c -- return type of system error code + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN int +zip_error_get_sys_type(int ze) { + if (ze < 0 || ze >= _zip_err_str_count) { + return 0; + } + + return _zip_err_str[ze].type; +} diff --git a/deps/libzip/lib/zip_error_strerror.c b/deps/libzip/lib/zip_error_strerror.c new file mode 100644 index 00000000000000..fe04cbb4f46014 --- /dev/null +++ b/deps/libzip/lib/zip_error_strerror.c @@ -0,0 +1,128 @@ +/* + zip_error_sterror.c -- get string representation of struct zip_error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include +#include + +#include "zipint.h" + +ZIP_EXTERN const char * +zip_error_strerror(zip_error_t *err) { + const char *zip_error_string, *system_error_string; + char *s; + char *system_error_buffer = NULL; + + zip_error_fini(err); + + if (err->zip_err < 0 || err->zip_err >= _zip_err_str_count) { + system_error_buffer = (char *)malloc(128); + snprintf_s(system_error_buffer, 128, "Unknown error %d", err->zip_err); + system_error_buffer[128 - 1] = '\0'; /* make sure string is NUL-terminated */ + zip_error_string = NULL; + system_error_string = system_error_buffer; + } + else { + zip_error_string = _zip_err_str[err->zip_err].description; + + switch (_zip_err_str[err->zip_err].type) { + case ZIP_ET_SYS: { + size_t len = strerrorlen_s(err->sys_err) + 1; + system_error_buffer = malloc(len); + strerror_s(system_error_buffer, len, err->sys_err); + system_error_string = system_error_buffer; + break; + } + + case ZIP_ET_ZLIB: + system_error_string = zError(err->sys_err); + break; + + case ZIP_ET_LIBZIP: { + zip_uint8_t error = GET_ERROR_FROM_DETAIL(err->sys_err); + int index = GET_INDEX_FROM_DETAIL(err->sys_err); + + if (error == 0) { + system_error_string = NULL; + } + else if (error >= _zip_err_details_count) { + system_error_buffer = (char *)malloc(128); + snprintf_s(system_error_buffer, 128, "invalid detail error %u", error); + system_error_buffer[128 - 1] = '\0'; /* make sure string is NUL-terminated */ + system_error_string = system_error_buffer; + } + else if (_zip_err_details[error].type == ZIP_DETAIL_ET_ENTRY && index < MAX_DETAIL_INDEX) { + system_error_buffer = (char *)malloc(128); + snprintf_s(system_error_buffer, 128, "entry %d: %s", index, _zip_err_details[error].description); + system_error_buffer[128 - 1] = '\0'; /* make sure string is NUL-terminated */ + system_error_string = system_error_buffer; + } + else { + system_error_string = _zip_err_details[error].description; + } + break; + } + + default: + system_error_string = NULL; + } + } + + if (system_error_string == NULL) { + free(system_error_buffer); + return zip_error_string; + } + else { + size_t length = strlen(system_error_string); + if (zip_error_string) { + size_t length_error = strlen(zip_error_string); + if (length + length_error + 2 < length) { + free(system_error_buffer); + return _zip_err_str[ZIP_ER_MEMORY].description; + } + length += length_error + 2; + } + if (length == SIZE_MAX || (s = (char *)malloc(length + 1)) == NULL) { + free(system_error_buffer); + return _zip_err_str[ZIP_ER_MEMORY].description; + } + + snprintf_s(s, length + 1, "%s%s%s", (zip_error_string ? zip_error_string : ""), (zip_error_string ? ": " : ""), system_error_string); + err->str = s; + + free(system_error_buffer); + return s; + } +} diff --git a/deps/libzip/lib/zip_error_to_str.c b/deps/libzip/lib/zip_error_to_str.c new file mode 100644 index 00000000000000..b60b78813b92c9 --- /dev/null +++ b/deps/libzip/lib/zip_error_to_str.c @@ -0,0 +1,58 @@ +/* + zip_error_to_str.c -- get string representation of zip error code + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN int +zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { + zip_error_t error; + const char *error_string; + int ret; + + zip_error_init(&error); + zip_error_set(&error, ze, se); + + error_string = zip_error_strerror(&error); + + ret = snprintf_s(buf, ZIP_MIN(len, SIZE_MAX), error_string, strlen(error_string)); + + zip_error_fini(&error); + + return ret; +} diff --git a/deps/libzip/lib/zip_extra_field.c b/deps/libzip/lib/zip_extra_field.c new file mode 100644 index 00000000000000..7aed12adb55d5f --- /dev/null +++ b/deps/libzip/lib/zip_extra_field.c @@ -0,0 +1,427 @@ +/* + zip_extra_field.c -- manipulate extra fields + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#include "zipint.h" + + +zip_extra_field_t * +_zip_ef_clone(const zip_extra_field_t *ef, zip_error_t *error) { + zip_extra_field_t *head, *prev, *def; + + head = prev = NULL; + + while (ef) { + if ((def = _zip_ef_new(ef->id, ef->size, ef->data, ef->flags)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_ef_free(head); + return NULL; + } + + if (head == NULL) + head = def; + if (prev) + prev->next = def; + prev = def; + + ef = ef->next; + } + + return head; +} + + +zip_extra_field_t * +_zip_ef_delete_by_id(zip_extra_field_t *ef, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags) { + zip_extra_field_t *head, *prev; + int i; + + i = 0; + head = ef; + prev = NULL; + for (; ef; ef = (prev ? prev->next : head)) { + if ((ef->flags & flags & ZIP_EF_BOTH) && ((ef->id == id) || (id == ZIP_EXTRA_FIELD_ALL))) { + if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) { + ef->flags &= ~(flags & ZIP_EF_BOTH); + if ((ef->flags & ZIP_EF_BOTH) == 0) { + if (prev) + prev->next = ef->next; + else + head = ef->next; + ef->next = NULL; + _zip_ef_free(ef); + + if (id_idx == ZIP_EXTRA_FIELD_ALL) + continue; + } + } + + i++; + if (i > id_idx) + break; + } + prev = ef; + } + + return head; +} + + +void +_zip_ef_free(zip_extra_field_t *ef) { + zip_extra_field_t *ef2; + + while (ef) { + ef2 = ef->next; + free(ef->data); + free(ef); + ef = ef2; + } +} + + +const zip_uint8_t * +_zip_ef_get_by_id(const zip_extra_field_t *ef, zip_uint16_t *lenp, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags, zip_error_t *error) { + static const zip_uint8_t empty[1] = {'\0'}; + + int i; + + i = 0; + for (; ef; ef = ef->next) { + if (ef->id == id && (ef->flags & flags & ZIP_EF_BOTH)) { + if (i < id_idx) { + i++; + continue; + } + + if (lenp) + *lenp = ef->size; + if (ef->size > 0) + return ef->data; + else + return empty; + } + } + + zip_error_set(error, ZIP_ER_NOENT, 0); + return NULL; +} + + +zip_extra_field_t * +_zip_ef_merge(zip_extra_field_t *to, zip_extra_field_t *from) { + zip_extra_field_t *ef2, *tt, *tail; + int duplicate; + + if (to == NULL) + return from; + + for (tail = to; tail->next; tail = tail->next) + ; + + for (; from; from = ef2) { + ef2 = from->next; + + duplicate = 0; + for (tt = to; tt; tt = tt->next) { + if (tt->id == from->id && tt->size == from->size && (tt->size == 0 || memcmp(tt->data, from->data, tt->size) == 0)) { + tt->flags |= (from->flags & ZIP_EF_BOTH); + duplicate = 1; + break; + } + } + + from->next = NULL; + if (duplicate) + _zip_ef_free(from); + else + tail = tail->next = from; + } + + return to; +} + + +zip_extra_field_t * +_zip_ef_new(zip_uint16_t id, zip_uint16_t size, const zip_uint8_t *data, zip_flags_t flags) { + zip_extra_field_t *ef; + + if ((ef = (zip_extra_field_t *)malloc(sizeof(*ef))) == NULL) + return NULL; + + ef->next = NULL; + ef->flags = flags; + ef->id = id; + ef->size = size; + if (size > 0) { + if ((ef->data = (zip_uint8_t *)_zip_memdup(data, size, NULL)) == NULL) { + free(ef); + return NULL; + } + } + else + ef->data = NULL; + + return ef; +} + + +bool +_zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, zip_extra_field_t **ef_head_p, zip_error_t *error) { + zip_buffer_t *buffer; + zip_extra_field_t *ef, *ef2, *ef_head; + + if ((buffer = _zip_buffer_new((zip_uint8_t *)data, len)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + ef_head = ef = NULL; + + while (_zip_buffer_ok(buffer) && _zip_buffer_left(buffer) >= 4) { + zip_uint16_t fid, flen; + zip_uint8_t *ef_data; + + fid = _zip_buffer_get_16(buffer); + flen = _zip_buffer_get_16(buffer); + ef_data = _zip_buffer_get(buffer, flen); + + if (ef_data == NULL) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_EF_LENGTH); + _zip_buffer_free(buffer); + _zip_ef_free(ef_head); + return false; + } + + if ((ef2 = _zip_ef_new(fid, flen, ef_data, flags)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_buffer_free(buffer); + _zip_ef_free(ef_head); + return false; + } + + if (ef_head) { + ef->next = ef2; + ef = ef2; + } + else + ef_head = ef = ef2; + } + + if (!_zip_buffer_eof(buffer)) { + /* Android APK files align stored file data with padding in extra fields; ignore. */ + /* see https://android.googlesource.com/platform/build/+/master/tools/zipalign/ZipAlign.cpp */ + /* buffer is at most 64k long, so this can't overflow. */ + size_t glen = _zip_buffer_left(buffer); + zip_uint8_t *garbage; + garbage = _zip_buffer_get(buffer, glen); + if (glen >= 4 || garbage == NULL || memcmp(garbage, "\0\0\0", (size_t)glen) != 0) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EF_TRAILING_GARBAGE); + _zip_buffer_free(buffer); + _zip_ef_free(ef_head); + return false; + } + } + + _zip_buffer_free(buffer); + + if (ef_head_p) { + *ef_head_p = ef_head; + } + else { + _zip_ef_free(ef_head); + } + + return true; +} + + +zip_extra_field_t * +_zip_ef_remove_internal(zip_extra_field_t *ef) { + zip_extra_field_t *ef_head; + zip_extra_field_t *prev, *next; + + ef_head = ef; + prev = NULL; + + while (ef) { + if (ZIP_EF_IS_INTERNAL(ef->id)) { + next = ef->next; + if (ef_head == ef) + ef_head = next; + ef->next = NULL; + _zip_ef_free(ef); + if (prev) + prev->next = next; + ef = next; + } + else { + prev = ef; + ef = ef->next; + } + } + + return ef_head; +} + + +zip_uint16_t +_zip_ef_size(const zip_extra_field_t *ef, zip_flags_t flags) { + zip_uint16_t size; + + size = 0; + for (; ef; ef = ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) + size = (zip_uint16_t)(size + 4 + ef->size); + } + + return size; +} + + +int +_zip_ef_write(zip_t *za, const zip_extra_field_t *ef, zip_flags_t flags) { + zip_uint8_t b[4]; + zip_buffer_t *buffer = _zip_buffer_new(b, sizeof(b)); + + if (buffer == NULL) { + return -1; + } + + for (; ef; ef = ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) { + _zip_buffer_set_offset(buffer, 0); + _zip_buffer_put_16(buffer, ef->id); + _zip_buffer_put_16(buffer, ef->size); + if (!_zip_buffer_ok(buffer)) { + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(buffer); + return -1; + } + if (_zip_write(za, b, 4) < 0) { + _zip_buffer_free(buffer); + return -1; + } + if (ef->size > 0) { + if (_zip_write(za, ef->data, ef->size) < 0) { + _zip_buffer_free(buffer); + return -1; + } + } + } + } + + _zip_buffer_free(buffer); + return 0; +} + + +int +_zip_read_local_ef(zip_t *za, zip_uint64_t idx) { + zip_entry_t *e; + unsigned char b[4]; + zip_buffer_t *buffer; + zip_uint16_t fname_len, ef_len; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + e = za->entry + idx; + + if (e->orig == NULL || e->orig->local_extra_fields_read) + return 0; + + if (e->orig->offset + 26 > ZIP_INT64_MAX) { + zip_error_set(&za->error, ZIP_ER_SEEK, EFBIG); + return -1; + } + + if (zip_source_seek(za->src, (zip_int64_t)(e->orig->offset + 26), SEEK_SET) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + + if ((buffer = _zip_buffer_new_from_source(za->src, sizeof(b), b, &za->error)) == NULL) { + return -1; + } + + fname_len = _zip_buffer_get_16(buffer); + ef_len = _zip_buffer_get_16(buffer); + + if (!_zip_buffer_eof(buffer)) { + _zip_buffer_free(buffer); + zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + _zip_buffer_free(buffer); + + if (ef_len > 0) { + zip_extra_field_t *ef; + zip_uint8_t *ef_raw; + + if (zip_source_seek(za->src, fname_len, SEEK_CUR) < 0) { + zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + ef_raw = _zip_read_data(NULL, za->src, ef_len, 0, &za->error); + + if (ef_raw == NULL) + return -1; + + if (!_zip_ef_parse(ef_raw, ef_len, ZIP_EF_LOCAL, &ef, &za->error)) { + free(ef_raw); + return -1; + } + free(ef_raw); + + if (ef) { + ef = _zip_ef_remove_internal(ef); + e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef); + } + } + + e->orig->local_extra_fields_read = 1; + + if (e->changes && e->changes->local_extra_fields_read == 0) { + e->changes->extra_fields = e->orig->extra_fields; + e->changes->local_extra_fields_read = 1; + } + + return 0; +} diff --git a/deps/libzip/lib/zip_extra_field_api.c b/deps/libzip/lib/zip_extra_field_api.c new file mode 100644 index 00000000000000..cd143f395ccc93 --- /dev/null +++ b/deps/libzip/lib/zip_extra_field_api.c @@ -0,0 +1,355 @@ +/* + zip_extra_field_api.c -- public extra fields API functions + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_file_extra_field_delete(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags) { + zip_dirent_t *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags); + return 0; +} + + +ZIP_EXTERN int +zip_file_extra_field_delete_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags) { + zip_dirent_t *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags); + return 0; +} + + +ZIP_EXTERN const zip_uint8_t * +zip_file_extra_field_get(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags) { + static const zip_uint8_t empty[1] = {'\0'}; + + zip_dirent_t *de; + zip_extra_field_t *ef; + int i; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return NULL; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return NULL; + + i = 0; + for (ef = de->extra_fields; ef; ef = ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) { + if (i < ef_idx) { + i++; + continue; + } + + if (idp) + *idp = ef->id; + if (lenp) + *lenp = ef->size; + if (ef->size > 0) + return ef->data; + else + return empty; + } + } + + zip_error_set(&za->error, ZIP_ER_NOENT, 0); + return NULL; +} + + +ZIP_EXTERN const zip_uint8_t * +zip_file_extra_field_get_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags) { + zip_dirent_t *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return NULL; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return NULL; + + return _zip_ef_get_by_id(de->extra_fields, lenp, ef_id, ef_idx, flags, &za->error); +} + + +ZIP_EXTERN zip_int16_t +zip_file_extra_fields_count(zip_t *za, zip_uint64_t idx, zip_flags_t flags) { + zip_dirent_t *de; + zip_extra_field_t *ef; + zip_uint16_t n; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return -1; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return -1; + + n = 0; + for (ef = de->extra_fields; ef; ef = ef->next) + if (ef->flags & flags & ZIP_EF_BOTH) + n++; + + return (zip_int16_t)n; +} + + +ZIP_EXTERN zip_int16_t +zip_file_extra_fields_count_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags) { + zip_dirent_t *de; + zip_extra_field_t *ef; + zip_uint16_t n; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((de = _zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return -1; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return -1; + + n = 0; + for (ef = de->extra_fields; ef; ef = ef->next) + if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) + n++; + + return (zip_int16_t)n; +} + + +ZIP_EXTERN int +zip_file_extra_field_set(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags) { + zip_dirent_t *de; + zip_uint16_t ls, cs; + zip_extra_field_t *ef, *ef_prev, *ef_new; + int i, found, new_len; + + if ((flags & ZIP_EF_BOTH) == 0) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (ZIP_EF_IS_INTERNAL(ef_id)) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + ef = de->extra_fields; + ef_prev = NULL; + i = 0; + found = 0; + + for (; ef; ef = ef->next) { + if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) { + if (i == ef_idx) { + found = 1; + break; + } + i++; + } + ef_prev = ef; + } + + if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (flags & ZIP_EF_LOCAL) + ls = _zip_ef_size(de->extra_fields, ZIP_EF_LOCAL); + else + ls = 0; + if (flags & ZIP_EF_CENTRAL) + cs = _zip_ef_size(de->extra_fields, ZIP_EF_CENTRAL); + else + cs = 0; + + new_len = ls > cs ? ls : cs; + if (found) + new_len -= ef->size + 4; + new_len += len + 4; + + if (new_len > ZIP_UINT16_MAX) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((ef_new = _zip_ef_new(ef_id, len, data, flags)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (found) { + if ((ef->flags & ZIP_EF_BOTH) == (flags & ZIP_EF_BOTH)) { + ef_new->next = ef->next; + ef->next = NULL; + _zip_ef_free(ef); + if (ef_prev) + ef_prev->next = ef_new; + else + de->extra_fields = ef_new; + } + else { + ef->flags &= ~(flags & ZIP_EF_BOTH); + ef_new->next = ef->next; + ef->next = ef_new; + } + } + else if (ef_prev) { + ef_new->next = ef_prev->next; + ef_prev->next = ef_new; + } + else + de->extra_fields = ef_new; + + return 0; +} + + +int +_zip_file_extra_field_prepare_for_change(zip_t *za, zip_uint64_t idx) { + zip_entry_t *e; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + e = za->entry + idx; + + if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD)) + return 0; + + if (e->orig) { + if (_zip_read_local_ef(za, idx) < 0) + return -1; + } + + if (e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + if (e->orig && e->orig->extra_fields) { + if ((e->changes->extra_fields = _zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL) + return -1; + } + e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD; + + return 0; +} diff --git a/deps/libzip/lib/zip_fclose.c b/deps/libzip/lib/zip_fclose.c new file mode 100644 index 00000000000000..b820d98bdcf3db --- /dev/null +++ b/deps/libzip/lib/zip_fclose.c @@ -0,0 +1,54 @@ +/* + zip_fclose.c -- close file in zip archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_fclose(zip_file_t *zf) { + int ret; + + if (zf->src) + zip_source_free(zf->src); + + ret = 0; + if (zf->error.zip_err) + ret = zf->error.zip_err; + + zip_error_fini(&zf->error); + free(zf); + return ret; +} diff --git a/deps/libzip/lib/zip_fdopen.c b/deps/libzip/lib/zip_fdopen.c new file mode 100644 index 00000000000000..e72c55dcadaaaf --- /dev/null +++ b/deps/libzip/lib/zip_fdopen.c @@ -0,0 +1,91 @@ +/* + zip_fdopen.c -- open read-only archive from file descriptor + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" +#ifdef HAVE_UNISTD_H +#include +#endif + + +ZIP_EXTERN zip_t * +zip_fdopen(int fd_orig, int _flags, int *zep) { + int fd; + FILE *fp; + zip_t *za; + zip_source_t *src; + struct zip_error error; + + if (_flags < 0 || (_flags & ~(ZIP_CHECKCONS | ZIP_RDONLY))) { + _zip_set_open_error(zep, NULL, ZIP_ER_INVAL); + return NULL; + } + +#ifndef ENABLE_FDOPEN + _zip_set_open_error(zep, NULL, ZIP_ER_OPNOTSUPP); + return NULL; +#else + /* We dup() here to avoid messing with the passed in fd. + We could not restore it to the original state in case of error. */ + + if ((fd = dup(fd_orig)) < 0) { + _zip_set_open_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + + if ((fp = fdopen(fd, "rb")) == NULL) { + close(fd); + _zip_set_open_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + + zip_error_init(&error); + if ((src = zip_source_filep_create(fp, 0, -1, &error)) == NULL) { + fclose(fp); + _zip_set_open_error(zep, &error, 0); + zip_error_fini(&error); + return NULL; + } + + if ((za = zip_open_from_source(src, _flags, &error)) == NULL) { + zip_source_free(src); + _zip_set_open_error(zep, &error, 0); + zip_error_fini(&error); + return NULL; + } + + zip_error_fini(&error); + close(fd_orig); + return za; +#endif +} diff --git a/deps/libzip/lib/zip_file_add.c b/deps/libzip/lib/zip_file_add.c new file mode 100644 index 00000000000000..c2c41e156352d8 --- /dev/null +++ b/deps/libzip/lib/zip_file_add.c @@ -0,0 +1,52 @@ +/* + zip_file_add.c -- add file via callback function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +/* + NOTE: Return type is signed so we can return -1 on error. + The index can not be larger than ZIP_INT64_MAX since the size + of the central directory cannot be larger than + ZIP_UINT64_MAX, and each entry is larger than 2 bytes. +*/ + +ZIP_EXTERN zip_int64_t +zip_file_add(zip_t *za, const char *name, zip_source_t *source, zip_flags_t flags) { + if (name == NULL || source == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_file_replace(za, ZIP_UINT64_MAX, name, source, flags); +} diff --git a/deps/libzip/lib/zip_file_error_clear.c b/deps/libzip/lib/zip_file_error_clear.c new file mode 100644 index 00000000000000..a10bff80c678fe --- /dev/null +++ b/deps/libzip/lib/zip_file_error_clear.c @@ -0,0 +1,44 @@ +/* + zip_file_error_clear.c -- clear zip file error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN void +zip_file_error_clear(zip_file_t *zf) { + if (zf == NULL) + return; + + _zip_error_clear(&zf->error); +} diff --git a/deps/libzip/lib/zip_file_error_get.c b/deps/libzip/lib/zip_file_error_get.c new file mode 100644 index 00000000000000..b93117bb9bd2ac --- /dev/null +++ b/deps/libzip/lib/zip_file_error_get.c @@ -0,0 +1,41 @@ +/* + zip_file_error_get.c -- get zip file error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN void +zip_file_error_get(zip_file_t *zf, int *zep, int *sep) { + _zip_error_get(&zf->error, zep, sep); +} diff --git a/deps/libzip/lib/zip_file_get_comment.c b/deps/libzip/lib/zip_file_get_comment.c new file mode 100644 index 00000000000000..fa998f02ed31be --- /dev/null +++ b/deps/libzip/lib/zip_file_get_comment.c @@ -0,0 +1,55 @@ +/* + zip_file_get_comment.c -- get file comment + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +/* lenp is 32 bit because converted comment can be longer than ZIP_UINT16_MAX */ + +ZIP_EXTERN const char * +zip_file_get_comment(zip_t *za, zip_uint64_t idx, zip_uint32_t *lenp, zip_flags_t flags) { + zip_dirent_t *de; + zip_uint32_t len; + const zip_uint8_t *str; + + if ((de = _zip_get_dirent(za, idx, flags, NULL)) == NULL) + return NULL; + + if ((str = _zip_string_get(de->comment, &len, flags, &za->error)) == NULL) + return NULL; + + if (lenp) + *lenp = len; + + return (const char *)str; +} diff --git a/deps/libzip/lib/zip_file_get_external_attributes.c b/deps/libzip/lib/zip_file_get_external_attributes.c new file mode 100644 index 00000000000000..a79bb3ed2bdbe1 --- /dev/null +++ b/deps/libzip/lib/zip_file_get_external_attributes.c @@ -0,0 +1,50 @@ +/* + zip_file_get_external_attributes.c -- get opsys/external attributes + Copyright (C) 2013-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +int +zip_file_get_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t *opsys, zip_uint32_t *attributes) { + zip_dirent_t *de; + + if ((de = _zip_get_dirent(za, idx, flags, NULL)) == NULL) + return -1; + + if (opsys) + *opsys = (zip_uint8_t)((de->version_madeby >> 8) & 0xff); + + if (attributes) + *attributes = de->ext_attrib; + + return 0; +} diff --git a/deps/libzip/lib/zip_file_get_offset.c b/deps/libzip/lib/zip_file_get_offset.c new file mode 100644 index 00000000000000..72f4880e78b10e --- /dev/null +++ b/deps/libzip/lib/zip_file_get_offset.c @@ -0,0 +1,117 @@ +/* + zip_file_get_offset.c -- get offset of file data in archive. + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + + +/* _zip_file_get_offset(za, ze): + Returns the offset of the file data for entry ze. + + On error, fills in za->error and returns 0. +*/ + +zip_uint64_t +_zip_file_get_offset(const zip_t *za, zip_uint64_t idx, zip_error_t *error) { + zip_uint64_t offset; + zip_int32_t size; + + if (za->entry[idx].orig == NULL) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return 0; + } + + offset = za->entry[idx].orig->offset; + + if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) { + zip_error_set_from_source(error, za->src); + return 0; + } + + /* TODO: cache? */ + if ((size = _zip_dirent_size(za->src, ZIP_EF_LOCAL, error)) < 0) + return 0; + + if (offset + (zip_uint32_t)size > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return 0; + } + + return offset + (zip_uint32_t)size; +} + +zip_uint64_t +_zip_file_get_end(const zip_t *za, zip_uint64_t index, zip_error_t *error) { + zip_uint64_t offset; + zip_dirent_t *entry; + + if ((offset = _zip_file_get_offset(za, index, error)) == 0) { + return 0; + } + + entry = za->entry[index].orig; + + if (offset + entry->comp_size < offset || offset + entry->comp_size > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return 0; + } + offset += entry->comp_size; + + if (entry->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { + zip_uint8_t buf[4]; + if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) { + zip_error_set_from_source(error, za->src); + return 0; + } + if (zip_source_read(za->src, buf, 4) != 4) { + zip_error_set_from_source(error, za->src); + return 0; + } + if (memcmp(buf, DATADES_MAGIC, 4) == 0) { + offset += 4; + } + offset += 12; + if (_zip_dirent_needs_zip64(entry, 0)) { + offset += 8; + } + if (offset > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return 0; + } + } + + return offset; +} diff --git a/deps/libzip/lib/zip_file_rename.c b/deps/libzip/lib/zip_file_rename.c new file mode 100644 index 00000000000000..9ac25814a9809d --- /dev/null +++ b/deps/libzip/lib/zip_file_rename.c @@ -0,0 +1,67 @@ +/* + zip_file_rename.c -- rename file in zip archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_file_rename(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags) { + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || (name != NULL && strlen(name) > ZIP_UINT16_MAX)) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if ((old_name = zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name != NULL && name[strlen(name) - 1] == '/'); + old_is_dir = (old_name[strlen(old_name) - 1] == '/'); + + if (new_is_dir != old_is_dir) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_set_name(za, idx, name, flags); +} diff --git a/deps/libzip/lib/zip_file_replace.c b/deps/libzip/lib/zip_file_replace.c new file mode 100644 index 00000000000000..4262d453ea067b --- /dev/null +++ b/deps/libzip/lib/zip_file_replace.c @@ -0,0 +1,105 @@ +/* + zip_file_replace.c -- replace file via callback function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_file_replace(zip_t *za, zip_uint64_t idx, zip_source_t *source, zip_flags_t flags) { + if (idx >= za->nentry || source == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_file_replace(za, idx, NULL, source, flags) == -1) + return -1; + + return 0; +} + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_file_replace(zip_t *za, zip_uint64_t idx, const char *name, zip_source_t *source, zip_flags_t flags) { + zip_uint64_t za_nentry_prev; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + za_nentry_prev = za->nentry; + if (idx == ZIP_UINT64_MAX) { + zip_int64_t i = -1; + + if (flags & ZIP_FL_OVERWRITE) + i = _zip_name_locate(za, name, flags, NULL); + + if (i == -1) { + /* create and use new entry, used by zip_add */ + if ((i = _zip_add_entry(za)) < 0) + return -1; + } + idx = (zip_uint64_t)i; + } + + if (name && _zip_set_name(za, idx, name, flags) != 0) { + if (za->nentry != za_nentry_prev) { + _zip_entry_finalize(za->entry + idx); + za->nentry = za_nentry_prev; + } + return -1; + } + + /* does not change any name related data, so we can do it here; + * needed for a double add of the same file name */ + _zip_unchange_data(za->entry + idx); + + if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) { + if (za->entry[idx].changes == NULL) { + if ((za->entry[idx].changes = _zip_dirent_clone(za->entry[idx].orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT; + za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD; + } + + za->entry[idx].source = source; + + return (zip_int64_t)idx; +} diff --git a/deps/libzip/lib/zip_file_set_comment.c b/deps/libzip/lib/zip_file_set_comment.c new file mode 100644 index 00000000000000..f50953bf1e20f7 --- /dev/null +++ b/deps/libzip/lib/zip_file_set_comment.c @@ -0,0 +1,101 @@ +/* + zip_file_set_comment.c -- set comment for file in archive + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_file_set_comment(zip_t *za, zip_uint64_t idx, const char *comment, zip_uint16_t len, zip_flags_t flags) { + zip_entry_t *e; + zip_string_t *cstr; + int changed; + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (len > 0 && comment == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((cstr = _zip_string_new((const zip_uint8_t *)comment, len, flags, &za->error)) == NULL) + return -1; + if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED) + cstr->encoding = ZIP_ENCODING_UTF8_KNOWN; + } + else + cstr = NULL; + + e = za->entry + idx; + + if (e->changes) { + _zip_string_free(e->changes->comment); + e->changes->comment = NULL; + e->changes->changed &= ~ZIP_DIRENT_COMMENT; + } + + if (e->orig && e->orig->comment) + changed = !_zip_string_equal(e->orig->comment, cstr); + else + changed = (cstr != NULL); + + if (changed) { + if (e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_string_free(cstr); + return -1; + } + } + e->changes->comment = cstr; + e->changes->changed |= ZIP_DIRENT_COMMENT; + } + else { + _zip_string_free(cstr); + if (e->changes && e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + + return 0; +} diff --git a/deps/libzip/lib/zip_file_set_encryption.c b/deps/libzip/lib/zip_file_set_encryption.c new file mode 100644 index 00000000000000..41392c1f053ef2 --- /dev/null +++ b/deps/libzip/lib/zip_file_set_encryption.c @@ -0,0 +1,116 @@ +/* + zip_file_set_encryption.c -- set encryption for file in archive + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +#include +#include + +ZIP_EXTERN int +zip_file_set_encryption(zip_t *za, zip_uint64_t idx, zip_uint16_t method, const char *password) { + zip_entry_t *e; + zip_uint16_t old_method; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (method != ZIP_EM_NONE && _zip_get_encryption_implementation(method, ZIP_CODEC_ENCODE) == NULL) { + zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + return -1; + } + + e = za->entry + idx; + + old_method = (e->orig == NULL ? ZIP_EM_NONE : e->orig->encryption_method); + + if (method == old_method && password == NULL) { + if (e->changes) { + if (e->changes->changed & ZIP_DIRENT_PASSWORD) { + _zip_crypto_clear(e->changes->password, strlen(e->changes->password)); + free(e->changes->password); + e->changes->password = (e->orig == NULL ? NULL : e->orig->password); + } + e->changes->changed &= ~(ZIP_DIRENT_ENCRYPTION_METHOD | ZIP_DIRENT_PASSWORD); + if (e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + } + else { + char *our_password = NULL; + + if (password) { + if ((our_password = strdup(password)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + if (e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + if (our_password) { + _zip_crypto_clear(our_password, strlen(our_password)); + } + free(our_password); + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + e->changes->encryption_method = method; + e->changes->changed |= ZIP_DIRENT_ENCRYPTION_METHOD; + if (password) { + e->changes->password = our_password; + e->changes->changed |= ZIP_DIRENT_PASSWORD; + } + else { + if (e->changes->changed & ZIP_DIRENT_PASSWORD) { + _zip_crypto_clear(e->changes->password, strlen(e->changes->password)); + free(e->changes->password); + e->changes->password = e->orig ? e->orig->password : NULL; + e->changes->changed &= ~ZIP_DIRENT_PASSWORD; + } + } + } + + return 0; +} diff --git a/deps/libzip/lib/zip_file_set_external_attributes.c b/deps/libzip/lib/zip_file_set_external_attributes.c new file mode 100644 index 00000000000000..1a0028d31bdacf --- /dev/null +++ b/deps/libzip/lib/zip_file_set_external_attributes.c @@ -0,0 +1,82 @@ +/* + zip_file_set_external_attributes.c -- set external attributes for entry + Copyright (C) 2013-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +ZIP_EXTERN int +zip_file_set_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t opsys, zip_uint32_t attributes) { + zip_entry_t *e; + int changed; + zip_uint8_t unchanged_opsys; + zip_uint32_t unchanged_attributes; + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + e = za->entry + idx; + + unchanged_opsys = (e->orig ? (zip_uint8_t)(e->orig->version_madeby >> 8) : (zip_uint8_t)ZIP_OPSYS_DEFAULT); + unchanged_attributes = e->orig ? e->orig->ext_attrib : ZIP_EXT_ATTRIB_DEFAULT; + + changed = (opsys != unchanged_opsys || attributes != unchanged_attributes); + + if (changed) { + if (e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + e->changes->version_madeby = (zip_uint16_t)((opsys << 8) | (e->changes->version_madeby & 0xff)); + e->changes->ext_attrib = attributes; + e->changes->changed |= ZIP_DIRENT_ATTRIBUTES; + } + else if (e->changes) { + e->changes->changed &= ~ZIP_DIRENT_ATTRIBUTES; + if (e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + else { + e->changes->version_madeby = (zip_uint16_t)((unchanged_opsys << 8) | (e->changes->version_madeby & 0xff)); + e->changes->ext_attrib = unchanged_attributes; + } + } + + return 0; +} diff --git a/deps/libzip/lib/zip_file_set_mtime.c b/deps/libzip/lib/zip_file_set_mtime.c new file mode 100644 index 00000000000000..10abe81b44db5c --- /dev/null +++ b/deps/libzip/lib/zip_file_set_mtime.c @@ -0,0 +1,73 @@ +/* + zip_file_set_mtime.c -- set modification time of entry. + Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "zipint.h" + +ZIP_EXTERN int +zip_file_set_dostime(zip_t *za, zip_uint64_t idx, zip_uint16_t dtime, zip_uint16_t ddate, zip_flags_t flags) { + time_t mtime; + mtime = _zip_d2u_time(dtime, ddate); + return zip_file_set_mtime(za, idx, mtime, flags); +} + +ZIP_EXTERN int +zip_file_set_mtime(zip_t *za, zip_uint64_t idx, time_t mtime, zip_flags_t flags) { + zip_entry_t *e; + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + e = za->entry + idx; + + if (e->orig != NULL && e->orig->encryption_method == ZIP_EM_TRAD_PKWARE && !ZIP_ENTRY_CHANGED(e, ZIP_DIRENT_ENCRYPTION_METHOD) && !ZIP_ENTRY_DATA_CHANGED(e)) { + zip_error_set(&za->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + e->changes->last_mod = mtime; + e->changes->changed |= ZIP_DIRENT_LAST_MOD; + + return 0; +} diff --git a/deps/libzip/lib/zip_file_strerror.c b/deps/libzip/lib/zip_file_strerror.c new file mode 100644 index 00000000000000..5b5a0092416f60 --- /dev/null +++ b/deps/libzip/lib/zip_file_strerror.c @@ -0,0 +1,41 @@ +/* + zip_file_sterror.c -- get string representation of zip file error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN const char * +zip_file_strerror(zip_file_t *zf) { + return zip_error_strerror(&zf->error); +} diff --git a/deps/libzip/lib/zip_fopen.c b/deps/libzip/lib/zip_fopen.c new file mode 100644 index 00000000000000..e3cde9be060239 --- /dev/null +++ b/deps/libzip/lib/zip_fopen.c @@ -0,0 +1,46 @@ +/* + zip_fopen.c -- open file in zip archive for reading + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_file_t * +zip_fopen(zip_t *za, const char *fname, zip_flags_t flags) { + zip_int64_t idx; + + if ((idx = zip_name_locate(za, fname, flags)) < 0) + return NULL; + + return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, za->default_password); +} diff --git a/deps/libzip/lib/zip_fopen_encrypted.c b/deps/libzip/lib/zip_fopen_encrypted.c new file mode 100644 index 00000000000000..d5880dcb996519 --- /dev/null +++ b/deps/libzip/lib/zip_fopen_encrypted.c @@ -0,0 +1,46 @@ +/* + zip_fopen_encrypted.c -- open file for reading with password + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_file_t * +zip_fopen_encrypted(zip_t *za, const char *fname, zip_flags_t flags, const char *password) { + zip_int64_t idx; + + if ((idx = zip_name_locate(za, fname, flags)) < 0) + return NULL; + + return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, password); +} diff --git a/deps/libzip/lib/zip_fopen_index.c b/deps/libzip/lib/zip_fopen_index.c new file mode 100644 index 00000000000000..a449b83a0d3ae4 --- /dev/null +++ b/deps/libzip/lib/zip_fopen_index.c @@ -0,0 +1,41 @@ +/* + zip_fopen_index.c -- open file in zip archive for reading by index + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_file_t * +zip_fopen_index(zip_t *za, zip_uint64_t index, zip_flags_t flags) { + return zip_fopen_index_encrypted(za, index, flags, za->default_password); +} diff --git a/deps/libzip/lib/zip_fopen_index_encrypted.c b/deps/libzip/lib/zip_fopen_index_encrypted.c new file mode 100644 index 00000000000000..d1afd8d13827ea --- /dev/null +++ b/deps/libzip/lib/zip_fopen_index_encrypted.c @@ -0,0 +1,86 @@ +/* + zip_fopen_index_encrypted.c -- open file for reading by index w/ password + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + +static zip_file_t *_zip_file_new(zip_t *za); + + +ZIP_EXTERN zip_file_t * +zip_fopen_index_encrypted(zip_t *za, zip_uint64_t index, zip_flags_t flags, const char *password) { + zip_file_t *zf; + zip_source_t *src; + + if (password != NULL && password[0] == '\0') { + password = NULL; + } + + if ((src = _zip_source_zip_new(za, index, flags, 0, 0, password, &za->error)) == NULL) + return NULL; + + if (zip_source_open(src) < 0) { + zip_error_set_from_source(&za->error, src); + zip_source_free(src); + return NULL; + } + + if ((zf = _zip_file_new(za)) == NULL) { + zip_source_free(src); + return NULL; + } + + zf->src = src; + + return zf; +} + + +static zip_file_t * +_zip_file_new(zip_t *za) { + zip_file_t *zf; + + if ((zf = (zip_file_t *)malloc(sizeof(struct zip_file))) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + zf->za = za; + zip_error_init(&zf->error); + zf->src = NULL; + + return zf; +} diff --git a/deps/libzip/lib/zip_fread.c b/deps/libzip/lib/zip_fread.c new file mode 100644 index 00000000000000..5b7da46aee29f6 --- /dev/null +++ b/deps/libzip/lib/zip_fread.c @@ -0,0 +1,63 @@ +/* + zip_fread.c -- read from file + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_int64_t +zip_fread(zip_file_t *zf, void *outbuf, zip_uint64_t toread) { + zip_int64_t n; + + if (!zf) + return -1; + + if (zf->error.zip_err != 0) + return -1; + + if (toread > ZIP_INT64_MAX) { + zip_error_set(&zf->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (toread == 0) { + return 0; + } + + if ((n = zip_source_read(zf->src, outbuf, toread)) < 0) { + zip_error_set_from_source(&zf->error, zf->src); + return -1; + } + + return n; +} diff --git a/deps/libzip/lib/zip_fseek.c b/deps/libzip/lib/zip_fseek.c new file mode 100644 index 00000000000000..f17847ac44d78f --- /dev/null +++ b/deps/libzip/lib/zip_fseek.c @@ -0,0 +1,61 @@ +/* + zip_fseek.c -- seek in file + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +ZIP_EXTERN zip_int8_t +zip_fseek(zip_file_t *zf, zip_int64_t offset, int whence) { + if (!zf) + return -1; + + if (zf->error.zip_err != 0) + return -1; + + if (zip_source_seek(zf->src, offset, whence) < 0) { + zip_error_set_from_source(&zf->error, zf->src); + return -1; + } + + return 0; +} + + +ZIP_EXTERN int +zip_file_is_seekable(zip_file_t *zfile) { + if (!zfile) { + return -1; + } + + return ZIP_SOURCE_CHECK_SUPPORTED(zip_source_supports(zfile->src), ZIP_SOURCE_SEEK); +} diff --git a/deps/libzip/lib/zip_ftell.c b/deps/libzip/lib/zip_ftell.c new file mode 100644 index 00000000000000..bf3b03d3487491 --- /dev/null +++ b/deps/libzip/lib/zip_ftell.c @@ -0,0 +1,54 @@ +/* + zip_ftell.c -- tell position in file + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +ZIP_EXTERN zip_int64_t +zip_ftell(zip_file_t *zf) { + zip_int64_t res; + + if (!zf) + return -1; + + if (zf->error.zip_err != 0) + return -1; + + res = zip_source_tell(zf->src); + if (res < 0) { + zip_error_set_from_source(&zf->error, zf->src); + return -1; + } + + return res; +} diff --git a/deps/libzip/lib/zip_get_archive_comment.c b/deps/libzip/lib/zip_get_archive_comment.c new file mode 100644 index 00000000000000..ea9a00ab5ca10a --- /dev/null +++ b/deps/libzip/lib/zip_get_archive_comment.c @@ -0,0 +1,58 @@ +/* + zip_get_archive_comment.c -- get archive comment + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN const char * +zip_get_archive_comment(zip_t *za, int *lenp, zip_flags_t flags) { + zip_string_t *comment; + zip_uint32_t len; + const zip_uint8_t *str; + + if ((flags & ZIP_FL_UNCHANGED) || (za->comment_changes == NULL)) + comment = za->comment_orig; + else + comment = za->comment_changes; + + if ((str = _zip_string_get(comment, &len, flags, &za->error)) == NULL) + return NULL; + + if (lenp) + *lenp = (int)len; + + return (const char *)str; +} diff --git a/deps/libzip/lib/zip_get_archive_flag.c b/deps/libzip/lib/zip_get_archive_flag.c new file mode 100644 index 00000000000000..fc200bdc4aebdb --- /dev/null +++ b/deps/libzip/lib/zip_get_archive_flag.c @@ -0,0 +1,45 @@ +/* + zip_get_archive_flag.c -- get archive global flag + Copyright (C) 2008-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_get_archive_flag(zip_t *za, zip_flags_t flag, zip_flags_t flags) { + unsigned int fl; + + fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; + + return (fl & flag) ? 1 : 0; +} diff --git a/deps/libzip/lib/zip_get_encryption_implementation.c b/deps/libzip/lib/zip_get_encryption_implementation.c new file mode 100644 index 00000000000000..72e48fe87abc89 --- /dev/null +++ b/deps/libzip/lib/zip_get_encryption_implementation.c @@ -0,0 +1,62 @@ +/* + zip_get_encryption_implementation.c -- get encryption implementation + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +zip_encryption_implementation +_zip_get_encryption_implementation(zip_uint16_t em, int operation) { + switch (em) { + case ZIP_EM_TRAD_PKWARE: + return operation == ZIP_CODEC_DECODE ? zip_source_pkware_decode : zip_source_pkware_encode; + +#if defined(HAVE_CRYPTO) + case ZIP_EM_AES_128: + case ZIP_EM_AES_192: + case ZIP_EM_AES_256: + return operation == ZIP_CODEC_DECODE ? zip_source_winzip_aes_decode : zip_source_winzip_aes_encode; +#endif + + default: + return NULL; + } +} + +ZIP_EXTERN int +zip_encryption_method_supported(zip_uint16_t method, int encode) { + if (method == ZIP_EM_NONE) { + return 1; + } + return _zip_get_encryption_implementation(method, encode ? ZIP_CODEC_ENCODE : ZIP_CODEC_DECODE) != NULL; +} diff --git a/deps/libzip/lib/zip_get_file_comment.c b/deps/libzip/lib/zip_get_file_comment.c new file mode 100644 index 00000000000000..d58e22ba6db42b --- /dev/null +++ b/deps/libzip/lib/zip_get_file_comment.c @@ -0,0 +1,50 @@ +/* + zip_get_file_comment.c -- get file comment + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN const char * +zip_get_file_comment(zip_t *za, zip_uint64_t idx, int *lenp, int flags) { + zip_uint32_t len; + const char *s; + + if ((s = zip_file_get_comment(za, idx, &len, (zip_flags_t)flags)) != NULL) { + if (lenp) + *lenp = (int)len; + } + + return s; +} diff --git a/deps/libzip/lib/zip_get_name.c b/deps/libzip/lib/zip_get_name.c new file mode 100644 index 00000000000000..4828d78107ea2c --- /dev/null +++ b/deps/libzip/lib/zip_get_name.c @@ -0,0 +1,58 @@ +/* + zip_get_name.c -- get filename for a file in zip file + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN const char * +zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags) { + return _zip_get_name(za, idx, flags, &za->error); +} + + +const char * +_zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error) { + zip_dirent_t *de; + const zip_uint8_t *str; + + if ((de = _zip_get_dirent(za, idx, flags, error)) == NULL) + return NULL; + + if ((str = _zip_string_get(de->filename, NULL, flags, error)) == NULL) + return NULL; + + return (const char *)str; +} diff --git a/deps/libzip/lib/zip_get_num_entries.c b/deps/libzip/lib/zip_get_num_entries.c new file mode 100644 index 00000000000000..667dc51179f10b --- /dev/null +++ b/deps/libzip/lib/zip_get_num_entries.c @@ -0,0 +1,52 @@ +/* + zip_get_num_entries.c -- get number of entries in archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_int64_t +zip_get_num_entries(zip_t *za, zip_flags_t flags) { + zip_uint64_t n; + + if (za == NULL) + return -1; + + if (flags & ZIP_FL_UNCHANGED) { + n = za->nentry; + while (n > 0 && za->entry[n - 1].orig == NULL) + --n; + return (zip_int64_t)n; + } + return (zip_int64_t)za->nentry; +} diff --git a/deps/libzip/lib/zip_get_num_files.c b/deps/libzip/lib/zip_get_num_files.c new file mode 100644 index 00000000000000..140e34f90061d3 --- /dev/null +++ b/deps/libzip/lib/zip_get_num_files.c @@ -0,0 +1,51 @@ +/* + zip_get_num_files.c -- get number of files in archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" +#include + + +ZIP_EXTERN int +zip_get_num_files(zip_t *za) { + if (za == NULL) + return -1; + + if (za->nentry > INT_MAX) { + zip_error_set(&za->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + return (int)za->nentry; +} diff --git a/deps/libzip/lib/zip_hash.c b/deps/libzip/lib/zip_hash.c new file mode 100644 index 00000000000000..d3a954ec5977e7 --- /dev/null +++ b/deps/libzip/lib/zip_hash.c @@ -0,0 +1,410 @@ +/* + zip_hash.c -- hash table string -> uint64 + Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" +#include +#include + +/* parameter for the string hash function */ +#define HASH_MULTIPLIER 33 +#define HASH_START 5381 + +/* hash table's fill ratio is kept between these by doubling/halfing its size as necessary */ +#define HASH_MAX_FILL .75 +#define HASH_MIN_FILL .01 + +/* but hash table size is kept between these */ +#define HASH_MIN_SIZE 256 +#define HASH_MAX_SIZE 0x80000000ul + +struct zip_hash_entry { + const zip_uint8_t *name; + zip_int64_t orig_index; + zip_int64_t current_index; + struct zip_hash_entry *next; + zip_uint32_t hash_value; +}; +typedef struct zip_hash_entry zip_hash_entry_t; + +struct zip_hash { + zip_uint32_t table_size; + zip_uint64_t nentries; + zip_hash_entry_t **table; +}; + + +/* free list of entries */ +static void +free_list(zip_hash_entry_t *entry) { + while (entry != NULL) { + zip_hash_entry_t *next = entry->next; + free(entry); + entry = next; + } +} + + +/* compute hash of string, full 32 bit value */ +static zip_uint32_t +hash_string(const zip_uint8_t *name) { + zip_uint64_t value = HASH_START; + + if (name == NULL) { + return 0; + } + + while (*name != 0) { + value = (zip_uint64_t)(((value * HASH_MULTIPLIER) + (zip_uint8_t)*name) % 0x100000000ul); + name++; + } + + return (zip_uint32_t)value; +} + + +/* resize hash table; new_size must be a power of 2, can be larger or smaller than current size */ +static bool +hash_resize(zip_hash_t *hash, zip_uint32_t new_size, zip_error_t *error) { + zip_hash_entry_t **new_table; + + if (new_size == hash->table_size) { + return true; + } + + if ((new_table = (zip_hash_entry_t **)calloc(new_size, sizeof(zip_hash_entry_t *))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + if (hash->nentries > 0) { + zip_uint32_t i; + + for (i = 0; i < hash->table_size; i++) { + zip_hash_entry_t *entry = hash->table[i]; + while (entry) { + zip_hash_entry_t *next = entry->next; + + zip_uint32_t new_index = entry->hash_value % new_size; + + entry->next = new_table[new_index]; + new_table[new_index] = entry; + + entry = next; + } + } + } + + free(hash->table); + hash->table = new_table; + hash->table_size = new_size; + + return true; +} + + +static zip_uint32_t +size_for_capacity(zip_uint64_t capacity) { + double needed_size = capacity / HASH_MAX_FILL; + zip_uint32_t v; + + if (needed_size > ZIP_UINT32_MAX) { + v = ZIP_UINT32_MAX; + } + else { + v = (zip_uint32_t)needed_size; + } + + if (v > HASH_MAX_SIZE) { + return HASH_MAX_SIZE; + } + + /* From Bit Twiddling Hacks by Sean Eron Anderson + (http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2). */ + + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + + return v; +} + + +zip_hash_t * +_zip_hash_new(zip_error_t *error) { + zip_hash_t *hash; + + if ((hash = (zip_hash_t *)malloc(sizeof(zip_hash_t))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + hash->table_size = 0; + hash->nentries = 0; + hash->table = NULL; + + return hash; +} + + +void +_zip_hash_free(zip_hash_t *hash) { + zip_uint32_t i; + + if (hash == NULL) { + return; + } + + if (hash->table != NULL) { + for (i = 0; i < hash->table_size; i++) { + if (hash->table[i] != NULL) { + free_list(hash->table[i]); + } + } + free(hash->table); + } + free(hash); +} + + +/* insert into hash, return error on existence or memory issues */ +bool +_zip_hash_add(zip_hash_t *hash, const zip_uint8_t *name, zip_uint64_t index, zip_flags_t flags, zip_error_t *error) { + zip_uint32_t hash_value, table_index; + zip_hash_entry_t *entry; + + if (hash == NULL || name == NULL || index > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return false; + } + + if (hash->table_size == 0) { + if (!hash_resize(hash, HASH_MIN_SIZE, error)) { + return false; + } + } + + hash_value = hash_string(name); + table_index = hash_value % hash->table_size; + + for (entry = hash->table[table_index]; entry != NULL; entry = entry->next) { + if (entry->hash_value == hash_value && strcmp((const char *)name, (const char *)entry->name) == 0) { + if (((flags & ZIP_FL_UNCHANGED) && entry->orig_index != -1) || entry->current_index != -1) { + zip_error_set(error, ZIP_ER_EXISTS, 0); + return false; + } + else { + break; + } + } + } + + if (entry == NULL) { + if ((entry = (zip_hash_entry_t *)malloc(sizeof(zip_hash_entry_t))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + entry->name = name; + entry->next = hash->table[table_index]; + hash->table[table_index] = entry; + entry->hash_value = hash_value; + entry->orig_index = -1; + hash->nentries++; + if (hash->nentries > hash->table_size * HASH_MAX_FILL && hash->table_size < HASH_MAX_SIZE) { + if (!hash_resize(hash, hash->table_size * 2, error)) { + return false; + } + } + } + + if (flags & ZIP_FL_UNCHANGED) { + entry->orig_index = (zip_int64_t)index; + } + entry->current_index = (zip_int64_t)index; + + return true; +} + + +/* remove entry from hash, error if not found */ +bool +_zip_hash_delete(zip_hash_t *hash, const zip_uint8_t *name, zip_error_t *error) { + zip_uint32_t hash_value, index; + zip_hash_entry_t *entry, *previous; + + if (hash == NULL || name == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return false; + } + + if (hash->nentries > 0) { + hash_value = hash_string(name); + index = hash_value % hash->table_size; + previous = NULL; + entry = hash->table[index]; + while (entry) { + if (entry->hash_value == hash_value && strcmp((const char *)name, (const char *)entry->name) == 0) { + if (entry->orig_index == -1) { + if (previous) { + previous->next = entry->next; + } + else { + hash->table[index] = entry->next; + } + free(entry); + hash->nentries--; + if (hash->nentries < hash->table_size * HASH_MIN_FILL && hash->table_size > HASH_MIN_SIZE) { + if (!hash_resize(hash, hash->table_size / 2, error)) { + return false; + } + } + } + else { + entry->current_index = -1; + } + return true; + } + previous = entry; + entry = entry->next; + } + } + + zip_error_set(error, ZIP_ER_NOENT, 0); + return false; +} + + +/* find value for entry in hash, -1 if not found */ +zip_int64_t +_zip_hash_lookup(zip_hash_t *hash, const zip_uint8_t *name, zip_flags_t flags, zip_error_t *error) { + zip_uint32_t hash_value, index; + zip_hash_entry_t *entry; + + if (hash == NULL || name == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + if (hash->nentries > 0) { + hash_value = hash_string(name); + index = hash_value % hash->table_size; + for (entry = hash->table[index]; entry != NULL; entry = entry->next) { + if (strcmp((const char *)name, (const char *)entry->name) == 0) { + if (flags & ZIP_FL_UNCHANGED) { + if (entry->orig_index != -1) { + return entry->orig_index; + } + } + else { + if (entry->current_index != -1) { + return entry->current_index; + } + } + break; + } + } + } + + zip_error_set(error, ZIP_ER_NOENT, 0); + return -1; +} + + +bool +_zip_hash_reserve_capacity(zip_hash_t *hash, zip_uint64_t capacity, zip_error_t *error) { + zip_uint32_t new_size; + + if (capacity == 0) { + return true; + } + + new_size = size_for_capacity(capacity); + + if (new_size <= hash->table_size) { + return true; + } + + if (!hash_resize(hash, new_size, error)) { + return false; + } + + return true; +} + + +bool +_zip_hash_revert(zip_hash_t *hash, zip_error_t *error) { + zip_uint32_t i; + zip_hash_entry_t *entry, *previous; + + for (i = 0; i < hash->table_size; i++) { + previous = NULL; + entry = hash->table[i]; + while (entry) { + if (entry->orig_index == -1) { + zip_hash_entry_t *p; + if (previous) { + previous->next = entry->next; + } + else { + hash->table[i] = entry->next; + } + p = entry; + entry = entry->next; + /* previous does not change */ + free(p); + hash->nentries--; + } + else { + entry->current_index = entry->orig_index; + previous = entry; + entry = entry->next; + } + } + } + + if (hash->nentries < hash->table_size * HASH_MIN_FILL && hash->table_size > HASH_MIN_SIZE) { + zip_uint32_t new_size = hash->table_size / 2; + while (hash->nentries < new_size * HASH_MIN_FILL && new_size > HASH_MIN_SIZE) { + new_size /= 2; + } + if (!hash_resize(hash, new_size, error)) { + return false; + } + } + + return true; +} diff --git a/deps/libzip/lib/zip_io_util.c b/deps/libzip/lib/zip_io_util.c new file mode 100644 index 00000000000000..eb2704b773fa46 --- /dev/null +++ b/deps/libzip/lib/zip_io_util.c @@ -0,0 +1,134 @@ +/* + zip_io_util.c -- I/O helper functions + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "zipint.h" + +int +_zip_read(zip_source_t *src, zip_uint8_t *b, zip_uint64_t length, zip_error_t *error) { + zip_int64_t n; + + if (length > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((n = zip_source_read(src, b, length)) < 0) { + zip_error_set_from_source(error, src); + return -1; + } + + if (n < (zip_int64_t)length) { + zip_error_set(error, ZIP_ER_EOF, 0); + return -1; + } + + return 0; +} + + +zip_uint8_t * +_zip_read_data(zip_buffer_t *buffer, zip_source_t *src, size_t length, bool nulp, zip_error_t *error) { + zip_uint8_t *r; + + if (length == 0 && !nulp) { + return NULL; + } + + r = (zip_uint8_t *)malloc(length + (nulp ? 1 : 0)); + if (!r) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (buffer) { + zip_uint8_t *data = _zip_buffer_get(buffer, length); + + if (data == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + free(r); + return NULL; + } + (void)memcpy_s(r, length, data, length); + } + else { + if (_zip_read(src, r, length, error) < 0) { + free(r); + return NULL; + } + } + + if (nulp) { + zip_uint8_t *o; + /* replace any in-string NUL characters with spaces */ + r[length] = 0; + for (o = r; o < r + length; o++) + if (*o == '\0') + *o = ' '; + } + + return r; +} + + +zip_string_t * +_zip_read_string(zip_buffer_t *buffer, zip_source_t *src, zip_uint16_t len, bool nulp, zip_error_t *error) { + zip_uint8_t *raw; + zip_string_t *s; + + if ((raw = _zip_read_data(buffer, src, len, nulp, error)) == NULL) + return NULL; + + s = _zip_string_new(raw, len, ZIP_FL_ENC_GUESS, error); + free(raw); + return s; +} + + +int +_zip_write(zip_t *za, const void *data, zip_uint64_t length) { + zip_int64_t n; + + if ((n = zip_source_write(za->src, data, length)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return -1; + } + if ((zip_uint64_t)n != length) { + zip_error_set(&za->error, ZIP_ER_WRITE, EINTR); + return -1; + } + + return 0; +} diff --git a/deps/libzip/lib/zip_libzip_version.c b/deps/libzip/lib/zip_libzip_version.c new file mode 100644 index 00000000000000..4200727fcd7bbd --- /dev/null +++ b/deps/libzip/lib/zip_libzip_version.c @@ -0,0 +1,41 @@ +/* + zip_libzip_version.c -- return run-time version of library + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN const char * +zip_libzip_version(void) { + return LIBZIP_VERSION; +} diff --git a/deps/libzip/lib/zip_memdup.c b/deps/libzip/lib/zip_memdup.c new file mode 100644 index 00000000000000..75d72c616b2ced --- /dev/null +++ b/deps/libzip/lib/zip_memdup.c @@ -0,0 +1,56 @@ +/* + zip_memdup.c -- internal zip function, "strdup" with len + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#include "zipint.h" + + +void * +_zip_memdup(const void *mem, size_t len, zip_error_t *error) { + void *ret; + + if (len == 0) + return NULL; + + ret = malloc(len); + if (!ret) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + (void)memcpy_s(ret, len, mem, len); + + return ret; +} diff --git a/deps/libzip/lib/zip_name_locate.c b/deps/libzip/lib/zip_name_locate.c new file mode 100644 index 00000000000000..4248dc2d36e172 --- /dev/null +++ b/deps/libzip/lib/zip_name_locate.c @@ -0,0 +1,116 @@ +/* + zip_name_locate.c -- get index by name + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#ifdef HAVE_STRINGS_H +#include +#endif + +#include "zipint.h" + + +ZIP_EXTERN zip_int64_t +zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags) { + return _zip_name_locate(za, fname, flags, &za->error); +} + + +zip_int64_t +_zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *error) { + int (*cmp)(const char *, const char *); + size_t fname_length; + zip_string_t *str = NULL; + const char *fn, *p; + zip_uint64_t i; + + if (za == NULL) { + return -1; + } + + if (fname == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + fname_length = strlen(fname); + + if (fname_length > ZIP_UINT16_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((flags & (ZIP_FL_ENC_UTF_8 | ZIP_FL_ENC_RAW)) == 0 && fname[0] != '\0') { + if ((str = _zip_string_new((const zip_uint8_t *)fname, (zip_uint16_t)strlen(fname), flags, error)) == NULL) { + return -1; + } + if ((fname = (const char *)_zip_string_get(str, NULL, 0, error)) == NULL) { + _zip_string_free(str); + return -1; + } + } + + if (flags & (ZIP_FL_NOCASE | ZIP_FL_NODIR | ZIP_FL_ENC_RAW | ZIP_FL_ENC_STRICT)) { + /* can't use hash table */ + cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; + + for (i = 0; i < za->nentry; i++) { + fn = _zip_get_name(za, i, flags, error); + + /* newly added (partially filled) entry or error */ + if (fn == NULL) + continue; + + if (flags & ZIP_FL_NODIR) { + p = strrchr(fn, '/'); + if (p) + fn = p + 1; + } + + if (cmp(fname, fn) == 0) { + _zip_error_clear(error); + _zip_string_free(str); + return (zip_int64_t)i; + } + } + + zip_error_set(error, ZIP_ER_NOENT, 0); + _zip_string_free(str); + return -1; + } + else { + zip_int64_t ret = _zip_hash_lookup(za->names, (const zip_uint8_t *)fname, flags, error); + _zip_string_free(str); + return ret; + } +} diff --git a/deps/libzip/lib/zip_new.c b/deps/libzip/lib/zip_new.c new file mode 100644 index 00000000000000..4f69c8a2f5d9f8 --- /dev/null +++ b/deps/libzip/lib/zip_new.c @@ -0,0 +1,73 @@ +/* + zip_new.c -- create and init struct zip + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +/* _zip_new: + creates a new zipfile struct, and sets the contents to zero; returns + the new struct. */ + +zip_t * +_zip_new(zip_error_t *error) { + zip_t *za; + + za = (zip_t *)malloc(sizeof(struct zip)); + if (!za) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((za->names = _zip_hash_new(error)) == NULL) { + free(za); + return NULL; + } + + za->src = NULL; + za->open_flags = 0; + zip_error_init(&za->error); + za->flags = za->ch_flags = 0; + za->default_password = NULL; + za->comment_orig = za->comment_changes = NULL; + za->comment_changed = 0; + za->nentry = za->nentry_alloc = 0; + za->entry = NULL; + za->nopen_source = za->nopen_source_alloc = 0; + za->open_source = NULL; + za->progress = NULL; + + return za; +} diff --git a/deps/libzip/lib/zip_node_ext.c b/deps/libzip/lib/zip_node_ext.c new file mode 100644 index 00000000000000..1241aaf392fb8f --- /dev/null +++ b/deps/libzip/lib/zip_node_ext.c @@ -0,0 +1,12 @@ +#include "zipint.h" + +zip_encryption_implementation +_zip_get_encryption_implementation(zip_uint16_t em, int operation) { + return NULL; +} + +zip_source_t * +zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); + return NULL; +} diff --git a/deps/libzip/lib/zip_open.c b/deps/libzip/lib/zip_open.c new file mode 100644 index 00000000000000..2839dfa9aa5b87 --- /dev/null +++ b/deps/libzip/lib/zip_open.c @@ -0,0 +1,875 @@ +/* + zip_open.c -- open zip archive by name + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include + +#include "zipint.h" + +typedef enum { EXISTS_ERROR = -1, EXISTS_NOT = 0, EXISTS_OK } exists_t; +static zip_t *_zip_allocate_new(zip_source_t *src, unsigned int flags, zip_error_t *error); +static zip_int64_t _zip_checkcons(zip_t *za, zip_cdir_t *cdir, zip_error_t *error); +static zip_cdir_t *_zip_find_central_dir(zip_t *za, zip_uint64_t len); +static exists_t _zip_file_exists(zip_source_t *src, zip_error_t *error); +static int _zip_headercomp(const zip_dirent_t *, const zip_dirent_t *); +static const unsigned char *_zip_memmem(const unsigned char *, size_t, const unsigned char *, size_t); +static zip_cdir_t *_zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_error_t *error); +static zip_cdir_t *_zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error); +static zip_cdir_t *_zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error); + + +ZIP_EXTERN zip_t * +zip_open(const char *fn, int _flags, int *zep) { + zip_t *za; + zip_source_t *src; + struct zip_error error; + + zip_error_init(&error); + if ((src = zip_source_file_create(fn, 0, -1, &error)) == NULL) { + _zip_set_open_error(zep, &error, 0); + zip_error_fini(&error); + return NULL; + } + + if ((za = zip_open_from_source(src, _flags, &error)) == NULL) { + zip_source_free(src); + _zip_set_open_error(zep, &error, 0); + zip_error_fini(&error); + return NULL; + } + + zip_error_fini(&error); + return za; +} + + +ZIP_EXTERN zip_t * +zip_open_from_source(zip_source_t *src, int _flags, zip_error_t *error) { + unsigned int flags; + zip_int64_t supported; + exists_t exists; + + if (_flags < 0 || src == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + flags = (unsigned int)_flags; + + supported = zip_source_supports(src); + if ((supported & ZIP_SOURCE_SUPPORTS_SEEKABLE) != ZIP_SOURCE_SUPPORTS_SEEKABLE) { + zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); + return NULL; + } + if ((supported & ZIP_SOURCE_SUPPORTS_WRITABLE) != ZIP_SOURCE_SUPPORTS_WRITABLE) { + flags |= ZIP_RDONLY; + } + + if ((flags & (ZIP_RDONLY | ZIP_TRUNCATE)) == (ZIP_RDONLY | ZIP_TRUNCATE)) { + zip_error_set(error, ZIP_ER_RDONLY, 0); + return NULL; + } + + exists = _zip_file_exists(src, error); + switch (exists) { + case EXISTS_ERROR: + return NULL; + + case EXISTS_NOT: + if ((flags & ZIP_CREATE) == 0) { + zip_error_set(error, ZIP_ER_NOENT, 0); + return NULL; + } + return _zip_allocate_new(src, flags, error); + + default: { + zip_t *za; + if (flags & ZIP_EXCL) { + zip_error_set(error, ZIP_ER_EXISTS, 0); + return NULL; + } + if (zip_source_open(src) < 0) { + zip_error_set_from_source(error, src); + return NULL; + } + + if (flags & ZIP_TRUNCATE) { + za = _zip_allocate_new(src, flags, error); + } + else { + /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL, just like open() */ + za = _zip_open(src, flags, error); + } + + if (za == NULL) { + zip_source_close(src); + return NULL; + } + return za; + } + } +} + + +zip_t * +_zip_open(zip_source_t *src, unsigned int flags, zip_error_t *error) { + zip_t *za; + zip_cdir_t *cdir; + struct zip_stat st; + zip_uint64_t len, idx; + + zip_stat_init(&st); + if (zip_source_stat(src, &st) < 0) { + zip_error_set_from_source(error, src); + return NULL; + } + if ((st.valid & ZIP_STAT_SIZE) == 0) { + zip_error_set(error, ZIP_ER_SEEK, EOPNOTSUPP); + return NULL; + } + len = st.size; + + + if ((za = _zip_allocate_new(src, flags, error)) == NULL) { + return NULL; + } + + /* treat empty files as empty archives */ + if (len == 0 && zip_source_accept_empty(src)) { + return za; + } + + if ((cdir = _zip_find_central_dir(za, len)) == NULL) { + _zip_error_copy(error, &za->error); + /* keep src so discard does not get rid of it */ + zip_source_keep(src); + zip_discard(za); + return NULL; + } + + za->entry = cdir->entry; + za->nentry = cdir->nentry; + za->nentry_alloc = cdir->nentry_alloc; + za->comment_orig = cdir->comment; + + free(cdir); + + _zip_hash_reserve_capacity(za->names, za->nentry, &za->error); + + for (idx = 0; idx < za->nentry; idx++) { + const zip_uint8_t *name = _zip_string_get(za->entry[idx].orig->filename, NULL, 0, error); + if (name == NULL) { + /* keep src so discard does not get rid of it */ + zip_source_keep(src); + zip_discard(za); + return NULL; + } + + if (_zip_hash_add(za->names, name, idx, ZIP_FL_UNCHANGED, &za->error) == false) { + if (za->error.zip_err != ZIP_ER_EXISTS || (flags & ZIP_CHECKCONS)) { + _zip_error_copy(error, &za->error); + /* keep src so discard does not get rid of it */ + zip_source_keep(src); + zip_discard(za); + return NULL; + } + } + } + + za->ch_flags = za->flags; + + return za; +} + + +void +_zip_set_open_error(int *zep, const zip_error_t *err, int ze) { + if (err) { + ze = zip_error_code_zip(err); + switch (zip_error_system_type(err)) { + case ZIP_ET_SYS: + case ZIP_ET_LIBZIP: + errno = zip_error_code_system(err); + break; + + default: + break; + } + } + + if (zep) + *zep = ze; +} + + +/* _zip_readcdir: + tries to find a valid end-of-central-directory at the beginning of + buf, and then the corresponding central directory entries. + Returns a struct zip_cdir which contains the central directory + entries, or NULL if unsuccessful. */ + +static zip_cdir_t * +_zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_error_t *error) { + zip_cdir_t *cd; + zip_uint16_t comment_len; + zip_uint64_t i, left; + zip_uint64_t eocd_offset = _zip_buffer_offset(buffer); + zip_buffer_t *cd_buffer; + + if (_zip_buffer_left(buffer) < EOCDLEN) { + /* not enough bytes left for comment */ + zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + /* check for end-of-central-dir magic */ + if (memcmp(_zip_buffer_get(buffer, 4), EOCD_MAGIC, 4) != 0) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + if (eocd_offset >= EOCD64LOCLEN && memcmp(_zip_buffer_data(buffer) + eocd_offset - EOCD64LOCLEN, EOCD64LOC_MAGIC, 4) == 0) { + _zip_buffer_set_offset(buffer, eocd_offset - EOCD64LOCLEN); + cd = _zip_read_eocd64(za->src, buffer, buf_offset, za->flags, error); + } + else { + _zip_buffer_set_offset(buffer, eocd_offset); + cd = _zip_read_eocd(buffer, buf_offset, za->flags, error); + } + + if (cd == NULL) + return NULL; + + _zip_buffer_set_offset(buffer, eocd_offset + 20); + comment_len = _zip_buffer_get_16(buffer); + + if (cd->offset + cd->size > buf_offset + eocd_offset) { + /* cdir spans past EOCD record */ + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); + _zip_cdir_free(cd); + return NULL; + } + + if (comment_len || (za->open_flags & ZIP_CHECKCONS)) { + zip_uint64_t tail_len; + + _zip_buffer_set_offset(buffer, eocd_offset + EOCDLEN); + tail_len = _zip_buffer_left(buffer); + + if (tail_len < comment_len || ((za->open_flags & ZIP_CHECKCONS) && tail_len != comment_len)) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_COMMENT_LENGTH_INVALID); + _zip_cdir_free(cd); + return NULL; + } + + if (comment_len) { + if ((cd->comment = _zip_string_new(_zip_buffer_get(buffer, comment_len), comment_len, ZIP_FL_ENC_GUESS, error)) == NULL) { + _zip_cdir_free(cd); + return NULL; + } + } + } + + if (cd->offset >= buf_offset) { + zip_uint8_t *data; + /* if buffer already read in, use it */ + _zip_buffer_set_offset(buffer, cd->offset - buf_offset); + + if ((data = _zip_buffer_get(buffer, cd->size)) == NULL) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_LENGTH_INVALID); + _zip_cdir_free(cd); + return NULL; + } + if ((cd_buffer = _zip_buffer_new(data, cd->size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_cdir_free(cd); + return NULL; + } + } + else { + cd_buffer = NULL; + + if (zip_source_seek(za->src, (zip_int64_t)cd->offset, SEEK_SET) < 0) { + zip_error_set_from_source(error, za->src); + _zip_cdir_free(cd); + return NULL; + } + + /* possible consistency check: cd->offset = len-(cd->size+cd->comment_len+EOCDLEN) ? */ + if (zip_source_tell(za->src) != (zip_int64_t)cd->offset) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + _zip_cdir_free(cd); + return NULL; + } + } + + left = (zip_uint64_t)cd->size; + i = 0; + while (left > 0) { + bool grown = false; + zip_int64_t entry_size; + + if (i == cd->nentry) { + /* InfoZIP has a hack to avoid using Zip64: it stores nentries % 0x10000 */ + /* This hack isn't applicable if we're using Zip64, or if there is no central directory entry following. */ + + if (cd->is_zip64 || left < CDENTRYSIZE) { + break; + } + + if (!_zip_cdir_grow(cd, 0x10000, error)) { + _zip_cdir_free(cd); + _zip_buffer_free(cd_buffer); + return NULL; + } + grown = true; + } + + if ((cd->entry[i].orig = _zip_dirent_new()) == NULL || (entry_size = _zip_dirent_read(cd->entry[i].orig, za->src, cd_buffer, false, error)) < 0) { + if (zip_error_code_zip(error) == ZIP_ER_INCONS) { + zip_error_set(error, ZIP_ER_INCONS, ADD_INDEX_TO_DETAIL(zip_error_code_system(error), i)); + } + else if (grown && zip_error_code_zip(error) == ZIP_ER_NOZIP) { + zip_error_set(error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_CDIR_ENTRY_INVALID, i)); + } + _zip_cdir_free(cd); + _zip_buffer_free(cd_buffer); + return NULL; + } + i++; + left -= (zip_uint64_t)entry_size; + } + + if (i != cd->nentry || left > 0) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_WRONG_ENTRIES_COUNT); + _zip_buffer_free(cd_buffer); + _zip_cdir_free(cd); + return NULL; + } + + if (za->open_flags & ZIP_CHECKCONS) { + bool ok; + + if (cd_buffer) { + ok = _zip_buffer_eof(cd_buffer); + } + else { + zip_int64_t offset = zip_source_tell(za->src); + + if (offset < 0) { + zip_error_set_from_source(error, za->src); + _zip_cdir_free(cd); + return NULL; + } + ok = ((zip_uint64_t)offset == cd->offset + cd->size); + } + + if (!ok) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_LENGTH_INVALID); + _zip_buffer_free(cd_buffer); + _zip_cdir_free(cd); + return NULL; + } + } + + _zip_buffer_free(cd_buffer); + return cd; +} + + +/* _zip_checkcons: + Checks the consistency of the central directory by comparing central + directory entries with local headers and checking for plausible + file and header offsets. Returns -1 if not plausible, else the + difference between the lowest and the highest fileposition reached */ + +static zip_int64_t +_zip_checkcons(zip_t *za, zip_cdir_t *cd, zip_error_t *error) { + zip_uint64_t i; + zip_uint64_t min, max, j; + struct zip_dirent temp; + + _zip_dirent_init(&temp); + if (cd->nentry) { + max = cd->entry[0].orig->offset; + min = cd->entry[0].orig->offset; + } + else + min = max = 0; + + for (i = 0; i < cd->nentry; i++) { + if (cd->entry[i].orig->offset < min) + min = cd->entry[i].orig->offset; + if (min > (zip_uint64_t)cd->offset) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + j = cd->entry[i].orig->offset + cd->entry[i].orig->comp_size + _zip_string_length(cd->entry[i].orig->filename) + LENTRYSIZE; + if (j > max) + max = j; + if (max > (zip_uint64_t)cd->offset) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + if (zip_source_seek(za->src, (zip_int64_t)cd->entry[i].orig->offset, SEEK_SET) < 0) { + zip_error_set_from_source(error, za->src); + return -1; + } + + if (_zip_dirent_read(&temp, za->src, NULL, true, error) == -1) { + if (zip_error_code_zip(error) == ZIP_ER_INCONS) { + zip_error_set(error, ZIP_ER_INCONS, ADD_INDEX_TO_DETAIL(zip_error_code_system(error), i)); + } + _zip_dirent_finalize(&temp); + return -1; + } + + if (_zip_headercomp(cd->entry[i].orig, &temp) != 0) { + zip_error_set(error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_ENTRY_HEADER_MISMATCH, i)); + _zip_dirent_finalize(&temp); + return -1; + } + + cd->entry[i].orig->extra_fields = _zip_ef_merge(cd->entry[i].orig->extra_fields, temp.extra_fields); + cd->entry[i].orig->local_extra_fields_read = 1; + temp.extra_fields = NULL; + + _zip_dirent_finalize(&temp); + } + + return (max - min) < ZIP_INT64_MAX ? (zip_int64_t)(max - min) : ZIP_INT64_MAX; +} + + +/* _zip_headercomp: + compares a central directory entry and a local file header + Return 0 if they are consistent, -1 if not. */ + +static int +_zip_headercomp(const zip_dirent_t *central, const zip_dirent_t *local) { + if ((central->version_needed < local->version_needed) +#if 0 + /* some zip-files have different values in local + and global headers for the bitflags */ + || (central->bitflags != local->bitflags) +#endif + || (central->comp_method != local->comp_method) || (central->last_mod != local->last_mod) || !_zip_string_equal(central->filename, local->filename)) + return -1; + + if ((central->crc != local->crc) || (central->comp_size != local->comp_size) || (central->uncomp_size != local->uncomp_size)) { + /* InfoZip stores valid values in local header even when data descriptor is used. + This is in violation of the appnote. + macOS Archive sets the compressed size even when data descriptor is used ( but not the others), + also in violation of the appnote. + */ + /* if data descriptor is not used, the values must match */ + if ((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0) { + return -1; + } + /* when using a data descriptor, the local header value must be zero or match */ + if ((local->crc != 0 && central->crc != local->crc) || + (local->comp_size != 0 && central->comp_size != local->comp_size) || + (local->uncomp_size != 0 && central->uncomp_size != local->uncomp_size)) { + return -1; + } + } + + return 0; +} + + +static zip_t * +_zip_allocate_new(zip_source_t *src, unsigned int flags, zip_error_t *error) { + zip_t *za; + + if ((za = _zip_new(error)) == NULL) { + return NULL; + } + + za->src = src; + za->open_flags = flags; + if (flags & ZIP_RDONLY) { + za->flags |= ZIP_AFL_RDONLY; + za->ch_flags |= ZIP_AFL_RDONLY; + } + return za; +} + + +/* + * tests for file existence + */ +static exists_t +_zip_file_exists(zip_source_t *src, zip_error_t *error) { + struct zip_stat st; + + zip_stat_init(&st); + if (zip_source_stat(src, &st) != 0) { + zip_error_t *src_error = zip_source_error(src); + if (zip_error_code_zip(src_error) == ZIP_ER_READ && zip_error_code_system(src_error) == ENOENT) { + return EXISTS_NOT; + } + _zip_error_copy(error, src_error); + return EXISTS_ERROR; + } + + return EXISTS_OK; +} + + +static zip_cdir_t * +_zip_find_central_dir(zip_t *za, zip_uint64_t len) { + zip_cdir_t *cdir, *cdirnew; + const zip_uint8_t *match; + zip_int64_t buf_offset; + zip_uint64_t buflen; + zip_int64_t a; + zip_int64_t best; + zip_error_t error; + zip_buffer_t *buffer; + + if (len < EOCDLEN) { + zip_error_set(&za->error, ZIP_ER_NOZIP, 0); + return NULL; + } + + buflen = (len < CDBUFSIZE ? len : CDBUFSIZE); + if (zip_source_seek(za->src, -(zip_int64_t)buflen, SEEK_END) < 0) { + zip_error_t *src_error = zip_source_error(za->src); + if (zip_error_code_zip(src_error) != ZIP_ER_SEEK || zip_error_code_system(src_error) != EFBIG) { + /* seek before start of file on my machine */ + _zip_error_copy(&za->error, src_error); + return NULL; + } + } + if ((buf_offset = zip_source_tell(za->src)) < 0) { + zip_error_set_from_source(&za->error, za->src); + return NULL; + } + + if ((buffer = _zip_buffer_new_from_source(za->src, buflen, NULL, &za->error)) == NULL) { + return NULL; + } + + best = -1; + cdir = NULL; + if (buflen >= CDBUFSIZE) { + /* EOCD64 locator is before EOCD, so leave place for it */ + _zip_buffer_set_offset(buffer, EOCD64LOCLEN); + } + zip_error_set(&error, ZIP_ER_NOZIP, 0); + + match = _zip_buffer_get(buffer, 0); + /* The size of buffer never greater than CDBUFSIZE. */ + while (_zip_buffer_left(buffer) >= EOCDLEN && (match = _zip_memmem(match, (size_t)_zip_buffer_left(buffer) - (EOCDLEN - 4), (const unsigned char *)EOCD_MAGIC, 4)) != NULL) { + _zip_buffer_set_offset(buffer, (zip_uint64_t)(match - _zip_buffer_data(buffer))); + if ((cdirnew = _zip_read_cdir(za, buffer, (zip_uint64_t)buf_offset, &error)) != NULL) { + if (cdir) { + if (best <= 0) { + best = _zip_checkcons(za, cdir, &error); + } + + a = _zip_checkcons(za, cdirnew, &error); + if (best < a) { + _zip_cdir_free(cdir); + cdir = cdirnew; + best = a; + } + else { + _zip_cdir_free(cdirnew); + } + } + else { + cdir = cdirnew; + if (za->open_flags & ZIP_CHECKCONS) + best = _zip_checkcons(za, cdir, &error); + else { + best = 0; + } + } + cdirnew = NULL; + } + + match++; + _zip_buffer_set_offset(buffer, (zip_uint64_t)(match - _zip_buffer_data(buffer))); + } + + _zip_buffer_free(buffer); + + if (best < 0) { + _zip_error_copy(&za->error, &error); + _zip_cdir_free(cdir); + return NULL; + } + + return cdir; +} + + +static const unsigned char *_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen) { + const unsigned char *p; + + if (littlelen == 0) { + return big; + } + + if (biglen < littlelen) { + return NULL; + } + + p = big; + while (true) { + p = (const unsigned char *)memchr(p, little[0], biglen - (littlelen - 1) - (size_t)(p - big)); + if (p == NULL) { + return NULL; + } + if (memcmp(p + 1, little + 1, littlelen - 1) == 0) { + return p; + } + p += 1; + } +} + + +static zip_cdir_t * +_zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error) { + zip_cdir_t *cd; + zip_uint64_t i, nentry, size, offset, eocd_offset; + + if (_zip_buffer_left(buffer) < EOCDLEN) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD_LENGTH_INVALID); + return NULL; + } + + eocd_offset = _zip_buffer_offset(buffer); + + _zip_buffer_get(buffer, 4); /* magic already verified */ + + if (_zip_buffer_get_32(buffer) != 0) { + zip_error_set(error, ZIP_ER_MULTIDISK, 0); + return NULL; + } + + /* number of cdir-entries on this disk */ + i = _zip_buffer_get_16(buffer); + /* number of cdir-entries */ + nentry = _zip_buffer_get_16(buffer); + + if (nentry != i) { + zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + size = _zip_buffer_get_32(buffer); + offset = _zip_buffer_get_32(buffer); + + if (offset + size < offset) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + + if (offset + size > buf_offset + eocd_offset) { + /* cdir spans past EOCD record */ + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); + return NULL; + } + + if ((flags & ZIP_CHECKCONS) && offset + size != buf_offset + eocd_offset) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_LENGTH_INVALID); + return NULL; + } + + if ((cd = _zip_cdir_new(nentry, error)) == NULL) + return NULL; + + cd->is_zip64 = false; + cd->size = size; + cd->offset = offset; + + return cd; +} + + +static zip_cdir_t * +_zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error) { + zip_cdir_t *cd; + zip_uint64_t offset; + zip_uint8_t eocd[EOCD64LEN]; + zip_uint64_t eocd_offset; + zip_uint64_t size, nentry, i, eocdloc_offset; + bool free_buffer; + zip_uint32_t num_disks, num_disks64, eocd_disk, eocd_disk64; + + eocdloc_offset = _zip_buffer_offset(buffer); + + _zip_buffer_get(buffer, 4); /* magic already verified */ + + num_disks = _zip_buffer_get_16(buffer); + eocd_disk = _zip_buffer_get_16(buffer); + eocd_offset = _zip_buffer_get_64(buffer); + + /* valid seek value for start of EOCD */ + if (eocd_offset > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + + /* does EOCD fit before EOCD locator? */ + if (eocd_offset + EOCD64LEN > eocdloc_offset + buf_offset) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_OVERLAPS_EOCD); + return NULL; + } + + /* make sure current position of buffer is beginning of EOCD */ + if (eocd_offset >= buf_offset && eocd_offset + EOCD64LEN <= buf_offset + _zip_buffer_size(buffer)) { + _zip_buffer_set_offset(buffer, eocd_offset - buf_offset); + free_buffer = false; + } + else { + if (zip_source_seek(src, (zip_int64_t)eocd_offset, SEEK_SET) < 0) { + zip_error_set_from_source(error, src); + return NULL; + } + if ((buffer = _zip_buffer_new_from_source(src, EOCD64LEN, eocd, error)) == NULL) { + return NULL; + } + free_buffer = true; + } + + if (memcmp(_zip_buffer_get(buffer, 4), EOCD64_MAGIC, 4) != 0) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_WRONG_MAGIC); + if (free_buffer) { + _zip_buffer_free(buffer); + } + return NULL; + } + + /* size of EOCD */ + size = _zip_buffer_get_64(buffer); + + /* is there a hole between EOCD and EOCD locator, or do they overlap? */ + if ((flags & ZIP_CHECKCONS) && size + eocd_offset + 12 != buf_offset + eocdloc_offset) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_OVERLAPS_EOCD); + if (free_buffer) { + _zip_buffer_free(buffer); + } + return NULL; + } + + _zip_buffer_get(buffer, 4); /* skip version made by/needed */ + + num_disks64 = _zip_buffer_get_32(buffer); + eocd_disk64 = _zip_buffer_get_32(buffer); + + /* if eocd values are 0xffff, we have to use eocd64 values. + otherwise, if the values are not the same, it's inconsistent; + in any case, if the value is not 0, we don't support it */ + if (num_disks == 0xffff) { + num_disks = num_disks64; + } + if (eocd_disk == 0xffff) { + eocd_disk = eocd_disk64; + } + if ((flags & ZIP_CHECKCONS) && (eocd_disk != eocd_disk64 || num_disks != num_disks64)) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_MISMATCH); + if (free_buffer) { + _zip_buffer_free(buffer); + } + return NULL; + } + if (num_disks != 0 || eocd_disk != 0) { + zip_error_set(error, ZIP_ER_MULTIDISK, 0); + if (free_buffer) { + _zip_buffer_free(buffer); + } + return NULL; + } + + nentry = _zip_buffer_get_64(buffer); + i = _zip_buffer_get_64(buffer); + + if (nentry != i) { + zip_error_set(error, ZIP_ER_MULTIDISK, 0); + if (free_buffer) { + _zip_buffer_free(buffer); + } + return NULL; + } + + size = _zip_buffer_get_64(buffer); + offset = _zip_buffer_get_64(buffer); + + /* did we read past the end of the buffer? */ + if (!_zip_buffer_ok(buffer)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + if (free_buffer) { + _zip_buffer_free(buffer); + } + return NULL; + } + + if (free_buffer) { + _zip_buffer_free(buffer); + } + + if (offset > ZIP_INT64_MAX || offset + size < offset) { + zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + if (offset + size > buf_offset + eocd_offset) { + /* cdir spans past EOCD record */ + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); + return NULL; + } + if ((flags & ZIP_CHECKCONS) && offset + size != buf_offset + eocd_offset) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); + return NULL; + } + + if (nentry > size / CDENTRYSIZE) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_INVALID); + return NULL; + } + + if ((cd = _zip_cdir_new(nentry, error)) == NULL) + return NULL; + + cd->is_zip64 = true; + cd->size = size; + cd->offset = offset; + + return cd; +} diff --git a/deps/libzip/lib/zip_pkware.c b/deps/libzip/lib/zip_pkware.c new file mode 100644 index 00000000000000..6a8c9fcde400b6 --- /dev/null +++ b/deps/libzip/lib/zip_pkware.c @@ -0,0 +1,112 @@ +/* + zip_pkware.c -- Traditional PKWARE de/encryption backend routines + Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + +#define PKWARE_KEY0 305419896 +#define PKWARE_KEY1 591751049 +#define PKWARE_KEY2 878082192 + + +static void +update_keys(zip_pkware_keys_t *keys, zip_uint8_t b) { + keys->key[0] = (zip_uint32_t)crc32(keys->key[0] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL; + keys->key[1] = (keys->key[1] + (keys->key[0] & 0xff)) * 134775813 + 1; + b = (zip_uint8_t)(keys->key[1] >> 24); + keys->key[2] = (zip_uint32_t)crc32(keys->key[2] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL; +} + + +static zip_uint8_t +crypt_byte(zip_pkware_keys_t *keys) { + zip_uint16_t tmp; + tmp = (zip_uint16_t)(keys->key[2] | 2); + tmp = (zip_uint16_t)(((zip_uint32_t)tmp * (tmp ^ 1)) >> 8); + return (zip_uint8_t)tmp; +} + + +void +_zip_pkware_keys_reset(zip_pkware_keys_t *keys) { + keys->key[0] = PKWARE_KEY0; + keys->key[1] = PKWARE_KEY1; + keys->key[2] = PKWARE_KEY2; +} + + +void +_zip_pkware_encrypt(zip_pkware_keys_t *keys, zip_uint8_t *out, const zip_uint8_t *in, zip_uint64_t len) { + zip_uint64_t i; + zip_uint8_t b; + zip_uint8_t tmp; + + for (i = 0; i < len; i++) { + b = in[i]; + + if (out != NULL) { + tmp = crypt_byte(keys); + update_keys(keys, b); + b ^= tmp; + out[i] = b; + } + else { + /* during initialization, we're only interested in key updates */ + update_keys(keys, b); + } + } +} + + +void +_zip_pkware_decrypt(zip_pkware_keys_t *keys, zip_uint8_t *out, const zip_uint8_t *in, zip_uint64_t len) { + zip_uint64_t i; + zip_uint8_t b; + zip_uint8_t tmp; + + for (i = 0; i < len; i++) { + b = in[i]; + + /* during initialization, we're only interested in key updates */ + if (out != NULL) { + tmp = crypt_byte(keys); + b ^= tmp; + out[i] = b; + } + + update_keys(keys, b); + } +} diff --git a/deps/libzip/lib/zip_progress.c b/deps/libzip/lib/zip_progress.c new file mode 100644 index 00000000000000..e080514b12dcaf --- /dev/null +++ b/deps/libzip/lib/zip_progress.c @@ -0,0 +1,293 @@ +/* + zip_progress.c -- progress reporting + Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + +struct zip_progress { + zip_t *za; + + zip_progress_callback callback_progress; + void (*ud_progress_free)(void *); + void *ud_progress; + + zip_cancel_callback callback_cancel; + void (*ud_cancel_free)(void *); + void *ud_cancel; + + double precision; + + /* state */ + double last_update; /* last value callback function was called with */ + + double start; /* start of sub-progress section */ + double end; /* end of sub-progress section */ +}; + +static void _zip_progress_free_cancel_callback(zip_progress_t *progress); +static void _zip_progress_free_progress_callback(zip_progress_t *progress); +static zip_progress_t *_zip_progress_new(zip_t *za); +static void _zip_progress_set_cancel_callback(zip_progress_t *progress, zip_cancel_callback callback, void (*ud_free)(void *), void *ud); +static void _zip_progress_set_progress_callback(zip_progress_t *progress, double precision, zip_progress_callback callback, void (*ud_free)(void *), void *ud); + +void +_zip_progress_end(zip_progress_t *progress) { + _zip_progress_update(progress, 1.0); +} + + +void +_zip_progress_free(zip_progress_t *progress) { + if (progress == NULL) { + return; + } + + _zip_progress_free_progress_callback(progress); + _zip_progress_free_cancel_callback(progress); + + free(progress); +} + + +static zip_progress_t * +_zip_progress_new(zip_t *za) { + zip_progress_t *progress = (zip_progress_t *)malloc(sizeof(*progress)); + + if (progress == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + progress->za = za; + + progress->callback_progress = NULL; + progress->ud_progress_free = NULL; + progress->ud_progress = NULL; + progress->precision = 0.0; + + progress->callback_cancel = NULL; + progress->ud_cancel_free = NULL; + progress->ud_cancel = NULL; + + return progress; +} + +static void +_zip_progress_free_progress_callback(zip_progress_t *progress) { + if (progress->ud_progress_free) { + progress->ud_progress_free(progress->ud_progress); + } + + progress->callback_progress = NULL; + progress->ud_progress = NULL; + progress->ud_progress_free = NULL; +} + +static void +_zip_progress_free_cancel_callback(zip_progress_t *progress) { + if (progress->ud_cancel_free) { + progress->ud_cancel_free(progress->ud_cancel); + } + + progress->callback_cancel = NULL; + progress->ud_cancel = NULL; + progress->ud_cancel_free = NULL; +} + +static void +_zip_progress_set_progress_callback(zip_progress_t *progress, double precision, zip_progress_callback callback, void (*ud_free)(void *), void *ud) { + _zip_progress_free_progress_callback(progress); + + progress->callback_progress = callback; + progress->ud_progress_free = ud_free; + progress->ud_progress = ud; + progress->precision = precision; +} + +void +_zip_progress_set_cancel_callback(zip_progress_t *progress, zip_cancel_callback callback, void (*ud_free)(void *), void *ud) { + _zip_progress_free_cancel_callback(progress); + + progress->callback_cancel = callback; + progress->ud_cancel_free = ud_free; + progress->ud_cancel = ud; +} + +int +_zip_progress_start(zip_progress_t *progress) { + if (progress == NULL) { + return 0; + } + + if (progress->callback_progress != NULL) { + progress->last_update = 0.0; + progress->callback_progress(progress->za, 0.0, progress->ud_progress); + } + + if (progress->callback_cancel != NULL) { + if (progress->callback_cancel(progress->za, progress->ud_cancel)) { + return -1; + } + } + + return 0; +} + + +int +_zip_progress_subrange(zip_progress_t *progress, double start, double end) { + if (progress == NULL) { + return 0; + } + + progress->start = start; + progress->end = end; + + return _zip_progress_update(progress, 0.0); +} + +int +_zip_progress_update(zip_progress_t *progress, double sub_current) { + double current; + + if (progress == NULL) { + return 0; + } + + if (progress->callback_progress != NULL) { + current = ZIP_MIN(ZIP_MAX(sub_current, 0.0), 1.0) * (progress->end - progress->start) + progress->start; + + if (current - progress->last_update > progress->precision) { + progress->callback_progress(progress->za, current, progress->ud_progress); + progress->last_update = current; + } + } + + if (progress->callback_cancel != NULL) { + if (progress->callback_cancel(progress->za, progress->ud_cancel)) { + return -1; + } + } + + return 0; +} + + +ZIP_EXTERN int +zip_register_progress_callback_with_state(zip_t *za, double precision, zip_progress_callback callback, void (*ud_free)(void *), void *ud) { + if (callback != NULL) { + if (za->progress == NULL) { + if ((za->progress = _zip_progress_new(za)) == NULL) { + return -1; + } + } + + _zip_progress_set_progress_callback(za->progress, precision, callback, ud_free, ud); + } + else { + if (za->progress != NULL) { + if (za->progress->callback_cancel == NULL) { + _zip_progress_free(za->progress); + za->progress = NULL; + } + else { + _zip_progress_free_progress_callback(za->progress); + } + } + } + + return 0; +} + + +ZIP_EXTERN int +zip_register_cancel_callback_with_state(zip_t *za, zip_cancel_callback callback, void (*ud_free)(void *), void *ud) { + if (callback != NULL) { + if (za->progress == NULL) { + if ((za->progress = _zip_progress_new(za)) == NULL) { + return -1; + } + } + + _zip_progress_set_cancel_callback(za->progress, callback, ud_free, ud); + } + else { + if (za->progress != NULL) { + if (za->progress->callback_progress == NULL) { + _zip_progress_free(za->progress); + za->progress = NULL; + } + else { + _zip_progress_free_cancel_callback(za->progress); + } + } + } + + return 0; +} + + +struct legacy_ud { + zip_progress_callback_t callback; +}; + + +static void +_zip_legacy_progress_callback(zip_t *za, double progress, void *vud) { + struct legacy_ud *ud = (struct legacy_ud *)vud; + + ud->callback(progress); +} + +ZIP_EXTERN void +zip_register_progress_callback(zip_t *za, zip_progress_callback_t progress_callback) { + struct legacy_ud *ud; + + if (progress_callback == NULL) { + zip_register_progress_callback_with_state(za, 0, NULL, NULL, NULL); + } + + if ((ud = (struct legacy_ud *)malloc(sizeof(*ud))) == NULL) { + return; + } + + ud->callback = progress_callback; + + if (zip_register_progress_callback_with_state(za, 0.001, _zip_legacy_progress_callback, free, ud) < 0) { + free(ud); + } +} diff --git a/deps/libzip/lib/zip_random_unix.c b/deps/libzip/lib/zip_random_unix.c new file mode 100644 index 00000000000000..f84a5482a41bd8 --- /dev/null +++ b/deps/libzip/lib/zip_random_unix.c @@ -0,0 +1,104 @@ +/* + zip_random_unix.c -- fill the user's buffer with random stuff (Unix version) + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#ifdef HAVE_CRYPTO +#include "zip_crypto.h" +#endif + +#ifdef HAVE_ARC4RANDOM + +#include + +#ifndef HAVE_SECURE_RANDOM +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + arc4random_buf(buffer, length); + return true; +} +#endif + +#ifndef HAVE_RANDOM_UINT32 +zip_uint32_t +zip_random_uint32(void) { + return arc4random(); +} +#endif + +#else /* HAVE_ARC4RANDOM */ + +#ifndef HAVE_SECURE_RANDOM +#include +#include + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + int fd; + + if ((fd = open("/dev/urandom", O_RDONLY)) < 0) { + return false; + } + + if (read(fd, buffer, length) != length) { + close(fd); + return false; + } + + close(fd); + return true; +} +#endif + +#ifndef HAVE_RANDOM_UINT32 +#include + +zip_uint32_t +zip_random_uint32(void) { + static bool seeded = false; + + zip_uint32_t value; + + if (zip_secure_random((zip_uint8_t *)&value, sizeof(value))) { + return value; + } + + if (!seeded) { + srandom((unsigned int)time(NULL)); + } + + return (zip_uint32_t)random(); +} +#endif + +#endif /* HAVE_ARC4RANDOM */ diff --git a/deps/libzip/lib/zip_random_uwp.c b/deps/libzip/lib/zip_random_uwp.c new file mode 100644 index 00000000000000..9f842b99153e14 --- /dev/null +++ b/deps/libzip/lib/zip_random_uwp.c @@ -0,0 +1,81 @@ +/* + zip_random_uwp.c -- fill the user's buffer with random stuff (UWP version) + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#ifdef HAVE_CRYPTO +#include "zip_crypto.h" +#endif + +#ifndef HAVE_SECURE_RANDOM + +#include +#include + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + BCRYPT_ALG_HANDLE hAlg = NULL; + NTSTATUS hr = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0); + if (!BCRYPT_SUCCESS(hr) || hAlg == NULL) { + return false; + } + hr = BCryptGenRandom(&hAlg, buffer, length, 0); + BCryptCloseAlgorithmProvider(&hAlg, 0); + if (!BCRYPT_SUCCESS(hr)) { + return false; + } + return true; +} + +#endif + +#ifndef HAVE_RANDOM_UINT32 +#include + +zip_uint32_t +zip_random_uint32(void) { + static bool seeded = false; + + zip_uint32_t value; + + if (zip_secure_random((zip_uint8_t *)&value, sizeof(value))) { + return value; + } + + if (!seeded) { + srand((unsigned int)time(NULL)); + } + + return (zip_uint32_t)rand(); +} +#endif diff --git a/deps/libzip/lib/zip_random_win32.c b/deps/libzip/lib/zip_random_win32.c new file mode 100644 index 00000000000000..966b9a5eb54d56 --- /dev/null +++ b/deps/libzip/lib/zip_random_win32.c @@ -0,0 +1,81 @@ +/* + zip_random_win32.c -- fill the user's buffer with random stuff (Windows version) + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#ifdef HAVE_CRYPTO +#include "zip_crypto.h" +#endif + +#include + +#ifndef HAVE_SECURE_RANDOM + +#include + +ZIP_EXTERN bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + HCRYPTPROV hprov; + if (!CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { + return false; + } + if (!CryptGenRandom(hprov, length, buffer)) { + return false; + } + if (!CryptReleaseContext(hprov, 0)) { + return false; + } + return true; +} +#endif + +#ifndef HAVE_RANDOM_UINT32 +#include + +zip_uint32_t +zip_random_uint32(void) { + static bool seeded = false; + + zip_uint32_t value; + + if (zip_secure_random((zip_uint8_t *)&value, sizeof(value))) { + return value; + } + + if (!seeded) { + srand((unsigned int)time(NULL)); + } + + return (zip_uint32_t)rand(); +} +#endif diff --git a/deps/libzip/lib/zip_rename.c b/deps/libzip/lib/zip_rename.c new file mode 100644 index 00000000000000..c89b06c9e36f35 --- /dev/null +++ b/deps/libzip/lib/zip_rename.c @@ -0,0 +1,42 @@ +/* + zip_rename.c -- rename file in zip archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN int +zip_rename(zip_t *za, zip_uint64_t idx, const char *name) { + return zip_file_rename(za, idx, name, 0); +} diff --git a/deps/libzip/lib/zip_replace.c b/deps/libzip/lib/zip_replace.c new file mode 100644 index 00000000000000..96c083c3dce2de --- /dev/null +++ b/deps/libzip/lib/zip_replace.c @@ -0,0 +1,42 @@ +/* + zip_replace.c -- replace file via callback function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN int +zip_replace(zip_t *za, zip_uint64_t idx, zip_source_t *source) { + return zip_file_replace(za, idx, source, 0); +} diff --git a/deps/libzip/lib/zip_set_archive_comment.c b/deps/libzip/lib/zip_set_archive_comment.c new file mode 100644 index 00000000000000..906371004ff19f --- /dev/null +++ b/deps/libzip/lib/zip_set_archive_comment.c @@ -0,0 +1,80 @@ +/* + zip_set_archive_comment.c -- set archive comment + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_set_archive_comment(zip_t *za, const char *comment, zip_uint16_t len) { + zip_string_t *cstr; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (len > 0 && comment == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((cstr = _zip_string_new((const zip_uint8_t *)comment, len, ZIP_FL_ENC_GUESS, &za->error)) == NULL) + return -1; + + if (_zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_CP437) { + _zip_string_free(cstr); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + } + else + cstr = NULL; + + _zip_string_free(za->comment_changes); + za->comment_changes = NULL; + + if (((za->comment_orig && _zip_string_equal(za->comment_orig, cstr)) || (za->comment_orig == NULL && cstr == NULL))) { + _zip_string_free(cstr); + za->comment_changed = 0; + } + else { + za->comment_changes = cstr; + za->comment_changed = 1; + } + + return 0; +} diff --git a/deps/libzip/lib/zip_set_archive_flag.c b/deps/libzip/lib/zip_set_archive_flag.c new file mode 100644 index 00000000000000..610409d5ab51c4 --- /dev/null +++ b/deps/libzip/lib/zip_set_archive_flag.c @@ -0,0 +1,65 @@ +/* + zip_get_archive_flag.c -- set archive global flag + Copyright (C) 2008-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_set_archive_flag(zip_t *za, zip_flags_t flag, int value) { + unsigned int new_flags; + + if (value) + new_flags = za->ch_flags | flag; + else + new_flags = za->ch_flags & ~flag; + + if (new_flags == za->ch_flags) + return 0; + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if ((flag & ZIP_AFL_RDONLY) && value && (za->ch_flags & ZIP_AFL_RDONLY) == 0) { + if (_zip_changed(za, NULL)) { + zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return -1; + } + } + + za->ch_flags = new_flags; + + return 0; +} diff --git a/deps/libzip/lib/zip_set_default_password.c b/deps/libzip/lib/zip_set_default_password.c new file mode 100644 index 00000000000000..4bab513f46a337 --- /dev/null +++ b/deps/libzip/lib/zip_set_default_password.c @@ -0,0 +1,58 @@ +/* + zip_set_default_password.c -- set default password for decryption + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_set_default_password(zip_t *za, const char *passwd) { + if (za == NULL) + return -1; + + free(za->default_password); + + if (passwd && passwd[0] != '\0') { + if ((za->default_password = strdup(passwd)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + else + za->default_password = NULL; + + return 0; +} diff --git a/deps/libzip/lib/zip_set_file_comment.c b/deps/libzip/lib/zip_set_file_comment.c new file mode 100644 index 00000000000000..5d2b0b8a03c8a0 --- /dev/null +++ b/deps/libzip/lib/zip_set_file_comment.c @@ -0,0 +1,46 @@ +/* + zip_set_file_comment.c -- set comment for file in archive + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN int +zip_set_file_comment(zip_t *za, zip_uint64_t idx, const char *comment, int len) { + if (len < 0 || len > ZIP_UINT16_MAX) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + return zip_file_set_comment(za, idx, comment, (zip_uint16_t)len, 0); +} diff --git a/deps/libzip/lib/zip_set_file_compression.c b/deps/libzip/lib/zip_set_file_compression.c new file mode 100644 index 00000000000000..1a19fb772b741b --- /dev/null +++ b/deps/libzip/lib/zip_set_file_compression.c @@ -0,0 +1,91 @@ +/* + zip_set_file_compression.c -- set compression for file in archive + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_set_file_compression(zip_t *za, zip_uint64_t idx, zip_int32_t method, zip_uint32_t flags) { + zip_entry_t *e; + zip_int32_t old_method; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (!zip_compression_method_supported(method, true)) { + zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return -1; + } + + e = za->entry + idx; + + old_method = (e->orig == NULL ? ZIP_CM_DEFAULT : e->orig->comp_method); + + /* TODO: do we want to recompress if level is set? Only if it's + * different than what bit flags tell us, but those are not + * defined for all compression methods, or not directly mappable + * to levels */ + + if (method == old_method) { + if (e->changes) { + e->changes->changed &= ~ZIP_DIRENT_COMP_METHOD; + e->changes->compression_level = 0; + if (e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + } + else { + if (e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + e->changes->comp_method = method; + e->changes->compression_level = (zip_uint16_t)flags; + e->changes->changed |= ZIP_DIRENT_COMP_METHOD; + } + + return 0; +} diff --git a/deps/libzip/lib/zip_set_name.c b/deps/libzip/lib/zip_set_name.c new file mode 100644 index 00000000000000..f1bf703e44b8d9 --- /dev/null +++ b/deps/libzip/lib/zip_set_name.c @@ -0,0 +1,157 @@ +/* + zip_set_name.c -- rename helper function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + + +int +_zip_set_name(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags) { + zip_entry_t *e; + zip_string_t *str; + bool same_as_orig; + zip_int64_t i; + const zip_uint8_t *old_name, *new_name; + zip_string_t *old_str; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (name && name[0] != '\0') { + /* TODO: check for string too long */ + if ((str = _zip_string_new((const zip_uint8_t *)name, (zip_uint16_t)strlen(name), flags, &za->error)) == NULL) + return -1; + if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(str, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED) + str->encoding = ZIP_ENCODING_UTF8_KNOWN; + } + else + str = NULL; + + /* TODO: encoding flags needed for CP437? */ + if ((i = _zip_name_locate(za, name, 0, NULL)) >= 0 && (zip_uint64_t)i != idx) { + _zip_string_free(str); + zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; + } + + /* no effective name change */ + if (i >= 0 && (zip_uint64_t)i == idx) { + _zip_string_free(str); + return 0; + } + + e = za->entry + idx; + + if (e->orig) + same_as_orig = _zip_string_equal(e->orig->filename, str); + else + same_as_orig = false; + + if (!same_as_orig && e->changes == NULL) { + if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_string_free(str); + return -1; + } + } + + if ((new_name = _zip_string_get(same_as_orig ? e->orig->filename : str, NULL, 0, &za->error)) == NULL) { + _zip_string_free(str); + return -1; + } + + if (e->changes) { + old_str = e->changes->filename; + } + else if (e->orig) { + old_str = e->orig->filename; + } + else { + old_str = NULL; + } + + if (old_str) { + if ((old_name = _zip_string_get(old_str, NULL, 0, &za->error)) == NULL) { + _zip_string_free(str); + return -1; + } + } + else { + old_name = NULL; + } + + if (_zip_hash_add(za->names, new_name, idx, 0, &za->error) == false) { + _zip_string_free(str); + return -1; + } + if (old_name) { + _zip_hash_delete(za->names, old_name, NULL); + } + + if (same_as_orig) { + if (e->changes) { + if (e->changes->changed & ZIP_DIRENT_FILENAME) { + _zip_string_free(e->changes->filename); + e->changes->changed &= ~ZIP_DIRENT_FILENAME; + if (e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + else { + /* TODO: what if not cloned? can that happen? */ + e->changes->filename = e->orig->filename; + } + } + } + _zip_string_free(str); + } + else { + if (e->changes->changed & ZIP_DIRENT_FILENAME) { + _zip_string_free(e->changes->filename); + } + e->changes->changed |= ZIP_DIRENT_FILENAME; + e->changes->filename = str; + } + + return 0; +} diff --git a/deps/libzip/lib/zip_source_accept_empty.c b/deps/libzip/lib/zip_source_accept_empty.c new file mode 100644 index 00000000000000..e772aeea967bc5 --- /dev/null +++ b/deps/libzip/lib/zip_source_accept_empty.c @@ -0,0 +1,52 @@ +/* + zip_source_accept_empty.c -- if empty source is a valid archive + Copyright (C) 2019-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +bool +zip_source_accept_empty(zip_source_t *src) { + zip_int64_t ret; + + if ((zip_source_supports(src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ACCEPT_EMPTY)) == 0) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + return zip_source_accept_empty(src->src); + } + return true; + } + + ret = _zip_source_call(src, NULL, 0, ZIP_SOURCE_ACCEPT_EMPTY); + + return ret != 0; +} diff --git a/deps/libzip/lib/zip_source_begin_write.c b/deps/libzip/lib/zip_source_begin_write.c new file mode 100644 index 00000000000000..4a9d5d5d662df1 --- /dev/null +++ b/deps/libzip/lib/zip_source_begin_write.c @@ -0,0 +1,57 @@ +/* + zip_source_begin_write.c -- start a new file for writing + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_begin_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (ZIP_SOURCE_IS_OPEN_WRITING(src)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_BEGIN_WRITE) < 0) { + return -1; + } + + src->write_state = ZIP_SOURCE_WRITE_OPEN; + + return 0; +} diff --git a/deps/libzip/lib/zip_source_begin_write_cloning.c b/deps/libzip/lib/zip_source_begin_write_cloning.c new file mode 100644 index 00000000000000..df195fcd40fba6 --- /dev/null +++ b/deps/libzip/lib/zip_source_begin_write_cloning.c @@ -0,0 +1,57 @@ +/* + zip_source_begin_write_cloning.c -- clone part of file for writing + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_begin_write_cloning(zip_source_t *src, zip_uint64_t offset) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (ZIP_SOURCE_IS_OPEN_WRITING(src)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_source_call(src, NULL, offset, ZIP_SOURCE_BEGIN_WRITE_CLONING) < 0) { + return -1; + } + + src->write_state = ZIP_SOURCE_WRITE_OPEN; + + return 0; +} diff --git a/deps/libzip/lib/zip_source_buffer.c b/deps/libzip/lib/zip_source_buffer.c new file mode 100644 index 00000000000000..7bea464f334086 --- /dev/null +++ b/deps/libzip/lib/zip_source_buffer.c @@ -0,0 +1,643 @@ +/* + zip_source_buffer.c -- create zip data source from buffer + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#include "zipint.h" + +#ifndef WRITE_FRAGMENT_SIZE +#define WRITE_FRAGMENT_SIZE (64 * 1024) +#endif + +struct buffer { + zip_buffer_fragment_t *fragments; /* fragments */ + zip_uint64_t *fragment_offsets; /* offset of each fragment from start of buffer, nfragments+1 entries */ + zip_uint64_t nfragments; /* number of allocated fragments */ + zip_uint64_t fragments_capacity; /* size of fragments (number of pointers) */ + + zip_uint64_t first_owned_fragment; /* first fragment to free data from */ + + zip_uint64_t shared_fragments; /* number of shared fragments */ + struct buffer *shared_buffer; /* buffer fragments are shared with */ + + zip_uint64_t size; /* size of buffer */ + zip_uint64_t offset; /* current offset in buffer */ + zip_uint64_t current_fragment; /* fragment current offset is in */ +}; + +typedef struct buffer buffer_t; + +struct read_data { + zip_error_t error; + time_t mtime; + zip_file_attributes_t attributes; + buffer_t *in; + buffer_t *out; +}; + +#define buffer_capacity(buffer) ((buffer)->fragment_offsets[(buffer)->nfragments]) +#define buffer_size(buffer) ((buffer)->size) + +static buffer_t *buffer_clone(buffer_t *buffer, zip_uint64_t length, zip_error_t *error); +static zip_uint64_t buffer_find_fragment(const buffer_t *buffer, zip_uint64_t offset); +static void buffer_free(buffer_t *buffer); +static bool buffer_grow_fragments(buffer_t *buffer, zip_uint64_t capacity, zip_error_t *error); +static buffer_t *buffer_new(const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int free_data, zip_error_t *error); +static zip_int64_t buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length); +static int buffer_seek(buffer_t *buffer, void *data, zip_uint64_t len, zip_error_t *error); +static zip_int64_t buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *); + +static zip_int64_t read_data(void *, void *, zip_uint64_t, zip_source_cmd_t); + +zip_source_t *zip_source_buffer_with_attributes_create(const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes, zip_error_t *error); +zip_source_t *zip_source_buffer_fragment_with_attributes_create(const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int freep, zip_file_attributes_t *attributes, zip_error_t *error); + + +ZIP_EXTERN zip_source_t * +zip_source_buffer(zip_t *za, const void *data, zip_uint64_t len, int freep) { + if (za == NULL) + return NULL; + + return zip_source_buffer_with_attributes_create(data, len, freep, NULL, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_buffer_create(const void *data, zip_uint64_t len, int freep, zip_error_t *error) { + return zip_source_buffer_with_attributes_create(data, len, freep, NULL, error); +} + + +zip_source_t * +zip_source_buffer_with_attributes_create(const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes, zip_error_t *error) { + zip_buffer_fragment_t fragment; + + if (data == NULL) { + if (len > 0) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return zip_source_buffer_fragment_with_attributes_create(NULL, 0, freep, attributes, error); + } + + fragment.data = (zip_uint8_t *)data; + fragment.length = len; + + return zip_source_buffer_fragment_with_attributes_create(&fragment, 1, freep, attributes, error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_buffer_fragment(zip_t *za, const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int freep) { + if (za == NULL) { + return NULL; + } + + return zip_source_buffer_fragment_with_attributes_create(fragments, nfragments, freep, NULL, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_buffer_fragment_create(const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int freep, zip_error_t *error) { + return zip_source_buffer_fragment_with_attributes_create(fragments, nfragments, freep, NULL, error); +} + +zip_source_t * +zip_source_buffer_fragment_with_attributes_create(const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int freep, zip_file_attributes_t *attributes, zip_error_t *error) { + struct read_data *ctx; + zip_source_t *zs; + buffer_t *buffer; + + if (fragments == NULL && nfragments > 0) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((buffer = buffer_new(fragments, nfragments, freep, error)) == NULL) { + return NULL; + } + + if ((ctx = (struct read_data *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + buffer_free(buffer); + return NULL; + } + + ctx->in = buffer; + ctx->out = NULL; + ctx->mtime = time(NULL); + if (attributes) { + (void)memcpy_s(&ctx->attributes, sizeof(ctx->attributes), attributes, sizeof(ctx->attributes)); + } + else { + zip_file_attributes_init(&ctx->attributes); + } + zip_error_init(&ctx->error); + + if ((zs = zip_source_function_create(read_data, ctx, error)) == NULL) { + buffer_free(ctx->in); + free(ctx); + return NULL; + } + + return zs; +} + + +zip_source_t * +zip_source_buffer_with_attributes(zip_t *za, const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes) { + return zip_source_buffer_with_attributes_create(data, len, freep, attributes, &za->error); +} + +static zip_int64_t +read_data(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + struct read_data *ctx = (struct read_data *)state; + + switch (cmd) { + case ZIP_SOURCE_BEGIN_WRITE: + if ((ctx->out = buffer_new(NULL, 0, 0, &ctx->error)) == NULL) { + return -1; + } + ctx->out->offset = 0; + ctx->out->current_fragment = 0; + return 0; + + case ZIP_SOURCE_BEGIN_WRITE_CLONING: + if ((ctx->out = buffer_clone(ctx->in, len, &ctx->error)) == NULL) { + return -1; + } + ctx->out->offset = len; + ctx->out->current_fragment = ctx->out->nfragments; + return 0; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_COMMIT_WRITE: + buffer_free(ctx->in); + ctx->in = ctx->out; + ctx->out = NULL; + return 0; + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + buffer_free(ctx->in); + buffer_free(ctx->out); + free(ctx); + return 0; + + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: { + if (len < sizeof(ctx->attributes)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + + (void)memcpy_s(data, sizeof(ctx->attributes), &ctx->attributes, sizeof(ctx->attributes)); + + return sizeof(ctx->attributes); + } + + case ZIP_SOURCE_OPEN: + ctx->in->offset = 0; + ctx->in->current_fragment = 0; + return 0; + + case ZIP_SOURCE_READ: + if (len > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + return buffer_read(ctx->in, data, len); + + case ZIP_SOURCE_REMOVE: { + buffer_t *empty = buffer_new(NULL, 0, 0, &ctx->error); + if (empty == NULL) { + return -1; + } + + buffer_free(ctx->in); + ctx->in = empty; + return 0; + } + + case ZIP_SOURCE_ROLLBACK_WRITE: + buffer_free(ctx->out); + ctx->out = NULL; + return 0; + + case ZIP_SOURCE_SEEK: + return buffer_seek(ctx->in, data, len, &ctx->error); + + case ZIP_SOURCE_SEEK_WRITE: + return buffer_seek(ctx->out, data, len, &ctx->error); + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + if (len < sizeof(*st)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + + st = (zip_stat_t *)data; + + zip_stat_init(st); + st->mtime = ctx->mtime; + st->size = ctx->in->size; + st->comp_size = st->size; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; + st->valid = ZIP_STAT_MTIME | ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_ENCRYPTION_METHOD; + + return sizeof(*st); + } + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_BEGIN_WRITE_CLONING, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, ZIP_SOURCE_SUPPORTS_REOPEN, -1); + + case ZIP_SOURCE_TELL: + if (ctx->in->offset > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW); + return -1; + } + return (zip_int64_t)ctx->in->offset; + + + case ZIP_SOURCE_TELL_WRITE: + if (ctx->out->offset > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW); + return -1; + } + return (zip_int64_t)ctx->out->offset; + + case ZIP_SOURCE_WRITE: + if (len > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + return buffer_write(ctx->out, data, len, &ctx->error); + + default: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} + + +static buffer_t * +buffer_clone(buffer_t *buffer, zip_uint64_t offset, zip_error_t *error) { + zip_uint64_t fragment, fragment_offset, waste; + buffer_t *clone; + + if (offset == 0) { + return buffer_new(NULL, 0, 1, error); + } + + if (offset > buffer->size) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if (buffer->shared_buffer != NULL) { + zip_error_set(error, ZIP_ER_INUSE, 0); + return NULL; + } + + fragment = buffer_find_fragment(buffer, offset); + fragment_offset = offset - buffer->fragment_offsets[fragment]; + + if (fragment_offset == 0) { + fragment--; + fragment_offset = buffer->fragments[fragment].length; + } + + /* TODO: This should also consider the length of the fully shared fragments */ + waste = buffer->fragments[fragment].length - fragment_offset; + if (waste > offset) { + zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); + return NULL; + } + + if ((clone = buffer_new(buffer->fragments, fragment + 1, 0, error)) == NULL) { + return NULL; + } + +#ifndef __clang_analyzer__ + /* clone->fragments can't be null, since it was created with at least one fragment */ + clone->fragments[fragment].length = fragment_offset; +#endif + clone->fragment_offsets[clone->nfragments] = offset; + clone->size = offset; + + clone->first_owned_fragment = ZIP_MIN(buffer->first_owned_fragment, clone->nfragments); + + buffer->shared_buffer = clone; + clone->shared_buffer = buffer; + buffer->shared_fragments = fragment + 1; + clone->shared_fragments = fragment + 1; + + return clone; +} + + +static zip_uint64_t +buffer_find_fragment(const buffer_t *buffer, zip_uint64_t offset) { + zip_uint64_t low, high, mid; + + if (buffer->nfragments == 0) { + return 0; + } + + low = 0; + high = buffer->nfragments - 1; + + while (low < high) { + mid = (high - low) / 2 + low; + if (buffer->fragment_offsets[mid] > offset) { + high = mid - 1; + } + else if (mid == buffer->nfragments || buffer->fragment_offsets[mid + 1] > offset) { + return mid; + } + else { + low = mid + 1; + } + } + + return low; +} + + +static void +buffer_free(buffer_t *buffer) { + zip_uint64_t i; + + if (buffer == NULL) { + return; + } + + if (buffer->shared_buffer != NULL) { + buffer->shared_buffer->shared_buffer = NULL; + buffer->shared_buffer->shared_fragments = 0; + + buffer->first_owned_fragment = ZIP_MAX(buffer->first_owned_fragment, buffer->shared_fragments); + } + + for (i = buffer->first_owned_fragment; i < buffer->nfragments; i++) { + free(buffer->fragments[i].data); + } + free(buffer->fragments); + free(buffer->fragment_offsets); + free(buffer); +} + + +static bool +buffer_grow_fragments(buffer_t *buffer, zip_uint64_t capacity, zip_error_t *error) { + zip_buffer_fragment_t *fragments; + zip_uint64_t *offsets; + + if (capacity < buffer->fragments_capacity) { + return true; + } + + zip_uint64_t fragments_size = sizeof(buffer->fragments[0]) * capacity; + zip_uint64_t offsets_size = sizeof(buffer->fragment_offsets[0]) * (capacity + 1); + + if (capacity == ZIP_UINT64_MAX || fragments_size < capacity || fragments_size > SIZE_MAX|| offsets_size < capacity || offsets_size > SIZE_MAX) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + if ((fragments = realloc(buffer->fragments, (size_t)fragments_size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + buffer->fragments = fragments; + if ((offsets = realloc(buffer->fragment_offsets, (size_t)offsets_size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + buffer->fragment_offsets = offsets; + buffer->fragments_capacity = capacity; + + return true; +} + + +static buffer_t * +buffer_new(const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int free_data, zip_error_t *error) { + buffer_t *buffer; + + if ((buffer = malloc(sizeof(*buffer))) == NULL) { + return NULL; + } + + buffer->offset = 0; + buffer->first_owned_fragment = 0; + buffer->size = 0; + buffer->fragments = NULL; + buffer->fragment_offsets = NULL; + buffer->nfragments = 0; + buffer->fragments_capacity = 0; + buffer->shared_buffer = NULL; + buffer->shared_fragments = 0; + + if (nfragments == 0) { + if ((buffer->fragment_offsets = malloc(sizeof(buffer->fragment_offsets[0]))) == NULL) { + free(buffer); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + buffer->fragment_offsets[0] = 0; + } + else { + zip_uint64_t i, j, offset; + + if (!buffer_grow_fragments(buffer, nfragments, NULL)) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + buffer_free(buffer); + return NULL; + } + + offset = 0; + for (i = 0, j = 0; i < nfragments; i++) { + if (fragments[i].length == 0) { + continue; + } + if (fragments[i].data == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + buffer_free(buffer); + return NULL; + } + buffer->fragments[j].data = fragments[i].data; + buffer->fragments[j].length = fragments[i].length; + buffer->fragment_offsets[i] = offset; + // TODO: overflow + offset += fragments[i].length; + j++; + } + buffer->nfragments = j; + buffer->first_owned_fragment = free_data ? 0 : buffer->nfragments; + buffer->fragment_offsets[buffer->nfragments] = offset; + buffer->size = offset; + } + + return buffer; +} + +static zip_int64_t +buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length) { + zip_uint64_t n, i, fragment_offset; + + length = ZIP_MIN(length, buffer->size - buffer->offset); + + if (length == 0) { + return 0; + } + if (length > ZIP_INT64_MAX) { + return -1; + } + + i = buffer->current_fragment; + fragment_offset = buffer->offset - buffer->fragment_offsets[i]; + n = 0; + while (n < length) { + zip_uint64_t left = ZIP_MIN(length - n, buffer->fragments[i].length - fragment_offset); +#if ZIP_UINT64_MAX > SIZE_MAX + left = ZIP_MIN(left, SIZE_MAX); +#endif + + (void)memcpy_s(data + n, (size_t)left, buffer->fragments[i].data + fragment_offset, (size_t)left); + + if (left == buffer->fragments[i].length - fragment_offset) { + i++; + } + n += left; + fragment_offset = 0; + } + + buffer->offset += n; + buffer->current_fragment = i; + return (zip_int64_t)n; +} + + +static int +buffer_seek(buffer_t *buffer, void *data, zip_uint64_t len, zip_error_t *error) { + zip_int64_t new_offset = zip_source_seek_compute_offset(buffer->offset, buffer->size, data, len, error); + + if (new_offset < 0) { + return -1; + } + + buffer->offset = (zip_uint64_t)new_offset; + buffer->current_fragment = buffer_find_fragment(buffer, buffer->offset); + return 0; +} + + +static zip_int64_t +buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error) { + zip_uint64_t copied, i, fragment_offset, capacity; + + if (buffer->offset + length + WRITE_FRAGMENT_SIZE - 1 < length) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + /* grow buffer if needed */ + capacity = buffer_capacity(buffer); + if (buffer->offset + length > capacity) { + zip_uint64_t needed_fragments = buffer->nfragments + (length - (capacity - buffer->offset) + WRITE_FRAGMENT_SIZE - 1) / WRITE_FRAGMENT_SIZE; + + if (needed_fragments > buffer->fragments_capacity) { + zip_uint64_t new_capacity = buffer->fragments_capacity; + + if (new_capacity == 0) { + new_capacity = 16; + } + while (new_capacity < needed_fragments) { + new_capacity *= 2; + } + + if (!buffer_grow_fragments(buffer, new_capacity, error)) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + while (buffer->nfragments < needed_fragments) { + if ((buffer->fragments[buffer->nfragments].data = malloc(WRITE_FRAGMENT_SIZE)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + buffer->fragments[buffer->nfragments].length = WRITE_FRAGMENT_SIZE; + buffer->nfragments++; + capacity += WRITE_FRAGMENT_SIZE; + buffer->fragment_offsets[buffer->nfragments] = capacity; + } + } + + i = buffer->current_fragment; + fragment_offset = buffer->offset - buffer->fragment_offsets[i]; + copied = 0; + while (copied < length) { + zip_uint64_t n = ZIP_MIN(ZIP_MIN(length - copied, buffer->fragments[i].length - fragment_offset), SIZE_MAX); +#if ZIP_UINT64_MAX > SIZE_MAX + n = ZIP_MIN(n, SIZE_MAX) +#endif + + (void)memcpy_s(buffer->fragments[i].data + fragment_offset, (size_t)n, data + copied, (size_t)n); + + if (n == buffer->fragments[i].length - fragment_offset) { + i++; + fragment_offset = 0; + } + else { + fragment_offset += n; + } + copied += n; + } + + buffer->offset += copied; + buffer->current_fragment = i; + if (buffer->offset > buffer->size) { + buffer->size = buffer->offset; + } + + return (zip_int64_t)copied; +} diff --git a/deps/libzip/lib/zip_source_call.c b/deps/libzip/lib/zip_source_call.c new file mode 100644 index 00000000000000..8c98fc2ef2d33a --- /dev/null +++ b/deps/libzip/lib/zip_source_call.c @@ -0,0 +1,68 @@ +/* + zip_source_call.c -- invoke callback command on zip_source + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include "zipint.h" + + +zip_int64_t +_zip_source_call(zip_source_t *src, void *data, zip_uint64_t length, zip_source_cmd_t command) { + zip_int64_t ret; + + if ((src->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(command)) == 0) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (src->src == NULL) { + ret = src->cb.f(src->ud, data, length, command); + } + else { + ret = src->cb.l(src->src, src->ud, data, length, command); + } + + if (ret < 0) { + if (command != ZIP_SOURCE_ERROR && command != ZIP_SOURCE_SUPPORTS) { + int e[2]; + + if (_zip_source_call(src, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { + zip_error_set(&src->error, ZIP_ER_INTERNAL, 0); + } + else { + zip_error_set(&src->error, e[0], e[1]); + } + } + } + + return ret; +} diff --git a/deps/libzip/lib/zip_source_close.c b/deps/libzip/lib/zip_source_close.c new file mode 100644 index 00000000000000..f4f3ff2b3cc522 --- /dev/null +++ b/deps/libzip/lib/zip_source_close.c @@ -0,0 +1,57 @@ +/* + zip_source_close.c -- close zip_source (stop reading) + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +int +zip_source_close(zip_source_t *src) { + if (!ZIP_SOURCE_IS_OPEN_READING(src)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + src->open_count--; + if (src->open_count == 0) { + _zip_source_call(src, NULL, 0, ZIP_SOURCE_CLOSE); + + if (ZIP_SOURCE_IS_LAYERED(src)) { + if (zip_source_close(src->src) < 0) { + zip_error_set(&src->error, ZIP_ER_INTERNAL, 0); + } + } + } + + return 0; +} diff --git a/deps/libzip/lib/zip_source_commit_write.c b/deps/libzip/lib/zip_source_commit_write.c new file mode 100644 index 00000000000000..d7f567b80ad26d --- /dev/null +++ b/deps/libzip/lib/zip_source_commit_write.c @@ -0,0 +1,68 @@ +/* + zip_source_commit_write.c -- commit changes to file + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_commit_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (!ZIP_SOURCE_IS_OPEN_WRITING(src)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (src->open_count > 1) { + zip_error_set(&src->error, ZIP_ER_INUSE, 0); + return -1; + } + else if (ZIP_SOURCE_IS_OPEN_READING(src)) { + if (zip_source_close(src) < 0) { + return -1; + } + } + + if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_COMMIT_WRITE) < 0) { + src->write_state = ZIP_SOURCE_WRITE_FAILED; + return -1; + } + + src->write_state = ZIP_SOURCE_WRITE_CLOSED; + + return 0; +} diff --git a/deps/libzip/lib/zip_source_compress.c b/deps/libzip/lib/zip_source_compress.c new file mode 100644 index 00000000000000..f3612418fa644a --- /dev/null +++ b/deps/libzip/lib/zip_source_compress.c @@ -0,0 +1,397 @@ +/* + zip_source_compress.c -- (de)compression routines + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#include "zipint.h" + +struct context { + zip_error_t error; + + bool end_of_input; + bool end_of_stream; + bool can_store; + bool is_stored; /* only valid if end_of_stream is true */ + bool compress; + zip_int32_t method; + + zip_uint64_t size; + zip_int64_t first_read; + zip_uint8_t buffer[BUFSIZE]; + + zip_compression_algorithm_t *algorithm; + void *ud; +}; + + +struct implementation { + zip_uint16_t method; + zip_compression_algorithm_t *compress; + zip_compression_algorithm_t *decompress; +}; + +static struct implementation implementations[] = { + {ZIP_CM_DEFLATE, &zip_algorithm_deflate_compress, &zip_algorithm_deflate_decompress}, +#if defined(HAVE_LIBBZ2) + {ZIP_CM_BZIP2, &zip_algorithm_bzip2_compress, &zip_algorithm_bzip2_decompress}, +#endif +#if defined(HAVE_LIBLZMA) + {ZIP_CM_LZMA, &zip_algorithm_xz_compress, &zip_algorithm_xz_decompress}, + /* Disabled - because 7z isn't able to unpack ZIP+LZMA2 + archives made this way - and vice versa. + + {ZIP_CM_LZMA2, &zip_algorithm_xz_compress, &zip_algorithm_xz_decompress}, + */ + {ZIP_CM_XZ, &zip_algorithm_xz_compress, &zip_algorithm_xz_decompress}, +#endif +#if defined(HAVE_LIBZSTD) + {ZIP_CM_ZSTD, &zip_algorithm_zstd_compress, &zip_algorithm_zstd_decompress}, +#endif + +}; + +static size_t implementations_size = sizeof(implementations) / sizeof(implementations[0]); + +static zip_source_t *compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool compress, int compression_flags); +static zip_int64_t compress_callback(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); +static void context_free(struct context *ctx); +static struct context *context_new(zip_int32_t method, bool compress, int compression_flags, zip_compression_algorithm_t *algorithm); +static zip_int64_t compress_read(zip_source_t *, struct context *, void *, zip_uint64_t); + +zip_compression_algorithm_t * +_zip_get_compression_algorithm(zip_int32_t method, bool compress) { + size_t i; + zip_uint16_t real_method = ZIP_CM_ACTUAL(method); + + for (i = 0; i < implementations_size; i++) { + if (implementations[i].method == real_method) { + if (compress) { + return implementations[i].compress; + } + else { + return implementations[i].decompress; + } + } + } + + return NULL; +} + +ZIP_EXTERN int +zip_compression_method_supported(zip_int32_t method, int compress) { + if (method == ZIP_CM_STORE) { + return 1; + } + return _zip_get_compression_algorithm(method, compress) != NULL; +} + +zip_source_t * +zip_source_compress(zip_t *za, zip_source_t *src, zip_int32_t method, int compression_flags) { + return compression_source_new(za, src, method, true, compression_flags); +} + +zip_source_t * +zip_source_decompress(zip_t *za, zip_source_t *src, zip_int32_t method) { + return compression_source_new(za, src, method, false, 0); +} + + +static zip_source_t * +compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool compress, int compression_flags) { + struct context *ctx; + zip_source_t *s2; + zip_compression_algorithm_t *algorithm = NULL; + + if (src == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((algorithm = _zip_get_compression_algorithm(method, compress)) == NULL) { + zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return NULL; + } + + if ((ctx = context_new(method, compress, compression_flags, algorithm)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((s2 = zip_source_layered(za, src, compress_callback, ctx)) == NULL) { + context_free(ctx); + return NULL; + } + + return s2; +} + + +static struct context * +context_new(zip_int32_t method, bool compress, int compression_flags, zip_compression_algorithm_t *algorithm) { + struct context *ctx; + + if ((ctx = (struct context *)malloc(sizeof(*ctx))) == NULL) { + return NULL; + } + zip_error_init(&ctx->error); + ctx->can_store = compress ? ZIP_CM_IS_DEFAULT(method) : false; + ctx->algorithm = algorithm; + ctx->method = method; + ctx->compress = compress; + ctx->end_of_input = false; + ctx->end_of_stream = false; + ctx->is_stored = false; + + if ((ctx->ud = ctx->algorithm->allocate(ZIP_CM_ACTUAL(method), compression_flags, &ctx->error)) == NULL) { + zip_error_fini(&ctx->error); + free(ctx); + return NULL; + } + + return ctx; +} + + +static void +context_free(struct context *ctx) { + if (ctx == NULL) { + return; + } + + ctx->algorithm->deallocate(ctx->ud); + zip_error_fini(&ctx->error); + + free(ctx); +} + + +static zip_int64_t +compress_read(zip_source_t *src, struct context *ctx, void *data, zip_uint64_t len) { + zip_compression_status_t ret; + bool end; + zip_int64_t n; + zip_uint64_t out_offset; + zip_uint64_t out_len; + + if (zip_error_code_zip(&ctx->error) != ZIP_ER_OK) { + return -1; + } + + if (len == 0 || ctx->end_of_stream) { + return 0; + } + + out_offset = 0; + + end = false; + while (!end && out_offset < len) { + out_len = len - out_offset; + ret = ctx->algorithm->process(ctx->ud, (zip_uint8_t *)data + out_offset, &out_len); + + if (ret != ZIP_COMPRESSION_ERROR) { + out_offset += out_len; + } + + switch (ret) { + case ZIP_COMPRESSION_END: + ctx->end_of_stream = true; + + if (!ctx->end_of_input) { + /* TODO: garbage after stream, or compression ended before all data read */ + } + + if (ctx->first_read < 0) { + /* we got end of processed stream before reading any input data */ + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + end = true; + break; + } + if (ctx->can_store && (zip_uint64_t)ctx->first_read <= out_offset) { + ctx->is_stored = true; + ctx->size = (zip_uint64_t)ctx->first_read; + (void)memcpy_s(data, ctx->size, ctx->buffer, ctx->size); + return (zip_int64_t)ctx->size; + } + end = true; + break; + + case ZIP_COMPRESSION_OK: + break; + + case ZIP_COMPRESSION_NEED_DATA: + if (ctx->end_of_input) { + /* TODO: error: stream not ended, but no more input */ + end = true; + break; + } + + if ((n = zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) { + zip_error_set_from_source(&ctx->error, src); + end = true; + break; + } + else if (n == 0) { + ctx->end_of_input = true; + ctx->algorithm->end_of_input(ctx->ud); + if (ctx->first_read < 0) { + ctx->first_read = 0; + } + } + else { + if (ctx->first_read >= 0) { + /* we overwrote a previously filled ctx->buffer */ + ctx->can_store = false; + } + else { + ctx->first_read = n; + } + + ctx->algorithm->input(ctx->ud, ctx->buffer, (zip_uint64_t)n); + } + break; + + case ZIP_COMPRESSION_ERROR: + /* error set by algorithm */ + if (zip_error_code_zip(&ctx->error) == ZIP_ER_OK) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + } + end = true; + break; + } + } + + if (out_offset > 0) { + ctx->can_store = false; + ctx->size += out_offset; + return (zip_int64_t)out_offset; + } + + return (zip_error_code_zip(&ctx->error) == ZIP_ER_OK) ? 0 : -1; +} + + +static zip_int64_t +compress_callback(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + struct context *ctx; + + ctx = (struct context *)ud; + + switch (cmd) { + case ZIP_SOURCE_OPEN: { + zip_stat_t st; + zip_file_attributes_t attributes; + + ctx->size = 0; + ctx->end_of_input = false; + ctx->end_of_stream = false; + ctx->is_stored = false; + ctx->first_read = -1; + + if (zip_source_stat(src, &st) < 0 || zip_source_get_file_attributes(src, &attributes) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + if (!ctx->algorithm->start(ctx->ud, &st, &attributes)) { + return -1; + } + + return 0; + } + + case ZIP_SOURCE_READ: + return compress_read(src, ctx, data, len); + + case ZIP_SOURCE_CLOSE: + if (!ctx->algorithm->end(ctx->ud)) { + return -1; + } + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + + if (ctx->compress) { + if (ctx->end_of_stream) { + st->comp_method = ctx->is_stored ? ZIP_CM_STORE : ZIP_CM_ACTUAL(ctx->method); + st->comp_size = ctx->size; + st->valid |= ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD; + } + else { + st->valid &= ~(ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD); + } + } + else { + st->comp_method = ZIP_CM_STORE; + st->valid |= ZIP_STAT_COMP_METHOD; + if (ctx->end_of_stream) { + st->size = ctx->size; + st->valid |= ZIP_STAT_SIZE; + } + } + } + return 0; + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + context_free(ctx); + return 0; + + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: { + zip_file_attributes_t *attributes = (zip_file_attributes_t *)data; + + if (len < sizeof(*attributes)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + + attributes->valid |= ZIP_FILE_ATTRIBUTES_VERSION_NEEDED | ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS; + attributes->version_needed = ctx->algorithm->version_needed; + attributes->general_purpose_bit_mask = ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS_ALLOWED_MASK; + attributes->general_purpose_bit_flags = (ctx->is_stored ? 0 : ctx->algorithm->general_purpose_bit_flags(ctx->ud)); + + return sizeof(*attributes); + } + + case ZIP_SOURCE_SUPPORTS: + return ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_SUPPORTS_REOPEN, -1); + + default: + return zip_source_pass_to_lower_layer(src, data, len, cmd); + } +} diff --git a/deps/libzip/lib/zip_source_crc.c b/deps/libzip/lib/zip_source_crc.c new file mode 100644 index 00000000000000..19f5760d48de48 --- /dev/null +++ b/deps/libzip/lib/zip_source_crc.c @@ -0,0 +1,201 @@ +/* + zip_source_crc.c -- pass-through source that calculates CRC32 and size + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include + +#include "zipint.h" + +struct crc_context { + int validate; /* whether to check CRC on EOF and return error on mismatch */ + int crc_complete; /* whether CRC was computed for complete file */ + zip_error_t error; + zip_uint64_t size; + zip_uint64_t position; /* current reading position */ + zip_uint64_t crc_position; /* how far we've computed the CRC */ + zip_uint32_t crc; +}; + +static zip_int64_t crc_read(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); + + +zip_source_t * +zip_source_crc_create(zip_source_t *src, int validate, zip_error_t *error) { + struct crc_context *ctx; + + if (src == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((ctx = (struct crc_context *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + zip_error_init(&ctx->error); + ctx->validate = validate; + ctx->crc_complete = 0; + ctx->crc_position = 0; + ctx->crc = (zip_uint32_t)crc32(0, NULL, 0); + ctx->size = 0; + + return zip_source_layered_create(src, crc_read, ctx, error); +} + + +static zip_int64_t +crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + struct crc_context *ctx; + zip_int64_t n; + + ctx = (struct crc_context *)_ctx; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + ctx->position = 0; + return 0; + + case ZIP_SOURCE_READ: + if ((n = zip_source_read(src, data, len)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + if (n == 0) { + if (ctx->crc_position == ctx->position) { + ctx->crc_complete = 1; + ctx->size = ctx->position; + + if (ctx->validate) { + struct zip_stat st; + + if (zip_source_stat(src, &st) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + if ((st.valid & ZIP_STAT_CRC) && st.crc != ctx->crc) { + zip_error_set(&ctx->error, ZIP_ER_CRC, 0); + return -1; + } + if ((st.valid & ZIP_STAT_SIZE) && st.size != ctx->size) { + /* We don't have the index here, but the caller should know which file they are reading from. */ + zip_error_set(&ctx->error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_INVALID_FILE_LENGTH, MAX_DETAIL_INDEX)); + return -1; + } + } + } + } + else if (!ctx->crc_complete && ctx->position <= ctx->crc_position) { + zip_uint64_t i, nn; + + for (i = ctx->crc_position - ctx->position; i < (zip_uint64_t)n; i += nn) { + nn = ZIP_MIN(UINT_MAX, (zip_uint64_t)n - i); + + ctx->crc = (zip_uint32_t)crc32(ctx->crc, (const Bytef *)data + i, (uInt)nn); + ctx->crc_position += nn; + } + } + ctx->position += (zip_uint64_t)n; + return n; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + + if (ctx->crc_complete) { + if ((st->valid & ZIP_STAT_SIZE) && st->size != ctx->size) { + zip_error_set(&ctx->error, ZIP_ER_DATA_LENGTH, 0); + return -1; + } + /* TODO: Set comp_size, comp_method, encryption_method? + After all, this only works for uncompressed data. */ + st->size = ctx->size; + st->crc = ctx->crc; + st->comp_size = ctx->size; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; + st->valid |= ZIP_STAT_SIZE | ZIP_STAT_CRC | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_ENCRYPTION_METHOD; + } + return 0; + } + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + free(ctx); + return 0; + + case ZIP_SOURCE_SUPPORTS: { + zip_int64_t mask = zip_source_supports(src); + + if (mask < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + return mask & ~zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_GET_FILE_ATTRIBUTES, -1); + } + + case ZIP_SOURCE_SEEK: { + zip_int64_t new_position; + zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error); + + if (args == NULL) { + return -1; + } + if (zip_source_seek(src, args->offset, args->whence) < 0 || (new_position = zip_source_tell(src)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + ctx->position = (zip_uint64_t)new_position; + + return 0; + } + + case ZIP_SOURCE_TELL: + return (zip_int64_t)ctx->position; + + default: + return zip_source_pass_to_lower_layer(src, data, len, cmd); + } +} diff --git a/deps/libzip/lib/zip_source_error.c b/deps/libzip/lib/zip_source_error.c new file mode 100644 index 00000000000000..dc7fa20cb0cad3 --- /dev/null +++ b/deps/libzip/lib/zip_source_error.c @@ -0,0 +1,46 @@ +/* + zip_source_error.c -- get last error from zip_source + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +zip_error_t * +zip_source_error(zip_source_t *src) { + return &src->error; +} + +bool +_zip_source_had_error(zip_source_t *src) { + return zip_source_error(src)->zip_err != ZIP_ER_OK; +} diff --git a/deps/libzip/lib/zip_source_file.h b/deps/libzip/lib/zip_source_file.h new file mode 100644 index 00000000000000..cca9fd2b524755 --- /dev/null +++ b/deps/libzip/lib/zip_source_file.h @@ -0,0 +1,90 @@ +/* + zip_source_file.h -- header for common file operations + Copyright (C) 2020-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +struct zip_source_file_stat { + zip_uint64_t size; /* must be valid for regular files */ + time_t mtime; /* must always be valid, is initialized to current time */ + bool exists; /* must always be valid */ + bool regular_file; /* must always be valid */ +}; + +typedef struct zip_source_file_context zip_source_file_context_t; +typedef struct zip_source_file_operations zip_source_file_operations_t; +typedef struct zip_source_file_stat zip_source_file_stat_t; + +struct zip_source_file_context { + zip_error_t error; /* last error information */ + zip_int64_t supports; + + /* reading */ + char *fname; /* name of file to read from */ + void *f; /* file to read from */ + zip_stat_t st; /* stat information passed in */ + zip_file_attributes_t attributes; /* additional file attributes */ + zip_error_t stat_error; /* error returned for stat */ + zip_uint64_t start; /* start offset of data to read */ + zip_uint64_t len; /* length of the file, 0 for up to EOF */ + zip_uint64_t offset; /* current offset relative to start (0 is beginning of part we read) */ + + /* writing */ + char *tmpname; + void *fout; + + zip_source_file_operations_t *ops; + void *ops_userdata; +}; + + +/* The following methods must be implemented to support each feature: + - close, read, seek, and stat must always be implemented. + - To support specifying the file by name, open, and strdup must be implemented. + - For write support, the file must be specified by name and close, commit_write, create_temp_output, remove, rollback_write, and tell must be implemented. + - create_temp_output_cloning is always optional. */ + +struct zip_source_file_operations { + void (*close)(zip_source_file_context_t *ctx); + zip_int64_t (*commit_write)(zip_source_file_context_t *ctx); + zip_int64_t (*create_temp_output)(zip_source_file_context_t *ctx); + zip_int64_t (*create_temp_output_cloning)(zip_source_file_context_t *ctx, zip_uint64_t len); + bool (*open)(zip_source_file_context_t *ctx); + zip_int64_t (*read)(zip_source_file_context_t *ctx, void *buf, zip_uint64_t len); + zip_int64_t (*remove)(zip_source_file_context_t *ctx); + void (*rollback_write)(zip_source_file_context_t *ctx); + bool (*seek)(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, int whence); + bool (*stat)(zip_source_file_context_t *ctx, zip_source_file_stat_t *st); + char *(*string_duplicate)(zip_source_file_context_t *ctx, const char *); + zip_int64_t (*tell)(zip_source_file_context_t *ctx, void *f); + zip_int64_t (*write)(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len); +}; + +zip_source_t *zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_source_file_operations_t *ops, void *ops_userdata, zip_error_t *error); diff --git a/deps/libzip/lib/zip_source_file_common.c b/deps/libzip/lib/zip_source_file_common.c new file mode 100644 index 00000000000000..2debfbd5320e42 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_common.c @@ -0,0 +1,378 @@ +/* + zip_source_file_common.c -- create data source from file + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include + +#include "zipint.h" + +#include "zip_source_file.h" + +static zip_int64_t read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd); + +static void +zip_source_file_stat_init(zip_source_file_stat_t *st) { + st->size = 0; + st->mtime = time(NULL); + st->exists = false; + st->regular_file = false; +} + +zip_source_t * +zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_source_file_operations_t *ops, void *ops_userdata, zip_error_t *error) { + zip_source_file_context_t *ctx; + zip_source_t *zs; + zip_source_file_stat_t sb; + + if (ops == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if (ops->close == NULL || ops->read == NULL || ops->seek == NULL || ops->stat == NULL) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } + + if (ops->write != NULL && (ops->commit_write == NULL || ops->create_temp_output == NULL || ops->remove == NULL || ops->rollback_write == NULL || ops->tell == NULL)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } + + if (fname != NULL) { + if (ops->open == NULL || ops->string_duplicate == NULL) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } + } + else if (file == NULL) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if (len < 0) { + len = 0; + } + + if (start > ZIP_INT64_MAX || start + (zip_uint64_t)len < start) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((ctx = (zip_source_file_context_t *)malloc(sizeof(zip_source_file_context_t))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + ctx->ops = ops; + ctx->ops_userdata = ops_userdata; + ctx->fname = NULL; + if (fname) { + if ((ctx->fname = ops->string_duplicate(ctx, fname)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + free(ctx); + return NULL; + } + } + ctx->f = file; + ctx->start = start; + ctx->len = (zip_uint64_t)len; + if (st) { + (void)memcpy_s(&ctx->st, sizeof(ctx->st), st, sizeof(*st)); + ctx->st.name = NULL; + ctx->st.valid &= ~ZIP_STAT_NAME; + } + else { + zip_stat_init(&ctx->st); + } + + if (ctx->len > 0) { + ctx->st.size = ctx->len; + ctx->st.valid |= ZIP_STAT_SIZE; + } + + zip_error_init(&ctx->stat_error); + + ctx->tmpname = NULL; + ctx->fout = NULL; + + zip_error_init(&ctx->error); + zip_file_attributes_init(&ctx->attributes); + + ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, ZIP_SOURCE_SUPPORTS_REOPEN, -1); + + zip_source_file_stat_init(&sb); + if (!ops->stat(ctx, &sb)) { + _zip_error_copy(error, &ctx->error); + free(ctx->fname); + free(ctx); + return NULL; + } + + if (!sb.exists) { + if (ctx->fname && ctx->start == 0 && ctx->len == 0 && ops->write != NULL) { + ctx->supports = ZIP_SOURCE_SUPPORTS_WRITABLE; + /* zip_open_from_source checks for this to detect non-existing files */ + zip_error_set(&ctx->stat_error, ZIP_ER_READ, ENOENT); + } + else { + zip_error_set(&ctx->stat_error, ZIP_ER_READ, ENOENT); + free(ctx->fname); + free(ctx); + return NULL; + } + } + else { + if ((ctx->st.valid & ZIP_STAT_MTIME) == 0) { + ctx->st.mtime = sb.mtime; + ctx->st.valid |= ZIP_STAT_MTIME; + } + if (sb.regular_file) { + ctx->supports = ZIP_SOURCE_SUPPORTS_SEEKABLE; + + if (ctx->start + ctx->len > sb.size) { + zip_error_set(error, ZIP_ER_INVAL, 0); + free(ctx->fname); + free(ctx); + return NULL; + } + + if (ctx->len == 0) { + ctx->len = sb.size - ctx->start; + ctx->st.size = ctx->len; + ctx->st.valid |= ZIP_STAT_SIZE; + + /* when using a partial file, don't allow writing */ + if (ctx->fname && start == 0 && ops->write != NULL) { + ctx->supports = ZIP_SOURCE_SUPPORTS_WRITABLE; + } + } + } + + ctx->supports |= ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_GET_FILE_ATTRIBUTES); + } + + ctx->supports |= ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ACCEPT_EMPTY); + if (ops->create_temp_output_cloning != NULL) { + if (ctx->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE)) { + ctx->supports |= ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE_CLONING); + } + } + + if ((zs = zip_source_function_create(read_file, ctx, error)) == NULL) { + free(ctx->fname); + free(ctx); + return NULL; + } + + return zs; +} + + +static zip_int64_t +read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + zip_source_file_context_t *ctx; + char *buf; + + ctx = (zip_source_file_context_t *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_ACCEPT_EMPTY: + return 0; + + case ZIP_SOURCE_BEGIN_WRITE: + /* write support should not be set if fname is NULL */ + if (ctx->fname == NULL) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + return -1; + } + return ctx->ops->create_temp_output(ctx); + + case ZIP_SOURCE_BEGIN_WRITE_CLONING: + /* write support should not be set if fname is NULL */ + if (ctx->fname == NULL) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + return -1; + } + return ctx->ops->create_temp_output_cloning(ctx, len); + + case ZIP_SOURCE_CLOSE: + if (ctx->fname) { + ctx->ops->close(ctx); + ctx->f = NULL; + } + return 0; + + case ZIP_SOURCE_COMMIT_WRITE: { + zip_int64_t ret = ctx->ops->commit_write(ctx); + ctx->fout = NULL; + if (ret == 0) { + free(ctx->tmpname); + ctx->tmpname = NULL; + } + return ret; + } + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + free(ctx->fname); + free(ctx->tmpname); + if (ctx->f) { + ctx->ops->close(ctx); + } + free(ctx); + return 0; + + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: + if (len < sizeof(ctx->attributes)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + (void)memcpy_s(data, sizeof(ctx->attributes), &ctx->attributes, sizeof(ctx->attributes)); + return sizeof(ctx->attributes); + + case ZIP_SOURCE_OPEN: + if (ctx->fname) { + if (ctx->ops->open(ctx) == false) { + return -1; + } + } + + if (ctx->start > 0) { // TODO: rewind on re-open + if (ctx->ops->seek(ctx, ctx->f, (zip_int64_t)ctx->start, SEEK_SET) == false) { + /* TODO: skip by reading */ + return -1; + } + } + ctx->offset = 0; + return 0; + + case ZIP_SOURCE_READ: { + zip_int64_t i; + zip_uint64_t n; + + if (ctx->len > 0) { + n = ZIP_MIN(ctx->len - ctx->offset, len); + } + else { + n = len; + } + + if ((i = ctx->ops->read(ctx, buf, n)) < 0) { + zip_error_set(&ctx->error, ZIP_ER_READ, errno); + return -1; + } + ctx->offset += (zip_uint64_t)i; + + return i; + } + + case ZIP_SOURCE_REMOVE: + return ctx->ops->remove(ctx); + + case ZIP_SOURCE_ROLLBACK_WRITE: + ctx->ops->rollback_write(ctx); + ctx->fout = NULL; + free(ctx->tmpname); + ctx->tmpname = NULL; + return 0; + + case ZIP_SOURCE_SEEK: { + zip_int64_t new_offset = zip_source_seek_compute_offset(ctx->offset, ctx->len, data, len, &ctx->error); + + if (new_offset < 0) { + return -1; + } + + /* The actual offset inside the file must be representable as zip_int64_t. */ + if (new_offset > ZIP_INT64_MAX - (zip_int64_t)ctx->start) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, EOVERFLOW); + return -1; + } + + ctx->offset = (zip_uint64_t)new_offset; + + if (ctx->ops->seek(ctx, ctx->f, (zip_int64_t)(ctx->offset + ctx->start), SEEK_SET) == false) { + return -1; + } + return 0; + } + + case ZIP_SOURCE_SEEK_WRITE: { + zip_source_args_seek_t *args; + + args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error); + if (args == NULL) { + return -1; + } + + if (ctx->ops->seek(ctx, ctx->fout, args->offset, args->whence) == false) { + return -1; + } + return 0; + } + + case ZIP_SOURCE_STAT: { + if (len < sizeof(ctx->st)) + return -1; + + if (zip_error_code_zip(&ctx->stat_error) != 0) { + zip_error_set(&ctx->error, zip_error_code_zip(&ctx->stat_error), zip_error_code_system(&ctx->stat_error)); + return -1; + } + + (void)memcpy_s(data, sizeof(ctx->st), &ctx->st, sizeof(ctx->st)); + return sizeof(ctx->st); + } + + case ZIP_SOURCE_SUPPORTS: + return ctx->supports; + + case ZIP_SOURCE_TELL: + return (zip_int64_t)ctx->offset; + + case ZIP_SOURCE_TELL_WRITE: + return ctx->ops->tell(ctx, ctx->fout); + + case ZIP_SOURCE_WRITE: + return ctx->ops->write(ctx, data, len); + + default: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} diff --git a/deps/libzip/lib/zip_source_file_stdio.c b/deps/libzip/lib/zip_source_file_stdio.c new file mode 100644 index 00000000000000..7ed91674bdbfb3 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_stdio.c @@ -0,0 +1,178 @@ +/* + zip_source_file_stdio.c -- read-only stdio file source implementation + Copyright (C) 2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include "zip_source_file.h" +#include "zip_source_file_stdio.h" + +#include +#include +#include +#include + +#ifdef _WIN32 +#ifndef S_IWUSR +#define S_IWUSR _S_IWRITE +#endif +#endif + +/* clang-format off */ +static zip_source_file_operations_t ops_stdio_read = { + _zip_stdio_op_close, + NULL, + NULL, + NULL, + NULL, + _zip_stdio_op_read, + NULL, + NULL, + _zip_stdio_op_seek, + _zip_stdio_op_stat, + NULL, + _zip_stdio_op_tell, + NULL +}; +/* clang-format on */ + + +ZIP_EXTERN zip_source_t * +zip_source_filep(zip_t *za, FILE *file, zip_uint64_t start, zip_int64_t len) { + if (za == NULL) { + return NULL; + } + + return zip_source_filep_create(file, start, len, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_filep_create(FILE *file, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + if (file == NULL || length < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return zip_source_file_common_new(NULL, file, start, length, NULL, &ops_stdio_read, NULL, error); +} + + +void +_zip_stdio_op_close(zip_source_file_context_t *ctx) { + fclose((FILE *)ctx->f); +} + + +zip_int64_t +_zip_stdio_op_read(zip_source_file_context_t *ctx, void *buf, zip_uint64_t len) { + size_t i; + if (len > SIZE_MAX) { + len = SIZE_MAX; + } + + if ((i = fread(buf, 1, (size_t)len, ctx->f)) == 0) { + if (ferror((FILE *)ctx->f)) { + zip_error_set(&ctx->error, ZIP_ER_READ, errno); + return -1; + } + } + + return (zip_int64_t)i; +} + + +bool +_zip_stdio_op_seek(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, int whence) { +#if ZIP_FSEEK_MAX > ZIP_INT64_MAX + if (offset > ZIP_FSEEK_MAX || offset < ZIP_FSEEK_MIN) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, EOVERFLOW); + return false; + } +#endif + + if (fseeko((FILE *)f, (off_t)offset, whence) < 0) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, errno); + return false; + } + return true; +} + + +bool +_zip_stdio_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st) { + struct stat sb; + + int ret; + + if (ctx->fname) { + ret = stat(ctx->fname, &sb); + } + else { + ret = fstat(fileno((FILE *)ctx->f), &sb); + } + + if (ret < 0) { + if (errno == ENOENT) { + st->exists = false; + return true; + } + zip_error_set(&ctx->error, ZIP_ER_READ, errno); + return false; + } + + st->size = (zip_uint64_t)sb.st_size; + st->mtime = sb.st_mtime; + + st->regular_file = S_ISREG(sb.st_mode); + st->exists = true; + + /* We're using UNIX file API, even on Windows; thus, we supply external file attributes with Unix values. */ + /* TODO: This could be improved on Windows by providing Windows-specific file attributes */ + ctx->attributes.valid = ZIP_FILE_ATTRIBUTES_HOST_SYSTEM | ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES; + ctx->attributes.host_system = ZIP_OPSYS_UNIX; + ctx->attributes.external_file_attributes = (((zip_uint32_t)sb.st_mode) << 16) | ((sb.st_mode & S_IWUSR) ? 0 : 1); + + return true; +} + + +zip_int64_t +_zip_stdio_op_tell(zip_source_file_context_t *ctx, void *f) { + off_t offset = ftello((FILE *)f); + + if (offset < 0) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, errno); + } + + return offset; +} diff --git a/deps/libzip/lib/zip_source_file_stdio.h b/deps/libzip/lib/zip_source_file_stdio.h new file mode 100644 index 00000000000000..802e6071ff5a74 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_stdio.h @@ -0,0 +1,45 @@ +#ifndef _HAD_ZIP_SOURCE_FILE_STDIO_H +#define _HAD_ZIP_SOURCE_FILE_STDIO_H + +/* + zip_source_file_stdio.h -- common header for stdio file implementation + Copyright (C) 2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +void _zip_stdio_op_close(zip_source_file_context_t *ctx); +zip_int64_t _zip_stdio_op_read(zip_source_file_context_t *ctx, void *buf, zip_uint64_t len); +bool _zip_stdio_op_seek(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, int whence); +bool _zip_stdio_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st); +zip_int64_t _zip_stdio_op_tell(zip_source_file_context_t *ctx, void *f); + +#endif /* _HAD_ZIP_SOURCE_FILE_STDIO_H */ diff --git a/deps/libzip/lib/zip_source_file_stdio_named.c b/deps/libzip/lib/zip_source_file_stdio_named.c new file mode 100644 index 00000000000000..51e06a91a994d2 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_stdio_named.c @@ -0,0 +1,392 @@ +/* + zip_source_file_stdio_named.c -- source for stdio file opened by name + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include "zip_source_file.h" +#include "zip_source_file_stdio.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_CLONEFILE +#include +#include +#define CAN_CLONE +#endif +#ifdef HAVE_FICLONERANGE +#include +#include +#define CAN_CLONE +#endif + +static int create_temp_file(zip_source_file_context_t *ctx, bool create_file); + +static zip_int64_t _zip_stdio_op_commit_write(zip_source_file_context_t *ctx); +static zip_int64_t _zip_stdio_op_create_temp_output(zip_source_file_context_t *ctx); +#ifdef CAN_CLONE +static zip_int64_t _zip_stdio_op_create_temp_output_cloning(zip_source_file_context_t *ctx, zip_uint64_t offset); +#endif +static bool _zip_stdio_op_open(zip_source_file_context_t *ctx); +static zip_int64_t _zip_stdio_op_remove(zip_source_file_context_t *ctx); +static void _zip_stdio_op_rollback_write(zip_source_file_context_t *ctx); +static char *_zip_stdio_op_strdup(zip_source_file_context_t *ctx, const char *string); +static zip_int64_t _zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len); +static FILE *_zip_fopen_close_on_exec(const char *name, bool writeable); + +/* clang-format off */ +static zip_source_file_operations_t ops_stdio_named = { + _zip_stdio_op_close, + _zip_stdio_op_commit_write, + _zip_stdio_op_create_temp_output, +#ifdef CAN_CLONE + _zip_stdio_op_create_temp_output_cloning, +#else + NULL, +#endif + _zip_stdio_op_open, + _zip_stdio_op_read, + _zip_stdio_op_remove, + _zip_stdio_op_rollback_write, + _zip_stdio_op_seek, + _zip_stdio_op_stat, + _zip_stdio_op_strdup, + _zip_stdio_op_tell, + _zip_stdio_op_write +}; +/* clang-format on */ + +ZIP_EXTERN zip_source_t * +zip_source_file(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len) { + if (za == NULL) + return NULL; + + return zip_source_file_create(fname, start, len, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + if (fname == NULL || length < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return zip_source_file_common_new(fname, NULL, start, length, NULL, &ops_stdio_named, NULL, error); +} + + +static zip_int64_t +_zip_stdio_op_commit_write(zip_source_file_context_t *ctx) { + if (fclose(ctx->fout) < 0) { + zip_error_set(&ctx->error, ZIP_ER_WRITE, errno); + return -1; + } + if (rename(ctx->tmpname, ctx->fname) < 0) { + zip_error_set(&ctx->error, ZIP_ER_RENAME, errno); + return -1; + } + + return 0; +} + + +static zip_int64_t +_zip_stdio_op_create_temp_output(zip_source_file_context_t *ctx) { + int fd = create_temp_file(ctx, true); + + if (fd < 0) { + return -1; + } + + if ((ctx->fout = fdopen(fd, "r+b")) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + close(fd); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } + + return 0; +} + +#ifdef CAN_CLONE +static zip_int64_t +_zip_stdio_op_create_temp_output_cloning(zip_source_file_context_t *ctx, zip_uint64_t offset) { + FILE *tfp; + + if (offset > ZIP_OFF_MAX) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, E2BIG); + return -1; + } + +#ifdef HAVE_CLONEFILE + /* clonefile insists on creating the file, so just create a name */ + if (create_temp_file(ctx, false) < 0) { + return -1; + } + + if (clonefile(ctx->fname, ctx->tmpname, 0) < 0) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } + if ((tfp = _zip_fopen_close_on_exec(ctx->tmpname, true)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } +#else + { + int fd; + struct file_clone_range range; + struct stat st; + + if (fstat(fileno(ctx->f), &st) < 0) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + return -1; + } + + if ((fd = create_temp_file(ctx, true)) < 0) { + return -1; + } + + range.src_fd = fileno(ctx->f); + range.src_offset = 0; + range.src_length = ((offset + st.st_blksize - 1) / st.st_blksize) * st.st_blksize; + if (range.src_length > st.st_size) { + range.src_length = 0; + } + range.dest_offset = 0; + if (ioctl(fd, FICLONERANGE, &range) < 0) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)close(fd); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } + + if ((tfp = fdopen(fd, "r+b")) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)close(fd); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } + } +#endif + + if (ftruncate(fileno(tfp), (off_t)offset) < 0) { + (void)fclose(tfp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } + if (fseeko(tfp, (off_t)offset, SEEK_SET) < 0) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)fclose(tfp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; + } + + ctx->fout = tfp; + + return 0; +} +#endif + +static bool +_zip_stdio_op_open(zip_source_file_context_t *ctx) { + if ((ctx->f = _zip_fopen_close_on_exec(ctx->fname, false)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_OPEN, errno); + return false; + } + return true; +} + + +static zip_int64_t +_zip_stdio_op_remove(zip_source_file_context_t *ctx) { + if (remove(ctx->fname) < 0) { + zip_error_set(&ctx->error, ZIP_ER_REMOVE, errno); + return -1; + } + return 0; +} + + +static void +_zip_stdio_op_rollback_write(zip_source_file_context_t *ctx) { + if (ctx->fout) { + fclose(ctx->fout); + } + (void)remove(ctx->tmpname); +} + +static char * +_zip_stdio_op_strdup(zip_source_file_context_t *ctx, const char *string) { + return strdup(string); +} + + +static zip_int64_t +_zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len) { + size_t ret; + + clearerr((FILE *)ctx->fout); + ret = fwrite(data, 1, len, (FILE *)ctx->fout); + if (ret != len || ferror((FILE *)ctx->fout)) { + zip_error_set(&ctx->error, ZIP_ER_WRITE, errno); + return -1; + } + + return (zip_int64_t)ret; +} + + +static int create_temp_file(zip_source_file_context_t *ctx, bool create_file) { + char *temp; + int mode; + struct stat st; + int fd; + char *start, *end; + + if (stat(ctx->fname, &st) == 0) { + mode = st.st_mode; + } + else { + mode = -1; + } + + size_t temp_size = strlen(ctx->fname) + 13; + if ((temp = (char *)malloc(temp_size)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + snprintf_s(temp, temp_size, "%s.XXXXXX.part", ctx->fname); + end = temp + strlen(temp) - 5; + start = end - 6; + + for (;;) { + zip_uint32_t value = zip_random_uint32(); + char *xs = start; + + while (xs < end) { + char digit = value % 36; + if (digit < 10) { + *(xs++) = digit + '0'; + } + else { + *(xs++) = digit - 10 + 'a'; + } + value /= 36; + } + + if (create_file) { + if ((fd = open(temp, O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC, mode == -1 ? 0666 : (mode_t)mode)) >= 0) { + if (mode != -1) { + /* open() honors umask(), which we don't want in this case */ +#ifdef HAVE_FCHMOD + (void)fchmod(fd, (mode_t)mode); +#else + (void)chmod(temp, (mode_t)mode); +#endif + } + break; + } + if (errno != EEXIST) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } + } + else { + if (stat(temp, &st) < 0) { + if (errno == ENOENT) { + break; + } + else { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } + } + } + } + + ctx->tmpname = temp; + + return create_file ? fd : 0; +} + + +/* + * fopen replacement that sets the close-on-exec flag + * some implementations support an fopen 'e' flag for that, + * but e.g. macOS doesn't. + */ +static FILE *_zip_fopen_close_on_exec(const char *name, bool writeable) { + int fd; + int flags; + FILE *fp; + + flags = O_CLOEXEC; + if (writeable) { + flags |= O_RDWR; + } + else { + flags |= O_RDONLY; + } + + /* mode argument needed on Windows */ + if ((fd = open(name, flags, 0666)) < 0) { + return NULL; + } + if ((fp = fdopen(fd, writeable ? "r+b" : "rb")) == NULL) { + return NULL; + } + return fp; +} diff --git a/deps/libzip/lib/zip_source_file_win32.c b/deps/libzip/lib/zip_source_file_win32.c new file mode 100644 index 00000000000000..4708dc85137ddc --- /dev/null +++ b/deps/libzip/lib/zip_source_file_win32.c @@ -0,0 +1,234 @@ +/* + zip_source_file_win32.c -- read-only Windows file source implementation + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zip_source_file_win32.h" + +static bool _zip_win32_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st); + +static bool _zip_stat_win32(zip_source_file_context_t *ctx, zip_source_file_stat_t *st, HANDLE h); + +/* clang-format off */ + +static zip_source_file_operations_t ops_win32_read = { + _zip_win32_op_close, + NULL, + NULL, + NULL, + NULL, + _zip_win32_op_read, + NULL, + NULL, + _zip_win32_op_seek, + _zip_win32_op_stat, + NULL, + _zip_win32_op_tell, + NULL +}; + +/* clang-format on */ + +ZIP_EXTERN zip_source_t * +zip_source_win32handle(zip_t *za, HANDLE h, zip_uint64_t start, zip_int64_t len) { + if (za == NULL) { + return NULL; + } + + return zip_source_win32handle_create(h, start, len, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_win32handle_create(HANDLE h, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + if (h == INVALID_HANDLE_VALUE || length < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return zip_source_file_common_new(NULL, h, start, length, NULL, &ops_win32_read, NULL, error); +} + + +void +_zip_win32_op_close(zip_source_file_context_t *ctx) { + CloseHandle((HANDLE)ctx->f); +} + + +zip_int64_t +_zip_win32_op_read(zip_source_file_context_t *ctx, void *buf, zip_uint64_t len) { + DWORD i; + + /* TODO: cap len to "DWORD_MAX" */ + if (!ReadFile((HANDLE)ctx->f, buf, (DWORD)len, &i, NULL)) { + zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + return (zip_int64_t)i; +} + + +bool +_zip_win32_op_seek(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, int whence) { + LARGE_INTEGER li; + DWORD method; + + switch (whence) { + case SEEK_SET: + method = FILE_BEGIN; + break; + case SEEK_END: + method = FILE_END; + break; + case SEEK_CUR: + method = FILE_CURRENT; + break; + default: + zip_error_set(&ctx->error, ZIP_ER_SEEK, EINVAL); + return false; + } + + li.QuadPart = (LONGLONG)offset; + if (!SetFilePointerEx((HANDLE)f, li, NULL, method)) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, _zip_win32_error_to_errno(GetLastError())); + return false; + } + + return true; +} + + +static bool +_zip_win32_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st) { + return _zip_stat_win32(ctx, st, (HANDLE)ctx->f); +} + + +zip_int64_t +_zip_win32_op_tell(zip_source_file_context_t *ctx, void *f) { + LARGE_INTEGER zero; + LARGE_INTEGER new_offset; + + zero.QuadPart = 0; + if (!SetFilePointerEx((HANDLE)f, zero, &new_offset, FILE_CURRENT)) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + return (zip_int64_t)new_offset.QuadPart; +} + + +int +_zip_win32_error_to_errno(DWORD win32err) { + /* Note: This list isn't exhaustive, but should cover common cases. */ + switch (win32err) { + case ERROR_INVALID_PARAMETER: + return EINVAL; + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return ENOENT; + case ERROR_INVALID_HANDLE: + return EBADF; + case ERROR_ACCESS_DENIED: + return EACCES; + case ERROR_FILE_EXISTS: + return EEXIST; + case ERROR_TOO_MANY_OPEN_FILES: + return EMFILE; + case ERROR_DISK_FULL: + return ENOSPC; + default: + return 10000 + win32err; + } +} + + +static bool +_zip_stat_win32(zip_source_file_context_t *ctx, zip_source_file_stat_t *st, HANDLE h) { + FILETIME mtimeft; + time_t mtime; + LARGE_INTEGER size; + + if (!GetFileTime(h, NULL, NULL, &mtimeft)) { + zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError())); + return false; + } + if (!_zip_filetime_to_time_t(mtimeft, &mtime)) { + zip_error_set(&ctx->error, ZIP_ER_READ, ERANGE); + return false; + } + + st->exists = true; + st->mtime = mtime; + + if (GetFileType(h) == FILE_TYPE_DISK) { + st->regular_file = 1; + + if (!GetFileSizeEx(h, &size)) { + zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError())); + return false; + } + + st->size = (zip_uint64_t)size.QuadPart; + } + + /* TODO: fill in ctx->attributes */ + + return true; +} + + +bool +_zip_filetime_to_time_t(FILETIME ft, time_t *t) { + /* + Inspired by http://stackoverflow.com/questions/6161776/convert-windows-filetime-to-second-in-unix-linux + */ + const zip_int64_t WINDOWS_TICK = 10000000LL; + const zip_int64_t SEC_TO_UNIX_EPOCH = 11644473600LL; + ULARGE_INTEGER li; + zip_int64_t secs; + time_t temp; + + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + secs = (li.QuadPart / WINDOWS_TICK - SEC_TO_UNIX_EPOCH); + + temp = (time_t)secs; + if (secs != (zip_int64_t)temp) { + return false; + } + + *t = temp; + return true; +} diff --git a/deps/libzip/lib/zip_source_file_win32.h b/deps/libzip/lib/zip_source_file_win32.h new file mode 100644 index 00000000000000..d86069ecaa6dfa --- /dev/null +++ b/deps/libzip/lib/zip_source_file_win32.h @@ -0,0 +1,84 @@ +#ifndef _HAD_ZIP_SOURCE_FILE_WIN32_H +#define _HAD_ZIP_SOURCE_FILE_WIN32_H + +/* + zip_source_file_win32.h -- common header for Windows file implementation + Copyright (C) 2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* 0x0501 => Windows XP; needs to be at least this value because of GetFileSizeEx */ +#if !defined(MS_UWP) && !defined(_WIN32_WINNT) +#define _WIN32_WINNT 0x0501 +#endif + +#include + +#include + +#include + +#include "zipint.h" + +#include "zip_source_file.h" + +struct zip_win32_file_operations { + char *(*allocate_tempname)(const char *name, size_t extra_chars, size_t *lengthp); + HANDLE(__stdcall *create_file)(const void *name, DWORD access, DWORD share_mode, PSECURITY_ATTRIBUTES security_attributes, DWORD creation_disposition, DWORD file_attributes, HANDLE template_file); + BOOL(__stdcall *delete_file)(const void *name); + DWORD(__stdcall *get_file_attributes)(const void *name); + BOOL(__stdcall *get_file_attributes_ex)(const void *name, GET_FILEEX_INFO_LEVELS info_level, void *information); + void (*make_tempname)(char *buf, size_t len, const char *name, zip_uint32_t i); + BOOL(__stdcall *move_file)(const void *from, const void *to, DWORD flags); + BOOL(__stdcall *set_file_attributes)(const void *name, DWORD attributes); + char *(*string_duplicate)(const char *string); +}; + +typedef struct zip_win32_file_operations zip_win32_file_operations_t; + +extern zip_source_file_operations_t _zip_source_file_win32_named_ops; + +void _zip_win32_op_close(zip_source_file_context_t *ctx); +zip_int64_t _zip_win32_op_read(zip_source_file_context_t *ctx, void *buf, zip_uint64_t len); +bool _zip_win32_op_seek(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, int whence); +zip_int64_t _zip_win32_op_tell(zip_source_file_context_t *ctx, void *f); + +bool _zip_filetime_to_time_t(FILETIME ft, time_t *t); +int _zip_win32_error_to_errno(DWORD win32err); + +#ifdef __clang__ +#define DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wincompatible-function-pointer-types\"") +#define DONT_WARN_INCOMPATIBLE_FN_PTR_END _Pragma("GCC diagnostic pop") +#else +#define DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN +#define DONT_WARN_INCOMPATIBLE_FN_PTR_END +#endif + +#endif /* _HAD_ZIP_SOURCE_FILE_WIN32_H */ diff --git a/deps/libzip/lib/zip_source_file_win32_ansi.c b/deps/libzip/lib/zip_source_file_win32_ansi.c new file mode 100644 index 00000000000000..31ea48a4b3ed42 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_win32_ansi.c @@ -0,0 +1,87 @@ +/* + zip_source_file_win32_ansi.c -- source for Windows file opened by ANSI name + Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zip_source_file_win32.h" + +static char *ansi_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp); +static void ansi_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i); + +/* clang-format off */ +DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN + +zip_win32_file_operations_t ops_ansi = { + ansi_allocate_tempname, + CreateFileA, + DeleteFileA, + GetFileAttributesA, + GetFileAttributesExA, + ansi_make_tempname, + MoveFileExA, + SetFileAttributesA, + strdup +}; + +DONT_WARN_INCOMPATIBLE_FN_PTR_END +/* clang-format on */ + +ZIP_EXTERN zip_source_t * +zip_source_win32a(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len) { + if (za == NULL) + return NULL; + + return zip_source_win32a_create(fname, start, len, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_win32a_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + if (fname == NULL || length < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return zip_source_file_common_new(fname, NULL, start, length, NULL, &_zip_source_file_win32_named_ops, &ops_ansi, error); +} + + +static char * +ansi_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp) { + *lengthp = strlen(name) + extra_chars; + return (char *)malloc(*lengthp); +} + + +static void +ansi_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i) { + snprintf_s(buf, len, "%s.%08x", name, i); +} diff --git a/deps/libzip/lib/zip_source_file_win32_named.c b/deps/libzip/lib/zip_source_file_win32_named.c new file mode 100644 index 00000000000000..855e605a9394a9 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_win32_named.c @@ -0,0 +1,274 @@ +/* + zip_source_file_win32_named.c -- source for Windows file opened by name + Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zip_source_file_win32.h" + +static zip_int64_t _zip_win32_named_op_commit_write(zip_source_file_context_t *ctx); +static zip_int64_t _zip_win32_named_op_create_temp_output(zip_source_file_context_t *ctx); +static bool _zip_win32_named_op_open(zip_source_file_context_t *ctx); +static zip_int64_t _zip_win32_named_op_remove(zip_source_file_context_t *ctx); +static void _zip_win32_named_op_rollback_write(zip_source_file_context_t *ctx); +static bool _zip_win32_named_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st); +static char *_zip_win32_named_op_string_duplicate(zip_source_file_context_t *ctx, const char *string); +static zip_int64_t _zip_win32_named_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len); + +static HANDLE win32_named_open(zip_source_file_context_t *ctx, const char *name, bool temporary, PSECURITY_ATTRIBUTES security_attributes); + +/* clang-format off */ +zip_source_file_operations_t _zip_source_file_win32_named_ops = { + _zip_win32_op_close, + _zip_win32_named_op_commit_write, + _zip_win32_named_op_create_temp_output, + NULL, + _zip_win32_named_op_open, + _zip_win32_op_read, + _zip_win32_named_op_remove, + _zip_win32_named_op_rollback_write, + _zip_win32_op_seek, + _zip_win32_named_op_stat, + _zip_win32_named_op_string_duplicate, + _zip_win32_op_tell, + _zip_win32_named_op_write +}; +/* clang-format on */ + +static zip_int64_t +_zip_win32_named_op_commit_write(zip_source_file_context_t *ctx) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + DWORD attributes; + + if (!CloseHandle((HANDLE)ctx->fout)) { + zip_error_set(&ctx->error, ZIP_ER_WRITE, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + attributes = file_ops->get_file_attributes(ctx->tmpname); + if (attributes == INVALID_FILE_ATTRIBUTES) { + zip_error_set(&ctx->error, ZIP_ER_RENAME, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + if (attributes & FILE_ATTRIBUTE_TEMPORARY) { + if (!file_ops->set_file_attributes(ctx->tmpname, attributes & ~FILE_ATTRIBUTE_TEMPORARY)) { + zip_error_set(&ctx->error, ZIP_ER_RENAME, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + } + + if (!file_ops->move_file(ctx->tmpname, ctx->fname, MOVEFILE_REPLACE_EXISTING)) { + zip_error_set(&ctx->error, ZIP_ER_RENAME, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + return 0; +} + +static zip_int64_t +_zip_win32_named_op_create_temp_output(zip_source_file_context_t *ctx) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + + zip_uint32_t value, i; + HANDLE th = INVALID_HANDLE_VALUE; + PSECURITY_DESCRIPTOR psd = NULL; + PSECURITY_ATTRIBUTES psa = NULL; + SECURITY_ATTRIBUTES sa; + SECURITY_INFORMATION si; + DWORD success; + PACL dacl = NULL; + char *tempname = NULL; + size_t tempname_size = 0; + + if ((HANDLE)ctx->f != INVALID_HANDLE_VALUE && GetFileType((HANDLE)ctx->f) == FILE_TYPE_DISK) { + si = DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION; + success = GetSecurityInfo((HANDLE)ctx->f, SE_FILE_OBJECT, si, NULL, NULL, &dacl, NULL, &psd); + if (success == ERROR_SUCCESS) { + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.bInheritHandle = FALSE; + sa.lpSecurityDescriptor = psd; + psa = &sa; + } + } + +#ifndef MS_UWP + value = GetTickCount(); +#else + value = (zip_uint32_t)(GetTickCount64() & 0xffffffff); +#endif + + if ((tempname = file_ops->allocate_tempname(ctx->fname, 10, &tempname_size)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + + for (i = 0; i < 1024 && th == INVALID_HANDLE_VALUE; i++) { + file_ops->make_tempname(tempname, tempname_size, ctx->fname, value + i); + + th = win32_named_open(ctx, tempname, true, psa); + if (th == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_EXISTS) + break; + } + + if (th == INVALID_HANDLE_VALUE) { + free(tempname); + LocalFree(psd); + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + LocalFree(psd); + ctx->fout = th; + ctx->tmpname = tempname; + + return 0; +} + + +static bool +_zip_win32_named_op_open(zip_source_file_context_t *ctx) { + HANDLE h = win32_named_open(ctx, ctx->fname, false, NULL); + + if (h == INVALID_HANDLE_VALUE) { + return false; + } + + ctx->f = h; + return true; +} + + +static zip_int64_t +_zip_win32_named_op_remove(zip_source_file_context_t *ctx) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + + if (!file_ops->delete_file(ctx->fname)) { + zip_error_set(&ctx->error, ZIP_ER_REMOVE, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + return 0; +} + + +static void +_zip_win32_named_op_rollback_write(zip_source_file_context_t *ctx) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + + if (ctx->fout) { + CloseHandle((HANDLE)ctx->fout); + } + file_ops->delete_file(ctx->tmpname); +} + + +static bool +_zip_win32_named_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + + WIN32_FILE_ATTRIBUTE_DATA file_attributes; + + if (!file_ops->get_file_attributes_ex(ctx->fname, GetFileExInfoStandard, &file_attributes)) { + DWORD error = GetLastError(); + if (error == ERROR_FILE_NOT_FOUND) { + st->exists = false; + return true; + } + zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(error)); + return false; + } + + st->exists = true; + st->regular_file = false; + + if (file_attributes.dwFileAttributes != INVALID_FILE_ATTRIBUTES) { + if ((file_attributes.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_REPARSE_POINT)) == 0) { + st->regular_file = true; + } + } + + if (!_zip_filetime_to_time_t(file_attributes.ftLastWriteTime, &st->mtime)) { + zip_error_set(&ctx->error, ZIP_ER_READ, ERANGE); + return false; + } + st->size = ((zip_uint64_t)file_attributes.nFileSizeHigh << 32) | file_attributes.nFileSizeLow; + + /* TODO: fill in ctx->attributes */ + + return true; +} + + +static char * +_zip_win32_named_op_string_duplicate(zip_source_file_context_t *ctx, const char *string) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + + return file_ops->string_duplicate(string); +} + + +static zip_int64_t +_zip_win32_named_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len) { + DWORD ret; + if (!WriteFile((HANDLE)ctx->fout, data, (DWORD)len, &ret, NULL) || ret != len) { + zip_error_set(&ctx->error, ZIP_ER_WRITE, _zip_win32_error_to_errno(GetLastError())); + return -1; + } + + return (zip_int64_t)ret; +} + + +static HANDLE +win32_named_open(zip_source_file_context_t *ctx, const char *name, bool temporary, PSECURITY_ATTRIBUTES security_attributes) { + zip_win32_file_operations_t *file_ops = (zip_win32_file_operations_t *)ctx->ops_userdata; + + DWORD access = GENERIC_READ; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE; + DWORD creation_disposition = OPEN_EXISTING; + DWORD file_attributes = FILE_ATTRIBUTE_NORMAL; + HANDLE h; + + if (temporary) { + access = GENERIC_READ | GENERIC_WRITE; + share_mode = FILE_SHARE_READ; + creation_disposition = CREATE_NEW; + file_attributes = FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY; + } + + h = file_ops->create_file(name, access, share_mode, security_attributes, creation_disposition, file_attributes, NULL); + + if (h == INVALID_HANDLE_VALUE) { + zip_error_set(&ctx->error, ZIP_ER_OPEN, _zip_win32_error_to_errno(GetLastError())); + } + + return h; +} diff --git a/deps/libzip/lib/zip_source_file_win32_utf16.c b/deps/libzip/lib/zip_source_file_win32_utf16.c new file mode 100644 index 00000000000000..b2f23419d2c36a --- /dev/null +++ b/deps/libzip/lib/zip_source_file_win32_utf16.c @@ -0,0 +1,113 @@ +/* + zip_source_file_win32_utf16.c -- source for Windows file opened by UTF-16 name + Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zip_source_file_win32.h" + +static char *utf16_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp); +static HANDLE __stdcall utf16_create_file(const char *name, DWORD access, DWORD share_mode, PSECURITY_ATTRIBUTES security_attributes, DWORD creation_disposition, DWORD file_attributes, HANDLE template_file); +static void utf16_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i); +static char *utf16_strdup(const char *string); + +/* clang-format off */ +DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN + +zip_win32_file_operations_t ops_utf16 = { + utf16_allocate_tempname, + utf16_create_file, + DeleteFileW, + GetFileAttributesW, + GetFileAttributesExW, + utf16_make_tempname, + MoveFileExW, + SetFileAttributesW, + utf16_strdup +}; + +DONT_WARN_INCOMPATIBLE_FN_PTR_END +/* clang-format on */ + +ZIP_EXTERN zip_source_t * +zip_source_win32w(zip_t *za, const wchar_t *fname, zip_uint64_t start, zip_int64_t len) { + if (za == NULL) + return NULL; + + return zip_source_win32w_create(fname, start, len, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_win32w_create(const wchar_t *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + if (fname == NULL || length < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + + return zip_source_file_common_new((const char *)fname, NULL, start, length, NULL, &_zip_source_file_win32_named_ops, &ops_utf16, error); +} + + +static char * +utf16_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp) { + *lengthp = wcslen((const wchar_t *)name) + extra_chars; + return (char *)malloc(*lengthp * sizeof(wchar_t)); +} + + +static HANDLE __stdcall utf16_create_file(const char *name, DWORD access, DWORD share_mode, PSECURITY_ATTRIBUTES security_attributes, DWORD creation_disposition, DWORD file_attributes, HANDLE template_file) { +#ifdef MS_UWP + CREATEFILE2_EXTENDED_PARAMETERS extParams = {0}; + extParams.dwFileAttributes = file_attributes; + extParams.dwFileFlags = FILE_FLAG_RANDOM_ACCESS; + extParams.dwSecurityQosFlags = SECURITY_ANONYMOUS; + extParams.dwSize = sizeof(extParams); + extParams.hTemplateFile = template_file; + extParams.lpSecurityAttributes = security_attributes; + + return CreateFile2((const wchar_t *)name, access, share_mode, creation_disposition, &extParams); +#else + return CreateFileW((const wchar_t *)name, access, share_mode, security_attributes, creation_disposition, file_attributes, template_file); +#endif +} + + +static void +utf16_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i) { + _snwprintf_s((wchar_t *)buf, len, len, L"%s.%08x", (const wchar_t *)name, i); +} + + +static char * +utf16_strdup(const char *string) { + return (char *)_wcsdup((const wchar_t *)string); +} diff --git a/deps/libzip/lib/zip_source_file_win32_utf8.c b/deps/libzip/lib/zip_source_file_win32_utf8.c new file mode 100644 index 00000000000000..687c30f9152333 --- /dev/null +++ b/deps/libzip/lib/zip_source_file_win32_utf8.c @@ -0,0 +1,73 @@ +/* + zip_source_file_win32_ansi.c -- source for Windows file opened by UTF-8 name + Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zip_source_file_win32.h" + +ZIP_EXTERN zip_source_t * +zip_source_file(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len) { + if (za == NULL) { + return NULL; + } + + return zip_source_file_create(fname, start, len, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + int size; + wchar_t *wfname; + zip_source_t *source; + + if (fname == NULL || length < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + /* Convert fname from UTF-8 to Windows-friendly UTF-16. */ + size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, fname, -1, NULL, 0); + if (size == 0) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if ((wfname = (wchar_t *)malloc(sizeof(wchar_t) * size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, fname, -1, wfname, size); + + source = zip_source_win32w_create(wfname, start, length, error); + + free(wfname); + return source; +} diff --git a/deps/libzip/lib/zip_source_free.c b/deps/libzip/lib/zip_source_free.c new file mode 100644 index 00000000000000..1a800405c263cc --- /dev/null +++ b/deps/libzip/lib/zip_source_free.c @@ -0,0 +1,71 @@ +/* + zip_source_free.c -- free zip data source + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN void +zip_source_free(zip_source_t *src) { + if (src == NULL) + return; + + if (src->refcount > 0) { + src->refcount--; + } + if (src->refcount > 0) { + return; + } + + if (ZIP_SOURCE_IS_OPEN_READING(src)) { + src->open_count = 1; /* force close */ + zip_source_close(src); + } + if (ZIP_SOURCE_IS_OPEN_WRITING(src)) { + zip_source_rollback_write(src); + } + + if (src->source_archive && !src->source_closed) { + _zip_deregister_source(src->source_archive, src); + } + + (void)_zip_source_call(src, NULL, 0, ZIP_SOURCE_FREE); + + if (src->src) { + zip_source_free(src->src); + } + + free(src); +} diff --git a/deps/libzip/lib/zip_source_function.c b/deps/libzip/lib/zip_source_function.c new file mode 100644 index 00000000000000..1fe6396e140fe8 --- /dev/null +++ b/deps/libzip/lib/zip_source_function.c @@ -0,0 +1,99 @@ +/* + zip_source_function.c -- create zip data source from callback function + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN zip_source_t * +zip_source_function(zip_t *za, zip_source_callback zcb, void *ud) { + if (za == NULL) { + return NULL; + } + + return zip_source_function_create(zcb, ud, &za->error); +} + + +ZIP_EXTERN zip_source_t * +zip_source_function_create(zip_source_callback zcb, void *ud, zip_error_t *error) { + zip_source_t *zs; + + if ((zs = _zip_source_new(error)) == NULL) + return NULL; + + zs->cb.f = zcb; + zs->ud = ud; + + zs->supports = zcb(ud, NULL, 0, ZIP_SOURCE_SUPPORTS); + if (zs->supports < 0) { + zs->supports = ZIP_SOURCE_SUPPORTS_READABLE; + } + zs->supports |= zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, -1); + + return zs; +} + + +ZIP_EXTERN void +zip_source_keep(zip_source_t *src) { + src->refcount++; +} + + +zip_source_t * +_zip_source_new(zip_error_t *error) { + zip_source_t *src; + + if ((src = (zip_source_t *)malloc(sizeof(*src))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + src->src = NULL; + src->cb.f = NULL; + src->ud = NULL; + src->open_count = 0; + src->write_state = ZIP_SOURCE_WRITE_CLOSED; + src->source_closed = false; + src->source_archive = NULL; + src->refcount = 1; + zip_error_init(&src->error); + src->eof = false; + src->had_read_error = false; + src->bytes_read = 0; + + return src; +} diff --git a/deps/libzip/lib/zip_source_get_file_attributes.c b/deps/libzip/lib/zip_source_get_file_attributes.c new file mode 100644 index 00000000000000..4771dc16b316d8 --- /dev/null +++ b/deps/libzip/lib/zip_source_get_file_attributes.c @@ -0,0 +1,108 @@ +/* + zip_source_get_file_attributes.c -- get attributes for file from source + Copyright (C) 2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +ZIP_EXTERN void +zip_file_attributes_init(zip_file_attributes_t *attributes) { + attributes->valid = 0; + attributes->version = 1; +} + +int +zip_source_get_file_attributes(zip_source_t *src, zip_file_attributes_t *attributes) { + if (src->source_closed) { + return -1; + } + if (attributes == NULL) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + zip_file_attributes_init(attributes); + + if (src->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_GET_FILE_ATTRIBUTES)) { + if (_zip_source_call(src, attributes, sizeof(*attributes), ZIP_SOURCE_GET_FILE_ATTRIBUTES) < 0) { + return -1; + } + } + + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_file_attributes_t lower_attributes; + + zip_file_attributes_init(&lower_attributes); + + if (zip_source_get_file_attributes(src->src, &lower_attributes) < 0) { + zip_error_set_from_source(&src->error, src->src); + return -1; + } + + if ((lower_attributes.valid & ZIP_FILE_ATTRIBUTES_HOST_SYSTEM) && (attributes->valid & ZIP_FILE_ATTRIBUTES_HOST_SYSTEM) == 0) { + attributes->host_system = lower_attributes.host_system; + attributes->valid |= ZIP_FILE_ATTRIBUTES_HOST_SYSTEM; + } + if ((lower_attributes.valid & ZIP_FILE_ATTRIBUTES_ASCII) && (attributes->valid & ZIP_FILE_ATTRIBUTES_ASCII) == 0) { + attributes->ascii = lower_attributes.ascii; + attributes->valid |= ZIP_FILE_ATTRIBUTES_ASCII; + } + if ((lower_attributes.valid & ZIP_FILE_ATTRIBUTES_VERSION_NEEDED)) { + if (attributes->valid & ZIP_FILE_ATTRIBUTES_VERSION_NEEDED) { + attributes->version_needed = ZIP_MAX(lower_attributes.version_needed, attributes->version_needed); + } + else { + attributes->version_needed = lower_attributes.version_needed; + attributes->valid |= ZIP_FILE_ATTRIBUTES_VERSION_NEEDED; + } + } + if ((lower_attributes.valid & ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES) && (attributes->valid & ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES) == 0) { + attributes->external_file_attributes = lower_attributes.external_file_attributes; + attributes->valid |= ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES; + } + if ((lower_attributes.valid & ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS)) { + if (attributes->valid & ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS) { + /* only take from lower level what is not defined at current level */ + lower_attributes.general_purpose_bit_mask &= ~attributes->general_purpose_bit_mask; + + attributes->general_purpose_bit_flags |= lower_attributes.general_purpose_bit_flags & lower_attributes.general_purpose_bit_mask; + attributes->general_purpose_bit_mask |= lower_attributes.general_purpose_bit_mask; + } + else { + attributes->valid |= ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS; + attributes->general_purpose_bit_flags = lower_attributes.general_purpose_bit_flags; + attributes->general_purpose_bit_mask = lower_attributes.general_purpose_bit_mask; + } + } + } + + return 0; +} diff --git a/deps/libzip/lib/zip_source_is_deleted.c b/deps/libzip/lib/zip_source_is_deleted.c new file mode 100644 index 00000000000000..838aa909679853 --- /dev/null +++ b/deps/libzip/lib/zip_source_is_deleted.c @@ -0,0 +1,41 @@ +/* + zip_source_is_deleted.c -- was archive was removed? + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_is_deleted(zip_source_t *src) { + return src->write_state == ZIP_SOURCE_WRITE_REMOVED; +} diff --git a/deps/libzip/lib/zip_source_layered.c b/deps/libzip/lib/zip_source_layered.c new file mode 100644 index 00000000000000..3caf087878558e --- /dev/null +++ b/deps/libzip/lib/zip_source_layered.c @@ -0,0 +1,76 @@ +/* + zip_source_layered.c -- create layered source + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +zip_source_t * +zip_source_layered(zip_t *za, zip_source_t *src, zip_source_layered_callback cb, void *ud) { + if (za == NULL) + return NULL; + + return zip_source_layered_create(src, cb, ud, &za->error); +} + + +zip_source_t * +zip_source_layered_create(zip_source_t *src, zip_source_layered_callback cb, void *ud, zip_error_t *error) { + zip_source_t *zs; + zip_int64_t lower_supports, supports; + + lower_supports = zip_source_supports(src); + supports = cb(src, ud, &lower_supports, sizeof(lower_supports), ZIP_SOURCE_SUPPORTS); + if (supports < 0) { + zip_error_set(error,ZIP_ER_INVAL, 0); /* Initialize in case cb doesn't return valid error. */ + cb(src, ud, error, sizeof(*error), ZIP_SOURCE_ERROR); + return NULL; + } + + if ((zs = _zip_source_new(error)) == NULL) { + return NULL; + } + + zip_source_keep(src); + zs->src = src; + zs->cb.l = cb; + zs->ud = ud; + zs->supports = supports; + + /* Layered sources can't support writing, since we currently have no use case. If we want to revisit this, we have to define how the two sources interact. */ + zs->supports &= ~(ZIP_SOURCE_SUPPORTS_WRITABLE & ~ZIP_SOURCE_SUPPORTS_SEEKABLE); + + return zs; +} diff --git a/deps/libzip/lib/zip_source_open.c b/deps/libzip/lib/zip_source_open.c new file mode 100644 index 00000000000000..b34fa2c6c0105d --- /dev/null +++ b/deps/libzip/lib/zip_source_open.c @@ -0,0 +1,76 @@ +/* + zip_source_open.c -- open zip_source (prepare for reading) + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +ZIP_EXTERN int +zip_source_open(zip_source_t *src) { + if (src->source_closed) { + return -1; + } + if (src->write_state == ZIP_SOURCE_WRITE_REMOVED) { + zip_error_set(&src->error, ZIP_ER_DELETED, 0); + return -1; + } + + if (ZIP_SOURCE_IS_OPEN_READING(src)) { + if ((zip_source_supports(src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK)) == 0) { + zip_error_set(&src->error, ZIP_ER_INUSE, 0); + return -1; + } + } + else { + if (ZIP_SOURCE_IS_LAYERED(src)) { + if (zip_source_open(src->src) < 0) { + zip_error_set_from_source(&src->error, src->src); + return -1; + } + } + + if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_OPEN) < 0) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_source_close(src->src); + } + return -1; + } + } + + src->eof = false; + src->had_read_error = false; + _zip_error_clear(&src->error); + src->bytes_read = 0; + src->open_count++; + + return 0; +} diff --git a/deps/libzip/lib/zip_source_pass_to_lower_layer.c b/deps/libzip/lib/zip_source_pass_to_lower_layer.c new file mode 100644 index 00000000000000..4a98222ecd447f --- /dev/null +++ b/deps/libzip/lib/zip_source_pass_to_lower_layer.c @@ -0,0 +1,78 @@ +/* + zip_source_pass_to_lower_layer.c -- pass command to lower layer + Copyright (C) 2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +zip_int64_t zip_source_pass_to_lower_layer(zip_source_t *src, void *data, zip_uint64_t length, zip_source_cmd_t command) { + switch (command) { + case ZIP_SOURCE_OPEN: + case ZIP_SOURCE_CLOSE: + case ZIP_SOURCE_FREE: + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: + case ZIP_SOURCE_SUPPORTS_REOPEN: + return 0; + + case ZIP_SOURCE_STAT: + return sizeof(zip_stat_t); + + case ZIP_SOURCE_ACCEPT_EMPTY: + case ZIP_SOURCE_ERROR: + case ZIP_SOURCE_READ: + case ZIP_SOURCE_SEEK: + case ZIP_SOURCE_TELL: + return _zip_source_call(src, data, length, command); + + + case ZIP_SOURCE_BEGIN_WRITE: + case ZIP_SOURCE_BEGIN_WRITE_CLONING: + case ZIP_SOURCE_COMMIT_WRITE: + case ZIP_SOURCE_REMOVE: + case ZIP_SOURCE_ROLLBACK_WRITE: + case ZIP_SOURCE_SEEK_WRITE: + case ZIP_SOURCE_TELL_WRITE: + case ZIP_SOURCE_WRITE: + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + + case ZIP_SOURCE_SUPPORTS: + if (length < sizeof(zip_int64_t)) { + zip_error_set(&src->error, ZIP_ER_INTERNAL, 0); + return -1; + } + return *(zip_int64_t *)data; + + default: + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} \ No newline at end of file diff --git a/deps/libzip/lib/zip_source_pkware_decode.c b/deps/libzip/lib/zip_source_pkware_decode.c new file mode 100644 index 00000000000000..b4c482b31238f5 --- /dev/null +++ b/deps/libzip/lib/zip_source_pkware_decode.c @@ -0,0 +1,219 @@ +/* + zip_source_pkware_decode.c -- Traditional PKWARE decryption routines + Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + +struct trad_pkware { + char *password; + zip_pkware_keys_t keys; + zip_error_t error; +}; + + +static int decrypt_header(zip_source_t *, struct trad_pkware *); +static zip_int64_t pkware_decrypt(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); +static struct trad_pkware *trad_pkware_new(const char *password, zip_error_t *error); +static void trad_pkware_free(struct trad_pkware *); + + +zip_source_t * +zip_source_pkware_decode(zip_t *za, zip_source_t *src, zip_uint16_t em, int flags, const char *password) { + struct trad_pkware *ctx; + zip_source_t *s2; + + if (password == NULL || src == NULL || em != ZIP_EM_TRAD_PKWARE) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + if (flags & ZIP_CODEC_ENCODE) { + zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + return NULL; + } + + if ((ctx = trad_pkware_new(password, &za->error)) == NULL) { + return NULL; + } + + if ((s2 = zip_source_layered(za, src, pkware_decrypt, ctx)) == NULL) { + trad_pkware_free(ctx); + return NULL; + } + + return s2; +} + + +static int +decrypt_header(zip_source_t *src, struct trad_pkware *ctx) { + zip_uint8_t header[ZIP_CRYPTO_PKWARE_HEADERLEN]; + struct zip_stat st; + zip_int64_t n; + bool ok = false; + + if ((n = zip_source_read(src, header, ZIP_CRYPTO_PKWARE_HEADERLEN)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + if (n != ZIP_CRYPTO_PKWARE_HEADERLEN) { + zip_error_set(&ctx->error, ZIP_ER_EOF, 0); + return -1; + } + + _zip_pkware_decrypt(&ctx->keys, header, header, ZIP_CRYPTO_PKWARE_HEADERLEN); + + if (zip_source_stat(src, &st)) { + /* stat failed, skip password validation */ + return 0; + } + + /* password verification - two ways: + * mtime - InfoZIP way, to avoid computing complete CRC before encrypting data + * CRC - old PKWare way + */ + + if (st.valid & ZIP_STAT_MTIME) { + unsigned short dostime, dosdate; + _zip_u2d_time(st.mtime, &dostime, &dosdate); + if (header[ZIP_CRYPTO_PKWARE_HEADERLEN - 1] == dostime >> 8) { + ok = true; + } + } + + if (st.valid & ZIP_STAT_CRC) { + if (header[ZIP_CRYPTO_PKWARE_HEADERLEN - 1] == st.crc >> 24) { + ok = true; + } + } + + if (!ok && ((st.valid & (ZIP_STAT_MTIME | ZIP_STAT_CRC)) != 0)) { + zip_error_set(&ctx->error, ZIP_ER_WRONGPASSWD, 0); + return -1; + } + + return 0; +} + + +static zip_int64_t +pkware_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + struct trad_pkware *ctx; + zip_int64_t n; + + ctx = (struct trad_pkware *)ud; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + _zip_pkware_keys_reset(&ctx->keys); + _zip_pkware_decrypt(&ctx->keys, NULL, (const zip_uint8_t *)ctx->password, strlen(ctx->password)); + if (decrypt_header(src, ctx) < 0) { + return -1; + } + return 0; + + case ZIP_SOURCE_READ: + if ((n = zip_source_read(src, data, len)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + _zip_pkware_decrypt(&ctx->keys, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n); + return n; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + + st->encryption_method = ZIP_EM_NONE; + st->valid |= ZIP_STAT_ENCRYPTION_METHOD; + if (st->valid & ZIP_STAT_COMP_SIZE) { + st->comp_size -= ZIP_CRYPTO_PKWARE_HEADERLEN; + } + + return 0; + } + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SUPPORTS_REOPEN, -1); + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + trad_pkware_free(ctx); + return 0; + + default: + return zip_source_pass_to_lower_layer(src, data, len, cmd); + } +} + + +static struct trad_pkware * +trad_pkware_new(const char *password, zip_error_t *error) { + struct trad_pkware *ctx; + + if ((ctx = (struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((ctx->password = strdup(password)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + free(ctx); + return NULL; + } + + zip_error_init(&ctx->error); + + return ctx; +} + + +static void +trad_pkware_free(struct trad_pkware *ctx) { + if (ctx == NULL) { + return; + } + + free(ctx->password); + free(ctx); +} diff --git a/deps/libzip/lib/zip_source_pkware_encode.c b/deps/libzip/lib/zip_source_pkware_encode.c new file mode 100644 index 00000000000000..cf2d34c9fc65a7 --- /dev/null +++ b/deps/libzip/lib/zip_source_pkware_encode.c @@ -0,0 +1,248 @@ +/* + zip_source_pkware_encode.c -- Traditional PKWARE encryption routines + Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + +struct trad_pkware { + char *password; + zip_pkware_keys_t keys; + zip_buffer_t *buffer; + bool eof; + zip_error_t error; +}; + + +static int encrypt_header(zip_source_t *, struct trad_pkware *); +static zip_int64_t pkware_encrypt(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); +static void trad_pkware_free(struct trad_pkware *); +static struct trad_pkware *trad_pkware_new(const char *password, zip_error_t *error); + + +zip_source_t * +zip_source_pkware_encode(zip_t *za, zip_source_t *src, zip_uint16_t em, int flags, const char *password) { + struct trad_pkware *ctx; + zip_source_t *s2; + + if (password == NULL || src == NULL || em != ZIP_EM_TRAD_PKWARE) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + if (!(flags & ZIP_CODEC_ENCODE)) { + zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + return NULL; + } + + if ((ctx = trad_pkware_new(password, &za->error)) == NULL) { + return NULL; + } + + if ((s2 = zip_source_layered(za, src, pkware_encrypt, ctx)) == NULL) { + trad_pkware_free(ctx); + return NULL; + } + + return s2; +} + + +static int +encrypt_header(zip_source_t *src, struct trad_pkware *ctx) { + struct zip_stat st; + unsigned short dostime, dosdate; + zip_uint8_t *header; + + if (zip_source_stat(src, &st) != 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + _zip_u2d_time(st.mtime, &dostime, &dosdate); + + if ((ctx->buffer = _zip_buffer_new(NULL, ZIP_CRYPTO_PKWARE_HEADERLEN)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + + header = _zip_buffer_data(ctx->buffer); + + /* generate header from random bytes and mtime + see appnote.iz, XIII. Decryption, Step 2, last paragraph */ + if (!zip_secure_random(header, ZIP_CRYPTO_PKWARE_HEADERLEN - 1)) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + _zip_buffer_free(ctx->buffer); + ctx->buffer = NULL; + return -1; + } + header[ZIP_CRYPTO_PKWARE_HEADERLEN - 1] = (zip_uint8_t)((dostime >> 8) & 0xff); + + _zip_pkware_encrypt(&ctx->keys, header, header, ZIP_CRYPTO_PKWARE_HEADERLEN); + + return 0; +} + + +static zip_int64_t +pkware_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, zip_source_cmd_t cmd) { + struct trad_pkware *ctx; + zip_int64_t n; + zip_uint64_t buffer_n; + + ctx = (struct trad_pkware *)ud; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + ctx->eof = false; + + /* initialize keys */ + _zip_pkware_keys_reset(&ctx->keys); + _zip_pkware_encrypt(&ctx->keys, NULL, (const zip_uint8_t *)ctx->password, strlen(ctx->password)); + + if (encrypt_header(src, ctx) < 0) { + return -1; + } + return 0; + + case ZIP_SOURCE_READ: + buffer_n = 0; + + if (ctx->buffer) { + /* write header values to data */ + buffer_n = _zip_buffer_read(ctx->buffer, data, length); + data = (zip_uint8_t *)data + buffer_n; + length -= buffer_n; + + if (_zip_buffer_eof(ctx->buffer)) { + _zip_buffer_free(ctx->buffer); + ctx->buffer = NULL; + } + } + + if (ctx->eof) { + return (zip_int64_t)buffer_n; + } + + if ((n = zip_source_read(src, data, length)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + _zip_pkware_encrypt(&ctx->keys, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n); + + if ((zip_uint64_t)n < length) { + ctx->eof = true; + } + + return (zip_int64_t)buffer_n + n; + + case ZIP_SOURCE_CLOSE: + _zip_buffer_free(ctx->buffer); + ctx->buffer = NULL; + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + st->encryption_method = ZIP_EM_TRAD_PKWARE; + st->valid |= ZIP_STAT_ENCRYPTION_METHOD; + if (st->valid & ZIP_STAT_COMP_SIZE) { + st->comp_size += ZIP_CRYPTO_PKWARE_HEADERLEN; + } + + return 0; + } + + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: { + zip_file_attributes_t *attributes = (zip_file_attributes_t *)data; + if (length < sizeof(*attributes)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + attributes->valid |= ZIP_FILE_ATTRIBUTES_VERSION_NEEDED; + attributes->version_needed = 20; + + return 0; + } + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_GET_FILE_ATTRIBUTES, -1); + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, length); + + case ZIP_SOURCE_FREE: + trad_pkware_free(ctx); + return 0; + + default: + return zip_source_pass_to_lower_layer(src, data, length, cmd); + } +} + + +static struct trad_pkware * +trad_pkware_new(const char *password, zip_error_t *error) { + struct trad_pkware *ctx; + + if ((ctx = (struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((ctx->password = strdup(password)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + free(ctx); + return NULL; + } + ctx->buffer = NULL; + zip_error_init(&ctx->error); + + return ctx; +} + + +static void +trad_pkware_free(struct trad_pkware *ctx) { + if (ctx == NULL) { + return; + } + + free(ctx->password); + _zip_buffer_free(ctx->buffer); + zip_error_fini(&ctx->error); + free(ctx); +} diff --git a/deps/libzip/lib/zip_source_read.c b/deps/libzip/lib/zip_source_read.c new file mode 100644 index 00000000000000..0938fcb0841db7 --- /dev/null +++ b/deps/libzip/lib/zip_source_read.c @@ -0,0 +1,96 @@ +/* + zip_source_read.c -- read data from zip_source + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +zip_int64_t +zip_source_read(zip_source_t *src, void *data, zip_uint64_t len) { + zip_uint64_t bytes_read; + zip_int64_t n; + + if (src->source_closed) { + return -1; + } + if (!ZIP_SOURCE_IS_OPEN_READING(src) || len > ZIP_INT64_MAX || (len > 0 && data == NULL)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (src->had_read_error) { + return -1; + } + + if (_zip_source_eof(src)) { + return 0; + } + + if (len == 0) { + return 0; + } + + bytes_read = 0; + while (bytes_read < len) { + if ((n = _zip_source_call(src, (zip_uint8_t *)data + bytes_read, len - bytes_read, ZIP_SOURCE_READ)) < 0) { + src->had_read_error = true; + if (bytes_read == 0) { + return -1; + } + else { + return (zip_int64_t)bytes_read; + } + } + + if (n == 0) { + src->eof = 1; + break; + } + + bytes_read += (zip_uint64_t)n; + } + + if (src->bytes_read + bytes_read < src->bytes_read) { + src->bytes_read = ZIP_UINT64_MAX; + } + else { + src->bytes_read += bytes_read; + } + return (zip_int64_t)bytes_read; +} + + +bool +_zip_source_eof(zip_source_t *src) { + return src->eof; +} diff --git a/deps/libzip/lib/zip_source_remove.c b/deps/libzip/lib/zip_source_remove.c new file mode 100644 index 00000000000000..c1d73ab928c582 --- /dev/null +++ b/deps/libzip/lib/zip_source_remove.c @@ -0,0 +1,65 @@ +/* + zip_source_remove.c -- remove empty archive + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include "zipint.h" + + +int +zip_source_remove(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (src->write_state == ZIP_SOURCE_WRITE_REMOVED) { + return 0; + } + + if (ZIP_SOURCE_IS_OPEN_READING(src)) { + if (zip_source_close(src) < 0) { + return -1; + } + } + if (src->write_state != ZIP_SOURCE_WRITE_CLOSED) { + zip_source_rollback_write(src); + } + + if (_zip_source_call(src, NULL, 0, ZIP_SOURCE_REMOVE) < 0) { + return -1; + } + + src->write_state = ZIP_SOURCE_WRITE_REMOVED; + + return 0; +} diff --git a/deps/libzip/lib/zip_source_rollback_write.c b/deps/libzip/lib/zip_source_rollback_write.c new file mode 100644 index 00000000000000..ea1a1510783fb1 --- /dev/null +++ b/deps/libzip/lib/zip_source_rollback_write.c @@ -0,0 +1,50 @@ +/* + zip_source_rollback_write.c -- discard changes + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN void +zip_source_rollback_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + return; + } + + if (src->write_state != ZIP_SOURCE_WRITE_OPEN && src->write_state != ZIP_SOURCE_WRITE_FAILED) { + return; + } + + _zip_source_call(src, NULL, 0, ZIP_SOURCE_ROLLBACK_WRITE); + src->write_state = ZIP_SOURCE_WRITE_CLOSED; +} diff --git a/deps/libzip/lib/zip_source_seek.c b/deps/libzip/lib/zip_source_seek.c new file mode 100644 index 00000000000000..e3baad5ab893fc --- /dev/null +++ b/deps/libzip/lib/zip_source_seek.c @@ -0,0 +1,95 @@ +/* + zip_source_seek.c -- seek to offset + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_seek(zip_source_t *src, zip_int64_t offset, int whence) { + zip_source_args_seek_t args; + + if (src->source_closed) { + return -1; + } + if (!ZIP_SOURCE_IS_OPEN_READING(src) || (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + args.offset = offset; + args.whence = whence; + + if (_zip_source_call(src, &args, sizeof(args), ZIP_SOURCE_SEEK) < 0) { + return -1; + } + + src->eof = 0; + return 0; +} + + +zip_int64_t +zip_source_seek_compute_offset(zip_uint64_t offset, zip_uint64_t length, void *data, zip_uint64_t data_length, zip_error_t *error) { + zip_int64_t new_offset; + zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, data_length, error); + + if (args == NULL) { + return -1; + } + + switch (args->whence) { + case SEEK_CUR: + new_offset = (zip_int64_t)offset + args->offset; + break; + + case SEEK_END: + new_offset = (zip_int64_t)length + args->offset; + break; + + case SEEK_SET: + new_offset = args->offset; + break; + + default: + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + if (new_offset < 0 || (zip_uint64_t)new_offset > length) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + return new_offset; +} diff --git a/deps/libzip/lib/zip_source_seek_write.c b/deps/libzip/lib/zip_source_seek_write.c new file mode 100644 index 00000000000000..34ae2f5af2a873 --- /dev/null +++ b/deps/libzip/lib/zip_source_seek_write.c @@ -0,0 +1,56 @@ +/* + zip_source_seek_write.c -- seek to offset for writing + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_seek_write(zip_source_t *src, zip_int64_t offset, int whence) { + zip_source_args_seek_t args; + + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (!ZIP_SOURCE_IS_OPEN_WRITING(src) || (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + args.offset = offset; + args.whence = whence; + + return (_zip_source_call(src, &args, sizeof(args), ZIP_SOURCE_SEEK_WRITE) < 0 ? -1 : 0); +} diff --git a/deps/libzip/lib/zip_source_stat.c b/deps/libzip/lib/zip_source_stat.c new file mode 100644 index 00000000000000..981038536ca08e --- /dev/null +++ b/deps/libzip/lib/zip_source_stat.c @@ -0,0 +1,62 @@ +/* + zip_source_stat.c -- get meta information from zip_source + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_source_stat(zip_source_t *src, zip_stat_t *st) { + if (src->source_closed) { + return -1; + } + if (st == NULL) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + zip_stat_init(st); + + if (ZIP_SOURCE_IS_LAYERED(src)) { + if (zip_source_stat(src->src, st) < 0) { + zip_error_set_from_source(&src->error, src->src); + return -1; + } + } + + if (_zip_source_call(src, st, sizeof(*st), ZIP_SOURCE_STAT) < 0) { + return -1; + } + + return 0; +} diff --git a/deps/libzip/lib/zip_source_supports.c b/deps/libzip/lib/zip_source_supports.c new file mode 100644 index 00000000000000..fa82eaf52c8c1a --- /dev/null +++ b/deps/libzip/lib/zip_source_supports.c @@ -0,0 +1,69 @@ +/* + zip_source_supports.c -- check for supported functions + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +zip_int64_t +zip_source_supports(zip_source_t *src) { + return src->supports; +} + +bool +zip_source_supports_reopen(zip_source_t *src) { + return (zip_source_supports(src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS_REOPEN)) != 0; +} + +ZIP_EXTERN zip_int64_t +zip_source_make_command_bitmap(zip_source_cmd_t cmd0, ...) { + zip_int64_t bitmap; + va_list ap; + + bitmap = ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd0); + + + va_start(ap, cmd0); + for (;;) { + int cmd = va_arg(ap, int); + if (cmd < 0) { + break; + } + bitmap |= ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd); + } + va_end(ap); + + return bitmap; +} diff --git a/deps/libzip/lib/zip_source_tell.c b/deps/libzip/lib/zip_source_tell.c new file mode 100644 index 00000000000000..49057ce56c0c1e --- /dev/null +++ b/deps/libzip/lib/zip_source_tell.c @@ -0,0 +1,57 @@ +/* + zip_source_tell.c -- report current offset + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_int64_t +zip_source_tell(zip_source_t *src) { + if (src->source_closed) { + return -1; + } + if (!ZIP_SOURCE_IS_OPEN_READING(src)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((src->supports & (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL) | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK))) == 0) { + if (src->bytes_read > ZIP_INT64_MAX) { + zip_error_set(&src->error, ZIP_ER_TELL, EOVERFLOW); + return -1; + } + return (zip_int64_t)src->bytes_read; + } + + return _zip_source_call(src, NULL, 0, ZIP_SOURCE_TELL); +} diff --git a/deps/libzip/lib/zip_source_tell_write.c b/deps/libzip/lib/zip_source_tell_write.c new file mode 100644 index 00000000000000..a5b0e53112d5b6 --- /dev/null +++ b/deps/libzip/lib/zip_source_tell_write.c @@ -0,0 +1,51 @@ +/* + zip_source_tell_write.c -- report current offset for writing + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_int64_t +zip_source_tell_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + + if (!ZIP_SOURCE_IS_OPEN_WRITING(src)) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_source_call(src, NULL, 0, ZIP_SOURCE_TELL_WRITE); +} diff --git a/deps/libzip/lib/zip_source_window.c b/deps/libzip/lib/zip_source_window.c new file mode 100644 index 00000000000000..50901d97c25a8e --- /dev/null +++ b/deps/libzip/lib/zip_source_window.c @@ -0,0 +1,337 @@ +/* + zip_source_window.c -- return part of lower source + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + +struct window { + zip_uint64_t start; /* where in file we start reading */ + zip_uint64_t end; /* where in file we stop reading */ + bool end_valid; /* whether end is set, otherwise read until EOF */ + + /* if not NULL, read file data for this file */ + zip_t *source_archive; + zip_uint64_t source_index; + + zip_uint64_t offset; /* offset in src for next read */ + + zip_stat_t stat; + zip_file_attributes_t attributes; + zip_error_t error; + zip_int64_t supports; + bool needs_seek; +}; + +static zip_int64_t window_read(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); + + +ZIP_EXTERN zip_source_t * +zip_source_window_create(zip_source_t *src, zip_uint64_t start, zip_int64_t len, zip_error_t *error) { + return _zip_source_window_new(src, start, len, NULL, 0, NULL, 0, error); +} + + +zip_source_t * +_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_int64_t length, zip_stat_t *st, zip_file_attributes_t *attributes, zip_t *source_archive, zip_uint64_t source_index, zip_error_t *error) { + struct window *ctx; + + if (src == NULL || length < -1 || (source_archive == NULL && source_index != 0)) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if (length >= 0) { + if (start + (zip_uint64_t)length < start) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + } + + if ((ctx = (struct window *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + ctx->start = start; + if (length == -1) { + ctx->end_valid = false; + } + else { + ctx->end = start + (zip_uint64_t)length; + ctx->end_valid = true; + } + zip_stat_init(&ctx->stat); + if (attributes != NULL) { + (void)memcpy_s(&ctx->attributes, sizeof(ctx->attributes), attributes, sizeof(ctx->attributes)); + } + else { + zip_file_attributes_init(&ctx->attributes); + } + ctx->source_archive = source_archive; + ctx->source_index = source_index; + zip_error_init(&ctx->error); + ctx->supports = (zip_source_supports(src) & (ZIP_SOURCE_SUPPORTS_SEEKABLE | ZIP_SOURCE_SUPPORTS_REOPEN)) | (zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1)); + ctx->needs_seek = (ctx->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK)) ? true : false; + + if (st) { + if (_zip_stat_merge(&ctx->stat, st, error) < 0) { + free(ctx); + return NULL; + } + } + + return zip_source_layered_create(src, window_read, ctx, error); +} + + +int +_zip_source_set_source_archive(zip_source_t *src, zip_t *za) { + src->source_archive = za; + return _zip_register_source(za, src); +} + + +/* called by zip_discard to avoid operating on file from closed archive */ +void +_zip_source_invalidate(zip_source_t *src) { + src->source_closed = 1; + + if (zip_error_code_zip(&src->error) == ZIP_ER_OK) { + zip_error_set(&src->error, ZIP_ER_ZIPCLOSED, 0); + } +} + + +static zip_int64_t +window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + struct window *ctx; + zip_int64_t ret; + zip_uint64_t n, i; + + ctx = (struct window *)_ctx; + + switch (cmd) { + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + free(ctx); + return 0; + + case ZIP_SOURCE_OPEN: + if (ctx->source_archive) { + zip_uint64_t offset; + + if ((offset = _zip_file_get_offset(ctx->source_archive, ctx->source_index, &ctx->error)) == 0) { + return -1; + } + if (ctx->end + offset < ctx->end) { + /* zip archive data claims end of data past zip64 limits */ + zip_error_set(&ctx->error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_CDIR_ENTRY_INVALID, ctx->source_index)); + return -1; + } + ctx->start += offset; + ctx->end += offset; + ctx->source_archive = NULL; + } + + if (!ctx->needs_seek) { + DEFINE_BYTE_ARRAY(b, BUFSIZE); + + if (!byte_array_init(b, BUFSIZE)) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + + for (n = 0; n < ctx->start; n += (zip_uint64_t)ret) { + i = (ctx->start - n > BUFSIZE ? BUFSIZE : ctx->start - n); + if ((ret = zip_source_read(src, b, i)) < 0) { + zip_error_set_from_source(&ctx->error, src); + byte_array_fini(b); + return -1; + } + if (ret == 0) { + zip_error_set(&ctx->error, ZIP_ER_EOF, 0); + byte_array_fini(b); + return -1; + } + } + + byte_array_fini(b); + } + + ctx->offset = ctx->start; + return 0; + + case ZIP_SOURCE_READ: + if (ctx->end_valid && len > ctx->end - ctx->offset) { + len = ctx->end - ctx->offset; + } + + if (len == 0) { + return 0; + } + + if (ctx->needs_seek) { + if (zip_source_seek(src, (zip_int64_t)ctx->offset, SEEK_SET) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + } + + if ((ret = zip_source_read(src, data, len)) < 0) { + zip_error_set(&ctx->error, ZIP_ER_EOF, 0); + return -1; + } + + ctx->offset += (zip_uint64_t)ret; + + if (ret == 0) { + if (ctx->end_valid && ctx->offset < ctx->end) { + zip_error_set(&ctx->error, ZIP_ER_EOF, 0); + return -1; + } + } + return ret; + + case ZIP_SOURCE_SEEK: { + zip_int64_t new_offset; + + if (!ctx->end_valid) { + zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error); + + if (args == NULL) { + return -1; + } + if (args->whence == SEEK_END) { + if (zip_source_seek(src, args->offset, args->whence) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + new_offset = zip_source_tell(src); + if (new_offset < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + if ((zip_uint64_t)new_offset < ctx->start) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + (void)zip_source_seek(src, (zip_int64_t)ctx->offset, SEEK_SET); + return -1; + } + ctx->offset = (zip_uint64_t)new_offset; + return 0; + } + } + + new_offset = zip_source_seek_compute_offset(ctx->offset - ctx->start, ctx->end - ctx->start, data, len, &ctx->error); + + if (new_offset < 0) { + return -1; + } + + ctx->offset = (zip_uint64_t)new_offset + ctx->start; + return 0; + } + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + + if (_zip_stat_merge(st, &ctx->stat, &ctx->error) < 0) { + return -1; + } + return 0; + } + + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: + if (len < sizeof(ctx->attributes)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + + (void)memcpy_s(data, sizeof(ctx->attributes), &ctx->attributes, sizeof(ctx->attributes)); + return sizeof(ctx->attributes); + + case ZIP_SOURCE_SUPPORTS: + return ctx->supports; + + case ZIP_SOURCE_TELL: + return (zip_int64_t)(ctx->offset - ctx->start); + + default: + return zip_source_pass_to_lower_layer(src, data, len, cmd); + } +} + + +void +_zip_deregister_source(zip_t *za, zip_source_t *src) { + unsigned int i; + + for (i = 0; i < za->nopen_source; i++) { + if (za->open_source[i] == src) { + za->open_source[i] = za->open_source[za->nopen_source - 1]; + za->nopen_source--; + break; + } + } +} + + +int +_zip_register_source(zip_t *za, zip_source_t *src) { + zip_source_t **open_source; + + if (za->nopen_source + 1 >= za->nopen_source_alloc) { + unsigned int n; + n = za->nopen_source_alloc + 10; + open_source = (zip_source_t **)realloc(za->open_source, n * sizeof(zip_source_t *)); + if (open_source == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + za->nopen_source_alloc = n; + za->open_source = open_source; + } + + za->open_source[za->nopen_source++] = src; + + return 0; +} diff --git a/deps/libzip/lib/zip_source_winzip_aes_decode.c b/deps/libzip/lib/zip_source_winzip_aes_decode.c new file mode 100644 index 00000000000000..91290be15a7b28 --- /dev/null +++ b/deps/libzip/lib/zip_source_winzip_aes_decode.c @@ -0,0 +1,264 @@ +/* + zip_source_winzip_aes_decode.c -- Winzip AES decryption routines + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + +struct winzip_aes { + char *password; + zip_uint16_t encryption_method; + + zip_uint64_t data_length; + zip_uint64_t current_position; + + zip_winzip_aes_t *aes_ctx; + zip_error_t error; +}; + + +static int decrypt_header(zip_source_t *src, struct winzip_aes *ctx); +static void winzip_aes_free(struct winzip_aes *); +static zip_int64_t winzip_aes_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_source_cmd_t cmd); +static struct winzip_aes *winzip_aes_new(zip_uint16_t encryption_method, const char *password, zip_error_t *error); + + +zip_source_t * +zip_source_winzip_aes_decode(zip_t *za, zip_source_t *src, zip_uint16_t encryption_method, int flags, const char *password) { + zip_source_t *s2; + zip_stat_t st; + zip_uint64_t aux_length; + struct winzip_aes *ctx; + + if ((encryption_method != ZIP_EM_AES_128 && encryption_method != ZIP_EM_AES_192 && encryption_method != ZIP_EM_AES_256) || password == NULL || src == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + if (flags & ZIP_CODEC_ENCODE) { + zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + return NULL; + } + + if (zip_source_stat(src, &st) != 0) { + zip_error_set_from_source(&za->error, src); + return NULL; + } + + aux_length = WINZIP_AES_PASSWORD_VERIFY_LENGTH + SALT_LENGTH(encryption_method) + HMAC_LENGTH; + + if ((st.valid & ZIP_STAT_COMP_SIZE) == 0 || st.comp_size < aux_length) { + zip_error_set(&za->error, ZIP_ER_OPNOTSUPP, 0); + return NULL; + } + + if ((ctx = winzip_aes_new(encryption_method, password, &za->error)) == NULL) { + return NULL; + } + + ctx->data_length = st.comp_size - aux_length; + + if ((s2 = zip_source_layered(za, src, winzip_aes_decrypt, ctx)) == NULL) { + winzip_aes_free(ctx); + return NULL; + } + + return s2; +} + + +static int +decrypt_header(zip_source_t *src, struct winzip_aes *ctx) { + zip_uint8_t header[WINZIP_AES_MAX_HEADER_LENGTH]; + zip_uint8_t password_verification[WINZIP_AES_PASSWORD_VERIFY_LENGTH]; + unsigned int headerlen; + zip_int64_t n; + + headerlen = WINZIP_AES_PASSWORD_VERIFY_LENGTH + SALT_LENGTH(ctx->encryption_method); + if ((n = zip_source_read(src, header, headerlen)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + if (n != headerlen) { + zip_error_set(&ctx->error, ZIP_ER_EOF, 0); + return -1; + } + + if ((ctx->aes_ctx = _zip_winzip_aes_new((zip_uint8_t *)ctx->password, strlen(ctx->password), header, ctx->encryption_method, password_verification, &ctx->error)) == NULL) { + return -1; + } + if (memcmp(password_verification, header + SALT_LENGTH(ctx->encryption_method), WINZIP_AES_PASSWORD_VERIFY_LENGTH) != 0) { + _zip_winzip_aes_free(ctx->aes_ctx); + ctx->aes_ctx = NULL; + zip_error_set(&ctx->error, ZIP_ER_WRONGPASSWD, 0); + return -1; + } + return 0; +} + + +static bool +verify_hmac(zip_source_t *src, struct winzip_aes *ctx) { + unsigned char computed[SHA1_LENGTH], from_file[HMAC_LENGTH]; + if (zip_source_read(src, from_file, HMAC_LENGTH) < HMAC_LENGTH) { + zip_error_set_from_source(&ctx->error, src); + return false; + } + + if (!_zip_winzip_aes_finish(ctx->aes_ctx, computed)) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + return false; + } + _zip_winzip_aes_free(ctx->aes_ctx); + ctx->aes_ctx = NULL; + + if (memcmp(from_file, computed, HMAC_LENGTH) != 0) { + zip_error_set(&ctx->error, ZIP_ER_CRC, 0); + return false; + } + + return true; +} + + +static zip_int64_t +winzip_aes_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { + struct winzip_aes *ctx; + zip_int64_t n; + + ctx = (struct winzip_aes *)ud; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + if (decrypt_header(src, ctx) < 0) { + return -1; + } + ctx->current_position = 0; + return 0; + + case ZIP_SOURCE_READ: + if (len > ctx->data_length - ctx->current_position) { + len = ctx->data_length - ctx->current_position; + } + + if (len == 0) { + if (!verify_hmac(src, ctx)) { + return -1; + } + return 0; + } + + if ((n = zip_source_read(src, data, len)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + ctx->current_position += (zip_uint64_t)n; + + if (!_zip_winzip_aes_decrypt(ctx->aes_ctx, (zip_uint8_t *)data, (zip_uint64_t)n)) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + return n; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + + st->encryption_method = ZIP_EM_NONE; + st->valid |= ZIP_STAT_ENCRYPTION_METHOD; + if (st->valid & ZIP_STAT_COMP_SIZE) { + st->comp_size -= 12 + SALT_LENGTH(ctx->encryption_method); + } + + return 0; + } + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SUPPORTS_REOPEN, -1); + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + case ZIP_SOURCE_FREE: + winzip_aes_free(ctx); + return 0; + + default: + return zip_source_pass_to_lower_layer(src, data, len, cmd); + } +} + + +static void +winzip_aes_free(struct winzip_aes *ctx) { + if (ctx == NULL) { + return; + } + + _zip_crypto_clear(ctx->password, strlen(ctx->password)); + free(ctx->password); + zip_error_fini(&ctx->error); + _zip_winzip_aes_free(ctx->aes_ctx); + free(ctx); +} + + +static struct winzip_aes * +winzip_aes_new(zip_uint16_t encryption_method, const char *password, zip_error_t *error) { + struct winzip_aes *ctx; + + if ((ctx = (struct winzip_aes *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((ctx->password = strdup(password)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + free(ctx); + return NULL; + } + + ctx->encryption_method = encryption_method; + ctx->aes_ctx = NULL; + + zip_error_init(&ctx->error); + + return ctx; +} diff --git a/deps/libzip/lib/zip_source_winzip_aes_encode.c b/deps/libzip/lib/zip_source_winzip_aes_encode.c new file mode 100644 index 00000000000000..ea86f926470bd9 --- /dev/null +++ b/deps/libzip/lib/zip_source_winzip_aes_encode.c @@ -0,0 +1,253 @@ +/* + zip_source_winzip_aes_encode.c -- Winzip AES encryption routines + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include + +#include "zipint.h" + + +struct winzip_aes { + char *password; + zip_uint16_t encryption_method; + + zip_uint8_t data[ZIP_MAX(WINZIP_AES_MAX_HEADER_LENGTH, SHA1_LENGTH)]; + zip_buffer_t *buffer; + + zip_winzip_aes_t *aes_ctx; + bool eof; + zip_error_t error; +}; + + +static int encrypt_header(zip_source_t *src, struct winzip_aes *ctx); +static void winzip_aes_free(struct winzip_aes *); +static zip_int64_t winzip_aes_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_source_cmd_t cmd); +static struct winzip_aes *winzip_aes_new(zip_uint16_t encryption_method, const char *password, zip_error_t *error); + + +zip_source_t * +zip_source_winzip_aes_encode(zip_t *za, zip_source_t *src, zip_uint16_t encryption_method, int flags, const char *password) { + zip_source_t *s2; + struct winzip_aes *ctx; + + if ((encryption_method != ZIP_EM_AES_128 && encryption_method != ZIP_EM_AES_192 && encryption_method != ZIP_EM_AES_256) || password == NULL || src == NULL) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((ctx = winzip_aes_new(encryption_method, password, &za->error)) == NULL) { + return NULL; + } + + if ((s2 = zip_source_layered(za, src, winzip_aes_encrypt, ctx)) == NULL) { + winzip_aes_free(ctx); + return NULL; + } + + return s2; +} + + +static int +encrypt_header(zip_source_t *src, struct winzip_aes *ctx) { + zip_uint16_t salt_length = SALT_LENGTH(ctx->encryption_method); + if (!zip_secure_random(ctx->data, salt_length)) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((ctx->aes_ctx = _zip_winzip_aes_new((zip_uint8_t *)ctx->password, strlen(ctx->password), ctx->data, ctx->encryption_method, ctx->data + salt_length, &ctx->error)) == NULL) { + return -1; + } + + if ((ctx->buffer = _zip_buffer_new(ctx->data, salt_length + WINZIP_AES_PASSWORD_VERIFY_LENGTH)) == NULL) { + _zip_winzip_aes_free(ctx->aes_ctx); + ctx->aes_ctx = NULL; + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + + return 0; +} + + +static zip_int64_t +winzip_aes_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, zip_source_cmd_t cmd) { + struct winzip_aes *ctx; + zip_int64_t ret; + zip_uint64_t buffer_n; + + ctx = (struct winzip_aes *)ud; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + ctx->eof = false; + if (encrypt_header(src, ctx) < 0) { + return -1; + } + return 0; + + case ZIP_SOURCE_READ: + buffer_n = 0; + + if (ctx->buffer) { + buffer_n = _zip_buffer_read(ctx->buffer, data, length); + + data = (zip_uint8_t *)data + buffer_n; + length -= buffer_n; + + if (_zip_buffer_eof(ctx->buffer)) { + _zip_buffer_free(ctx->buffer); + ctx->buffer = NULL; + } + } + + if (ctx->eof) { + return (zip_int64_t)buffer_n; + } + + if ((ret = zip_source_read(src, data, length)) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + + if (!_zip_winzip_aes_encrypt(ctx->aes_ctx, data, (zip_uint64_t)ret)) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + /* TODO: return partial read? */ + return -1; + } + + if ((zip_uint64_t)ret < length) { + ctx->eof = true; + if (!_zip_winzip_aes_finish(ctx->aes_ctx, ctx->data)) { + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + /* TODO: return partial read? */ + return -1; + } + _zip_winzip_aes_free(ctx->aes_ctx); + ctx->aes_ctx = NULL; + if ((ctx->buffer = _zip_buffer_new(ctx->data, HMAC_LENGTH)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + /* TODO: return partial read? */ + return -1; + } + buffer_n += _zip_buffer_read(ctx->buffer, (zip_uint8_t *)data + ret, length - (zip_uint64_t)ret); + } + + return (zip_int64_t)(buffer_n + (zip_uint64_t)ret); + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + + st = (zip_stat_t *)data; + st->encryption_method = ctx->encryption_method; + st->valid |= ZIP_STAT_ENCRYPTION_METHOD; + if (st->valid & ZIP_STAT_COMP_SIZE) { + st->comp_size += 12 + SALT_LENGTH(ctx->encryption_method); + } + + return 0; + } + + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: { + zip_file_attributes_t *attributes = (zip_file_attributes_t *)data; + if (length < sizeof(*attributes)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + attributes->valid |= ZIP_FILE_ATTRIBUTES_VERSION_NEEDED; + attributes->version_needed = 51; + + return 0; + } + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_GET_FILE_ATTRIBUTES, -1); + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, length); + + case ZIP_SOURCE_FREE: + winzip_aes_free(ctx); + return 0; + + default: + return zip_source_pass_to_lower_layer(src, data, length, cmd); + } +} + + +static void +winzip_aes_free(struct winzip_aes *ctx) { + if (ctx == NULL) { + return; + } + + _zip_crypto_clear(ctx->password, strlen(ctx->password)); + free(ctx->password); + zip_error_fini(&ctx->error); + _zip_buffer_free(ctx->buffer); + _zip_winzip_aes_free(ctx->aes_ctx); + free(ctx); +} + + +static struct winzip_aes * +winzip_aes_new(zip_uint16_t encryption_method, const char *password, zip_error_t *error) { + struct winzip_aes *ctx; + + if ((ctx = (struct winzip_aes *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((ctx->password = strdup(password)) == NULL) { + free(ctx); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + ctx->encryption_method = encryption_method; + ctx->buffer = NULL; + ctx->aes_ctx = NULL; + + zip_error_init(&ctx->error); + + ctx->eof = false; + return ctx; +} diff --git a/deps/libzip/lib/zip_source_write.c b/deps/libzip/lib/zip_source_write.c new file mode 100644 index 00000000000000..24dde9b2479cb5 --- /dev/null +++ b/deps/libzip/lib/zip_source_write.c @@ -0,0 +1,46 @@ +/* + zip_source_write.c -- start a new file for writing + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN zip_int64_t +zip_source_write(zip_source_t *src, const void *data, zip_uint64_t length) { + if (!ZIP_SOURCE_IS_OPEN_WRITING(src) || length > ZIP_INT64_MAX) { + zip_error_set(&src->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_source_call(src, (void *)data, length, ZIP_SOURCE_WRITE); +} diff --git a/deps/libzip/lib/zip_source_zip.c b/deps/libzip/lib/zip_source_zip.c new file mode 100644 index 00000000000000..6111647d3f6782 --- /dev/null +++ b/deps/libzip/lib/zip_source_zip.c @@ -0,0 +1,59 @@ +/* + zip_source_zip.c -- create data source from zip file + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + +ZIP_EXTERN zip_source_t *zip_source_zip_create(zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len, zip_error_t *error) { + if (len < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if (len == -1) + len = 0; + + if (start == 0 && len == 0) + flags |= ZIP_FL_COMPRESSED; + else + flags &= ~ZIP_FL_COMPRESSED; + + return _zip_source_zip_new(srcza, srcidx, flags, start, (zip_uint64_t)len, srcza->default_password, error); +} + + +ZIP_EXTERN zip_source_t *zip_source_zip(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len) { + return zip_source_zip_create(srcza, srcidx, flags, start, len, &za->error); +} diff --git a/deps/libzip/lib/zip_source_zip_new.c b/deps/libzip/lib/zip_source_zip_new.c new file mode 100644 index 00000000000000..855e7af44dbdc5 --- /dev/null +++ b/deps/libzip/lib/zip_source_zip_new.c @@ -0,0 +1,314 @@ +/* + zip_source_zip_new.c -- prepare data structures for zip_fopen/zip_source_zip + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + +static void _zip_file_attributes_from_dirent(zip_file_attributes_t *attributes, zip_dirent_t *de); + +zip_source_t *_zip_source_zip_new(zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_uint64_t len, const char *password, zip_error_t *error) { + /* TODO: We need to make sure that the returned source is invalidated when srcza is closed. */ + zip_source_t *src, *s2; + zip_stat_t st; + zip_file_attributes_t attributes; + zip_dirent_t *de; + bool partial_data, needs_crc, encrypted, needs_decrypt, compressed, needs_decompress, changed_data, have_size, have_comp_size; + zip_flags_t stat_flags; + zip_int64_t data_len; + + if (srcza == NULL || srcidx >= srcza->nentry || len > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + changed_data = false; + if ((flags & ZIP_FL_UNCHANGED) == 0) { + zip_entry_t *entry = srcza->entry + srcidx; + if (ZIP_ENTRY_DATA_CHANGED(entry)) { + if (!zip_source_supports_reopen(entry->source)) { + zip_error_set(error, ZIP_ER_CHANGED, 0); + return NULL; + } + + changed_data = true; + } + else if (entry->deleted) { + zip_error_set(error, ZIP_ER_CHANGED, 0); + return NULL; + } + } + + stat_flags = flags; + if (!changed_data) { + stat_flags |= ZIP_FL_UNCHANGED; + } + + if (zip_stat_index(srcza, srcidx, stat_flags, &st) < 0) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } + + if (flags & ZIP_FL_ENCRYPTED) { + flags |= ZIP_FL_COMPRESSED; + } + + if ((start > 0 || len > 0) && (flags & ZIP_FL_COMPRESSED)) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + have_size = (st.valid & ZIP_STAT_SIZE) != 0; + /* overflow or past end of file */ + if ((start > 0 || len > 0) && ((start + len < start) || (have_size && (start + len > st.size)))) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if (len == 0) { + if (have_size) { + if (st.size - start > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + data_len = (zip_int64_t)(st.size - start); + } + else { + data_len = -1; + } + } + else { + if (len > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + data_len = (zip_int64_t)(len); + } + + if (have_size) { + partial_data = (zip_uint64_t)(data_len) < st.size; + } + else { + partial_data = true; + } + encrypted = (st.valid & ZIP_STAT_ENCRYPTION_METHOD) && (st.encryption_method != ZIP_EM_NONE); + needs_decrypt = ((flags & ZIP_FL_ENCRYPTED) == 0) && encrypted; + compressed = (st.valid & ZIP_STAT_COMP_METHOD) && (st.comp_method != ZIP_CM_STORE); + needs_decompress = ((flags & ZIP_FL_COMPRESSED) == 0) && compressed; + /* when reading the whole file, check for CRC errors */ + needs_crc = ((flags & ZIP_FL_COMPRESSED) == 0 || !compressed) && !partial_data && (st.valid & ZIP_STAT_CRC) != 0; + + if (needs_decrypt) { + if (password == NULL) { + password = srcza->default_password; + } + if (password == NULL) { + zip_error_set(error, ZIP_ER_NOPASSWD, 0); + return NULL; + } + } + + if ((de = _zip_get_dirent(srcza, srcidx, flags, error)) == NULL) { + return NULL; + } + _zip_file_attributes_from_dirent(&attributes, de); + + have_comp_size = (st.valid & ZIP_STAT_COMP_SIZE) != 0; + if (compressed) { + if (have_comp_size && st.comp_size == 0) { + src = zip_source_buffer_with_attributes_create(NULL, 0, 0, &attributes, error); + } + else { + src = NULL; + } + } + else if (have_size && st.size == 0) { + src = zip_source_buffer_with_attributes_create(NULL, 0, 0, &attributes, error); + } + else { + src = NULL; + } + + /* if we created source buffer above, store it in s2, so we can + free it after it's wrapped in window source */ + s2 = src; + /* if we created a buffer source above, then treat it as if + reading the changed data - that way we don't need add another + special case to the code below that wraps it in the window + source */ + changed_data = changed_data || (src != NULL); + + if (partial_data && !needs_decrypt && !needs_decompress) { + struct zip_stat st2; + zip_t *source_archive; + zip_uint64_t source_index; + + if (changed_data) { + if (src == NULL) { + src = srcza->entry[srcidx].source; + } + source_archive = NULL; + source_index = 0; + } + else { + src = srcza->src; + source_archive = srcza; + source_index = srcidx; + } + + st2.comp_method = ZIP_CM_STORE; + st2.valid = ZIP_STAT_COMP_METHOD; + if (data_len >= 0) { + st2.size = (zip_uint64_t)data_len; + st2.comp_size = (zip_uint64_t)data_len; + st2.valid |= ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE; + } + if (st.valid & ZIP_STAT_MTIME) { + st2.mtime = st.mtime; + st2.valid |= ZIP_STAT_MTIME; + } + + if ((src = _zip_source_window_new(src, start, data_len, &st2, &attributes, source_archive, source_index, error)) == NULL) { + return NULL; + } + } + /* here we restrict src to file data, so no point in doing it for + source that already represents only the file data */ + else if (!changed_data) { + /* this branch is executed only for archive sources; we know + that stat data come from the archive too, so it's safe to + assume that st has a comp_size specified */ + if (st.comp_size > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + /* despite the fact that we want the whole data file, we still + wrap the source into a window source to add st and + attributes and to have a source that positions the read + offset properly before each read for multiple zip_file_t + referring to the same underlying source */ + if ((src = _zip_source_window_new(srcza->src, 0, (zip_int64_t)st.comp_size, &st, &attributes, srcza, srcidx, error)) == NULL) { + return NULL; + } + } + else { + /* this branch gets executed when reading the whole changed + data file or when "reading" from a zero-sized source buffer + that we created above */ + if (src == NULL) { + src = srcza->entry[srcidx].source; + } + /* despite the fact that we want the whole data file, we still + wrap the source into a window source to add st and + attributes and to have a source that positions the read + offset properly before each read for multiple zip_file_t + referring to the same underlying source */ + if ((src = _zip_source_window_new(src, 0, data_len, &st, &attributes, NULL, 0, error)) == NULL) { + return NULL; + } + } + /* drop a reference of a buffer source if we created one above - + window source that wraps it has increased the ref count on its + own */ + if (s2 != NULL) { + zip_source_free(s2); + } + + if (_zip_source_set_source_archive(src, srcza) < 0) { + zip_source_free(src); + return NULL; + } + + /* creating a layered source calls zip_keep() on the lower layer, so we free it */ + + if (needs_decrypt) { + zip_encryption_implementation enc_impl; + + if ((enc_impl = _zip_get_encryption_implementation(st.encryption_method, ZIP_CODEC_DECODE)) == NULL) { + zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); + return NULL; + } + + s2 = enc_impl(srcza, src, st.encryption_method, 0, password); + zip_source_free(src); + if (s2 == NULL) { + return NULL; + } + src = s2; + } + if (needs_decompress) { + s2 = zip_source_decompress(srcza, src, st.comp_method); + zip_source_free(src); + if (s2 == NULL) { + return NULL; + } + src = s2; + } + if (needs_crc) { + s2 = zip_source_crc_create(src, 1, error); + zip_source_free(src); + if (s2 == NULL) { + return NULL; + } + src = s2; + } + + if (partial_data && (needs_decrypt || needs_decompress)) { + zip_stat_t st2; + zip_stat_init(&st2); + if (data_len >= 0) { + st2.valid = ZIP_STAT_SIZE; + st2.size = (zip_uint64_t)data_len; + } + s2 = _zip_source_window_new(src, start, data_len, &st2, 0, NULL, 0, error); + zip_source_free(src); + if (s2 == NULL) { + return NULL; + } + src = s2; + } + + return src; +} + +static void +_zip_file_attributes_from_dirent(zip_file_attributes_t *attributes, zip_dirent_t *de) { + zip_file_attributes_init(attributes); + attributes->valid = ZIP_FILE_ATTRIBUTES_ASCII | ZIP_FILE_ATTRIBUTES_HOST_SYSTEM | ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES | ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS; + attributes->ascii = de->int_attrib & 1; + attributes->host_system = de->version_madeby >> 8; + attributes->external_file_attributes = de->ext_attrib; + attributes->general_purpose_bit_flags = de->bitflags; + attributes->general_purpose_bit_mask = ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS_ALLOWED_MASK; +} diff --git a/deps/libzip/lib/zip_stat.c b/deps/libzip/lib/zip_stat.c new file mode 100644 index 00000000000000..51d8026dddc9e7 --- /dev/null +++ b/deps/libzip/lib/zip_stat.c @@ -0,0 +1,46 @@ +/* + zip_stat.c -- get information about file by name + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_stat(zip_t *za, const char *fname, zip_flags_t flags, zip_stat_t *st) { + zip_int64_t idx; + + if ((idx = zip_name_locate(za, fname, flags)) < 0) + return -1; + + return zip_stat_index(za, (zip_uint64_t)idx, flags, st); +} diff --git a/deps/libzip/lib/zip_stat_index.c b/deps/libzip/lib/zip_stat_index.c new file mode 100644 index 00000000000000..fb532ec1f3b855 --- /dev/null +++ b/deps/libzip/lib/zip_stat_index.c @@ -0,0 +1,80 @@ +/* + zip_stat_index.c -- get information about file by index + Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_stat_index(zip_t *za, zip_uint64_t index, zip_flags_t flags, zip_stat_t *st) { + const char *name; + zip_dirent_t *de; + + if ((de = _zip_get_dirent(za, index, flags, NULL)) == NULL) + return -1; + + if ((name = zip_get_name(za, index, flags)) == NULL) + return -1; + + + if ((flags & ZIP_FL_UNCHANGED) == 0 && ZIP_ENTRY_DATA_CHANGED(za->entry + index)) { + zip_entry_t *entry = za->entry + index; + + if (zip_source_stat(entry->source, st) < 0) { + zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return -1; + } + + if (entry->changes != NULL && entry->changes->changed & ZIP_DIRENT_LAST_MOD) { + st->mtime = de->last_mod; + st->valid |= ZIP_STAT_MTIME; + } + } + else { + zip_stat_init(st); + + st->crc = de->crc; + st->size = de->uncomp_size; + st->mtime = de->last_mod; + st->comp_size = de->comp_size; + st->comp_method = (zip_uint16_t)de->comp_method; + st->encryption_method = de->encryption_method; + st->valid = (de->crc_valid ? ZIP_STAT_CRC : 0) | ZIP_STAT_SIZE | ZIP_STAT_MTIME | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_ENCRYPTION_METHOD; + } + + st->index = index; + st->name = name; + st->valid |= ZIP_STAT_INDEX | ZIP_STAT_NAME; + + return 0; +} diff --git a/deps/libzip/lib/zip_stat_init.c b/deps/libzip/lib/zip_stat_init.c new file mode 100644 index 00000000000000..9c6088a79624b5 --- /dev/null +++ b/deps/libzip/lib/zip_stat_init.c @@ -0,0 +1,83 @@ +/* + zip_stat_init.c -- initialize struct zip_stat. + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + + +ZIP_EXTERN void +zip_stat_init(zip_stat_t *st) { + st->valid = 0; + st->name = NULL; + st->index = ZIP_UINT64_MAX; + st->crc = 0; + st->mtime = (time_t)-1; + st->size = 0; + st->comp_size = 0; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; +} + + +int +_zip_stat_merge(zip_stat_t *dst, const zip_stat_t *src, zip_error_t *error) { + /* name is not merged, since zip_stat_t doesn't own it, and src may not be valid as long as dst */ + if (src->valid & ZIP_STAT_INDEX) { + dst->index = src->index; + } + if (src->valid & ZIP_STAT_SIZE) { + dst->size = src->size; + } + if (src->valid & ZIP_STAT_COMP_SIZE) { + dst->comp_size = src->comp_size; + } + if (src->valid & ZIP_STAT_MTIME) { + dst->mtime = src->mtime; + } + if (src->valid & ZIP_STAT_CRC) { + dst->crc = src->crc; + } + if (src->valid & ZIP_STAT_COMP_METHOD) { + dst->comp_method = src->comp_method; + } + if (src->valid & ZIP_STAT_ENCRYPTION_METHOD) { + dst->encryption_method = src->encryption_method; + } + if (src->valid & ZIP_STAT_FLAGS) { + dst->flags = src->flags; + } + dst->valid |= src->valid; + + return 0; +} diff --git a/deps/libzip/lib/zip_strerror.c b/deps/libzip/lib/zip_strerror.c new file mode 100644 index 00000000000000..7d8279318dc0be --- /dev/null +++ b/deps/libzip/lib/zip_strerror.c @@ -0,0 +1,41 @@ +/* + zip_sterror.c -- get string representation of zip error + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN const char * +zip_strerror(zip_t *za) { + return zip_error_strerror(&za->error); +} diff --git a/deps/libzip/lib/zip_string.c b/deps/libzip/lib/zip_string.c new file mode 100644 index 00000000000000..1c964491c9dbfc --- /dev/null +++ b/deps/libzip/lib/zip_string.c @@ -0,0 +1,178 @@ +/* + zip_string.c -- string handling (with encoding) + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include + +#include "zipint.h" + +zip_uint32_t +_zip_string_crc32(const zip_string_t *s) { + zip_uint32_t crc; + + crc = (zip_uint32_t)crc32(0L, Z_NULL, 0); + + if (s != NULL) + crc = (zip_uint32_t)crc32(crc, s->raw, s->length); + + return crc; +} + + +int +_zip_string_equal(const zip_string_t *a, const zip_string_t *b) { + if (a == NULL || b == NULL) + return a == b; + + if (a->length != b->length) + return 0; + + /* TODO: encoding */ + + return (memcmp(a->raw, b->raw, a->length) == 0); +} + + +void +_zip_string_free(zip_string_t *s) { + if (s == NULL) + return; + + free(s->raw); + free(s->converted); + free(s); +} + + +const zip_uint8_t * +_zip_string_get(zip_string_t *string, zip_uint32_t *lenp, zip_flags_t flags, zip_error_t *error) { + static const zip_uint8_t empty[1] = ""; + + if (string == NULL) { + if (lenp) + *lenp = 0; + return empty; + } + + if ((flags & ZIP_FL_ENC_RAW) == 0) { + /* start guessing */ + if (string->encoding == ZIP_ENCODING_UNKNOWN) + _zip_guess_encoding(string, ZIP_ENCODING_UNKNOWN); + + if (((flags & ZIP_FL_ENC_STRICT) && string->encoding != ZIP_ENCODING_ASCII && string->encoding != ZIP_ENCODING_UTF8_KNOWN) || (string->encoding == ZIP_ENCODING_CP437)) { + if (string->converted == NULL) { + if ((string->converted = _zip_cp437_to_utf8(string->raw, string->length, &string->converted_length, error)) == NULL) + return NULL; + } + if (lenp) + *lenp = string->converted_length; + return string->converted; + } + } + + if (lenp) + *lenp = string->length; + return string->raw; +} + + +zip_uint16_t +_zip_string_length(const zip_string_t *s) { + if (s == NULL) + return 0; + + return s->length; +} + + +zip_string_t * +_zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, zip_error_t *error) { + zip_string_t *s; + zip_encoding_type_t expected_encoding; + + if (length == 0) + return NULL; + + switch (flags & ZIP_FL_ENCODING_ALL) { + case ZIP_FL_ENC_GUESS: + expected_encoding = ZIP_ENCODING_UNKNOWN; + break; + case ZIP_FL_ENC_UTF_8: + expected_encoding = ZIP_ENCODING_UTF8_KNOWN; + break; + case ZIP_FL_ENC_CP437: + expected_encoding = ZIP_ENCODING_CP437; + break; + default: + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((s = (zip_string_t *)malloc(sizeof(*s))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((s->raw = (zip_uint8_t *)malloc((size_t)length + 1)) == NULL) { + free(s); + return NULL; + } + + (void)memcpy_s(s->raw, length + 1, raw, length); + s->raw[length] = '\0'; + s->length = length; + s->encoding = ZIP_ENCODING_UNKNOWN; + s->converted = NULL; + s->converted_length = 0; + + if (expected_encoding != ZIP_ENCODING_UNKNOWN) { + if (_zip_guess_encoding(s, expected_encoding) == ZIP_ENCODING_ERROR) { + _zip_string_free(s); + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + } + + return s; +} + + +int +_zip_string_write(zip_t *za, const zip_string_t *s) { + if (s == NULL) + return 0; + + return _zip_write(za, s->raw, s->length); +} diff --git a/deps/libzip/lib/zip_unchange.c b/deps/libzip/lib/zip_unchange.c new file mode 100644 index 00000000000000..d69a3dfe174255 --- /dev/null +++ b/deps/libzip/lib/zip_unchange.c @@ -0,0 +1,98 @@ +/* + zip_unchange.c -- undo changes to file in zip archive + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_unchange(zip_t *za, zip_uint64_t idx) { + return _zip_unchange(za, idx, 0); +} + + +int +_zip_unchange(zip_t *za, zip_uint64_t idx, int allow_duplicates) { + zip_int64_t i; + bool renamed; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + renamed = za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME); + if (!allow_duplicates && (renamed || za->entry[idx].deleted)) { + const char *orig_name = NULL; + const char *changed_name = NULL; + + if (za->entry[idx].orig != NULL) { + if ((orig_name = _zip_get_name(za, idx, ZIP_FL_UNCHANGED, &za->error)) == NULL) { + return -1; + } + + i = _zip_name_locate(za, orig_name, 0, NULL); + if (i >= 0 && (zip_uint64_t)i != idx) { + zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; + } + } + + if (renamed) { + if ((changed_name = _zip_get_name(za, idx, 0, &za->error)) == NULL) { + return -1; + } + } + + if (orig_name) { + if (_zip_hash_add(za->names, (const zip_uint8_t *)orig_name, idx, 0, &za->error) == false) { + return -1; + } + } + if (changed_name) { + if (_zip_hash_delete(za->names, (const zip_uint8_t *)changed_name, &za->error) == false) { + _zip_hash_delete(za->names, (const zip_uint8_t *)orig_name, NULL); + return -1; + } + } + } + + _zip_dirent_free(za->entry[idx].changes); + za->entry[idx].changes = NULL; + + _zip_unchange_data(za->entry + idx); + + return 0; +} diff --git a/deps/libzip/lib/zip_unchange_all.c b/deps/libzip/lib/zip_unchange_all.c new file mode 100644 index 00000000000000..34f3702e07eac7 --- /dev/null +++ b/deps/libzip/lib/zip_unchange_all.c @@ -0,0 +1,54 @@ +/* + zip_unchange.c -- undo changes to all files in zip archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + + +ZIP_EXTERN int +zip_unchange_all(zip_t *za) { + int ret; + zip_uint64_t i; + + if (!_zip_hash_revert(za->names, &za->error)) { + return -1; + } + + ret = 0; + for (i = 0; i < za->nentry; i++) + ret |= _zip_unchange(za, i, 1); + + ret |= zip_unchange_archive(za); + + return ret; +} diff --git a/deps/libzip/lib/zip_unchange_archive.c b/deps/libzip/lib/zip_unchange_archive.c new file mode 100644 index 00000000000000..56a8e31f60be93 --- /dev/null +++ b/deps/libzip/lib/zip_unchange_archive.c @@ -0,0 +1,51 @@ +/* + zip_unchange_archive.c -- undo global changes to ZIP archive + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include + +#include "zipint.h" + + +ZIP_EXTERN int +zip_unchange_archive(zip_t *za) { + if (za->comment_changed) { + _zip_string_free(za->comment_changes); + za->comment_changes = NULL; + za->comment_changed = 0; + } + + za->ch_flags = za->flags; + + return 0; +} diff --git a/deps/libzip/lib/zip_unchange_data.c b/deps/libzip/lib/zip_unchange_data.c new file mode 100644 index 00000000000000..6bdecd1872de13 --- /dev/null +++ b/deps/libzip/lib/zip_unchange_data.c @@ -0,0 +1,53 @@ +/* + zip_unchange_data.c -- undo helper function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +void +_zip_unchange_data(zip_entry_t *ze) { + if (ze->source) { + zip_source_free(ze->source); + ze->source = NULL; + } + + if (ze->changes != NULL && (ze->changes->changed & ZIP_DIRENT_COMP_METHOD) && ze->changes->comp_method == ZIP_CM_REPLACED_DEFAULT) { + ze->changes->changed &= ~ZIP_DIRENT_COMP_METHOD; + if (ze->changes->changed == 0) { + _zip_dirent_free(ze->changes); + ze->changes = NULL; + } + } + + ze->deleted = 0; +} diff --git a/deps/libzip/lib/zip_utf-8.c b/deps/libzip/lib/zip_utf-8.c new file mode 100644 index 00000000000000..678912f6b4beee --- /dev/null +++ b/deps/libzip/lib/zip_utf-8.c @@ -0,0 +1,226 @@ +/* + zip_utf-8.c -- UTF-8 support functions for libzip + Copyright (C) 2011-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "zipint.h" + +#include + + +static const zip_uint16_t _cp437_to_unicode[256] = { + /* 0x00 - 0x0F */ + 0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + + /* 0x10 - 0x1F */ + 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, + + /* 0x20 - 0x2F */ + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + + /* 0x30 - 0x3F */ + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + + /* 0x40 - 0x4F */ + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + + /* 0x50 - 0x5F */ + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + + /* 0x60 - 0x6F */ + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + + /* 0x70 - 0x7F */ + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302, + + /* 0x80 - 0x8F */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + + /* 0x90 - 0x9F */ + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + + /* 0xA0 - 0xAF */ + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + + /* 0xB0 - 0xBF */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + + /* 0xC0 - 0xCF */ + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + + /* 0xD0 - 0xDF */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + + /* 0xE0 - 0xEF */ + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + + /* 0xF0 - 0xFF */ + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0}; + +#define UTF_8_LEN_2_MASK 0xe0 +#define UTF_8_LEN_2_MATCH 0xc0 +#define UTF_8_LEN_3_MASK 0xf0 +#define UTF_8_LEN_3_MATCH 0xe0 +#define UTF_8_LEN_4_MASK 0xf8 +#define UTF_8_LEN_4_MATCH 0xf0 +#define UTF_8_CONTINUE_MASK 0xc0 +#define UTF_8_CONTINUE_MATCH 0x80 + + +zip_encoding_type_t +_zip_guess_encoding(zip_string_t *str, zip_encoding_type_t expected_encoding) { + zip_encoding_type_t enc; + const zip_uint8_t *name; + zip_uint32_t i, j, ulen; + + if (str == NULL) + return ZIP_ENCODING_ASCII; + + name = str->raw; + + if (str->encoding != ZIP_ENCODING_UNKNOWN) + enc = str->encoding; + else { + enc = ZIP_ENCODING_ASCII; + for (i = 0; i < str->length; i++) { + if ((name[i] > 31 && name[i] < 128) || name[i] == '\r' || name[i] == '\n' || name[i] == '\t') + continue; + + enc = ZIP_ENCODING_UTF8_GUESSED; + if ((name[i] & UTF_8_LEN_2_MASK) == UTF_8_LEN_2_MATCH) + ulen = 1; + else if ((name[i] & UTF_8_LEN_3_MASK) == UTF_8_LEN_3_MATCH) + ulen = 2; + else if ((name[i] & UTF_8_LEN_4_MASK) == UTF_8_LEN_4_MATCH) + ulen = 3; + else { + enc = ZIP_ENCODING_CP437; + break; + } + + if (i + ulen >= str->length) { + enc = ZIP_ENCODING_CP437; + break; + } + + for (j = 1; j <= ulen; j++) { + if ((name[i + j] & UTF_8_CONTINUE_MASK) != UTF_8_CONTINUE_MATCH) { + enc = ZIP_ENCODING_CP437; + goto done; + } + } + i += ulen; + } + } + +done: + str->encoding = enc; + + if (expected_encoding != ZIP_ENCODING_UNKNOWN) { + if (expected_encoding == ZIP_ENCODING_UTF8_KNOWN && enc == ZIP_ENCODING_UTF8_GUESSED) + str->encoding = enc = ZIP_ENCODING_UTF8_KNOWN; + + if (expected_encoding != enc && enc != ZIP_ENCODING_ASCII) + return ZIP_ENCODING_ERROR; + } + + return enc; +} + + +static zip_uint32_t +_zip_unicode_to_utf8_len(zip_uint32_t codepoint) { + if (codepoint < 0x0080) + return 1; + if (codepoint < 0x0800) + return 2; + if (codepoint < 0x10000) + return 3; + return 4; +} + + +static zip_uint32_t +_zip_unicode_to_utf8(zip_uint32_t codepoint, zip_uint8_t *buf) { + if (codepoint < 0x0080) { + buf[0] = codepoint & 0xff; + return 1; + } + if (codepoint < 0x0800) { + buf[0] = (zip_uint8_t)(UTF_8_LEN_2_MATCH | ((codepoint >> 6) & 0x1f)); + buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f)); + return 2; + } + if (codepoint < 0x10000) { + buf[0] = (zip_uint8_t)(UTF_8_LEN_3_MATCH | ((codepoint >> 12) & 0x0f)); + buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f)); + buf[2] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f)); + return 3; + } + buf[0] = (zip_uint8_t)(UTF_8_LEN_4_MATCH | ((codepoint >> 18) & 0x07)); + buf[1] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 12) & 0x3f)); + buf[2] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f)); + buf[3] = (zip_uint8_t)(UTF_8_CONTINUE_MATCH | (codepoint & 0x3f)); + return 4; +} + + +zip_uint8_t * +_zip_cp437_to_utf8(const zip_uint8_t *const _cp437buf, zip_uint32_t len, zip_uint32_t *utf8_lenp, zip_error_t *error) { + zip_uint8_t *cp437buf = (zip_uint8_t *)_cp437buf; + zip_uint8_t *utf8buf; + zip_uint32_t buflen, i, offset; + + if (len == 0) { + if (utf8_lenp) + *utf8_lenp = 0; + return NULL; + } + + buflen = 1; + for (i = 0; i < len; i++) + buflen += _zip_unicode_to_utf8_len(_cp437_to_unicode[cp437buf[i]]); + + if ((utf8buf = (zip_uint8_t *)malloc(buflen)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + offset = 0; + for (i = 0; i < len; i++) + offset += _zip_unicode_to_utf8(_cp437_to_unicode[cp437buf[i]], utf8buf + offset); + + utf8buf[buflen - 1] = 0; + if (utf8_lenp) + *utf8_lenp = buflen - 1; + return utf8buf; +} diff --git a/deps/libzip/lib/zip_winzip_aes.c b/deps/libzip/lib/zip_winzip_aes.c new file mode 100644 index 00000000000000..ce269036cf2975 --- /dev/null +++ b/deps/libzip/lib/zip_winzip_aes.c @@ -0,0 +1,162 @@ +/* + zip_winzip_aes.c -- Winzip AES de/encryption backend routines + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include "zip_crypto.h" + +#include +#include + + +#define MAX_KEY_LENGTH 256 +#define PBKDF2_ITERATIONS 1000 + +struct _zip_winzip_aes { + _zip_crypto_aes_t *aes; + _zip_crypto_hmac_t *hmac; + zip_uint8_t counter[ZIP_CRYPTO_AES_BLOCK_LENGTH]; + zip_uint8_t pad[ZIP_CRYPTO_AES_BLOCK_LENGTH]; + int pad_offset; +}; + +static bool +aes_crypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length) { + zip_uint64_t i, j; + + for (i = 0; i < length; i++) { + if (ctx->pad_offset == AES_BLOCK_SIZE) { + for (j = 0; j < 8; j++) { + ctx->counter[j]++; + if (ctx->counter[j] != 0) { + break; + } + } + if (!_zip_crypto_aes_encrypt_block(ctx->aes, ctx->counter, ctx->pad)) { + return false; + } + ctx->pad_offset = 0; + } + data[i] ^= ctx->pad[ctx->pad_offset++]; + } + + return true; +} + + +zip_winzip_aes_t * +_zip_winzip_aes_new(const zip_uint8_t *password, zip_uint64_t password_length, const zip_uint8_t *salt, zip_uint16_t encryption_method, zip_uint8_t *password_verify, zip_error_t *error) { + zip_winzip_aes_t *ctx; + zip_uint8_t buffer[2 * (MAX_KEY_LENGTH / 8) + WINZIP_AES_PASSWORD_VERIFY_LENGTH]; + zip_uint16_t key_size = 0; /* in bits */ + zip_uint16_t key_length; /* in bytes */ + + switch (encryption_method) { + case ZIP_EM_AES_128: + key_size = 128; + break; + case ZIP_EM_AES_192: + key_size = 192; + break; + case ZIP_EM_AES_256: + key_size = 256; + break; + } + + if (key_size == 0 || salt == NULL || password == NULL || password_length == 0) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + key_length = key_size / 8; + + if ((ctx = (zip_winzip_aes_t *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + memset(ctx->counter, 0, sizeof(ctx->counter)); + ctx->pad_offset = ZIP_CRYPTO_AES_BLOCK_LENGTH; + + if (!_zip_crypto_pbkdf2(password, password_length, salt, key_length / 2, PBKDF2_ITERATIONS, buffer, 2 * key_length + WINZIP_AES_PASSWORD_VERIFY_LENGTH)) { + free(ctx); + return NULL; + } + + if ((ctx->aes = _zip_crypto_aes_new(buffer, key_size, error)) == NULL) { + _zip_crypto_clear(ctx, sizeof(*ctx)); + free(ctx); + return NULL; + } + if ((ctx->hmac = _zip_crypto_hmac_new(buffer + key_length, key_length, error)) == NULL) { + _zip_crypto_aes_free(ctx->aes); + free(ctx); + return NULL; + } + + if (password_verify) { + (void)memcpy_s(password_verify, WINZIP_AES_PASSWORD_VERIFY_LENGTH, buffer + (2 * key_size / 8), WINZIP_AES_PASSWORD_VERIFY_LENGTH); + } + + return ctx; +} + + +bool +_zip_winzip_aes_encrypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length) { + return aes_crypt(ctx, data, length) && _zip_crypto_hmac(ctx->hmac, data, length); +} + + +bool +_zip_winzip_aes_decrypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length) { + return _zip_crypto_hmac(ctx->hmac, data, length) && aes_crypt(ctx, data, length); +} + + +bool +_zip_winzip_aes_finish(zip_winzip_aes_t *ctx, zip_uint8_t *hmac) { + return _zip_crypto_hmac_output(ctx->hmac, hmac); +} + + +void +_zip_winzip_aes_free(zip_winzip_aes_t *ctx) { + if (ctx == NULL) { + return; + } + + _zip_crypto_aes_free(ctx->aes); + _zip_crypto_hmac_free(ctx->hmac); + free(ctx); +} diff --git a/deps/libzip/lib/zipconf.h b/deps/libzip/lib/zipconf.h new file mode 100644 index 00000000000000..84a1717db05f85 --- /dev/null +++ b/deps/libzip/lib/zipconf.h @@ -0,0 +1,45 @@ +#ifndef _HAD_ZIPCONF_H +#define _HAD_ZIPCONF_H + +#if __clang__ +#else +#define _Nullable +#define _Nonnull +#endif + +#define LIBZIP_VERSION "1.9.2" +#define LIBZIP_VERSION_MAJOR 1 +#define LIBZIP_VERSION_MINOR 9 +#define LIBZIP_VERSION_MICRO 2 + +#if !defined(__STDC_FORMAT_MACROS) +#define __STDC_FORMAT_MACROS 1 +#endif +#include + +typedef int8_t zip_int8_t; +typedef uint8_t zip_uint8_t; +typedef int16_t zip_int16_t; +typedef uint16_t zip_uint16_t; +typedef int32_t zip_int32_t; +typedef uint32_t zip_uint32_t; +typedef int64_t zip_int64_t; +typedef uint64_t zip_uint64_t; + +#define ZIP_INT8_MIN (-ZIP_INT8_MAX-1) +#define ZIP_INT8_MAX 0x7f +#define ZIP_UINT8_MAX 0xff + +#define ZIP_INT16_MIN (-ZIP_INT16_MAX-1) +#define ZIP_INT16_MAX 0x7fff +#define ZIP_UINT16_MAX 0xffff + +#define ZIP_INT32_MIN (-ZIP_INT32_MAX-1L) +#define ZIP_INT32_MAX 0x7fffffffL +#define ZIP_UINT32_MAX 0xffffffffLU + +#define ZIP_INT64_MIN (-ZIP_INT64_MAX-1LL) +#define ZIP_INT64_MAX 0x7fffffffffffffffLL +#define ZIP_UINT64_MAX 0xffffffffffffffffULL + +#endif /* zipconf.h */ diff --git a/deps/libzip/lib/zipint.h b/deps/libzip/lib/zipint.h new file mode 100644 index 00000000000000..fce0862d122516 --- /dev/null +++ b/deps/libzip/lib/zipint.h @@ -0,0 +1,644 @@ +#ifndef _HAD_ZIPINT_H +#define _HAD_ZIPINT_H + +/* + zipint.h -- internal declarations. + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "config.h" + +#include "compat.h" + +#ifdef ZIP_ALLOCATE_BUFFER +#include +#endif + +#ifndef _ZIP_COMPILING_DEPRECATED +#define ZIP_DISABLE_DEPRECATED +#endif + +#include "zip.h" + +#define CENTRAL_MAGIC "PK\1\2" +#define LOCAL_MAGIC "PK\3\4" +#define EOCD_MAGIC "PK\5\6" +#define DATADES_MAGIC "PK\7\10" +#define EOCD64LOC_MAGIC "PK\6\7" +#define EOCD64_MAGIC "PK\6\6" +#define CDENTRYSIZE 46u +#define LENTRYSIZE 30 +#define MAXCOMLEN 65536 +#define MAXEXTLEN 65536 +#define EOCDLEN 22 +#define EOCD64LOCLEN 20 +#define EOCD64LEN 56 +#define CDBUFSIZE (MAXCOMLEN + EOCDLEN + EOCD64LOCLEN) +#define BUFSIZE 8192 +#define EFZIP64SIZE 28 +#define EF_WINZIP_AES_SIZE 7 +#define MAX_DATA_DESCRIPTOR_LENGTH 24 + +#define ZIP_CRYPTO_PKWARE_HEADERLEN 12 + +#define ZIP_CM_REPLACED_DEFAULT (-2) +#define ZIP_CM_WINZIP_AES 99 /* Winzip AES encrypted */ + +#define WINZIP_AES_PASSWORD_VERIFY_LENGTH 2 +#define WINZIP_AES_MAX_HEADER_LENGTH (16 + WINZIP_AES_PASSWORD_VERIFY_LENGTH) +#define AES_BLOCK_SIZE 16 +#define HMAC_LENGTH 10 +#define SHA1_LENGTH 20 +#define SALT_LENGTH(method) ((method) == ZIP_EM_AES_128 ? 8 : ((method) == ZIP_EM_AES_192 ? 12 : 16)) + +#define ZIP_CM_IS_DEFAULT(x) ((x) == ZIP_CM_DEFAULT || (x) == ZIP_CM_REPLACED_DEFAULT) +#define ZIP_CM_ACTUAL(x) ((zip_uint16_t)(ZIP_CM_IS_DEFAULT(x) ? ZIP_CM_DEFLATE : (x))) + +#define ZIP_EF_UTF_8_COMMENT 0x6375 +#define ZIP_EF_UTF_8_NAME 0x7075 +#define ZIP_EF_WINZIP_AES 0x9901 +#define ZIP_EF_ZIP64 0x0001 + +#define ZIP_EF_IS_INTERNAL(id) ((id) == ZIP_EF_UTF_8_COMMENT || (id) == ZIP_EF_UTF_8_NAME || (id) == ZIP_EF_WINZIP_AES || (id) == ZIP_EF_ZIP64) + +/* according to unzip-6.0's zipinfo.c, this corresponds to a regular file with rw permissions for everyone */ +#define ZIP_EXT_ATTRIB_DEFAULT (0100666u << 16) +/* according to unzip-6.0's zipinfo.c, this corresponds to a directory with rwx permissions for everyone */ +#define ZIP_EXT_ATTRIB_DEFAULT_DIR (0040777u << 16) + +#define ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS_ALLOWED_MASK 0x0836 + +#define ZIP_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define ZIP_MIN(a, b) ((a) < (b) ? (a) : (b)) + +/* This section contains API that won't materialize like this. It's + placed in the internal section, pending cleanup. */ + +/* flags for compression and encryption sources */ + +#define ZIP_CODEC_DECODE 0 /* decompress/decrypt (encode flag not set) */ +#define ZIP_CODEC_ENCODE 1 /* compress/encrypt */ + +typedef zip_source_t *(*zip_encryption_implementation)(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); + +zip_encryption_implementation _zip_get_encryption_implementation(zip_uint16_t method, int operation); + +/* clang-format off */ +enum zip_compression_status { + ZIP_COMPRESSION_OK, + ZIP_COMPRESSION_END, + ZIP_COMPRESSION_ERROR, + ZIP_COMPRESSION_NEED_DATA +}; +/* clang-format on */ +typedef enum zip_compression_status zip_compression_status_t; + +struct zip_compression_algorithm { + /* Return maximum compressed size for uncompressed data of given size. */ + zip_uint64_t (*maximum_compressed_size)(zip_uint64_t uncompressed_size); + + /* called once to create new context */ + void *(*allocate)(zip_uint16_t method, int compression_flags, zip_error_t *error); + /* called once to free context */ + void (*deallocate)(void *ctx); + + /* get compression specific general purpose bitflags */ + zip_uint16_t (*general_purpose_bit_flags)(void *ctx); + /* minimum version needed when using this algorithm */ + zip_uint8_t version_needed; + + /* start processing */ + bool (*start)(void *ctx, zip_stat_t *st, zip_file_attributes_t *attributes); + /* stop processing */ + bool (*end)(void *ctx); + + /* provide new input data, remains valid until next call to input or end */ + bool (*input)(void *ctx, zip_uint8_t *data, zip_uint64_t length); + + /* all input data has been provided */ + void (*end_of_input)(void *ctx); + + /* process input data, writing to data, which has room for length bytes, update length to number of bytes written */ + zip_compression_status_t (*process)(void *ctx, zip_uint8_t *data, zip_uint64_t *length); +}; +typedef struct zip_compression_algorithm zip_compression_algorithm_t; + +extern zip_compression_algorithm_t zip_algorithm_bzip2_compress; +extern zip_compression_algorithm_t zip_algorithm_bzip2_decompress; +extern zip_compression_algorithm_t zip_algorithm_deflate_compress; +extern zip_compression_algorithm_t zip_algorithm_deflate_decompress; +extern zip_compression_algorithm_t zip_algorithm_xz_compress; +extern zip_compression_algorithm_t zip_algorithm_xz_decompress; +extern zip_compression_algorithm_t zip_algorithm_zstd_compress; +extern zip_compression_algorithm_t zip_algorithm_zstd_decompress; + +zip_compression_algorithm_t *_zip_get_compression_algorithm(zip_int32_t method, bool compress); + +/* This API is not final yet, but we need it internally, so it's private for now. */ + +const zip_uint8_t *zip_get_extra_field_by_id(zip_t *, int, int, zip_uint16_t, int, zip_uint16_t *); + +/* This section contains API that is of limited use until support for + user-supplied compression/encryption implementation is finished. + Thus we will keep it private for now. */ + +zip_source_t *zip_source_compress(zip_t *za, zip_source_t *src, zip_int32_t cm, int compression_flags); +zip_source_t *zip_source_crc_create(zip_source_t *, int, zip_error_t *error); +zip_source_t *zip_source_decompress(zip_t *za, zip_source_t *src, zip_int32_t cm); +zip_source_t *zip_source_pkware_decode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); +zip_source_t *zip_source_pkware_encode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); +int zip_source_remove(zip_source_t *); +zip_int64_t zip_source_supports(zip_source_t *src); +bool zip_source_supports_reopen(zip_source_t *src); +zip_source_t *zip_source_winzip_aes_decode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); +zip_source_t *zip_source_winzip_aes_encode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); +zip_source_t *zip_source_buffer_with_attributes(zip_t *za, const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes); +zip_source_t *zip_source_buffer_with_attributes_create(const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes, zip_error_t *error); + +/* error source for layered sources */ + +enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; + +#define ZIP_DETAIL_ET_GLOBAL 0 +#define ZIP_DETAIL_ET_ENTRY 1 + +struct _zip_err_info { + int type; + const char *description; +}; + +extern const struct _zip_err_info _zip_err_str[]; +extern const int _zip_err_str_count; +extern const struct _zip_err_info _zip_err_details[]; +extern const int _zip_err_details_count; + +/* macros for libzip-internal errors */ +#define MAX_DETAIL_INDEX 0x7fffff +#define MAKE_DETAIL_WITH_INDEX(error, index) ((((index) > MAX_DETAIL_INDEX) ? MAX_DETAIL_INDEX : (int)(index)) << 8 | (error)) +#define GET_INDEX_FROM_DETAIL(error) (((error) >> 8) & MAX_DETAIL_INDEX) +#define GET_ERROR_FROM_DETAIL(error) ((error) & 0xff) +#define ADD_INDEX_TO_DETAIL(error, index) MAKE_DETAIL_WITH_INDEX(GET_ERROR_FROM_DETAIL(error), (index)) + +/* error code for libzip-internal errors */ +#define ZIP_ER_DETAIL_NO_DETAIL 0 /* G no detail */ +#define ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD 1 /* G central directory overlaps EOCD, or there is space between them */ +#define ZIP_ER_DETAIL_COMMENT_LENGTH_INVALID 2 /* G archive comment length incorrect */ +#define ZIP_ER_DETAIL_CDIR_LENGTH_INVALID 3 /* G central directory length invalid */ +#define ZIP_ER_DETAIL_CDIR_ENTRY_INVALID 4 /* E central header invalid */ +#define ZIP_ER_DETAIL_CDIR_WRONG_ENTRIES_COUNT 5 /* G central directory count of entries is incorrect */ +#define ZIP_ER_DETAIL_ENTRY_HEADER_MISMATCH 6 /* E local and central headers do not match */ +#define ZIP_ER_DETAIL_EOCD_LENGTH_INVALID 7 /* G wrong EOCD length */ +#define ZIP_ER_DETAIL_EOCD64_OVERLAPS_EOCD 8 /* G EOCD64 overlaps EOCD, or there is space between them */ +#define ZIP_ER_DETAIL_EOCD64_WRONG_MAGIC 9 /* G EOCD64 magic incorrect */ +#define ZIP_ER_DETAIL_EOCD64_MISMATCH 10 /* G EOCD64 and EOCD do not match */ +#define ZIP_ER_DETAIL_CDIR_INVALID 11 /* G invalid value in central directory */ +#define ZIP_ER_DETAIL_VARIABLE_SIZE_OVERFLOW 12 /* E variable size fields overflow header */ +#define ZIP_ER_DETAIL_INVALID_UTF8_IN_FILENAME 13 /* E invalid UTF-8 in filename */ +#define ZIP_ER_DETAIL_INVALID_UTF8_IN_COMMENT 13 /* E invalid UTF-8 in comment */ +#define ZIP_ER_DETAIL_INVALID_ZIP64_EF 14 /* E invalid Zip64 extra field */ +#define ZIP_ER_DETAIL_INVALID_WINZIPAES_EF 14 /* E invalid WinZip AES extra field */ +#define ZIP_ER_DETAIL_EF_TRAILING_GARBAGE 15 /* E garbage at end of extra fields */ +#define ZIP_ER_DETAIL_INVALID_EF_LENGTH 16 /* E extra field length is invalid */ +#define ZIP_ER_DETAIL_INVALID_FILE_LENGTH 17 /* E file length in header doesn't match actual file length */ + +/* directory entry: general purpose bit flags */ + +#define ZIP_GPBF_ENCRYPTED 0x0001u /* is encrypted */ +#define ZIP_GPBF_DATA_DESCRIPTOR 0x0008u /* crc/size after file data */ +#define ZIP_GPBF_STRONG_ENCRYPTION 0x0040u /* uses strong encryption */ +#define ZIP_GPBF_ENCODING_UTF_8 0x0800u /* file name encoding is UTF-8 */ + + +/* extra fields */ +#define ZIP_EF_LOCAL ZIP_FL_LOCAL /* include in local header */ +#define ZIP_EF_CENTRAL ZIP_FL_CENTRAL /* include in central directory */ +#define ZIP_EF_BOTH (ZIP_EF_LOCAL | ZIP_EF_CENTRAL) /* include in both */ + +#define ZIP_FL_FORCE_ZIP64 1024 /* force zip64 extra field (_zip_dirent_write) */ + +#define ZIP_FL_ENCODING_ALL (ZIP_FL_ENC_GUESS | ZIP_FL_ENC_CP437 | ZIP_FL_ENC_UTF_8) + + +/* encoding type */ +enum zip_encoding_type { + ZIP_ENCODING_UNKNOWN, /* not yet analyzed */ + ZIP_ENCODING_ASCII, /* plain ASCII */ + ZIP_ENCODING_UTF8_KNOWN, /* is UTF-8 */ + ZIP_ENCODING_UTF8_GUESSED, /* possibly UTF-8 */ + ZIP_ENCODING_CP437, /* Code Page 437 */ + ZIP_ENCODING_ERROR /* should be UTF-8 but isn't */ +}; + +typedef enum zip_encoding_type zip_encoding_type_t; + +struct zip_hash; +struct zip_progress; + +typedef struct zip_cdir zip_cdir_t; +typedef struct zip_dirent zip_dirent_t; +typedef struct zip_entry zip_entry_t; +typedef struct zip_extra_field zip_extra_field_t; +typedef struct zip_string zip_string_t; +typedef struct zip_buffer zip_buffer_t; +typedef struct zip_hash zip_hash_t; +typedef struct zip_progress zip_progress_t; + +/* zip archive, part of API */ + +struct zip { + zip_source_t *src; /* data source for archive */ + unsigned int open_flags; /* flags passed to zip_open */ + zip_error_t error; /* error information */ + + unsigned int flags; /* archive global flags */ + unsigned int ch_flags; /* changed archive global flags */ + + char *default_password; /* password used when no other supplied */ + + zip_string_t *comment_orig; /* archive comment */ + zip_string_t *comment_changes; /* changed archive comment */ + bool comment_changed; /* whether archive comment was changed */ + + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ + zip_entry_t *entry; /* entries */ + + unsigned int nopen_source; /* number of open sources using archive */ + unsigned int nopen_source_alloc; /* number of sources allocated */ + zip_source_t **open_source; /* open sources using archive */ + + zip_hash_t *names; /* hash table for name lookup */ + + zip_progress_t *progress; /* progress callback for zip_close() */ +}; + +/* file in zip archive, part of API */ + +struct zip_file { + zip_t *za; /* zip archive containing this file */ + zip_error_t error; /* error information */ + zip_source_t *src; /* data source */ +}; + +/* zip archive directory entry (central or local) */ + +#define ZIP_DIRENT_COMP_METHOD 0x0001u +#define ZIP_DIRENT_FILENAME 0x0002u +#define ZIP_DIRENT_COMMENT 0x0004u +#define ZIP_DIRENT_EXTRA_FIELD 0x0008u +#define ZIP_DIRENT_ATTRIBUTES 0x0010u +#define ZIP_DIRENT_LAST_MOD 0x0020u +#define ZIP_DIRENT_ENCRYPTION_METHOD 0x0040u +#define ZIP_DIRENT_PASSWORD 0x0080u +#define ZIP_DIRENT_ALL ZIP_UINT32_MAX + +struct zip_dirent { + zip_uint32_t changed; + bool local_extra_fields_read; /* whether we already read in local header extra fields */ + bool cloned; /* whether this instance is cloned, and thus shares non-changed strings */ + + bool crc_valid; /* if CRC is valid (sometimes not for encrypted archives) */ + + zip_uint16_t version_madeby; /* (c) version of creator */ + zip_uint16_t version_needed; /* (cl) version needed to extract */ + zip_uint16_t bitflags; /* (cl) general purpose bit flag */ + zip_int32_t comp_method; /* (cl) compression method used (uint16 and ZIP_CM_DEFAULT (-1)) */ + time_t last_mod; /* (cl) time of last modification */ + zip_uint32_t crc; /* (cl) CRC-32 of uncompressed data */ + zip_uint64_t comp_size; /* (cl) size of compressed data */ + zip_uint64_t uncomp_size; /* (cl) size of uncompressed data */ + zip_string_t *filename; /* (cl) file name (NUL-terminated) */ + zip_extra_field_t *extra_fields; /* (cl) extra fields, parsed */ + zip_string_t *comment; /* (c) file comment */ + zip_uint32_t disk_number; /* (c) disk number start */ + zip_uint16_t int_attrib; /* (c) internal file attributes */ + zip_uint32_t ext_attrib; /* (c) external file attributes */ + zip_uint64_t offset; /* (c) offset of local header */ + + zip_uint16_t compression_level; /* level of compression to use (never valid in orig) */ + zip_uint16_t encryption_method; /* encryption method, computed from other fields */ + char *password; /* file specific encryption password */ +}; + +/* zip archive central directory */ + +struct zip_cdir { + zip_entry_t *entry; /* directory entries */ + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ + + zip_uint64_t size; /* size of central directory */ + zip_uint64_t offset; /* offset of central directory in file */ + zip_string_t *comment; /* zip archive comment */ + bool is_zip64; /* central directory in zip64 format */ +}; + +struct zip_extra_field { + zip_extra_field_t *next; + zip_flags_t flags; /* in local/central header */ + zip_uint16_t id; /* header id */ + zip_uint16_t size; /* data size */ + zip_uint8_t *data; +}; + +enum zip_source_write_state { + ZIP_SOURCE_WRITE_CLOSED, /* write is not in progress */ + ZIP_SOURCE_WRITE_OPEN, /* write is in progress */ + ZIP_SOURCE_WRITE_FAILED, /* commit failed, only rollback allowed */ + ZIP_SOURCE_WRITE_REMOVED /* file was removed */ +}; +typedef enum zip_source_write_state zip_source_write_state_t; + +struct zip_source { + zip_source_t *src; + union { + zip_source_callback f; + zip_source_layered_callback l; + } cb; + void *ud; + zip_error_t error; + zip_int64_t supports; /* supported commands */ + unsigned int open_count; /* number of times source was opened (directly or as lower layer) */ + zip_source_write_state_t write_state; /* whether source is open for writing */ + bool source_closed; /* set if source archive is closed */ + zip_t *source_archive; /* zip archive we're reading from, NULL if not from archive */ + unsigned int refcount; + bool eof; /* EOF reached */ + bool had_read_error; /* a previous ZIP_SOURCE_READ reported an error */ + zip_uint64_t bytes_read; /* for sources that don't support ZIP_SOURCE_TELL. */ +}; + +#define ZIP_SOURCE_IS_OPEN_READING(src) ((src)->open_count > 0) +#define ZIP_SOURCE_IS_OPEN_WRITING(src) ((src)->write_state == ZIP_SOURCE_WRITE_OPEN) +#define ZIP_SOURCE_IS_LAYERED(src) ((src)->src != NULL) + +/* entry in zip archive directory */ + +struct zip_entry { + zip_dirent_t *orig; + zip_dirent_t *changes; + zip_source_t *source; + bool deleted; +}; + + +/* file or archive comment, or filename */ + +struct zip_string { + zip_uint8_t *raw; /* raw string */ + zip_uint16_t length; /* length of raw string */ + enum zip_encoding_type encoding; /* autorecognized encoding */ + zip_uint8_t *converted; /* autoconverted string */ + zip_uint32_t converted_length; /* length of converted */ +}; + + +/* byte array */ + +/* For performance, we usually keep 8k byte arrays on the stack. + However, there are (embedded) systems with a stack size of 12k; + for those, use malloc()/free() */ + +#ifdef ZIP_ALLOCATE_BUFFER +#define DEFINE_BYTE_ARRAY(buf, size) zip_uint8_t *buf +#define byte_array_init(buf, size) (((buf) = (zip_uint8_t *)malloc(size)) != NULL) +#define byte_array_fini(buf) (free(buf)) +#else +#define DEFINE_BYTE_ARRAY(buf, size) zip_uint8_t buf[size] +#define byte_array_init(buf, size) (1) +#define byte_array_fini(buf) ((void)0) +#endif + + +/* bounds checked access to memory buffer */ + +struct zip_buffer { + bool ok; + bool free_data; + + zip_uint8_t *data; + zip_uint64_t size; + zip_uint64_t offset; +}; + +/* which files to write in which order */ + +struct zip_filelist { + zip_uint64_t idx; + /* TODO const char *name; */ +}; + +typedef struct zip_filelist zip_filelist_t; + +struct _zip_winzip_aes; +typedef struct _zip_winzip_aes zip_winzip_aes_t; + +struct _zip_pkware_keys { + zip_uint32_t key[3]; +}; +typedef struct _zip_pkware_keys zip_pkware_keys_t; + +#define ZIP_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define ZIP_MIN(a, b) ((a) < (b) ? (a) : (b)) + +#define ZIP_ENTRY_CHANGED(e, f) ((e)->changes && ((e)->changes->changed & (f))) +#define ZIP_ENTRY_DATA_CHANGED(x) ((x)->source != NULL) +#define ZIP_ENTRY_HAS_CHANGES(e) (ZIP_ENTRY_DATA_CHANGED(e) || (e)->deleted || ZIP_ENTRY_CHANGED((e), ZIP_DIRENT_ALL)) + +#define ZIP_IS_RDONLY(za) ((za)->ch_flags & ZIP_AFL_RDONLY) + + +#ifdef HAVE_EXPLICIT_MEMSET +#define _zip_crypto_clear(b, l) explicit_memset((b), 0, (l)) +#else +#ifdef HAVE_EXPLICIT_BZERO +#define _zip_crypto_clear(b, l) explicit_bzero((b), (l)) +#else +#include +#define _zip_crypto_clear(b, l) memset((b), 0, (l)) +#endif +#endif + + +zip_int64_t _zip_add_entry(zip_t *); + +zip_uint8_t *_zip_buffer_data(zip_buffer_t *buffer); +bool _zip_buffer_eof(zip_buffer_t *buffer); +void _zip_buffer_free(zip_buffer_t *buffer); +zip_uint8_t *_zip_buffer_get(zip_buffer_t *buffer, zip_uint64_t length); +zip_uint16_t _zip_buffer_get_16(zip_buffer_t *buffer); +zip_uint32_t _zip_buffer_get_32(zip_buffer_t *buffer); +zip_uint64_t _zip_buffer_get_64(zip_buffer_t *buffer); +zip_uint8_t _zip_buffer_get_8(zip_buffer_t *buffer); +zip_uint64_t _zip_buffer_left(zip_buffer_t *buffer); +zip_buffer_t *_zip_buffer_new(zip_uint8_t *data, zip_uint64_t size); +zip_buffer_t *_zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error); +zip_uint64_t _zip_buffer_offset(zip_buffer_t *buffer); +bool _zip_buffer_ok(zip_buffer_t *buffer); +zip_uint8_t *_zip_buffer_peek(zip_buffer_t *buffer, zip_uint64_t length); +int _zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length); +int _zip_buffer_put_16(zip_buffer_t *buffer, zip_uint16_t i); +int _zip_buffer_put_32(zip_buffer_t *buffer, zip_uint32_t i); +int _zip_buffer_put_64(zip_buffer_t *buffer, zip_uint64_t i); +int _zip_buffer_put_8(zip_buffer_t *buffer, zip_uint8_t i); +zip_uint64_t _zip_buffer_read(zip_buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length); +int _zip_buffer_skip(zip_buffer_t *buffer, zip_uint64_t length); +int _zip_buffer_set_offset(zip_buffer_t *buffer, zip_uint64_t offset); +zip_uint64_t _zip_buffer_size(zip_buffer_t *buffer); + +void _zip_cdir_free(zip_cdir_t *); +bool _zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *error); +zip_cdir_t *_zip_cdir_new(zip_uint64_t, zip_error_t *); +zip_int64_t _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors); +time_t _zip_d2u_time(zip_uint16_t, zip_uint16_t); +void _zip_deregister_source(zip_t *za, zip_source_t *src); + +void _zip_dirent_apply_attributes(zip_dirent_t *, zip_file_attributes_t *, bool, zip_uint32_t); +zip_dirent_t *_zip_dirent_clone(const zip_dirent_t *); +void _zip_dirent_free(zip_dirent_t *); +void _zip_dirent_finalize(zip_dirent_t *); +void _zip_dirent_init(zip_dirent_t *); +bool _zip_dirent_needs_zip64(const zip_dirent_t *, zip_flags_t); +zip_dirent_t *_zip_dirent_new(void); +bool zip_dirent_process_ef_zip64(zip_dirent_t * zde, const zip_uint8_t * ef, zip_uint64_t got_len, bool local, zip_error_t * error); +zip_int64_t _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error); +void _zip_dirent_set_version_needed(zip_dirent_t *de, bool force_zip64); +zip_int32_t _zip_dirent_size(zip_source_t *src, zip_uint16_t, zip_error_t *); +int _zip_dirent_write(zip_t *za, zip_dirent_t *dirent, zip_flags_t flags); + +zip_extra_field_t *_zip_ef_clone(const zip_extra_field_t *, zip_error_t *); +zip_extra_field_t *_zip_ef_delete_by_id(zip_extra_field_t *, zip_uint16_t, zip_uint16_t, zip_flags_t); +void _zip_ef_free(zip_extra_field_t *); +const zip_uint8_t *_zip_ef_get_by_id(const zip_extra_field_t *, zip_uint16_t *, zip_uint16_t, zip_uint16_t, zip_flags_t, zip_error_t *); +zip_extra_field_t *_zip_ef_merge(zip_extra_field_t *, zip_extra_field_t *); +zip_extra_field_t *_zip_ef_new(zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_flags_t); +bool _zip_ef_parse(const zip_uint8_t *, zip_uint16_t, zip_flags_t, zip_extra_field_t **, zip_error_t *); +zip_extra_field_t *_zip_ef_remove_internal(zip_extra_field_t *); +zip_uint16_t _zip_ef_size(const zip_extra_field_t *, zip_flags_t); +int _zip_ef_write(zip_t *za, const zip_extra_field_t *ef, zip_flags_t flags); + +void _zip_entry_finalize(zip_entry_t *); +void _zip_entry_init(zip_entry_t *); + +void _zip_error_clear(zip_error_t *); +void _zip_error_get(const zip_error_t *, int *, int *); + +void _zip_error_copy(zip_error_t *dst, const zip_error_t *src); + +const zip_uint8_t *_zip_extract_extra_field_by_id(zip_error_t *, zip_uint16_t, int, const zip_uint8_t *, zip_uint16_t, zip_uint16_t *); + +int _zip_file_extra_field_prepare_for_change(zip_t *, zip_uint64_t); +int _zip_file_fillbuf(void *, size_t, zip_file_t *); +zip_uint64_t _zip_file_get_end(const zip_t *za, zip_uint64_t index, zip_error_t *error); +zip_uint64_t _zip_file_get_offset(const zip_t *, zip_uint64_t, zip_error_t *); + +zip_dirent_t *_zip_get_dirent(zip_t *, zip_uint64_t, zip_flags_t, zip_error_t *); + +enum zip_encoding_type _zip_guess_encoding(zip_string_t *, enum zip_encoding_type); +zip_uint8_t *_zip_cp437_to_utf8(const zip_uint8_t *const, zip_uint32_t, zip_uint32_t *, zip_error_t *); + +bool _zip_hash_add(zip_hash_t *hash, const zip_uint8_t *name, zip_uint64_t index, zip_flags_t flags, zip_error_t *error); +bool _zip_hash_delete(zip_hash_t *hash, const zip_uint8_t *key, zip_error_t *error); +void _zip_hash_free(zip_hash_t *hash); +zip_int64_t _zip_hash_lookup(zip_hash_t *hash, const zip_uint8_t *name, zip_flags_t flags, zip_error_t *error); +zip_hash_t *_zip_hash_new(zip_error_t *error); +bool _zip_hash_reserve_capacity(zip_hash_t *hash, zip_uint64_t capacity, zip_error_t *error); +bool _zip_hash_revert(zip_hash_t *hash, zip_error_t *error); + +int _zip_mkstempm(char *path, int mode, bool create_file); + +zip_t *_zip_open(zip_source_t *, unsigned int, zip_error_t *); + +void _zip_progress_end(zip_progress_t *progress); +void _zip_progress_free(zip_progress_t *progress); +int _zip_progress_start(zip_progress_t *progress); +int _zip_progress_subrange(zip_progress_t *progress, double start, double end); +int _zip_progress_update(zip_progress_t *progress, double value); + +/* this symbol is extern so it can be overridden for regression testing */ +ZIP_EXTERN bool zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length); +zip_uint32_t zip_random_uint32(void); + +int _zip_read(zip_source_t *src, zip_uint8_t *data, zip_uint64_t length, zip_error_t *error); +int _zip_read_at_offset(zip_source_t *src, zip_uint64_t offset, unsigned char *b, size_t length, zip_error_t *error); +zip_uint8_t *_zip_read_data(zip_buffer_t *buffer, zip_source_t *src, size_t length, bool nulp, zip_error_t *error); +int _zip_read_local_ef(zip_t *, zip_uint64_t); +zip_string_t *_zip_read_string(zip_buffer_t *buffer, zip_source_t *src, zip_uint16_t length, bool nulp, zip_error_t *error); +int _zip_register_source(zip_t *za, zip_source_t *src); + +void _zip_set_open_error(int *zep, const zip_error_t *err, int ze); + +bool zip_source_accept_empty(zip_source_t *src); +zip_int64_t _zip_source_call(zip_source_t *src, void *data, zip_uint64_t length, zip_source_cmd_t command); +bool _zip_source_eof(zip_source_t *); +zip_source_t *_zip_source_file_or_p(const char *, FILE *, zip_uint64_t, zip_int64_t, const zip_stat_t *, zip_error_t *error); +bool _zip_source_had_error(zip_source_t *); +void _zip_source_invalidate(zip_source_t *src); +zip_source_t *_zip_source_new(zip_error_t *error); +int _zip_source_set_source_archive(zip_source_t *, zip_t *); +zip_source_t *_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_int64_t length, zip_stat_t *st, zip_file_attributes_t *attributes, zip_t *source_archive, zip_uint64_t source_index, zip_error_t *error); +zip_source_t *_zip_source_zip_new(zip_t *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_uint64_t, const char *, zip_error_t *error); + +int _zip_stat_merge(zip_stat_t *dst, const zip_stat_t *src, zip_error_t *error); +int _zip_string_equal(const zip_string_t *a, const zip_string_t *b); +void _zip_string_free(zip_string_t *string); +zip_uint32_t _zip_string_crc32(const zip_string_t *string); +const zip_uint8_t *_zip_string_get(zip_string_t *string, zip_uint32_t *lenp, zip_flags_t flags, zip_error_t *error); +zip_uint16_t _zip_string_length(const zip_string_t *string); +zip_string_t *_zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, zip_error_t *error); +int _zip_string_write(zip_t *za, const zip_string_t *string); +bool _zip_winzip_aes_decrypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length); +bool _zip_winzip_aes_encrypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length); +bool _zip_winzip_aes_finish(zip_winzip_aes_t *ctx, zip_uint8_t *hmac); +void _zip_winzip_aes_free(zip_winzip_aes_t *ctx); +zip_winzip_aes_t *_zip_winzip_aes_new(const zip_uint8_t *password, zip_uint64_t password_length, const zip_uint8_t *salt, zip_uint16_t key_size, zip_uint8_t *password_verify, zip_error_t *error); + +void _zip_pkware_encrypt(zip_pkware_keys_t *keys, zip_uint8_t *out, const zip_uint8_t *in, zip_uint64_t len); +void _zip_pkware_decrypt(zip_pkware_keys_t *keys, zip_uint8_t *out, const zip_uint8_t *in, zip_uint64_t len); +zip_pkware_keys_t *_zip_pkware_keys_new(zip_error_t *error); +void _zip_pkware_keys_free(zip_pkware_keys_t *keys); +void _zip_pkware_keys_reset(zip_pkware_keys_t *keys); + +int _zip_changed(const zip_t *, zip_uint64_t *); +const char *_zip_get_name(zip_t *, zip_uint64_t, zip_flags_t, zip_error_t *); +int _zip_local_header_read(zip_t *, int); +void *_zip_memdup(const void *, size_t, zip_error_t *); +zip_int64_t _zip_name_locate(zip_t *, const char *, zip_flags_t, zip_error_t *); +zip_t *_zip_new(zip_error_t *); + +zip_int64_t _zip_file_replace(zip_t *, zip_uint64_t, const char *, zip_source_t *, zip_flags_t); +int _zip_set_name(zip_t *, zip_uint64_t, const char *, zip_flags_t); +void _zip_u2d_time(time_t, zip_uint16_t *, zip_uint16_t *); +int _zip_unchange(zip_t *, zip_uint64_t, int); +void _zip_unchange_data(zip_entry_t *); +int _zip_write(zip_t *za, const void *data, zip_uint64_t length); + +#endif /* zipint.h */ diff --git a/deps/libzip/libzip-config.cmake.in b/deps/libzip/libzip-config.cmake.in new file mode 100644 index 00000000000000..5b9aa5580652ca --- /dev/null +++ b/deps/libzip/libzip-config.cmake.in @@ -0,0 +1,11 @@ +@PACKAGE_INIT@ + +# only needed for static library, and doesn't work as-is +#include(CMakeFindDependencyMacro) +#find_dependency(ZLIB::ZLIB) +# how to handle the optional dependencies? +# Provide all our library targets to users. +include("${CMAKE_CURRENT_LIST_DIR}/libzip-targets.cmake") + +check_required_components(libzip) + diff --git a/deps/libzip/libzip.gyp b/deps/libzip/libzip.gyp new file mode 100644 index 00000000000000..8ccf3c1b768f23 --- /dev/null +++ b/deps/libzip/libzip.gyp @@ -0,0 +1,124 @@ +{ + 'targets': [ + { + 'target_name': 'libzip', + 'type': 'static_library', + 'dependencies': ['../zlib/zlib.gyp:zlib'], + 'include_dirs': ['lib'], + 'direct_dependent_settings': { + 'include_dirs': ['lib'] + }, + 'defines': [ + ], + 'sources': [ + 'lib/zip_add.c', + 'lib/zip_add_dir.c', + 'lib/zip_add_entry.c', + 'lib/zip_algorithm_deflate.c', + 'lib/zip_buffer.c', + 'lib/zip_close.c', + 'lib/zip_delete.c', + 'lib/zip_dir_add.c', + 'lib/zip_dirent.c', + 'lib/zip_discard.c', + 'lib/zip_entry.c', + 'lib/zip_err_str.c', + 'lib/zip_error.c', + 'lib/zip_error_clear.c', + 'lib/zip_error_get.c', + 'lib/zip_error_get_sys_type.c', + 'lib/zip_error_strerror.c', + 'lib/zip_error_to_str.c', + 'lib/zip_extra_field.c', + 'lib/zip_extra_field_api.c', + 'lib/zip_fclose.c', + 'lib/zip_fdopen.c', + 'lib/zip_file_add.c', + 'lib/zip_file_error_clear.c', + 'lib/zip_file_error_get.c', + 'lib/zip_file_get_comment.c', + 'lib/zip_file_get_external_attributes.c', + 'lib/zip_file_get_offset.c', + 'lib/zip_file_rename.c', + 'lib/zip_file_replace.c', + 'lib/zip_file_set_comment.c', + 'lib/zip_file_set_encryption.c', + 'lib/zip_file_set_external_attributes.c', + 'lib/zip_file_set_mtime.c', + 'lib/zip_file_strerror.c', + 'lib/zip_fopen.c', + 'lib/zip_fopen_encrypted.c', + 'lib/zip_fopen_index.c', + 'lib/zip_fopen_index_encrypted.c', + 'lib/zip_fread.c', + 'lib/zip_fseek.c', + 'lib/zip_ftell.c', + 'lib/zip_get_archive_comment.c', + 'lib/zip_get_archive_flag.c', + 'lib/zip_get_file_comment.c', + 'lib/zip_get_name.c', + 'lib/zip_get_num_entries.c', + 'lib/zip_get_num_files.c', + 'lib/zip_hash.c', + 'lib/zip_io_util.c', + 'lib/zip_libzip_version.c', + 'lib/zip_memdup.c', + 'lib/zip_name_locate.c', + 'lib/zip_new.c', + 'lib/zip_node_ext.c', + 'lib/zip_open.c', + 'lib/zip_pkware.c', + 'lib/zip_progress.c', + 'lib/zip_rename.c', + 'lib/zip_replace.c', + 'lib/zip_set_archive_comment.c', + 'lib/zip_set_archive_flag.c', + 'lib/zip_set_default_password.c', + 'lib/zip_set_file_comment.c', + 'lib/zip_set_file_compression.c', + 'lib/zip_set_name.c', + 'lib/zip_source_accept_empty.c', + 'lib/zip_source_begin_write.c', + 'lib/zip_source_begin_write_cloning.c', + 'lib/zip_source_buffer.c', + 'lib/zip_source_call.c', + 'lib/zip_source_close.c', + 'lib/zip_source_commit_write.c', + 'lib/zip_source_compress.c', + 'lib/zip_source_crc.c', + 'lib/zip_source_error.c', + 'lib/zip_source_file_common.c', + 'lib/zip_source_free.c', + 'lib/zip_source_function.c', + 'lib/zip_source_get_file_attributes.c', + 'lib/zip_source_is_deleted.c', + 'lib/zip_source_layered.c', + 'lib/zip_source_open.c', + 'lib/zip_source_pass_to_lower_layer.c', + 'lib/zip_source_read.c', + 'lib/zip_source_remove.c', + 'lib/zip_source_rollback_write.c', + 'lib/zip_source_seek.c', + 'lib/zip_source_seek_write.c', + 'lib/zip_source_stat.c', + 'lib/zip_source_supports.c', + 'lib/zip_source_tell.c', + 'lib/zip_source_tell_write.c', + 'lib/zip_source_window.c', + 'lib/zip_source_write.c', + 'lib/zip_source_zip.c', + 'lib/zip_source_zip_new.c', + 'lib/zip_stat.c', + 'lib/zip_stat_index.c', + 'lib/zip_stat_init.c', + 'lib/zip_strerror.c', + 'lib/zip_string.c', + 'lib/zip_unchange.c', + 'lib/zip_unchange_all.c', + 'lib/zip_unchange_archive.c', + 'lib/zip_unchange_data.c', + 'lib/zip_utf-8.c' + ] + } + ] +} diff --git a/deps/libzip/libzip.pc.in b/deps/libzip/libzip.pc.in new file mode 100644 index 00000000000000..d51b0ab631b251 --- /dev/null +++ b/deps/libzip/libzip.pc.in @@ -0,0 +1,14 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +bindir=@bindir@ +libdir=@libdir@ +includedir=@includedir@ + +zipcmp=${bindir}/zipcmp + +Name: libzip +Description: library for handling zip archives +Version: @PROJECT_VERSION@ +Libs: @PKG_CONFIG_RPATH@ -L${libdir} -lzip +Libs.private: @LIBS@ +Cflags: -I${includedir} diff --git a/deps/libzip/man/CMakeLists.txt b/deps/libzip/man/CMakeLists.txt new file mode 100644 index 00000000000000..bc1a9b3b2a85e7 --- /dev/null +++ b/deps/libzip/man/CMakeLists.txt @@ -0,0 +1,166 @@ +set(MAN_PAGES + ZIP_SOURCE_GET_ARGS.3 + libzip.3 + zip_add.3 + zip_add_dir.3 + zip_close.3 + zip_compression_method_supported.3 + zip_delete.3 + zip_dir_add.3 + zip_discard.3 + zip_encryption_method_supported.3 + zip_error_clear.3 + zip_error_code_system.3 + zip_error_code_zip.3 + zip_error_fini.3 + zip_error_get.3 + zip_error_get_sys_type.3 + zip_error_init.3 + zip_error_set.3 + zip_error_strerror.3 + zip_error_system_type.3 + zip_error_to_data.3 + zip_error_to_str.3 + zip_errors.3 + zip_fclose.3 + zip_fdopen.3 + zip_file_add.3 + zip_file_attributes_init.3 + zip_file_extra_field_delete.3 + zip_file_extra_field_get.3 + zip_file_extra_field_set.3 + zip_file_extra_fields_count.3 + zip_file_get_comment.3 + zip_file_get_error.3 + zip_file_get_external_attributes.3 + zip_file_rename.3 + zip_file_set_comment.3 + zip_file_set_encryption.3 + zip_file_set_external_attributes.3 + zip_file_set_mtime.3 + zip_file_strerror.3 + zip_fopen.3 + zip_fopen_encrypted.3 + zip_fread.3 + zip_fseek.3 + zip_ftell.3 + zip_get_archive_comment.3 + zip_get_archive_flag.3 + zip_get_error.3 + zip_get_file_comment.3 + zip_get_name.3 + zip_get_num_entries.3 + zip_get_num_files.3 + zip_libzip_version.3 + zip_name_locate.3 + zip_open.3 + zip_register_cancel_callback_with_state.3 + zip_register_progress_callback.3 + zip_register_progress_callback_with_state.3 + zip_rename.3 + zip_set_archive_comment.3 + zip_set_archive_flag.3 + zip_set_default_password.3 + zip_set_file_comment.3 + zip_set_file_compression.3 + zip_source.3 + zip_source_begin_write.3 + zip_source_buffer.3 + zip_source_buffer_fragment.3 + zip_source_close.3 + zip_source_commit_write.3 + zip_source_error.3 + zip_source_file.3 + zip_source_filep.3 + zip_source_free.3 + zip_source_function.3 + zip_source_is_deleted.3 + zip_source_layered.3 + zip_source_keep.3 + zip_source_make_command_bitmap.3 + zip_source_open.3 + zip_source_read.3 + zip_source_rollback_write.3 + zip_source_seek.3 + zip_source_seek_compute_offset.3 + zip_source_seek_write.3 + zip_source_stat.3 + zip_source_tell.3 + zip_source_tell_write.3 + zip_source_win32a.3 + zip_source_win32handle.3 + zip_source_win32w.3 + zip_source_window.3 + zip_source_write.3 + zip_source_zip.3 + zip_stat.3 + zip_stat_init.3 + zip_unchange.3 + zip_unchange_all.3 + zip_unchange_archive.3 + zipcmp.1 + zipmerge.1 + ziptool.1 +) + +foreach(MAN_PAGE ${MAN_PAGES}) + string(REGEX REPLACE "[1-9]$" "${DOCUMENTATION_FORMAT}" SOURCE_FILE ${MAN_PAGE}) + if(LIBZIP_DO_INSTALL) + if (DOCUMENTATION_FORMAT MATCHES "html") + install(FILES ${PROJECT_BINARY_DIR}/man/${MAN_PAGE} DESTINATION ${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME} RENAME ${SOURCE_FILE}) + else() + string(REGEX REPLACE ".*(.)$" "man\\1" SUBDIR ${MAN_PAGE}) + install(FILES ${PROJECT_BINARY_DIR}/man/${MAN_PAGE} DESTINATION ${CMAKE_INSTALL_MANDIR}/${SUBDIR}) + endif() + endif() + # configure_file does not find out about updates to the sources, and it does not provide a target + #configure_file(${SOURCE_FILE} ${MAN_PAGE} COPYONLY) + add_custom_command(OUTPUT ${MAN_PAGE} + DEPENDS ${SOURCE_FILE} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${MAN_PAGE} + COMMENT "Preparing ${MAN_PAGE}" + ) + + string(REGEX REPLACE "[1-9]$" "html" HTML_FILE ${MAN_PAGE}) + string(REGEX REPLACE "[1-9]$" "man" MAN_FILE ${MAN_PAGE}) + string(REGEX REPLACE "[1-9]$" "mdoc" MDOC_FILE ${MAN_PAGE}) + + # html re-generation + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE} + DEPENDS ${MDOC_FILE} + COMMAND ${CMAKE_COMMAND} -DIN=${CMAKE_CURRENT_SOURCE_DIR}/${MDOC_FILE} -DOUT=${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE} -P ${CMAKE_CURRENT_SOURCE_DIR}/update-html.cmake + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${HTML_FILE} + ) + list(APPEND UPDATEHTML ${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE}) + + # man re-generation + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE} + DEPENDS ${MDOC_FILE} + COMMAND ${CMAKE_COMMAND} -DIN=${CMAKE_CURRENT_SOURCE_DIR}/${MDOC_FILE} -DOUT=${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE} -P ${CMAKE_CURRENT_SOURCE_DIR}/update-man.cmake + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_FILE} + ) + list(APPEND UPDATEMAN ${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE}) +endforeach() +add_custom_target(man ALL DEPENDS ${MAN_PAGES}) +add_custom_target(update-man DEPENDS ${UPDATEMAN}) +add_custom_target(update-html DEPENDS ${UPDATEHTML}) + +file(STRINGS links MANPAGE_LINKS) +foreach(LINKS_LINE ${MANPAGE_LINKS}) + if(${LINKS_LINE} MATCHES "(.*) (.*)") + set(SOURCE ${CMAKE_MATCH_1}) + set(TARGET ${CMAKE_MATCH_2}) + if(LIBZIP_DO_INSTALL) + if (DOCUMENTATION_FORMAT MATCHES "html") + INSTALL(FILES ${PROJECT_BINARY_DIR}/man/${SOURCE}.3 DESTINATION ${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME} RENAME ${TARGET}.html) + else() + INSTALL(FILES ${PROJECT_BINARY_DIR}/man/${SOURCE}.3 DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 RENAME ${TARGET}.3) + endif() + endif() + endif() +endforeach() + +add_custom_target(update_zip_errors + COMMAND sh ${PROJECT_SOURCE_DIR}/man/make_zip_errors.sh ${CMAKE_SOURCE_DIR}/lib/zip.h ${PROJECT_SOURCE_DIR}/man/zip_errors.mdoc + DEPENDS ${CMAKE_SOURCE_DIR}/lib/zip.h ${PROJECT_SOURCE_DIR}/man/zip_errors.mdoc +) diff --git a/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html b/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html new file mode 100644 index 00000000000000..cae3b3f48cc8d6 --- /dev/null +++ b/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html @@ -0,0 +1,114 @@ + + + + + + + ZIP_SOURCE_GET_ARGS(3) + + + + + + + + +
ZIP_SOURCE_GET_ARGS(3)Library Functions ManualZIP_SOURCE_GET_ARGS(3)
+
+
+

+ZIP_SOURCE_GET_ARGS — +
validate and cast arguments to source callback
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

type * +
+ ZIP_SOURCE_GET_ARGS(type, + void *data, + zip_uint64_t len, + zip_error_t *error);

+
+
+

+The ZIP_SOURCE_GET_ARGS() macro casts + data to a pointer to type. +
+
+

+On success, ZIP_SOURCE_GET_ARGS() returns + data. In case of error, it returns + NULL and sets error. +
+
+

+ZIP_SOURCE_GET_ARGS() fails if: +
+
[]
+
len is less than the size of + type
+
+
+
+

+libzip(3), + zip_source_function(3) +
+
+

+ZIP_SOURCE_GET_ARGS() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man b/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man new file mode 100644 index 00000000000000..cd49d5fde4ee7a --- /dev/null +++ b/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man @@ -0,0 +1,83 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" ZIP_SOURCE_GET_ARGS -- validate and cast arguments to source callback +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_GET_ARGS" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBZIP_SOURCE_GET_ARGS\fR +\- validate and cast arguments to source callback +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fItype *\fR +.br +.PD 0 +.HP 4n +\fBZIP_SOURCE_GET_ARGS\fR(\fItype\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The +\fBZIP_SOURCE_GET_ARGS\fR() +macro casts +\fIdata\fR +to a pointer to +\fItype\fR. +.SH "RETURN VALUES" +On success, +\fBZIP_SOURCE_GET_ARGS\fR() +returns +\fIdata\fR. +In case of error, it returns +\fRNULL\fR +and sets +\fIerror\fR. +.SH "ERRORS" +\fBZIP_SOURCE_GET_ARGS\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIlen\fR +is less than the size of +\fItype\fR +.SH "SEE ALSO" +libzip(3), +zip_source_function(3) +.SH "HISTORY" +\fBZIP_SOURCE_GET_ARGS\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc b/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc new file mode 100644 index 00000000000000..3f8fb40ead1bea --- /dev/null +++ b/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc @@ -0,0 +1,79 @@ +.\" ZIP_SOURCE_GET_ARGS -- validate and cast arguments to source callback +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_GET_ARGS 3 +.Os +.Sh NAME +.Nm ZIP_SOURCE_GET_ARGS +.Nd validate and cast arguments to source callback +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft type * +.Fn ZIP_SOURCE_GET_ARGS "type" "void *data" "zip_uint64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The +.Fn ZIP_SOURCE_GET_ARGS +macro casts +.Ar data +to a pointer to +.Ar type . +.Sh RETURN VALUES +On success, +.Fn ZIP_SOURCE_GET_ARGS +returns +.Ar data . +In case of error, it returns +.Dv NULL +and sets +.Ar error . +.Sh ERRORS +.Fn ZIP_SOURCE_GET_ARGS +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar len +is less than the size of +.Ar type +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source_function 3 +.Sh HISTORY +.Fn ZIP_SOURCE_GET_ARGS +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/fix-man-links.sh b/deps/libzip/man/fix-man-links.sh new file mode 100755 index 00000000000000..53b7b076620c0e --- /dev/null +++ b/deps/libzip/man/fix-man-links.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# +LINKBASE='http://pubs.opengroup.org/onlinepubs/9699919799/functions/' + +sed -E -e 's,(),\1'"$LINKBASE"'\2\3,g' -e "s,$LINKBASE"'(libzip|zip),\1,g' diff --git a/deps/libzip/man/handle_links b/deps/libzip/man/handle_links new file mode 100755 index 00000000000000..7c2ed37d35f861 --- /dev/null +++ b/deps/libzip/man/handle_links @@ -0,0 +1,74 @@ +#!/usr/bin/env perl + +use strict; + +my $operation = shift @ARGV; + +if ($operation !~ m/^(install|uninstall)$/) { + print STDERR "$0: unknown operation $operation\n"; + exit(1); +} + +my %options = (); + +for my $arg (@ARGV) { + if ($arg =~ m/([^=]*)=(.*)/) { + $options{$1} = $2; + } + else { + print STDERR "$0: can't parse option [$arg]\n"; + exit(1); + } +} + +for my $option (qw(command directory extension file)) { + unless (defined($options{$option})) { + print STDERR "$0: required variable $option not provided\n"; + exit(1); + } +} + +my $fh; +unless (open $fh, '<', $options{file}) { + print STDERR "$0: can't open links file '$options{file}': $!"; + exit(1); +} + +my @cmd = split /\s+/, $options{command}; + +while (my $line = <$fh>) { + chomp $line; + my @args = split /\s+/, $line; + + process(@args); +} + +sub process { + my ($source, @destinations) = @_; + + my @args = (@cmd); + + if ($operation eq 'install') { + push @args, "$options{directory}/$source.$options{extension}"; + } + + for my $destination (@destinations) { + push @args, "$options{directory}/$destination.$options{extension}"; + run_command(@args); + pop @args; + } +} + +sub run_command { + print (join ' ', @_); + print "\n"; + + my $ret = system(@_); + + if ($ret != 0) { + print STDERR "$0: command failed: $?\n"; + exit(1); + } + + return 1; +} diff --git a/deps/libzip/man/libzip.html b/deps/libzip/man/libzip.html new file mode 100644 index 00000000000000..693b04fd38275e --- /dev/null +++ b/deps/libzip/man/libzip.html @@ -0,0 +1,294 @@ + + + + + + + LIBZIP(3) + + + + + + + + +
LIBZIP(3)Library Functions ManualLIBZIP(3)
+
+
+

+libzip — +
library for manipulating zip archives
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +
+
+

+libzip is a library for reading, creating, and modifying + zip archives. +

The main design criteria for libzip + were:

+
    +
  • Do not create corrupt files, even in case of errors.
  • +
  • Do not delete data.
  • +
  • Be efficient.
  • +
+

For this reason, when modifying zip archives, + libzip writes to a temporary file and replaces the + original zip archive atomically.

+

Below there are two sections listing functions: one for how to + read from zip archives and one for how to create/modify them.

+
+
+

+
+

+Names of files in the host file system are expected in UTF-8 encoding. On + Windows, variants for ASCII and UTF-16 are also available. +

Names of files inside archives are by default expected in UTF-8 + encoding. Other encodings can be requested by using the flags + ZIP_FL_ENC_CP437 and + ZIP_FL_ENC_RAW.

+

For details see the relevant man pages.

+
+
+

+The zip format requires the use of forward slash (‘/’) as + directory separator. Since backslash (‘\’) can be part of a + valid file name on Unix systems, libzip does not + automatically convert them, even on Windows. It is the responsibility of the + programmer to ensure that all directory separators are passed as forward + slashes to libzip. +
+
+
+

+In general, different zip archives opened by libzip are + independent of each other and can be used by parallel-running threads without + locking. If you want to use an archive from multiple threads, you have to + synchronize access to it yourself. If you use an archive as a source for + zip_file_add(3) or + zip_file_replace(3), access to + the target archive must be synchronized with access to the source archive as + well. +
+
+

+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+
+

+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+
+

+ +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 5, 2022NiH
+ + diff --git a/deps/libzip/man/libzip.man b/deps/libzip/man/libzip.man new file mode 100644 index 00000000000000..c2342c10a5a453 --- /dev/null +++ b/deps/libzip/man/libzip.man @@ -0,0 +1,360 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" libzip.mdoc -- general overview of available functions +.\" Copyright (C) 2005-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "LIBZIP" "3" "December 5, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBlibzip\fR +\- library for manipulating zip archives +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.SH "DESCRIPTION" +\fBlibzip\fR +is a library for reading, creating, and modifying zip archives. +.PP +The main design criteria for +\fBlibzip\fR +were: +.PD 0 +.TP 4n +\fB\(bu\fR +Do not create corrupt files, even in case of errors. +.TP 4n +\fB\(bu\fR +Do not delete data. +.TP 4n +\fB\(bu\fR +Be efficient. +.PD +.PP +For this reason, when modifying zip archives, +\fBlibzip\fR +writes to a temporary file and replaces the original +zip archive atomically. +.PP +Below there are two sections listing functions: one for how to read +from zip archives and one for how to create/modify them. +.SH "FILE NAMES" +.SS "Encoding" +Names of files in the host file system are expected in UTF-8 encoding. +On Windows, variants for ASCII and UTF-16 are also available. +.PP +Names of files inside archives are by default expected in UTF-8 encoding. +Other encodings can be requested by using the flags +\fRZIP_FL_ENC_CP437\fR +and +\fRZIP_FL_ENC_RAW\fR. +.PP +For details see the relevant man pages. +.SS "Directory Separator" +The zip format requires the use of forward slash +(\(oq/\(cq) +as directory separator. +Since backslash +(\(oq\e\(cq) +can be part of a valid file name on Unix systems, +\fBlibzip\fR +does not automatically convert them, even on Windows. +It is the responsibility of the programmer to ensure that all +directory separators are passed as forward slashes to +\fBlibzip\fR. +.SH "THREAD SAFETY" +In general, different zip archives opened by +\fBlibzip\fR +are independent of each other and can be used by parallel-running +threads without locking. +If you want to use an archive from multiple threads, you have to +synchronize access to it yourself. +If you use an archive as a source for +zip_file_add(3) +or +zip_file_replace(3), +access to the target archive must be synchronized with access to the +source archive as well. +.SH "READING ZIP ARCHIVES" +.SS "Open Archive" +.TP 4n +\fB\(bu\fR +zip_open(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_fdopen(3) +.PD +.SS "Find Files" +.TP 4n +\fB\(bu\fR +zip_name_locate(3) +.SS "Read Files" +.TP 4n +\fB\(bu\fR +zip_fopen(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_fopen_encrypted(3) +.TP 4n +\fB\(bu\fR +zip_fopen_index(3) +.TP 4n +\fB\(bu\fR +zip_fopen_index_encrypted(3) +.TP 4n +\fB\(bu\fR +zip_fread(3) +.TP 4n +\fB\(bu\fR +zip_file_is_seekable(3) +.TP 4n +\fB\(bu\fR +zip_fseek(3) +(uncompressed files only) +.TP 4n +\fB\(bu\fR +zip_ftell(3) +.TP 4n +\fB\(bu\fR +zip_fclose(3) +.PD +.SS "Close Archive" +.TP 4n +\fB\(bu\fR +zip_close(3) +.SS "Miscellaneous" +.TP 4n +\fB\(bu\fR +zip_stat(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_compression_method_supported(3) +.TP 4n +\fB\(bu\fR +zip_encryption_method_supported(3) +.TP 4n +\fB\(bu\fR +zip_file_get_comment(3) +.TP 4n +\fB\(bu\fR +zip_file_get_external_attributes(3) +.TP 4n +\fB\(bu\fR +zip_get_archive_comment(3) +.TP 4n +\fB\(bu\fR +zip_get_archive_flag(3) +.TP 4n +\fB\(bu\fR +zip_get_name(3) +.TP 4n +\fB\(bu\fR +zip_get_num_entries(3) +.TP 4n +\fB\(bu\fR +zip_set_default_password(3) +.TP 4n +\fB\(bu\fR +zip_source_pass_to_lower_layer(3) +.PD +.SH "CREATING/MODIFYING ZIP ARCHIVES" +.SS "Create/Open Archive" +.TP 4n +\fB\(bu\fR +zip_open(3) +.SS "Add/Change Files and Directories" +.TP 4n +\fB\(bu\fR +zip_dir_add(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_file_add(3) +.TP 4n +\fB\(bu\fR +zip_file_replace(3) +.TP 4n +\fB\(bu\fR +zip_file_set_comment(3) +.TP 4n +\fB\(bu\fR +zip_file_set_dostime(3) +.TP 4n +\fB\(bu\fR +zip_file_set_external_attributes(3) +.TP 4n +\fB\(bu\fR +zip_file_set_encryption(3) +.TP 4n +\fB\(bu\fR +zip_file_set_mtime(3) +.TP 4n +\fB\(bu\fR +zip_set_file_compression(3) +.TP 4n +\fB\(bu\fR +zip_source_buffer(3) +.TP 4n +\fB\(bu\fR +zip_source_file(3) +.TP 4n +\fB\(bu\fR +zip_source_filep(3) +.TP 4n +\fB\(bu\fR +zip_source_free(3) +.TP 4n +\fB\(bu\fR +zip_source_function(3) +.TP 4n +\fB\(bu\fR +zip_source_layered(3) +.TP 4n +\fB\(bu\fR +zip_source_zip(3) +.PD +.SS "Rename Files" +.TP 4n +\fB\(bu\fR +zip_rename(3) +.SS "Delete Files" +.TP 4n +\fB\(bu\fR +zip_delete(3) +.SS "Revert Changes" +.TP 4n +\fB\(bu\fR +zip_unchange(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_unchange_all(3) +.TP 4n +\fB\(bu\fR +zip_unchange_archive(3) +.PD +.SS "Read/Modify Extra Fields" +.TP 4n +\fB\(bu\fR +zip_file_extra_field_delete(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_file_extra_field_delete_by_id(3) +.TP 4n +\fB\(bu\fR +zip_file_extra_field_get(3) +.TP 4n +\fB\(bu\fR +zip_file_extra_field_get_by_id(3) +.TP 4n +\fB\(bu\fR +zip_file_extra_field_set(3) +.TP 4n +\fB\(bu\fR +zip_file_extra_fields_count(3) +.TP 4n +\fB\(bu\fR +zip_file_extra_fields_count_by_id(3) +.PD +.SS "Close Archive (Writing)" +.TP 4n +\fB\(bu\fR +zip_close(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_discard(3) +.PD +.SS "Miscellaneous (Writing)" +.TP 4n +\fB\(bu\fR +zip_file_attributes_init(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_libzip_version(3) +.TP 4n +\fB\(bu\fR +zip_register_cancel_callback_with_state(3) +.TP 4n +\fB\(bu\fR +zip_register_progress_callback_with_state(3) +.TP 4n +\fB\(bu\fR +zip_set_archive_comment(3) +.TP 4n +\fB\(bu\fR +zip_set_archive_flag(3) +.TP 4n +\fB\(bu\fR +zip_source(3) +.PD +.SH "ERROR HANDLING" +.TP 4n +\fB\(bu\fR +zip_error_strerror(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_strerror(3) +.TP 4n +\fB\(bu\fR +zip_file_strerror(3) +.TP 4n +\fB\(bu\fR +zip_file_get_error(3) +.TP 4n +\fB\(bu\fR +zip_get_error(3) +.TP 4n +\fB\(bu\fR +zip_error_init_with_code(3) +.TP 4n +\fB\(bu\fR +zip_error_set(3) +.TP 4n +\fB\(bu\fR +zip_error_set_from_source(3) +.TP 4n +\fB\(bu\fR +zip_error_system_type(3) +.TP 4n +\fB\(bu\fR +zip_errors(3) +.PD +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/libzip.mdoc b/deps/libzip/man/libzip.mdoc new file mode 100644 index 00000000000000..72b45c18a08e5a --- /dev/null +++ b/deps/libzip/man/libzip.mdoc @@ -0,0 +1,295 @@ +.\" libzip.mdoc -- general overview of available functions +.\" Copyright (C) 2005-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt LIBZIP 3 +.Os +.Sh NAME +.Nm libzip +.Nd library for manipulating zip archives +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Sh DESCRIPTION +.Nm +is a library for reading, creating, and modifying zip archives. +.Pp +The main design criteria for +.Nm +were: +.Bl -bullet -compact +.It +Do not create corrupt files, even in case of errors. +.It +Do not delete data. +.It +Be efficient. +.El +.Pp +For this reason, when modifying zip archives, +.Nm +writes to a temporary file and replaces the original +zip archive atomically. +.Pp +Below there are two sections listing functions: one for how to read +from zip archives and one for how to create/modify them. +.Sh FILE NAMES +.Ss Encoding +Names of files in the host file system are expected in UTF-8 encoding. +On Windows, variants for ASCII and UTF-16 are also available. +.Pp +Names of files inside archives are by default expected in UTF-8 encoding. +Other encodings can be requested by using the flags +.Dv ZIP_FL_ENC_CP437 +and +.Dv ZIP_FL_ENC_RAW . +.Pp +For details see the relevant man pages. +.Ss Directory Separator +The zip format requires the use of forward slash +.Pq Sq / +as directory separator. +Since backslash +.Pq Sq \e +can be part of a valid file name on Unix systems, +.Nm +does not automatically convert them, even on Windows. +It is the responsibility of the programmer to ensure that all +directory separators are passed as forward slashes to +.Nm . +.Sh THREAD SAFETY +In general, different zip archives opened by +.Nm +are independent of each other and can be used by parallel-running +threads without locking. +If you want to use an archive from multiple threads, you have to +synchronize access to it yourself. +If you use an archive as a source for +.Xr zip_file_add 3 +or +.Xr zip_file_replace 3 , +access to the target archive must be synchronized with access to the +source archive as well. +.Sh READING ZIP ARCHIVES +.Ss Open Archive +.Bl -bullet -compact +.It +.Xr zip_open 3 +.It +.Xr zip_fdopen 3 +.El +.Ss Find Files +.Bl -bullet -compact +.It +.Xr zip_name_locate 3 +.El +.Ss Read Files +.Bl -bullet -compact +.It +.Xr zip_fopen 3 +.It +.Xr zip_fopen_encrypted 3 +.It +.Xr zip_fopen_index 3 +.It +.Xr zip_fopen_index_encrypted 3 +.It +.Xr zip_fread 3 +.It +.Xr zip_file_is_seekable 3 +.It +.Xr zip_fseek 3 +(uncompressed files only) +.It +.Xr zip_ftell 3 +.It +.Xr zip_fclose 3 +.El +.Ss Close Archive +.Bl -bullet -compact +.It +.Xr zip_close 3 +.El +.Ss Miscellaneous +.Bl -bullet -compact +.It +.Xr zip_stat 3 +.It +.Xr zip_compression_method_supported 3 +.It +.Xr zip_encryption_method_supported 3 +.It +.Xr zip_file_get_comment 3 +.It +.Xr zip_file_get_external_attributes 3 +.It +.Xr zip_get_archive_comment 3 +.It +.Xr zip_get_archive_flag 3 +.It +.Xr zip_get_name 3 +.It +.Xr zip_get_num_entries 3 +.It +.Xr zip_set_default_password 3 +.It +.Xr zip_source_pass_to_lower_layer 3 +.El +.Sh CREATING/MODIFYING ZIP ARCHIVES +.Ss Create/Open Archive +.Bl -bullet -compact +.It +.Xr zip_open 3 +.El +.Ss Add/Change Files and Directories +.Bl -bullet -compact +.It +.Xr zip_dir_add 3 +.It +.Xr zip_file_add 3 +.It +.Xr zip_file_replace 3 +.It +.Xr zip_file_set_comment 3 +.It +.Xr zip_file_set_dostime 3 +.It +.Xr zip_file_set_external_attributes 3 +.It +.Xr zip_file_set_encryption 3 +.It +.Xr zip_file_set_mtime 3 +.It +.Xr zip_set_file_compression 3 +.It +.Xr zip_source_buffer 3 +.It +.Xr zip_source_file 3 +.It +.Xr zip_source_filep 3 +.It +.Xr zip_source_free 3 +.It +.Xr zip_source_function 3 +.It +.Xr zip_source_layered 3 +.It +.Xr zip_source_zip 3 +.El +.Ss Rename Files +.Bl -bullet -compact +.It +.Xr zip_rename 3 +.El +.Ss Delete Files +.Bl -bullet -compact +.It +.Xr zip_delete 3 +.El +.Ss Revert Changes +.Bl -bullet -compact +.It +.Xr zip_unchange 3 +.It +.Xr zip_unchange_all 3 +.It +.Xr zip_unchange_archive 3 +.El +.Ss Read/Modify Extra Fields +.Bl -bullet -compact +.It +.Xr zip_file_extra_field_delete 3 +.It +.Xr zip_file_extra_field_delete_by_id 3 +.It +.Xr zip_file_extra_field_get 3 +.It +.Xr zip_file_extra_field_get_by_id 3 +.It +.Xr zip_file_extra_field_set 3 +.It +.Xr zip_file_extra_fields_count 3 +.It +.Xr zip_file_extra_fields_count_by_id 3 +.El +.Ss Close Archive (Writing) +.Bl -bullet -compact +.It +.Xr zip_close 3 +.It +.Xr zip_discard 3 +.El +.Ss Miscellaneous (Writing) +.Bl -bullet -compact +.It +.Xr zip_file_attributes_init 3 +.It +.Xr zip_libzip_version 3 +.It +.Xr zip_register_cancel_callback_with_state 3 +.It +.Xr zip_register_progress_callback_with_state 3 +.It +.Xr zip_set_archive_comment 3 +.It +.Xr zip_set_archive_flag 3 +.It +.Xr zip_source 3 +.El +.Sh ERROR HANDLING +.Bl -bullet -compact +.It +.Xr zip_error_strerror 3 +.It +.Xr zip_strerror 3 +.It +.Xr zip_file_strerror 3 +.It +.Xr zip_file_get_error 3 +.It +.Xr zip_get_error 3 +.It +.Xr zip_error_init_with_code 3 +.It +.Xr zip_error_set 3 +.It +.Xr zip_error_set_from_source 3 +.It +.Xr zip_error_system_type 3 +.It +.Xr zip_errors 3 +.El +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/links b/deps/libzip/man/links new file mode 100644 index 00000000000000..ab1e5fb55a57e1 --- /dev/null +++ b/deps/libzip/man/links @@ -0,0 +1,25 @@ +zip_add zip_replace +zip_error_clear zip_file_error_clear +zip_error_get zip_file_error_get +zip_error_init zip_error_init_with_code +zip_file_add zip_file_replace +zip_file_extra_field_delete zip_file_extra_field_delete_by_id +zip_file_extra_field_get zip_file_extra_field_get_by_id +zip_file_extra_fields_count zip_file_extra_fields_count_by_id +zip_file_set_mtime zip_file_set_dostime +zip_file_strerror zip_strerror +zip_fopen zip_fopen_index +zip_fopen_encrypted zip_fopen_index_encrypted +zip_fseek zip_file_is_seekable +zip_open zip_open_from_source +zip_source_begin_write zip_source_begin_write_cloning +zip_source_buffer zip_source_buffer_create +zip_source_buffer_fragment zip_source_buffer_fragment_create +zip_source_file zip_source_file_create +zip_source_filep zip_source_filep_create +zip_source_function zip_source_function_create +zip_source_layered zip_source_layered_create +zip_source_win32a zip_source_win32a_create +zip_source_win32handle zip_source_win32handle_create +zip_source_win32w zip_source_win32w_create +zip_stat zip_stat_index diff --git a/deps/libzip/man/make_zip_errors.sh b/deps/libzip/man/make_zip_errors.sh new file mode 100755 index 00000000000000..f4ffe5e0301a3c --- /dev/null +++ b/deps/libzip/man/make_zip_errors.sh @@ -0,0 +1,114 @@ +#!/bin/sh + +# make_zip_errrors.sh: create zip_errors.mdoc from zip.h +# Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner +# +# This file is part of libzip, a library to manipulate ZIP archives. +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +if [ "$#" -ne 2 ] +then + echo "Usage: $0 in_file out_file" >&2 + echo " e.g. $0 zip.h zip_errors.mdoc" >&2 + exit 1 +fi + +if [ "$1" = "$2" ] +then + echo "$0: error: output file = input file" >&2 + exit 1 +fi + +date=`LC_TIME=en_US date '+%B %e, %Y' | sed 's/ / /'` + +cat <> "$2.$$" || exit 1 +.\" zip_errors.mdoc -- list of all libzip error codes +.\" Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS \`\`AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" This file was generated automatically by $0 +.\" from $1; make changes there. +.\" +.Dd $date +.Dt ZIP_ERRORS 3 +.Os +.Sh NAME +.Nm zip_errors +.Nd list of all libzip error codes +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Sh DESCRIPTION +The following error codes are used by libzip: +.Bl -tag -width XZIPXERXCOMPNOTSUPPXX +EOF + +sed -n 's/^#define \(ZIP_ER_[A-Z_0-9]*\).*\/\* \(.\) \([^*]*\) \*\//.It Bq Er \1@\3./p' "$1" \ + | sort\ + | tr @ '\012' \ + >> "$2.$$" || exit 1 + +cat <> "$2.$$" || exit 1 +.El +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at +EOF + +mv "$2.$$" "$2" || exit 1 diff --git a/deps/libzip/man/mkdocset.pl b/deps/libzip/man/mkdocset.pl new file mode 100755 index 00000000000000..78be79b2f08e2c --- /dev/null +++ b/deps/libzip/man/mkdocset.pl @@ -0,0 +1,216 @@ +#!/usr/bin/env perl + +use strict; + +my $DOCSETUTIL = '/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil'; + +my $BASE_URL = 'http://nih.at/libzip'; +my $BUNDLE_ID = 'at.nih.libzip'; + +my $SRCDIR = $ENV{SRCDIR} // '.'; + +my @files = @ARGV; + +my $docset = 'at.nih.libzip.docset'; +my @sh_nodes = qw(zipcmp zipmerge ziptool); + +(system('rm', '-rf', $docset) == 0) or die "can't remove old version of docset: $!"; + +mkdir($docset) or die "can't create docset directory: $!"; +mkdir("$docset/Contents") or die "can't create docset directory: $!"; +mkdir("$docset/Contents/Resources") or die "can't create docset directory: $!"; +mkdir("$docset/Contents/Resources/Documents") or die "can't create docset directory: $!"; + +my $version = `sed -n 's/#define PACKAGE_VERSION "\\(.*\\)"/\\1/p' ../config.h`; +chomp $version; + +my $suffix = ''; +$suffix = '-hg' if ($version =~ /[a-z]$/); + +my $package_file = "$BUNDLE_ID-$version.xar"; +my $download_url = "$BASE_URL/$package_file"; +my $feed_url = "$BASE_URL/at.nih.libzip$suffix.atom"; + +open I, "> $docset/Contents/Info.plist" or die "can't create Info.plist: $!"; +print I < + + + + CFBundleIdentifier + $BUNDLE_ID.docset + CFBundleName + libzip + DocSetPublisherIdentifier + at.nih + DocSetPublisherName + NiH + NSHumanReadableCopyright + Copyright © 2016 Dieter Baron and Thomas Klausner + CFBundleVersion + $version + DocSetFeedURL + $feed_url + DocSetFeedName + libzip + + +EOF +close I; + +open N, "> $docset/Contents/Resources/Nodes.xml" or die "can't create Nodes.xml: $!"; + +my %tl_nodes = (libzip => 1); + +for (@sh_nodes) { + $tl_nodes{$_} = 1; +} + +my @tokens = (); + +print N < + + + + libzip package + + + Library + libzip.html + +EOF + + +my $id = 1001; + +for my $html (@files) { + my $name = $html; + $name =~ s/.html//; + + if ($tl_nodes{$name}) { + next; + } + + process_file($html, 'c', $id++); +} + +print N " \n"; +print N " \n"; +print N " \n"; +print N " Commands\n"; +print N " \n"; + +$id = 2; + +for my $name (@sh_nodes) { + process_file("$name.html", 'c', $id++); +} + +print N " \n"; +print N " \n"; +print N " \n"; +print N " \n"; +print N " \n"; +print N "\n"; + +close N; + +link("$SRCDIR/nih-man.css", "$docset/Contents/Resources/Documents/nih-man.css") or die "can't link css file: $!"; +copy_html('libzip.html', "$docset/Contents/Resources/Documents/libzip.html"); + +write_tokens(); + +system($DOCSETUTIL, 'index', $docset) == 0 or die "can't index docset: $!"; +system($DOCSETUTIL, 'validate', $docset) == 0 or die "can't validate docset: $!"; + +unlink("$docset/Contents/Resources/Nodes.xml"); +unlink("$docset/Contents/Resources/Tokens.xml"); + +system($DOCSETUTIL, 'package', '-output', "at.nih.libzip-$version.xar", '-atom', "at.nih.libzip$suffix.atom", '-download-url', "$BASE_URL/at.nih.libzip-$version.xar", $docset); + + +sub copy_html { + my ($src, $dst) = @_; + + my $content = `cat $src`; + $content =~ s,,,; + $content =~ s,../nih-man.css,nih-man.css,; + + # remove header and footer + $content =~ s,]*class="(heade?r?|foote?r?)".*?,,sg; + + $content =~ s,(
$dst" or die "can't create $dst: $!"; + print X $content; + close X; +} + +sub process_file { + my ($html, $lang, $id) = @_; + + my $name = $html; + $name =~ s/.html//; + my $mdoc = "$SRCDIR/$name.mdoc"; + + my $description; + my @names = (); + + open MD, "< $mdoc" or die "can't open $mdoc: $!"; + + while (my $line = ) { + if ($line =~ m/^.Nm (.*?)( ,)?$/) { + push @names, $1; + } + elsif ($line =~ m/^.Nd (.*)/) { + $description = $1; + } + elsif ($line =~ m/^.Sh SYNOPSIS/) { + last; + } + } + + close MD; + + print N " \n"; + print N " $name\n"; + print N " $html\n"; + print N " \n"; + + for my $name (@names) { + push @tokens, { type => "//apple_ref/$lang/func", + path => $html, + name => $name, + description => $description, + id => $id }; + } + + copy_html($html, "$docset/Contents/Resources/Documents/$html"); +} + +sub write_token { + my ($T, $token) = @_; + + print $T " \n"; + print $T " $token->{type}/$token->{name}\n"; + print $T " $token->{path}\n"; + print $T " $token->{description}\n"; + print $T " {id}\" />\n"; + print $T " \n"; +} + +sub write_tokens { + open my $T, "> $docset/Contents/Resources/Tokens.xml" or die "can't create Tokens.xml: $!"; + print $T "\n"; + print $T "\n"; + + for my $token (sort { $a->{name} cmp $b->{name} } @tokens) { + write_token($T, $token); + } + + print $T "\n"; + + close $T; +} diff --git a/deps/libzip/man/nih-man.css b/deps/libzip/man/nih-man.css new file mode 100644 index 00000000000000..33c355a0b287f2 --- /dev/null +++ b/deps/libzip/man/nih-man.css @@ -0,0 +1,59 @@ +div.lit { + font-family: monospace; +} +div.sec-head, div.ssec-head, h1, h2 { + padding: 4pt; + border: 1px solid #555555; + background: #aaaaaa; + font-weight: bold; +} +div.sec-head, h1 { + font-size: large; +} +h2 { + font-size: medium; +} +div.sec-body, div.ssec-body { + margin-top: 1em; +} +span.arg { + font-style: italic; +} +span.define { +} +span.emph { +} +span.errno { +} +span.farg { + font-style: italic; +} +span.fname { + font-weight: bold; +} +span.ftype { + font-style: italic; +} +span.includes { + font-weight: bold; +} +span.name { + font-weight: bold; +} + +/* copied from nih's style.css */ +body { + background: #cccccc; +} +a { + text-decoration: none; +} +a:link { + color: #555555; +} +a:visited { + color: #666666; +} +a:hover { + color: #777777; +} diff --git a/deps/libzip/man/update-html.cmake b/deps/libzip/man/update-html.cmake new file mode 100644 index 00000000000000..4bc469b4b7aea9 --- /dev/null +++ b/deps/libzip/man/update-html.cmake @@ -0,0 +1,12 @@ +# expect variables IN and OUT +EXECUTE_PROCESS(COMMAND mandoc -T html -Oman=%N.html,style=../nih-man.css ${IN} + OUTPUT_VARIABLE HTML) +SET(LINKBASE "http://pubs.opengroup.org/onlinepubs/9699919799/functions/") +STRING(REGEX REPLACE "()" "\\1${LINKBASE}\\2\\3" HTML "${HTML}") +STRING(REGEX REPLACE "${LINKBASE}(libzip|zip)" "\\1" HTML "${HTML}") +STRING(REGEX REPLACE "NetBSD [0-9.]*" "NiH" HTML "${HTML}") +FILE(WRITE ${OUT}.new "${HTML}") +CONFIGURE_FILE(${OUT}.new ${OUT} COPYONLY) +FILE(REMOVE ${OUT}.new) + + diff --git a/deps/libzip/man/update-man.cmake b/deps/libzip/man/update-man.cmake new file mode 100644 index 00000000000000..2459e939976f0c --- /dev/null +++ b/deps/libzip/man/update-man.cmake @@ -0,0 +1,7 @@ +# expect variables IN and OUT +EXECUTE_PROCESS(COMMAND mandoc -T man ${IN} OUTPUT_VARIABLE MAN) +STRING(REGEX REPLACE "(NetBSD|macOS) [0-9.]*" "NiH" MAN "${MAN}") +FILE(WRITE ${OUT}.new "${MAN}") +CONFIGURE_FILE(${OUT}.new ${OUT} COPYONLY) +FILE(REMOVE ${OUT}.new) + diff --git a/deps/libzip/man/zip_add.html b/deps/libzip/man/zip_add.html new file mode 100644 index 00000000000000..11b30a69bf44e8 --- /dev/null +++ b/deps/libzip/man/zip_add.html @@ -0,0 +1,121 @@ + + + + + + + ZIP_ADD(3) + + + + + + + + +
ZIP_ADD(3)Library Functions ManualZIP_ADD(3)
+
+
+

+zip_add, zip_replace — +
add file to zip archive or replace file in zip archive (obsolete + interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_add(zip_t + *archive, const char + *name, zip_source_t + *source);

+

int +
+ zip_replace(zip_t + *archive, zip_uint64_t + index, zip_source_t + *source);

+
+
+

+The function zip_add() is the obsolete version of + zip_file_add(3). It is the same as + calling zip_file_add(3) with an + empty flags argument. Similarly, the + zip_replace() function is the obsolete version of + zip_file_replace(3). It is the + same as calling + zip_file_replace(3) with an + empty flags argument. +
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3) +
+
+

+zip_add() was added in libzip 0.6. In libzip 0.10 the + return type was changed from int to + zip_int64_t. It was deprecated in libzip 0.11, use + zip_file_add() instead. +

zip_replace() was added in libzip 0.6. In + libzip 0.10 the type of index was changed from + int to zip_uint64_t. It was + deprecated in libzip 0.11, use zip_file_replace() + instead.

+
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_add.man b/deps/libzip/man/zip_add.man new file mode 100644 index 00000000000000..8d63a7809f818f --- /dev/null +++ b/deps/libzip/man/zip_add.man @@ -0,0 +1,106 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_add.mdoc -- add files to zip archive +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ADD" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_add\fR, +\fBzip_replace\fR +\- add file to zip archive or replace file in zip archive (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_add\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *name\fR, \fIzip_source_t\ *source\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_replace\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_add\fR() +is the obsolete version of +zip_file_add(3). +It is the same as calling +zip_file_add(3) +with an empty +\fIflags\fR +argument. +Similarly, the +\fBzip_replace\fR() +function is the obsolete version of +zip_file_replace(3). +It is the same as calling +zip_file_replace(3) +with an empty +\fIflags\fR +argument. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3) +.SH "HISTORY" +\fBzip_add\fR() +was added in libzip 0.6. +In libzip 0.10 the return type was changed from +\fIint\fR +to +\fIzip_int64_t\fR. +It was deprecated in libzip 0.11, use +\fBzip_file_add\fR() +instead. +.PP +\fBzip_replace\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +It was deprecated in libzip 0.11, use +\fBzip_file_replace\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_add.mdoc b/deps/libzip/man/zip_add.mdoc new file mode 100644 index 00000000000000..01184934ab6460 --- /dev/null +++ b/deps/libzip/man/zip_add.mdoc @@ -0,0 +1,96 @@ +.\" zip_add.mdoc -- add files to zip archive +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ADD 3 +.Os +.Sh NAME +.Nm zip_add , +.Nm zip_replace +.Nd add file to zip archive or replace file in zip archive (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_add "zip_t *archive" "const char *name" "zip_source_t *source" +.Ft int +.Fn zip_replace "zip_t *archive" "zip_uint64_t index" "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_add +is the obsolete version of +.Xr zip_file_add 3 . +It is the same as calling +.Xr zip_file_add 3 +with an empty +.Ar flags +argument. +Similarly, the +.Fn zip_replace +function is the obsolete version of +.Xr zip_file_replace 3 . +It is the same as calling +.Xr zip_file_replace 3 +with an empty +.Ar flags +argument. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 +.Sh HISTORY +.Fn zip_add +was added in libzip 0.6. +In libzip 0.10 the return type was changed from +.Vt int +to +.Vt zip_int64_t . +It was deprecated in libzip 0.11, use +.Fn zip_file_add +instead. +.Pp +.Fn zip_replace +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +It was deprecated in libzip 0.11, use +.Fn zip_file_replace +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_add_dir.html b/deps/libzip/man/zip_add_dir.html new file mode 100644 index 00000000000000..fc8c55b855dbfa --- /dev/null +++ b/deps/libzip/man/zip_add_dir.html @@ -0,0 +1,102 @@ + + + + + + + ZIP_ADD_DIR(3) + + + + + + + + +
ZIP_ADD_DIR(3)Library Functions ManualZIP_ADD_DIR(3)
+
+
+

+zip_add_dir — +
add directory to zip archive (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_add_dir(zip_t + *archive, const char + *name);

+
+
+

+The function zip_add_dir() is the obsolete version of + zip_dir_add(3). It is the same as + calling zip_dir_add(3) with an empty + flags argument. +
+
+

+libzip(3), + zip_dir_add(3) +
+
+

+zip_add_dir() was added in libzip 0.8. In libzip 0.10 + the return type was changed from int to + zip_int64_t. It was deprecated in libzip 0.11, use + zip_dir_add() instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_add_dir.man b/deps/libzip/man/zip_add_dir.man new file mode 100644 index 00000000000000..a0f7d0a0603d38 --- /dev/null +++ b/deps/libzip/man/zip_add_dir.man @@ -0,0 +1,74 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_add_dir.mdoc -- add directory to zip archive +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ADD_DIR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_add_dir\fR +\- add directory to zip archive (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_add_dir\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *name\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_add_dir\fR() +is the obsolete version of +zip_dir_add(3). +It is the same as calling +zip_dir_add(3) +with an empty flags argument. +.SH "SEE ALSO" +libzip(3), +zip_dir_add(3) +.SH "HISTORY" +\fBzip_add_dir\fR() +was added in libzip 0.8. +In libzip 0.10 the return type was changed from +\fIint\fR +to +\fIzip_int64_t\fR. +It was deprecated in libzip 0.11, use +\fBzip_dir_add\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_add_dir.mdoc b/deps/libzip/man/zip_add_dir.mdoc new file mode 100644 index 00000000000000..c502dbb4edbe3d --- /dev/null +++ b/deps/libzip/man/zip_add_dir.mdoc @@ -0,0 +1,69 @@ +.\" zip_add_dir.mdoc -- add directory to zip archive +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ADD_DIR 3 +.Os +.Sh NAME +.Nm zip_add_dir +.Nd add directory to zip archive (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_add_dir "zip_t *archive" "const char *name" +.Sh DESCRIPTION +The function +.Fn zip_add_dir +is the obsolete version of +.Xr zip_dir_add 3 . +It is the same as calling +.Xr zip_dir_add 3 +with an empty flags argument. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_dir_add 3 +.Sh HISTORY +.Fn zip_add_dir +was added in libzip 0.8. +In libzip 0.10 the return type was changed from +.Vt int +to +.Vt zip_int64_t . +It was deprecated in libzip 0.11, use +.Fn zip_dir_add +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_close.html b/deps/libzip/man/zip_close.html new file mode 100644 index 00000000000000..7b22b319582277 --- /dev/null +++ b/deps/libzip/man/zip_close.html @@ -0,0 +1,158 @@ + + + + + + + ZIP_CLOSE(3) + + + + + + + + +
ZIP_CLOSE(3)Library Functions ManualZIP_CLOSE(3)
+
+
+

+zip_close — +
close zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_close(zip_t + *archive);

+
+
+

+The zip_close() function writes any changes made to + archive to disk. If archive + contains no files, the file is completely removed (no empty archive is + written). If successful, archive is freed. Otherwise + archive is left unchanged and must still be freed. +

To close and free a zip archive without saving changes, use + zip_discard(3).

+

Progress updates for GUIs can be implemented using + zip_register_progress_callback_with_state(3). + Cancelling the write of an archive during zip_close + can be implemented using + zip_register_cancel_callback_with_state(3).

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+zip_close() will fail if: +
+
[]
+
Unexpected end-of-file found while reading from a file.
+
[]
+
The callback function of an added or replaced file returned an error but + failed to report which.
+
[]
+
The path argument is + NULL.
+
[]
+
Required memory could not be allocated.
+
[]
+
File is not a zip archive.
+
[]
+
A file read failed.
+
[]
+
A temporary file could not be renamed to its final name.
+
[]
+
A file seek failed.
+
[]
+
A temporary file could not be created.
+
[]
+
A file write failed.
+
[]
+
An error occurred while (de)compressing a stream with + zlib(3).
+
+Additionally, any errors returned by the callback function for added or replaced + files will be passed back. +
+
+

+libzip(3), + zip_discard(3), + zip_fdopen(3), + zip_get_error(3), + zip_open(3), + zip_register_cancel_callback_with_state(3), + zip_register_progress_callback_with_state(3), + zip_strerror(3) +
+
+

+zip_close() was added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+

+Please note that all indices, zip_stat(3) + information and other data about the archive is invalid after + zip_close. When you open the same file again, it will + be a completely new zip_t structure. +
+
+ + + + + +
April 1, 2022NiH
+ + diff --git a/deps/libzip/man/zip_close.man b/deps/libzip/man/zip_close.man new file mode 100644 index 00000000000000..21853e9f6a9f32 --- /dev/null +++ b/deps/libzip/man/zip_close.man @@ -0,0 +1,150 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_close.mdoc -- close zip archive +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_CLOSE" "3" "April 1, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_close\fR +\- close zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_close\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_close\fR() +function writes any changes made to +\fIarchive\fR +to disk. +If +\fIarchive\fR +contains no files, the file is completely removed (no empty archive is +written). +If successful, +\fIarchive\fR +is freed. +Otherwise +\fIarchive\fR +is left unchanged and must still be freed. +.PP +To close and free a zip archive without saving changes, use +zip_discard(3). +.PP +Progress updates for GUIs can be implemented using +zip_register_progress_callback_with_state(3). +Cancelling the write of an archive during +\fBzip_close\fR +can be implemented using +zip_register_cancel_callback_with_state(3). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_close\fR() +will fail if: +.TP 19n +[\fRZIP_ER_EOF\fR] +Unexpected end-of-file found while reading from a file. +.TP 19n +[\fRZIP_ER_INTERNAL\fR] +The callback function of an added or replaced file returned an +error but failed to report which. +.TP 19n +[\fRZIP_ER_INVAL\fR] +The +\fIpath\fR +argument is +\fRNULL\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_NOZIP\fR] +File is not a zip archive. +.TP 19n +[\fRZIP_ER_READ\fR] +A file read failed. +.TP 19n +[\fRZIP_ER_RENAME\fR] +A temporary file could not be renamed to its final name. +.TP 19n +[\fRZIP_ER_SEEK\fR] +A file seek failed. +.TP 19n +[\fRZIP_ER_TMPOPEN\fR] +A temporary file could not be created. +.TP 19n +[\fRZIP_ER_WRITE\fR] +A file write failed. +.TP 19n +[\fRZIP_ER_ZLIB\fR] +An error occurred while (de)compressing a stream with +zlib(3). +.PD 0 +.PP +Additionally, any errors returned by the callback function +for added or replaced files will be passed back. +.PD +.SH "SEE ALSO" +libzip(3), +zip_discard(3), +zip_fdopen(3), +zip_get_error(3), +zip_open(3), +zip_register_cancel_callback_with_state(3), +zip_register_progress_callback_with_state(3), +zip_strerror(3) +.SH "HISTORY" +\fBzip_close\fR() +was added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> +.SH "CAVEATS" +Please note that all indices, +zip_stat(3) +information and other data about the archive is invalid after +\fBzip_close\fR. +When you open the same file again, it will be a completely new +\fIzip_t\fR +structure. diff --git a/deps/libzip/man/zip_close.mdoc b/deps/libzip/man/zip_close.mdoc new file mode 100644 index 00000000000000..c8dae24430ea41 --- /dev/null +++ b/deps/libzip/man/zip_close.mdoc @@ -0,0 +1,133 @@ +.\" zip_close.mdoc -- close zip archive +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 1, 2022 +.Dt ZIP_CLOSE 3 +.Os +.Sh NAME +.Nm zip_close +.Nd close zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_close "zip_t *archive" +.Sh DESCRIPTION +The +.Fn zip_close +function writes any changes made to +.Ar archive +to disk. +If +.Ar archive +contains no files, the file is completely removed (no empty archive is +written). +If successful, +.Ar archive +is freed. +Otherwise +.Ar archive +is left unchanged and must still be freed. +.Pp +To close and free a zip archive without saving changes, use +.Xr zip_discard 3 . +.Pp +Progress updates for GUIs can be implemented using +.Xr zip_register_progress_callback_with_state 3 . +Cancelling the write of an archive during +.Nm +can be implemented using +.Xr zip_register_cancel_callback_with_state 3 . +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_close +will fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_EOF +Unexpected end-of-file found while reading from a file. +.It Bq Er ZIP_ER_INTERNAL +The callback function of an added or replaced file returned an +error but failed to report which. +.It Bq Er ZIP_ER_INVAL +The +.Ar path +argument is +.Dv NULL . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_NOZIP +File is not a zip archive. +.It Bq Er ZIP_ER_READ +A file read failed. +.It Bq Er ZIP_ER_RENAME +A temporary file could not be renamed to its final name. +.It Bq Er ZIP_ER_SEEK +A file seek failed. +.It Bq Er ZIP_ER_TMPOPEN +A temporary file could not be created. +.It Bq Er ZIP_ER_WRITE +A file write failed. +.It Bq Er ZIP_ER_ZLIB +An error occurred while (de)compressing a stream with +.Xr zlib 3 . +.El +Additionally, any errors returned by the callback function +for added or replaced files will be passed back. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_discard 3 , +.Xr zip_fdopen 3 , +.Xr zip_get_error 3 , +.Xr zip_open 3 , +.Xr zip_register_cancel_callback_with_state 3 , +.Xr zip_register_progress_callback_with_state 3 , +.Xr zip_strerror 3 +.Sh HISTORY +.Fn zip_close +was added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at +.Sh CAVEATS +Please note that all indices, +.Xr zip_stat 3 +information and other data about the archive is invalid after +.Nm . +When you open the same file again, it will be a completely new +.Vt zip_t +structure. diff --git a/deps/libzip/man/zip_compression_method_supported.html b/deps/libzip/man/zip_compression_method_supported.html new file mode 100644 index 00000000000000..beab807cc8f47e --- /dev/null +++ b/deps/libzip/man/zip_compression_method_supported.html @@ -0,0 +1,105 @@ + + + + + + + ZIP_COMPRESSION_METHOD_SUPPORTED(3) + + + + + + + + +
ZIP_COMPRESSION_METHOD_SUPPORTED(3)Library Functions ManualZIP_COMPRESSION_METHOD_SUPPORTED(3)
+
+
+

+zip_compression_method_supported — +
return if a compression method is supported
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_compression_method_supported(zip_int32_t + method, int + compress);

+
+
+

+The zip_compression_method_supported() returns if the + compression method method is supported for compression + (if compress is zero) or decompression (otherwise). +
+
+

+Returns 1 if the method is supported, 0 otherwise. +
+
+

+libzip(3), + zip_encryption_method_supported(3), + zip_set_file_compression(3) +
+
+

+zip_compression_method_supported() was added in libzip + 1.7.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 2, 2020NiH
+ + diff --git a/deps/libzip/man/zip_compression_method_supported.man b/deps/libzip/man/zip_compression_method_supported.man new file mode 100644 index 00000000000000..ae67e89644f359 --- /dev/null +++ b/deps/libzip/man/zip_compression_method_supported.man @@ -0,0 +1,70 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_compression_method_supported.mdoc -- return if compression method is supported +.\" Copyright (C) 2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_COMPRESSION_METHOD_SUPPORTED" "3" "April 2, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_compression_method_supported\fR +\- return if a compression method is supported +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_compression_method_supported\fR(\fIzip_int32_t\ method\fR, \fIint\ compress\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_compression_method_supported\fR() +returns if the compression method +\fImethod\fR +is supported for compression (if +\fIcompress\fR +is zero) or decompression (otherwise). +.SH "RETURN VALUES" +Returns 1 if the method is supported, 0 otherwise. +.SH "SEE ALSO" +libzip(3), +zip_encryption_method_supported(3), +zip_set_file_compression(3) +.SH "HISTORY" +\fBzip_compression_method_supported\fR() +was added in libzip 1.7.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_compression_method_supported.mdoc b/deps/libzip/man/zip_compression_method_supported.mdoc new file mode 100644 index 00000000000000..0882df16d207b2 --- /dev/null +++ b/deps/libzip/man/zip_compression_method_supported.mdoc @@ -0,0 +1,65 @@ +.\" zip_compression_method_supported.mdoc -- return if compression method is supported +.\" Copyright (C) 2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 2, 2020 +.Dt ZIP_COMPRESSION_METHOD_SUPPORTED 3 +.Os +.Sh NAME +.Nm zip_compression_method_supported +.Nd return if a compression method is supported +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_compression_method_supported "zip_int32_t method" "int compress" +.Sh DESCRIPTION +The +.Fn zip_compression_method_supported +returns if the compression method +.Ar method +is supported for compression (if +.Ar compress +is zero) or decompression (otherwise). +.Sh RETURN VALUES +Returns 1 if the method is supported, 0 otherwise. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_encryption_method_supported 3 , +.Xr zip_set_file_compression 3 +.Sh HISTORY +.Fn zip_compression_method_supported +was added in libzip 1.7.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_delete.html b/deps/libzip/man/zip_delete.html new file mode 100644 index 00000000000000..1dd8bede53c143 --- /dev/null +++ b/deps/libzip/man/zip_delete.html @@ -0,0 +1,114 @@ + + + + + + + ZIP_DELETE(3) + + + + + + + + +
ZIP_DELETE(3)Library Functions ManualZIP_DELETE(3)
+
+
+

+zip_delete — +
delete file from zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_delete(zip_t + *archive, zip_uint64_t + index);

+
+
+

+The file at position index in the zip archive + archive is marked as deleted. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+zip_delete() fails if: +
+
[]
+
index is not a valid file index in + archive.
+
+
+
+

+libzip(3), + zip_unchange(3) +
+
+

+zip_delete() was added in libzip 0.6. In libzip 0.10 the + type of index was changed from int + to zip_uint64_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_delete.man b/deps/libzip/man/zip_delete.man new file mode 100644 index 00000000000000..9f3a0102bb8935 --- /dev/null +++ b/deps/libzip/man/zip_delete.man @@ -0,0 +1,84 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_delete.mdoc -- delete files from zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_DELETE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_delete\fR +\- delete file from zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_delete\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR); +.PD +.SH "DESCRIPTION" +The file at position +\fIindex\fR +in the zip archive +\fIarchive\fR +is marked as deleted. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_delete\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_unchange(3) +.SH "HISTORY" +\fBzip_delete\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_delete.mdoc b/deps/libzip/man/zip_delete.mdoc new file mode 100644 index 00000000000000..f5fd117457f79e --- /dev/null +++ b/deps/libzip/man/zip_delete.mdoc @@ -0,0 +1,80 @@ +.\" zip_delete.mdoc -- delete files from zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_DELETE 3 +.Os +.Sh NAME +.Nm zip_delete +.Nd delete file from zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_delete "zip_t *archive" "zip_uint64_t index" +.Sh DESCRIPTION +The file at position +.Ar index +in the zip archive +.Ar archive +is marked as deleted. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_delete +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_unchange 3 +.Sh HISTORY +.Fn zip_delete +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_dir_add.html b/deps/libzip/man/zip_dir_add.html new file mode 100644 index 00000000000000..5c9d4ab178ab44 --- /dev/null +++ b/deps/libzip/man/zip_dir_add.html @@ -0,0 +1,134 @@ + + + + + + + ZIP_DIR_ADD(3) + + + + + + + + +
ZIP_DIR_ADD(3)Library Functions ManualZIP_DIR_ADD(3)
+
+
+

+zip_dir_add — +
add directory to zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_dir_add(zip_t + *archive, const char + *name, zip_flags_t + flags);

+
+
+

+The function zip_dir_add() adds a directory to a zip + archive. The argument archive specifies the zip archive + to which the directory should be added. name is the + directory's name in the zip archive. +

This function adds an entry to the archive. It does not check + whether a directory with that name exists in the file system, nor does it + add its contents if it does. The flags argument can be + any of:

+
+
+
Guess encoding of name (default). (Only CP-437 and + UTF-8 are recognized.)
+
+
Interpret name as UTF-8.
+
+
Interpret name as code page 437 (CP-437).
+
+
+
+

+Upon successful completion, the index of the new entry in the archive is + returned. Otherwise, -1 is returned and the error code in + archive is set to indicate the error. +
+
+

+zip_dir_add() fails if: +
+
[]
+
There is already an entry called name in the + archive.
+
[]
+
archive or name are + NULL, or invalid UTF-8 encoded file names.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3) +
+
+

+zip_dir_add() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 20, 2020NiH
+ + diff --git a/deps/libzip/man/zip_dir_add.man b/deps/libzip/man/zip_dir_add.man new file mode 100644 index 00000000000000..defdb67fc77ae1 --- /dev/null +++ b/deps/libzip/man/zip_dir_add.man @@ -0,0 +1,116 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_dir_add.mdoc -- add directory to zip archive +.\" Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_DIR_ADD" "3" "September 20, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_dir_add\fR +\- add directory to zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_dir_add\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *name\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_dir_add\fR() +adds a directory to a zip archive. +The argument +\fIarchive\fR +specifies the zip archive to which the directory should be added. +\fIname\fR +is the directory's name in the zip archive. +.PP +This function adds an entry to the archive. +It does not check whether a directory with that name exists in the +file system, nor does it add its contents if it does. +The +\fIflags\fR +argument can be any of: +.TP 22n +\fRZIP_FL_ENC_GUESS\fR +Guess encoding of +\fIname\fR +(default). +(Only CP-437 and UTF-8 are recognized.) +.TP 22n +\fRZIP_FL_ENC_UTF_8\fR +Interpret +\fIname\fR +as UTF-8. +.TP 22n +\fRZIP_FL_ENC_CP437\fR +Interpret +\fIname\fR +as code page 437 (CP-437). +.SH "RETURN VALUES" +Upon successful completion, the index of the new entry in the archive +is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_dir_add\fR() +fails if: +.TP 19n +[\fRZIP_ER_EXISTS\fR] +There is already an entry called +\fIname\fR +in the archive. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIarchive\fR +or +\fIname\fR +are +\fRNULL\fR, +or invalid UTF-8 encoded file names. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3) +.SH "HISTORY" +\fBzip_dir_add\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_dir_add.mdoc b/deps/libzip/man/zip_dir_add.mdoc new file mode 100644 index 00000000000000..9c379d706671de --- /dev/null +++ b/deps/libzip/man/zip_dir_add.mdoc @@ -0,0 +1,109 @@ +.\" zip_dir_add.mdoc -- add directory to zip archive +.\" Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 20, 2020 +.Dt ZIP_DIR_ADD 3 +.Os +.Sh NAME +.Nm zip_dir_add +.Nd add directory to zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_dir_add "zip_t *archive" "const char *name" "zip_flags_t flags" +.Sh DESCRIPTION +The function +.Fn zip_dir_add +adds a directory to a zip archive. +The argument +.Ar archive +specifies the zip archive to which the directory should be added. +.Ar name +is the directory's name in the zip archive. +.Pp +This function adds an entry to the archive. +It does not check whether a directory with that name exists in the +file system, nor does it add its contents if it does. +The +.Ar flags +argument can be any of: +.Bl -tag -width XZIPXFLXENCXSTRICTXX +.It Dv ZIP_FL_ENC_GUESS +Guess encoding of +.Ar name +(default). +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_UTF_8 +Interpret +.Ar name +as UTF-8. +.It Dv ZIP_FL_ENC_CP437 +Interpret +.Ar name +as code page 437 (CP-437). +.El +.Sh RETURN VALUES +Upon successful completion, the index of the new entry in the archive +is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_dir_add +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_EXISTS +There is already an entry called +.Ar name +in the archive. +.It Bq Er ZIP_ER_INVAL +.Ar archive +or +.Ar name +are +.Dv NULL , +or invalid UTF-8 encoded file names. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 +.Sh HISTORY +.Fn zip_dir_add +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_discard.html b/deps/libzip/man/zip_discard.html new file mode 100644 index 00000000000000..c9bd74e81636f8 --- /dev/null +++ b/deps/libzip/man/zip_discard.html @@ -0,0 +1,97 @@ + + + + + + + ZIP_DISCARD(3) + + + + + + + + +
ZIP_DISCARD(3)Library Functions ManualZIP_DISCARD(3)
+
+
+

+zip_discard — +
close zip archive and discard changes
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_discard(zip_t + *archive);

+
+
+

+The zip_discard() function closes + archive and frees the memory allocated for it. Any + changes to the archive are not written to disk and discarded. +
+
+

+libzip(3), + zip_close(3) +
+
+

+zip_discard() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_discard.man b/deps/libzip/man/zip_discard.man new file mode 100644 index 00000000000000..cf8203867a9870 --- /dev/null +++ b/deps/libzip/man/zip_discard.man @@ -0,0 +1,66 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_discard.mdoc -- close zip archive and discard changes +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_DISCARD" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_discard\fR +\- close zip archive and discard changes +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_discard\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_discard\fR() +function closes +\fIarchive\fR +and frees the memory allocated for it. +Any changes to the archive are not written to disk and discarded. +.SH "SEE ALSO" +libzip(3), +zip_close(3) +.SH "HISTORY" +\fBzip_discard\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_discard.mdoc b/deps/libzip/man/zip_discard.mdoc new file mode 100644 index 00000000000000..b7a97c8dde9ae9 --- /dev/null +++ b/deps/libzip/man/zip_discard.mdoc @@ -0,0 +1,61 @@ +.\" zip_discard.mdoc -- close zip archive and discard changes +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_DISCARD 3 +.Os +.Sh NAME +.Nm zip_discard +.Nd close zip archive and discard changes +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_discard "zip_t *archive" +.Sh DESCRIPTION +The +.Fn zip_discard +function closes +.Ar archive +and frees the memory allocated for it. +Any changes to the archive are not written to disk and discarded. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 +.Sh HISTORY +.Fn zip_discard +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_encryption_method_supported.html b/deps/libzip/man/zip_encryption_method_supported.html new file mode 100644 index 00000000000000..cb86ab576427ef --- /dev/null +++ b/deps/libzip/man/zip_encryption_method_supported.html @@ -0,0 +1,105 @@ + + + + + + + ZIP_ENCRYPTION_METHOD_SUPPORTED(3) + + + + + + + + +
ZIP_ENCRYPTION_METHOD_SUPPORTED(3)Library Functions ManualZIP_ENCRYPTION_METHOD_SUPPORTED(3)
+
+
+

+zip_encryption_method_supported — +
return if an encryption method is supported
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_encryption_method_supported(zip_int16_t + method, int + encrypt);

+
+
+

+The zip_encryption_method_supported() returns if the + encryption method method is supported for encryption (if + encrypt is zero) or decryption (otherwise). +
+
+

+Returns 1 if the method is supported, 0 otherwise. +
+
+

+libzip(3), + zip_compression_method_supported(3), + zip_file_set_encryption(3) +
+
+

+zip_encryption_method_supported() was added in libzip + 1.7.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 2, 2020NiH
+ + diff --git a/deps/libzip/man/zip_encryption_method_supported.man b/deps/libzip/man/zip_encryption_method_supported.man new file mode 100644 index 00000000000000..274f9aeeaae94e --- /dev/null +++ b/deps/libzip/man/zip_encryption_method_supported.man @@ -0,0 +1,70 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_encryption_method_supported.mdoc -- return if encryption method is supported +.\" Copyright (C) 2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ENCRYPTION_METHOD_SUPPORTED" "3" "April 2, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_encryption_method_supported\fR +\- return if an encryption method is supported +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_encryption_method_supported\fR(\fIzip_int16_t\ method\fR, \fIint\ encrypt\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_encryption_method_supported\fR() +returns if the encryption method +\fImethod\fR +is supported for encryption (if +\fIencrypt\fR +is zero) or decryption (otherwise). +.SH "RETURN VALUES" +Returns 1 if the method is supported, 0 otherwise. +.SH "SEE ALSO" +libzip(3), +zip_compression_method_supported(3), +zip_file_set_encryption(3) +.SH "HISTORY" +\fBzip_encryption_method_supported\fR() +was added in libzip 1.7.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_encryption_method_supported.mdoc b/deps/libzip/man/zip_encryption_method_supported.mdoc new file mode 100644 index 00000000000000..35f9c546515ac6 --- /dev/null +++ b/deps/libzip/man/zip_encryption_method_supported.mdoc @@ -0,0 +1,65 @@ +.\" zip_encryption_method_supported.mdoc -- return if encryption method is supported +.\" Copyright (C) 2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 2, 2020 +.Dt ZIP_ENCRYPTION_METHOD_SUPPORTED 3 +.Os +.Sh NAME +.Nm zip_encryption_method_supported +.Nd return if an encryption method is supported +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_encryption_method_supported "zip_int16_t method" "int encrypt" +.Sh DESCRIPTION +The +.Fn zip_encryption_method_supported +returns if the encryption method +.Ar method +is supported for encryption (if +.Ar encrypt +is zero) or decryption (otherwise). +.Sh RETURN VALUES +Returns 1 if the method is supported, 0 otherwise. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_compression_method_supported 3 , +.Xr zip_file_set_encryption 3 +.Sh HISTORY +.Fn zip_encryption_method_supported +was added in libzip 1.7.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_clear.html b/deps/libzip/man/zip_error_clear.html new file mode 100644 index 00000000000000..6f9f5d84742522 --- /dev/null +++ b/deps/libzip/man/zip_error_clear.html @@ -0,0 +1,104 @@ + + + + + + + ZIP_ERROR_CLEAR(3) + + + + + + + + +
ZIP_ERROR_CLEAR(3)Library Functions ManualZIP_ERROR_CLEAR(3)
+
+
+

+zip_error_clear, + zip_file_error_clear — +
clear error state for archive or file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_error_clear(zip_t + *archive);

+

void +
+ zip_file_error_clear(zip_file_t + *file);

+
+
+

+The zip_error_clear() function clears the error state + for the zip archive archive. +

The zip_file_error_clear() function does + the same for the zip file file.

+
+
+

+libzip(3), + zip_get_error(3) +
+
+

+zip_error_clear() and + zip_file_error_clear() were added in libzip 0.8. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_clear.man b/deps/libzip/man/zip_error_clear.man new file mode 100644 index 00000000000000..c8f1fcdcd703f2 --- /dev/null +++ b/deps/libzip/man/zip_error_clear.man @@ -0,0 +1,79 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_clear.mdoc -- clear error state for archive or file +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_CLEAR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_clear\fR, +\fBzip_file_error_clear\fR +\- clear error state for archive or file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_error_clear\fR(\fIzip_t\ *archive\fR); +.PD +.PP +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_file_error_clear\fR(\fIzip_file_t\ *file\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_clear\fR() +function clears the error state for the zip archive +\fIarchive\fR. +.PP +The +\fBzip_file_error_clear\fR() +function does the same for the zip file +\fIfile\fR. +.SH "SEE ALSO" +libzip(3), +zip_get_error(3) +.SH "HISTORY" +\fBzip_error_clear\fR() +and +\fBzip_file_error_clear\fR() +were added in libzip 0.8. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_clear.mdoc b/deps/libzip/man/zip_error_clear.mdoc new file mode 100644 index 00000000000000..bf490555da89ac --- /dev/null +++ b/deps/libzip/man/zip_error_clear.mdoc @@ -0,0 +1,69 @@ +.\" zip_error_clear.mdoc -- clear error state for archive or file +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_CLEAR 3 +.Os +.Sh NAME +.Nm zip_error_clear , +.Nm zip_file_error_clear +.Nd clear error state for archive or file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_error_clear "zip_t *archive" +.Ft void +.Fn zip_file_error_clear "zip_file_t *file" +.Sh DESCRIPTION +The +.Fn zip_error_clear +function clears the error state for the zip archive +.Ar archive . +.Pp +The +.Fn zip_file_error_clear +function does the same for the zip file +.Ar file . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_get_error 3 +.Sh HISTORY +.Fn zip_error_clear +and +.Fn zip_file_error_clear +were added in libzip 0.8. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_code_system.html b/deps/libzip/man/zip_error_code_system.html new file mode 100644 index 00000000000000..bd7e7ce5c03641 --- /dev/null +++ b/deps/libzip/man/zip_error_code_system.html @@ -0,0 +1,99 @@ + + + + + + + ZIP_ERROR_CODE_SYSTEM(3) + + + + + + + + +
ZIP_ERROR_CODE_SYSTEM(3)Library Functions ManualZIP_ERROR_CODE_SYSTEM(3)
+
+
+

+zip_error_code_system — +
get operating system error part of zip_error
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_error_code_system(const + zip_error_t *ze);

+
+
+

+The zip_error_code_system() function returns the system + specific part of the error from the zip_error error ze. + For finding out what system reported the error, use + zip_error_system_type(3). +
+
+

+libzip(3), + zip_error_code_zip(3), + zip_error_system_type(3) +
+
+

+zip_error_code_system() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_code_system.man b/deps/libzip/man/zip_error_code_system.man new file mode 100644 index 00000000000000..babf30252a19a3 --- /dev/null +++ b/deps/libzip/man/zip_error_code_system.man @@ -0,0 +1,68 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_code_system.mdoc -- get system error part of zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_CODE_SYSTEM" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_code_system\fR +\- get operating system error part of zip_error +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_error_code_system\fR(\fIconst\ zip_error_t\ *ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_code_system\fR() +function returns the system specific part of the error from the +zip_error error +\fIze\fR. +For finding out what system reported the error, use +zip_error_system_type(3). +.SH "SEE ALSO" +libzip(3), +zip_error_code_zip(3), +zip_error_system_type(3) +.SH "HISTORY" +\fBzip_error_code_system\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_code_system.mdoc b/deps/libzip/man/zip_error_code_system.mdoc new file mode 100644 index 00000000000000..e052e2d18072fc --- /dev/null +++ b/deps/libzip/man/zip_error_code_system.mdoc @@ -0,0 +1,63 @@ +.\" zip_error_code_system.mdoc -- get system error part of zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_CODE_SYSTEM 3 +.Os +.Sh NAME +.Nm zip_error_code_system +.Nd get operating system error part of zip_error +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_error_code_system "const zip_error_t *ze" +.Sh DESCRIPTION +The +.Fn zip_error_code_system +function returns the system specific part of the error from the +zip_error error +.Ar ze . +For finding out what system reported the error, use +.Xr zip_error_system_type 3 . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_code_zip 3 , +.Xr zip_error_system_type 3 +.Sh HISTORY +.Fn zip_error_code_system +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_code_zip.html b/deps/libzip/man/zip_error_code_zip.html new file mode 100644 index 00000000000000..c4a5e72228726c --- /dev/null +++ b/deps/libzip/man/zip_error_code_zip.html @@ -0,0 +1,96 @@ + + + + + + + ZIP_ERROR_CODE_ZIP(3) + + + + + + + + +
ZIP_ERROR_CODE_ZIP(3)Library Functions ManualZIP_ERROR_CODE_ZIP(3)
+
+
+

+zip_error_code_zip — +
get libzip error part of zip_error
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_error_code_zip(const + zip_error_t *ze);

+
+
+

+The zip_error_code_zip() function returns the libzip + specific part of the error from the zip_error error ze. +
+
+

+libzip(3), + zip_error_code_system(3) +
+
+

+zip_error_code_zip() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_code_zip.man b/deps/libzip/man/zip_error_code_zip.man new file mode 100644 index 00000000000000..38a710f06933f9 --- /dev/null +++ b/deps/libzip/man/zip_error_code_zip.man @@ -0,0 +1,65 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_code_zip.mdoc -- get libzip error part of zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_CODE_ZIP" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_code_zip\fR +\- get libzip error part of zip_error +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_error_code_zip\fR(\fIconst\ zip_error_t\ *ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_code_zip\fR() +function returns the libzip specific part of the error from the +zip_error error +\fIze\fR. +.SH "SEE ALSO" +libzip(3), +zip_error_code_system(3) +.SH "HISTORY" +\fBzip_error_code_zip\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_code_zip.mdoc b/deps/libzip/man/zip_error_code_zip.mdoc new file mode 100644 index 00000000000000..b051eb0d5f6b52 --- /dev/null +++ b/deps/libzip/man/zip_error_code_zip.mdoc @@ -0,0 +1,60 @@ +.\" zip_error_code_zip.mdoc -- get libzip error part of zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_CODE_ZIP 3 +.Os +.Sh NAME +.Nm zip_error_code_zip +.Nd get libzip error part of zip_error +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_error_code_zip "const zip_error_t *ze" +.Sh DESCRIPTION +The +.Fn zip_error_code_zip +function returns the libzip specific part of the error from the +zip_error error +.Ar ze . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_code_system 3 +.Sh HISTORY +.Fn zip_error_code_zip +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_fini.html b/deps/libzip/man/zip_error_fini.html new file mode 100644 index 00000000000000..14c26275c8ddf8 --- /dev/null +++ b/deps/libzip/man/zip_error_fini.html @@ -0,0 +1,97 @@ + + + + + + + ZIP_ERROR_FINI(3) + + + + + + + + +
ZIP_ERROR_FINI(3)Library Functions ManualZIP_ERROR_FINI(3)
+
+
+

+zip_error_fini — +
clean up zip_error structure
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_error_fini(zip_error_t + *ze);

+
+
+

+The zip_error_fini() function cleans up and frees + internally allocated memory of the zip_error pointed to by + ze. +
+
+

+libzip(3), + zip_error_init(3) +
+
+

+zip_error_fini() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_fini.man b/deps/libzip/man/zip_error_fini.man new file mode 100644 index 00000000000000..a24cdb801cfd1e --- /dev/null +++ b/deps/libzip/man/zip_error_fini.man @@ -0,0 +1,65 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_fini.mdoc -- clean up zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_FINI" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_fini\fR +\- clean up zip_error structure +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_error_fini\fR(\fIzip_error_t\ *ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_fini\fR() +function cleans up and frees internally allocated memory of the +zip_error pointed to by +\fIze\fR. +.SH "SEE ALSO" +libzip(3), +zip_error_init(3) +.SH "HISTORY" +\fBzip_error_fini\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_fini.mdoc b/deps/libzip/man/zip_error_fini.mdoc new file mode 100644 index 00000000000000..d584cdf61f309b --- /dev/null +++ b/deps/libzip/man/zip_error_fini.mdoc @@ -0,0 +1,60 @@ +.\" zip_error_fini.mdoc -- clean up zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_FINI 3 +.Os +.Sh NAME +.Nm zip_error_fini +.Nd clean up zip_error structure +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_error_fini "zip_error_t *ze" +.Sh DESCRIPTION +The +.Fn zip_error_fini +function cleans up and frees internally allocated memory of the +zip_error pointed to by +.Ar ze . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_init 3 +.Sh HISTORY +.Fn zip_error_fini +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_get.html b/deps/libzip/man/zip_error_get.html new file mode 100644 index 00000000000000..a584206b4f3d84 --- /dev/null +++ b/deps/libzip/man/zip_error_get.html @@ -0,0 +1,150 @@ + + + + + + + ZIP_ERROR_GET(3) + + + + + + + + +
ZIP_ERROR_GET(3)Library Functions ManualZIP_ERROR_GET(3)
+
+
+

+zip_error_get, + zip_file_error_get — +
get error codes for archive or file (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_error_get(zip_t + *archive, int *zep, + int *sep);

+

void +
+ zip_file_error_get(zip_file_t + *file, int *zep, + int *sep);

+
+
+

+The functions zip_error_get() and + zip_file_error_get() are deprecated. Use + zip_error_code_system(3), + zip_error_code_zip(3), + zip_file_get_error(3), and + zip_get_error(3) instead. +

For zip_error_get(), replace

+
+
+int ze, se;
+zip_error_get(za, &ze, &se);
+
+
+with +
+
+int ze, se;
+zip_error_t *error = zip_get_error(za);
+ze = zip_error_code_zip(error);
+se = zip_error_code_system(error);
+
+
+For zip_file_error_get(), replace +
+
+int ze, se;
+zip_file_error_get(zf, &ze, &se);
+
+
+with +
+
+int ze, se;
+zip_error_t *error = zip_file_get_error(zf);
+ze = zip_error_code_zip(error);
+se = zip_error_code_system(error);
+
+
+
+
+

+libzip(3), + zip_error_code_system(3), + zip_error_code_zip(3), + zip_file_get_error(3), + zip_get_error(3) +
+
+

+zip_error_get() was added in libzip 0.6. It was + deprecated in libzip 1.0, use zip_get_error(), + zip_error_code_zip(), / + zip_error_code_system() instead. +

zip_file_error_get() was added in libzip + 0.6. It was deprecated in libzip 1.0, use + zip_file_get_error(), + zip_error_code_zip(), / + zip_error_code_system() instead.

+
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_get.man b/deps/libzip/man/zip_error_get.man new file mode 100644 index 00000000000000..0c7e9446d05165 --- /dev/null +++ b/deps/libzip/man/zip_error_get.man @@ -0,0 +1,139 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_get.mdoc -- get error codes for archive or file +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_GET" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_get\fR, +\fBzip_file_error_get\fR +\- get error codes for archive or file (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_error_get\fR(\fIzip_t\ *archive\fR, \fIint\ *zep\fR, \fIint\ *sep\fR); +.PD +.PP +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_file_error_get\fR(\fIzip_file_t\ *file\fR, \fIint\ *zep\fR, \fIint\ *sep\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_error_get\fR() +and +\fBzip_file_error_get\fR() +are deprecated. +Use +zip_error_code_system(3), +zip_error_code_zip(3), +zip_file_get_error(3), +and +zip_get_error(3) +instead. +.PP +For +\fBzip_error_get\fR(), +replace +.nf +.sp +.RS 6n +int ze, se; +zip_error_get(za, &ze, &se); +.RE +.fi +with +.nf +.sp +.RS 6n +int ze, se; +zip_error_t *error = zip_get_error(za); +ze = zip_error_code_zip(error); +se = zip_error_code_system(error); +.RE +.fi +For +\fBzip_file_error_get\fR(), +replace +.nf +.sp +.RS 6n +int ze, se; +zip_file_error_get(zf, &ze, &se); +.RE +.fi +with +.nf +.sp +.RS 6n +int ze, se; +zip_error_t *error = zip_file_get_error(zf); +ze = zip_error_code_zip(error); +se = zip_error_code_system(error); +.RE +.fi +.SH "SEE ALSO" +libzip(3), +zip_error_code_system(3), +zip_error_code_zip(3), +zip_file_get_error(3), +zip_get_error(3) +.SH "HISTORY" +\fBzip_error_get\fR() +was added in libzip 0.6. +It was deprecated in libzip 1.0, use +\fBzip_get_error\fR(), +\fBzip_error_code_zip\fR(), +/ +\fBzip_error_code_system\fR() +instead. +.PP +\fBzip_file_error_get\fR() +was added in libzip 0.6. +It was deprecated in libzip 1.0, use +\fBzip_file_get_error\fR(), +\fBzip_error_code_zip\fR(), +/ +\fBzip_error_code_system\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_get.mdoc b/deps/libzip/man/zip_error_get.mdoc new file mode 100644 index 00000000000000..da843baa0119e8 --- /dev/null +++ b/deps/libzip/man/zip_error_get.mdoc @@ -0,0 +1,117 @@ +.\" zip_error_get.mdoc -- get error codes for archive or file +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_GET 3 +.Os +.Sh NAME +.Nm zip_error_get , +.Nm zip_file_error_get +.Nd get error codes for archive or file (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_error_get "zip_t *archive" "int *zep" "int *sep" +.Ft void +.Fn zip_file_error_get "zip_file_t *file" "int *zep" "int *sep" +.Sh DESCRIPTION +The functions +.Fn zip_error_get +and +.Fn zip_file_error_get +are deprecated. +Use +.Xr zip_error_code_system 3 , +.Xr zip_error_code_zip 3 , +.Xr zip_file_get_error 3 , +and +.Xr zip_get_error 3 +instead. +.Pp +For +.Fn zip_error_get , +replace +.Bd -literal -offset indent +int ze, se; +zip_error_get(za, &ze, &se); +.Ed +with +.Bd -literal -offset indent +int ze, se; +zip_error_t *error = zip_get_error(za); +ze = zip_error_code_zip(error); +se = zip_error_code_system(error); +.Ed +For +.Fn zip_file_error_get , +replace +.Bd -literal -offset indent +int ze, se; +zip_file_error_get(zf, &ze, &se); +.Ed +with +.Bd -literal -offset indent +int ze, se; +zip_error_t *error = zip_file_get_error(zf); +ze = zip_error_code_zip(error); +se = zip_error_code_system(error); +.Ed +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_code_system 3 , +.Xr zip_error_code_zip 3 , +.Xr zip_file_get_error 3 , +.Xr zip_get_error 3 +.Sh HISTORY +.Fn zip_error_get +was added in libzip 0.6. +It was deprecated in libzip 1.0, use +.Fn zip_get_error , +.Fn zip_error_code_zip , +/ +.Fn zip_error_code_system +instead. +.Pp +.Fn zip_file_error_get +was added in libzip 0.6. +It was deprecated in libzip 1.0, use +.Fn zip_file_get_error , +.Fn zip_error_code_zip , +/ +.Fn zip_error_code_system +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_get_sys_type.html b/deps/libzip/man/zip_error_get_sys_type.html new file mode 100644 index 00000000000000..f0be0b0c833196 --- /dev/null +++ b/deps/libzip/man/zip_error_get_sys_type.html @@ -0,0 +1,116 @@ + + + + + + + ZIP_ERROR_GET_SYS_TYPE(3) + + + + + + + + +
ZIP_ERROR_GET_SYS_TYPE(3)Library Functions ManualZIP_ERROR_GET_SYS_TYPE(3)
+
+
+

+zip_error_get_sys_type — +
get type of system error code (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_error_get_sys_type(int + ze);

+
+
+

+The function zip_error_get_sys_type() is deprecated; use + zip_error_init_with_code(3) + and + zip_error_system_type(3) + instead. +

Replace

+
+
+int i = zip_error_get_sys_type(ze);
+
+
+with +
+
+zip_error_t error;
+zip_error_init_with_code(&error, ze);
+int i = zip_error_system_type(&error);
+
+
+
+
+

+libzip(3), + zip_error_init_with_code(3), + zip_error_system_type(3) +
+
+

+zip_error_get_sys_type() was added in libzip 0.6. It was + deprecated in libzip 1.0, use zip_error_system_type() + instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_get_sys_type.man b/deps/libzip/man/zip_error_get_sys_type.man new file mode 100644 index 00000000000000..3fad5d91df15cb --- /dev/null +++ b/deps/libzip/man/zip_error_get_sys_type.man @@ -0,0 +1,88 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_get_sys_type.mdoc -- get type of error +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_GET_SYS_TYPE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_get_sys_type\fR +\- get type of system error code (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_error_get_sys_type\fR(\fIint\ ze\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_error_get_sys_type\fR() +is deprecated; use +zip_error_init_with_code(3) +and +zip_error_system_type(3) +instead. +.PP +Replace +.nf +.sp +.RS 6n +int i = zip_error_get_sys_type(ze); +.RE +.fi +with +.nf +.sp +.RS 6n +zip_error_t error; +zip_error_init_with_code(&error, ze); +int i = zip_error_system_type(&error); +.RE +.fi +.SH "SEE ALSO" +libzip(3), +zip_error_init_with_code(3), +zip_error_system_type(3) +.SH "HISTORY" +\fBzip_error_get_sys_type\fR() +was added in libzip 0.6. +It was deprecated in libzip 1.0, use +\fBzip_error_system_type\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_get_sys_type.mdoc b/deps/libzip/man/zip_error_get_sys_type.mdoc new file mode 100644 index 00000000000000..2a12311cbe6c8e --- /dev/null +++ b/deps/libzip/man/zip_error_get_sys_type.mdoc @@ -0,0 +1,77 @@ +.\" zip_error_get_sys_type.mdoc -- get type of error +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_GET_SYS_TYPE 3 +.Os +.Sh NAME +.Nm zip_error_get_sys_type +.Nd get type of system error code (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_error_get_sys_type "int ze" +.Sh DESCRIPTION +The function +.Fn zip_error_get_sys_type +is deprecated; use +.Xr zip_error_init_with_code 3 +and +.Xr zip_error_system_type 3 +instead. +.Pp +Replace +.Bd -literal -offset indent +int i = zip_error_get_sys_type(ze); +.Ed +with +.Bd -literal -offset indent +zip_error_t error; +zip_error_init_with_code(&error, ze); +int i = zip_error_system_type(&error); +.Ed +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_init_with_code 3 , +.Xr zip_error_system_type 3 +.Sh HISTORY +.Fn zip_error_get_sys_type +was added in libzip 0.6. +It was deprecated in libzip 1.0, use +.Fn zip_error_system_type +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_init.html b/deps/libzip/man/zip_error_init.html new file mode 100644 index 00000000000000..a980156eac89a0 --- /dev/null +++ b/deps/libzip/man/zip_error_init.html @@ -0,0 +1,108 @@ + + + + + + + ZIP_ERROR_INIT(3) + + + + + + + + +
ZIP_ERROR_INIT(3)Library Functions ManualZIP_ERROR_INIT(3)
+
+
+

+zip_error_init, + zip_error_init_with_code — +
initialize zip_error structure
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_error_init(zip_error_t + *error);

+

void +
+ zip_error_init_with_code(zip_error_t + *error, int + ze);

+
+
+

+The zip_error_init() function initializes the zip_error + pointed to by error. *error must + be allocated before calling zip_error_init(). +

The zip_error_init_with_code() function + does the same, but additionally sets the zip error code to + ze and sets the system error code to the current + errno(3) value, if appropriate.

+
+
+

+libzip(3), + zip_error_fini(3) +
+
+

+zip_error_init() and + zip_error_init_with_code() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_init.man b/deps/libzip/man/zip_error_init.man new file mode 100644 index 00000000000000..bc032ce7cd1c2e --- /dev/null +++ b/deps/libzip/man/zip_error_init.man @@ -0,0 +1,85 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_init.mdoc -- initialize zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_INIT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_init\fR, +\fBzip_error_init_with_code\fR +\- initialize zip_error structure +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_error_init\fR(\fIzip_error_t\ *error\fR); +.PD +.PP +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_error_init_with_code\fR(\fIzip_error_t\ *error\fR, \fIint\ ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_init\fR() +function initializes the zip_error pointed to by +\fIerror\fR. +\fI*error\fR +must be allocated before calling +\fBzip_error_init\fR(). +.PP +The +\fBzip_error_init_with_code\fR() +function does the same, but additionally sets the zip error code to +\fIze\fR +and sets the system error code to the current +errno(3) +value, if appropriate. +.SH "SEE ALSO" +libzip(3), +zip_error_fini(3) +.SH "HISTORY" +\fBzip_error_init\fR() +and +\fBzip_error_init_with_code\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_init.mdoc b/deps/libzip/man/zip_error_init.mdoc new file mode 100644 index 00000000000000..a1ef57b87b6060 --- /dev/null +++ b/deps/libzip/man/zip_error_init.mdoc @@ -0,0 +1,76 @@ +.\" zip_error_init.mdoc -- initialize zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_INIT 3 +.Os +.Sh NAME +.Nm zip_error_init , +.Nm zip_error_init_with_code +.Nd initialize zip_error structure +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_error_init "zip_error_t *error" +.Ft void +.Fn zip_error_init_with_code "zip_error_t *error" "int ze" +.Sh DESCRIPTION +The +.Fn zip_error_init +function initializes the zip_error pointed to by +.Ar error . +.Ar *error +must be allocated before calling +.Fn zip_error_init . +.Pp +The +.Fn zip_error_init_with_code +function does the same, but additionally sets the zip error code to +.Ar ze +and sets the system error code to the current +.Xr errno 3 +value, if appropriate. +.\" TODO: describe when you would need to call this at all +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_fini 3 +.Sh HISTORY +.Fn zip_error_init +and +.Fn zip_error_init_with_code +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_set.html b/deps/libzip/man/zip_error_set.html new file mode 100644 index 00000000000000..39314f0792e266 --- /dev/null +++ b/deps/libzip/man/zip_error_set.html @@ -0,0 +1,102 @@ + + + + + + + ZIP_ERROR_SET(3) + + + + + + + + +
ZIP_ERROR_SET(3)Library Functions ManualZIP_ERROR_SET(3)
+
+
+

+zip_error_set — +
fill in zip_error structure
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_error_set(zip_error_t + *ze, int le, + int se);

+
+
+

+The zip_error_set() function sets the zip_error pointed + to by ze to the libzip error code + le and the system error code se. +

ze must be allocated and initialized with + zip_error_init(3) before + calling zip_error_set().

+
+
+

+libzip(3), + zip_error_init(3), + zip_error_set_from_source(3) +
+
+

+zip_error_set() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 5, 2022NiH
+ + diff --git a/deps/libzip/man/zip_error_set.man b/deps/libzip/man/zip_error_set.man new file mode 100644 index 00000000000000..3b1b1fde5a6ea7 --- /dev/null +++ b/deps/libzip/man/zip_error_set.man @@ -0,0 +1,75 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_set.mdoc -- set zip_error +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_SET" "3" "December 5, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_set\fR +\- fill in zip_error structure +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_error_set\fR(\fIzip_error_t\ *ze\fR, \fIint\ le\fR, \fIint\ se\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_set\fR() +function sets the zip_error pointed to by +\fIze\fR +to the libzip error code +\fIle\fR +and the system error code +\fIse\fR. +.PP +\fIze\fR +must be allocated and initialized with +zip_error_init(3) +before calling +\fBzip_error_set\fR(). +.SH "SEE ALSO" +libzip(3), +zip_error_init(3), +zip_error_set_from_source(3) +.SH "HISTORY" +\fBzip_error_set\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_set.mdoc b/deps/libzip/man/zip_error_set.mdoc new file mode 100644 index 00000000000000..2edd23d5649825 --- /dev/null +++ b/deps/libzip/man/zip_error_set.mdoc @@ -0,0 +1,70 @@ +.\" zip_error_set.mdoc -- set zip_error +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt ZIP_ERROR_SET 3 +.Os +.Sh NAME +.Nm zip_error_set +.Nd fill in zip_error structure +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_error_set "zip_error_t *ze" "int le" "int se" +.Sh DESCRIPTION +The +.Fn zip_error_set +function sets the zip_error pointed to by +.Ar ze +to the libzip error code +.Ar le +and the system error code +.Ar se . +.Pp +.Ar ze +must be allocated and initialized with +.Xr zip_error_init 3 +before calling +.Fn zip_error_set . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_init 3 , +.Xr zip_error_set_from_source 3 +.Sh HISTORY +.Fn zip_error_set +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_set_from_source.mdoc b/deps/libzip/man/zip_error_set_from_source.mdoc new file mode 100644 index 00000000000000..19b872a5896b43 --- /dev/null +++ b/deps/libzip/man/zip_error_set_from_source.mdoc @@ -0,0 +1,69 @@ +.\" zip_error_set_from_source.mdoc -- set zip_error from source +.\" Copyright (C) 2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt ZIP_ERROR_SET_FROM_SOURCE 3 +.Os +.Sh NAME +.Nm zip_error_set_from_source +.Nd fill in zip_error structure from source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_error_set_from_source "zip_error_t *ze" "zip_source_t *src" +.Sh DESCRIPTION +The +.Fn zip_error_set_from_source +function sets the zip_error pointed to by +.Ar ze +to the error reported by +.Ar src +as returned by +.Xr zip_error_source 3 . +.Ar ze +must be allocated and initialized with +.Xr zip_error_init 3 +before calling +.Fn zip_error_set_from_source . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_init 3 , +.Xr zip_error_set 3 +.Sh HISTORY +.Fn zip_error_set_from_source +was added in libzip 1.10. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_strerror.html b/deps/libzip/man/zip_error_strerror.html new file mode 100644 index 00000000000000..2939de201555d4 --- /dev/null +++ b/deps/libzip/man/zip_error_strerror.html @@ -0,0 +1,101 @@ + + + + + + + ZIP_ERROR_STRERROR(3) + + + + + + + + +
ZIP_ERROR_STRERROR(3)Library Functions ManualZIP_ERROR_STRERROR(3)
+
+
+

+zip_error_strerror — +
create human-readable string for zip_error
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_error_strerror(zip_error_t + *ze);

+
+
+

+The zip_error_strerror() function returns an error + message string corresponding to ze like + strerror(3). This string will stay + valid until the next call to zip_error_strerror() or + until zip_error_fini(3) is + called. +
+
+

+libzip(3), + strerror(3), + zip_error_fini(3) +
+
+

+zip_error_strerror() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_strerror.man b/deps/libzip/man/zip_error_strerror.man new file mode 100644 index 00000000000000..e4640ffcdbcb67 --- /dev/null +++ b/deps/libzip/man/zip_error_strerror.man @@ -0,0 +1,72 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_strerror.mdoc -- create human-readable version of zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_STRERROR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_strerror\fR +\- create human-readable string for zip_error +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_error_strerror\fR(\fIzip_error_t\ *ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_strerror\fR() +function returns an error message string corresponding to +\fIze\fR +like +strerror(3). +This string will stay valid until the next call to +\fBzip_error_strerror\fR() +or until +zip_error_fini(3) +is called. +.SH "SEE ALSO" +libzip(3), +strerror(3), +zip_error_fini(3) +.SH "HISTORY" +\fBzip_error_strerror\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_strerror.mdoc b/deps/libzip/man/zip_error_strerror.mdoc new file mode 100644 index 00000000000000..cf7299f5da4275 --- /dev/null +++ b/deps/libzip/man/zip_error_strerror.mdoc @@ -0,0 +1,67 @@ +.\" zip_error_strerror.mdoc -- create human-readable version of zip_error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_STRERROR 3 +.Os +.Sh NAME +.Nm zip_error_strerror +.Nd create human-readable string for zip_error +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_error_strerror "zip_error_t *ze" +.Sh DESCRIPTION +The +.Fn zip_error_strerror +function returns an error message string corresponding to +.Ar ze +like +.Xr strerror 3 . +This string will stay valid until the next call to +.Fn zip_error_strerror +or until +.Xr zip_error_fini 3 +is called. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr strerror 3 , +.Xr zip_error_fini 3 +.Sh HISTORY +.Fn zip_error_strerror +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_system_type.html b/deps/libzip/man/zip_error_system_type.html new file mode 100644 index 00000000000000..31a02a4dcdc1aa --- /dev/null +++ b/deps/libzip/man/zip_error_system_type.html @@ -0,0 +1,107 @@ + + + + + + + ZIP_ERROR_SYSTEM_TYPE(3) + + + + + + + + +
ZIP_ERROR_SYSTEM_TYPE(3)Library Functions ManualZIP_ERROR_SYSTEM_TYPE(3)
+
+
+

+zip_error_system_type — +
return type of system error
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_error_system_type(const + zip_error_t *ze);

+
+
+

+The zip_error_system_type() function returns the type of + the system specific part for the zip_error ze. + Currently, the following system types are defined: +
+
+
System specific part of ze is unused.
+
+
System specific part of ze is an + errno(2).
+
+
System specific part of ze is a + zlib(3) error.
+
+
+
+

+libzip(3), + zip_error_code_system(3) +
+
+

+zip_error_system_type() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_system_type.man b/deps/libzip/man/zip_error_system_type.man new file mode 100644 index 00000000000000..8d824ee17ea6ef --- /dev/null +++ b/deps/libzip/man/zip_error_system_type.man @@ -0,0 +1,83 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_system_type.mdoc -- return system type for error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_SYSTEM_TYPE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_system_type\fR +\- return type of system error +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_error_system_type\fR(\fIconst\ zip_error_t\ *ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_error_system_type\fR() +function returns the type of the system specific part for the zip_error +\fIze\fR. +Currently, the following system types are defined: +.TP 13n +\fRZIP_ET_NONE\fR +System specific part of +\fIze\fR +is unused. +.TP 13n +\fRZIP_ET_SYS\fR +System specific part of +\fIze\fR +is an +errno(2). +.TP 13n +\fRZIP_ET_ZLIB\fR +System specific part of +\fIze\fR +is a +zlib(3) +error. +.SH "SEE ALSO" +libzip(3), +zip_error_code_system(3) +.SH "HISTORY" +\fBzip_error_system_type\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_system_type.mdoc b/deps/libzip/man/zip_error_system_type.mdoc new file mode 100644 index 00000000000000..e2d4e0dda65eb9 --- /dev/null +++ b/deps/libzip/man/zip_error_system_type.mdoc @@ -0,0 +1,77 @@ +.\" zip_error_system_type.mdoc -- return system type for error +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_SYSTEM_TYPE 3 +.Os +.Sh NAME +.Nm zip_error_system_type +.Nd return type of system error +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_error_system_type "const zip_error_t *ze" +.Sh DESCRIPTION +The +.Fn zip_error_system_type +function returns the type of the system specific part for the zip_error +.Ar ze . +Currently, the following system types are defined: +.Bl -tag -width ZIP_ET_NONE +.It Dv ZIP_ET_NONE +System specific part of +.Ar ze +is unused. +.It Dv ZIP_ET_SYS +System specific part of +.Ar ze +is an +.Xr errno 2 . +.It Dv ZIP_ET_ZLIB +System specific part of +.Ar ze +is a +.Xr zlib 3 +error. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_code_system 3 +.Sh HISTORY +.Fn zip_error_system_type +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_to_data.html b/deps/libzip/man/zip_error_to_data.html new file mode 100644 index 00000000000000..ff387a81a09cad --- /dev/null +++ b/deps/libzip/man/zip_error_to_data.html @@ -0,0 +1,108 @@ + + + + + + + ZIP_ERROR_TO_DATA(3) + + + + + + + + +
ZIP_ERROR_TO_DATA(3)Library Functions ManualZIP_ERROR_TO_DATA(3)
+
+
+

+zip_error_to_data — +
convert zip_error to return value suitable for + ZIP_SOURCE_ERROR
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_error_to_data(const + zip_error_t *ze, void + *data, zip_uint64_t + len);

+
+
+

+zip_error_to_data() function converts the zip_error + ze into data suitable as return value for + ZIP_SOURCE_ERROR. The data is written into the buffer + data of size len. If the buffer is + not large enough to hold 2 ints, an error is returned. +
+
+

+zip_error_to_data() returns 2*(sizeof int) on success, + and -1 on error. +
+
+

+libzip(3), + zip_source_function(3) +
+
+

+zip_error_to_data() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_to_data.man b/deps/libzip/man/zip_error_to_data.man new file mode 100644 index 00000000000000..532383c582452d --- /dev/null +++ b/deps/libzip/man/zip_error_to_data.man @@ -0,0 +1,74 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_to_data.mdoc -- create error data for ZIP_SOURCE_ERROR +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_TO_DATA" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_to_data\fR +\- convert zip_error to return value suitable for ZIP_SOURCE_ERROR +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_error_to_data\fR(\fIconst\ zip_error_t\ *ze\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ len\fR); +.PD +.SH "DESCRIPTION" +\fBzip_error_to_data\fR() +function converts the zip_error +\fIze\fR +into data suitable as return value for +\fRZIP_SOURCE_ERROR\fR. +The data is written into the buffer +\fIdata\fR +of size +\fIlen\fR. +If the buffer is not large enough to hold 2 ints, an error is +returned. +.SH "RETURN VALUES" +\fBzip_error_to_data\fR() +returns 2*(sizeof int) on success, and \-1 on error. +.SH "SEE ALSO" +libzip(3), +zip_source_function(3) +.SH "HISTORY" +\fBzip_error_to_data\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_to_data.mdoc b/deps/libzip/man/zip_error_to_data.mdoc new file mode 100644 index 00000000000000..d969c9218d4364 --- /dev/null +++ b/deps/libzip/man/zip_error_to_data.mdoc @@ -0,0 +1,69 @@ +.\" zip_error_to_data.mdoc -- create error data for ZIP_SOURCE_ERROR +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_TO_DATA 3 +.Os +.Sh NAME +.Nm zip_error_to_data +.Nd convert zip_error to return value suitable for ZIP_SOURCE_ERROR +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_error_to_data "const zip_error_t *ze" "void *data" "zip_uint64_t len" +.Sh DESCRIPTION +.Fn zip_error_to_data +function converts the zip_error +.Ar ze +into data suitable as return value for +.Dv ZIP_SOURCE_ERROR . +The data is written into the buffer +.Ar data +of size +.Ar len . +If the buffer is not large enough to hold 2 ints, an error is +returned. +.Sh RETURN VALUES +.Fn zip_error_to_data +returns 2*(sizeof int) on success, and \-1 on error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source_function 3 +.Sh HISTORY +.Fn zip_error_to_data +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_error_to_str.html b/deps/libzip/man/zip_error_to_str.html new file mode 100644 index 00000000000000..7c4474f4fd5041 --- /dev/null +++ b/deps/libzip/man/zip_error_to_str.html @@ -0,0 +1,124 @@ + + + + + + + ZIP_ERROR_TO_STR(3) + + + + + + + + +
ZIP_ERROR_TO_STR(3)Library Functions ManualZIP_ERROR_TO_STR(3)
+
+
+

+zip_error_to_str — +
get string representation of zip error (obsolete + interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_error_to_str(char + *buf, zip_uint64_t + len, int ze, + int se);

+
+
+

+The function zip_error_to_str() is deprecated; use + zip_error_init_with_code(3) + and zip_error_strerror(3) + instead. +

Replace

+
+
+char buf[BUFSIZE];
+zip_error_to_str(buf, sizeof(buf), ze, se);
+printf("%s", buf);
+
+
+with +
+
+zip_error_t error;
+zip_error_init_with_code(&error, ze);
+printf("%s", zip_error_strerror(&error));
+zip_error_fini(&error);
+
+
+
+
+

+libzip(3), + zip_error_init_with_code(3), + zip_error_strerror(3) +
+
+

+zip_error_to_str() was added in libzip 0.6. In libzip + 0.10 the type of len was changed from + size_t to zip_uint64_t. It was + deprecated in libzip 1.0, use + zip_error_init_with_code() and + zip_error_strerror() instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_error_to_str.man b/deps/libzip/man/zip_error_to_str.man new file mode 100644 index 00000000000000..e4298952b9299d --- /dev/null +++ b/deps/libzip/man/zip_error_to_str.man @@ -0,0 +1,99 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_error_to_str.mdoc -- get string representation of zip error code +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_ERROR_TO_STR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_error_to_str\fR +\- get string representation of zip error (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_error_to_str\fR(\fIchar\ *buf\fR, \fIzip_uint64_t\ len\fR, \fIint\ ze\fR, \fIint\ se\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_error_to_str\fR() +is deprecated; use +zip_error_init_with_code(3) +and +zip_error_strerror(3) +instead. +.PP +Replace +.nf +.sp +.RS 6n +char buf[BUFSIZE]; +zip_error_to_str(buf, sizeof(buf), ze, se); +printf("%s", buf); +.RE +.fi +with +.nf +.sp +.RS 6n +zip_error_t error; +zip_error_init_with_code(&error, ze); +printf("%s", zip_error_strerror(&error)); +zip_error_fini(&error); +.RE +.fi +.SH "SEE ALSO" +libzip(3), +zip_error_init_with_code(3), +zip_error_strerror(3) +.SH "HISTORY" +\fBzip_error_to_str\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIlen\fR +was changed from +\fIsize_t\fR +to +\fIzip_uint64_t\fR. +It was deprecated in libzip 1.0, use +\fBzip_error_init_with_code\fR() +and +\fBzip_error_strerror\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_error_to_str.mdoc b/deps/libzip/man/zip_error_to_str.mdoc new file mode 100644 index 00000000000000..3e0a3227522561 --- /dev/null +++ b/deps/libzip/man/zip_error_to_str.mdoc @@ -0,0 +1,88 @@ +.\" zip_error_to_str.mdoc -- get string representation of zip error code +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERROR_TO_STR 3 +.Os +.Sh NAME +.Nm zip_error_to_str +.Nd get string representation of zip error (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_error_to_str "char *buf" "zip_uint64_t len" "int ze" "int se" +.Sh DESCRIPTION +The function +.Fn zip_error_to_str +is deprecated; use +.Xr zip_error_init_with_code 3 +and +.Xr zip_error_strerror 3 +instead. +.Pp +Replace +.Bd -literal -offset indent +char buf[BUFSIZE]; +zip_error_to_str(buf, sizeof(buf), ze, se); +printf("%s", buf); +.Ed +with +.Bd -literal -offset indent +zip_error_t error; +zip_error_init_with_code(&error, ze); +printf("%s", zip_error_strerror(&error)); +zip_error_fini(&error); +.Ed +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_init_with_code 3 , +.Xr zip_error_strerror 3 +.Sh HISTORY +.Fn zip_error_to_str +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar len +was changed from +.Vt size_t +to +.Vt zip_uint64_t . +It was deprecated in libzip 1.0, use +.Fn zip_error_init_with_code +and +.Fn zip_error_strerror +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_errors.html b/deps/libzip/man/zip_errors.html new file mode 100644 index 00000000000000..790f3c70985d02 --- /dev/null +++ b/deps/libzip/man/zip_errors.html @@ -0,0 +1,150 @@ + + + + + + + ZIP_ERRORS(3) + + + + + + + + +
ZIP_ERRORS(3)Library Functions ManualZIP_ERRORS(3)
+
+
+

+zip_errors — +
list of all libzip error codes
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +
+
+

+The following error codes are used by libzip: +
+
[ZIP_ER_CHANGED]
+
Entry has been changed.
+
[ZIP_ER_CLOSE]
+
Closing zip archive failed.
+
[ZIP_ER_COMPNOTSUPP]
+
Compression method not supported.
+
[ZIP_ER_COMPRESSED_DATA]
+
Compressed data invalid.
+
[ZIP_ER_CRC]
+
CRC error.
+
[ZIP_ER_DELETED]
+
Entry has been deleted.
+
[ZIP_ER_ENCRNOTSUPP]
+
Encryption method not supported.
+
[ZIP_ER_EOF]
+
Premature end of file.
+
[ZIP_ER_EXISTS]
+
File already exists.
+
[ZIP_ER_INCONS]
+
Zip archive inconsistent.
+
[ZIP_ER_INTERNAL]
+
Internal error.
+
[ZIP_ER_INUSE]
+
Resource still in use.
+
[ZIP_ER_INVAL]
+
Invalid argument.
+
[ZIP_ER_MEMORY]
+
Malloc failure.
+
[ZIP_ER_MULTIDISK]
+
Multi-disk zip archives not supported.
+
[ZIP_ER_NOENT]
+
No such file.
+
[ZIP_ER_NOPASSWD]
+
No password provided.
+
[ZIP_ER_NOZIP]
+
Not a zip archive.
+
[ZIP_ER_OK]
+
No error.
+
[ZIP_ER_OPEN]
+
Can't open file.
+
[ZIP_ER_OPNOTSUPP]
+
Operation not supported.
+
[ZIP_ER_RDONLY]
+
Read-only archive.
+
[ZIP_ER_READ]
+
Read error.
+
[ZIP_ER_REMOVE]
+
Can't remove file.
+
[ZIP_ER_RENAME]
+
Renaming temporary file failed.
+
[ZIP_ER_SEEK]
+
Seek error.
+
[ZIP_ER_TELL]
+
Tell error.
+
[ZIP_ER_TMPOPEN]
+
Failure to create temporary file.
+
[ZIP_ER_WRITE]
+
Write error.
+
[ZIP_ER_WRONGPASSWD]
+
Wrong password provided.
+
[ZIP_ER_ZIPCLOSED]
+
Containing zip archive was closed.
+
[ZIP_ER_ZLIB]
+
Zlib error.
+
+
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_errors.man b/deps/libzip/man/zip_errors.man new file mode 100644 index 00000000000000..8378318870d666 --- /dev/null +++ b/deps/libzip/man/zip_errors.man @@ -0,0 +1,147 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_errors.mdoc -- list of all libzip error codes +.\" Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" This file was generated automatically by ./make_zip_errors.sh +.\" from ./../lib/zip.h; make changes there. +.\" +.TH "ZIP_ERRORS" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_errors\fR +\- list of all libzip error codes +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.SH "DESCRIPTION" +The following error codes are used by libzip: +.TP 26n +[\fRZIP_ER_CHANGED\fR] +Entry has been changed. +.TP 26n +[\fRZIP_ER_CLOSE\fR] +Closing zip archive failed. +.TP 26n +[\fRZIP_ER_COMPNOTSUPP\fR] +Compression method not supported. +.TP 26n +[\fRZIP_ER_COMPRESSED_DATA\fR] +Compressed data invalid. +.TP 26n +[\fRZIP_ER_CRC\fR] +CRC error. +.TP 26n +[\fRZIP_ER_DELETED\fR] +Entry has been deleted. +.TP 26n +[\fRZIP_ER_ENCRNOTSUPP\fR] +Encryption method not supported. +.TP 26n +[\fRZIP_ER_EOF\fR] +Premature end of file. +.TP 26n +[\fRZIP_ER_EXISTS\fR] +File already exists. +.TP 26n +[\fRZIP_ER_INCONS\fR] +Zip archive inconsistent. +.TP 26n +[\fRZIP_ER_INTERNAL\fR] +Internal error. +.TP 26n +[\fRZIP_ER_INUSE\fR] +Resource still in use. +.TP 26n +[\fRZIP_ER_INVAL\fR] +Invalid argument. +.TP 26n +[\fRZIP_ER_MEMORY\fR] +Malloc failure. +.TP 26n +[\fRZIP_ER_MULTIDISK\fR] +Multi-disk zip archives not supported. +.TP 26n +[\fRZIP_ER_NOENT\fR] +No such file. +.TP 26n +[\fRZIP_ER_NOPASSWD\fR] +No password provided. +.TP 26n +[\fRZIP_ER_NOZIP\fR] +Not a zip archive. +.TP 26n +[\fRZIP_ER_OK\fR] +No error. +.TP 26n +[\fRZIP_ER_OPEN\fR] +Can't open file. +.TP 26n +[\fRZIP_ER_OPNOTSUPP\fR] +Operation not supported. +.TP 26n +[\fRZIP_ER_RDONLY\fR] +Read-only archive. +.TP 26n +[\fRZIP_ER_READ\fR] +Read error. +.TP 26n +[\fRZIP_ER_REMOVE\fR] +Can't remove file. +.TP 26n +[\fRZIP_ER_RENAME\fR] +Renaming temporary file failed. +.TP 26n +[\fRZIP_ER_SEEK\fR] +Seek error. +.TP 26n +[\fRZIP_ER_TELL\fR] +Tell error. +.TP 26n +[\fRZIP_ER_TMPOPEN\fR] +Failure to create temporary file. +.TP 26n +[\fRZIP_ER_WRITE\fR] +Write error. +.TP 26n +[\fRZIP_ER_WRONGPASSWD\fR] +Wrong password provided. +.TP 26n +[\fRZIP_ER_ZIPCLOSED\fR] +Containing zip archive was closed. +.TP 26n +[\fRZIP_ER_ZLIB\fR] +Zlib error. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_errors.mdoc b/deps/libzip/man/zip_errors.mdoc new file mode 100644 index 00000000000000..1ff668703b52df --- /dev/null +++ b/deps/libzip/man/zip_errors.mdoc @@ -0,0 +1,117 @@ +.\" zip_errors.mdoc -- list of all libzip error codes +.\" Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" This file was generated automatically by ./make_zip_errors.sh +.\" from ./../lib/zip.h; make changes there. +.\" +.Dd December 18, 2017 +.Dt ZIP_ERRORS 3 +.Os +.Sh NAME +.Nm zip_errors +.Nd list of all libzip error codes +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Sh DESCRIPTION +The following error codes are used by libzip: +.Bl -tag -width XZIP_ER_COMPRESSED_DATAX +.It Bq Er ZIP_ER_CHANGED +Entry has been changed. +.It Bq Er ZIP_ER_CLOSE +Closing zip archive failed. +.It Bq Er ZIP_ER_COMPNOTSUPP +Compression method not supported. +.It Bq Er ZIP_ER_COMPRESSED_DATA +Compressed data invalid. +.It Bq Er ZIP_ER_CRC +CRC error. +.It Bq Er ZIP_ER_DELETED +Entry has been deleted. +.It Bq Er ZIP_ER_ENCRNOTSUPP +Encryption method not supported. +.It Bq Er ZIP_ER_EOF +Premature end of file. +.It Bq Er ZIP_ER_EXISTS +File already exists. +.It Bq Er ZIP_ER_INCONS +Zip archive inconsistent. +.It Bq Er ZIP_ER_INTERNAL +Internal error. +.It Bq Er ZIP_ER_INUSE +Resource still in use. +.It Bq Er ZIP_ER_INVAL +Invalid argument. +.It Bq Er ZIP_ER_MEMORY +Malloc failure. +.It Bq Er ZIP_ER_MULTIDISK +Multi-disk zip archives not supported. +.It Bq Er ZIP_ER_NOENT +No such file. +.It Bq Er ZIP_ER_NOPASSWD +No password provided. +.It Bq Er ZIP_ER_NOZIP +Not a zip archive. +.It Bq Er ZIP_ER_OK +No error. +.It Bq Er ZIP_ER_OPEN +Can't open file. +.It Bq Er ZIP_ER_OPNOTSUPP +Operation not supported. +.It Bq Er ZIP_ER_RDONLY +Read-only archive. +.It Bq Er ZIP_ER_READ +Read error. +.It Bq Er ZIP_ER_REMOVE +Can't remove file. +.It Bq Er ZIP_ER_RENAME +Renaming temporary file failed. +.It Bq Er ZIP_ER_SEEK +Seek error. +.It Bq Er ZIP_ER_TELL +Tell error. +.It Bq Er ZIP_ER_TMPOPEN +Failure to create temporary file. +.It Bq Er ZIP_ER_WRITE +Write error. +.It Bq Er ZIP_ER_WRONGPASSWD +Wrong password provided. +.It Bq Er ZIP_ER_ZIPCLOSED +Containing zip archive was closed. +.It Bq Er ZIP_ER_ZLIB +Zlib error. +.El +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_fclose.html b/deps/libzip/man/zip_fclose.html new file mode 100644 index 00000000000000..cc8bc4c0b75f74 --- /dev/null +++ b/deps/libzip/man/zip_fclose.html @@ -0,0 +1,103 @@ + + + + + + + ZIP_FCLOSE(3) + + + + + + + + +
ZIP_FCLOSE(3)Library Functions ManualZIP_FCLOSE(3)
+
+
+

+zip_fclose — +
close file in zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_fclose(zip_file_t + *file);

+
+
+

+The zip_fclose() function closes + file and frees the memory allocated for it. +
+
+

+Upon successful completion 0 is returned. Otherwise, the error code is returned. +
+
+

+libzip(3), + zip_fopen(3), + zip_fread(3), + zip_fseek(3) +
+
+

+zip_fclose() was added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_fclose.man b/deps/libzip/man/zip_fclose.man new file mode 100644 index 00000000000000..e27cebd4ea75ce --- /dev/null +++ b/deps/libzip/man/zip_fclose.man @@ -0,0 +1,70 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fclose.mdoc -- close file in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FCLOSE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fclose\fR +\- close file in zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_fclose\fR(\fIzip_file_t\ *file\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_fclose\fR() +function closes +\fIfile\fR +and frees the memory allocated for it. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, the error code is returned. +.SH "SEE ALSO" +libzip(3), +zip_fopen(3), +zip_fread(3), +zip_fseek(3) +.SH "HISTORY" +\fBzip_fclose\fR() +was added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_fclose.mdoc b/deps/libzip/man/zip_fclose.mdoc new file mode 100644 index 00000000000000..561d37d55f4ed0 --- /dev/null +++ b/deps/libzip/man/zip_fclose.mdoc @@ -0,0 +1,65 @@ +.\" zip_fclose.mdoc -- close file in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FCLOSE 3 +.Os +.Sh NAME +.Nm zip_fclose +.Nd close file in zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_fclose "zip_file_t *file" +.Sh DESCRIPTION +The +.Fn zip_fclose +function closes +.Ar file +and frees the memory allocated for it. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, the error code is returned. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fopen 3 , +.Xr zip_fread 3 , +.Xr zip_fseek 3 +.Sh HISTORY +.Fn zip_fclose +was added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_fdopen.html b/deps/libzip/man/zip_fdopen.html new file mode 100644 index 00000000000000..14b5a2a36d6e1a --- /dev/null +++ b/deps/libzip/man/zip_fdopen.html @@ -0,0 +1,156 @@ + + + + + + + ZIP_FDOPEN(3) + + + + + + + + +
ZIP_FDOPEN(3)Library Functions ManualZIP_FDOPEN(3)
+
+
+

+zip_fdopen — +
open zip archive using open file descriptor
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_t * +
+ zip_fdopen(int + fd, int flags, + int *errorp);

+
+
+

+The zip archive specified by the open file descriptor fd + is opened and a pointer to a struct zip, used to + manipulate the archive, is returned. In contrast to + zip_open(3), using + zip_fdopen the archive can only be opened in read-only + mode. The fd argument may not be used any longer after + calling zip_fdopen. The flags + are specified by or'ing the + following values, or 0 for none of them. +
+
+
+
Perform additional stricter consistency checks on the archive, and error + if they fail.
+
+
+

If an error occurs and errorp is + non-NULL, it will be set to + the corresponding error code.

+
+
+

+Upon successful completion zip_fdopen() returns a + struct zip pointer, and fd should + not be used any longer, nor passed to + close(2). Otherwise, + NULL is returned and *errorp is + set to indicate the error. In the error case, fd remains + unchanged. +
+
+

+The file specified by fd is prepared for use by + libzip(3) unless: +
+
[]
+
Inconsistencies were found in the file specified by + path. This error is often caused by specifying + ZIP_CHECKCONS but can also happen without it.
+
[]
+
The flags argument is invalid. Not all + zip_open(3) flags are allowed for + zip_fdopen, see + DESCRIPTION.
+
[]
+
Required memory could not be allocated.
+
[]
+
The file specified by fd is not a zip archive.
+
[]
+
The file specified by fd could not be prepared for + use by libzip(3).
+
[]
+
This functionality has been disabled at compile time.
+
[]
+
A read error occurred; see errno for details.
+
[]
+
The file specified by fd does not allow seeks.
+
+
+
+

+libzip(3), + zip_close(3), + zip_error_strerror(3), + zip_open(3) +
+
+

+zip_fdopen() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 23, 2022NiH
+ + diff --git a/deps/libzip/man/zip_fdopen.man b/deps/libzip/man/zip_fdopen.man new file mode 100644 index 00000000000000..1f25d2d5ed4be1 --- /dev/null +++ b/deps/libzip/man/zip_fdopen.man @@ -0,0 +1,162 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fdopen.mdoc -- open zip archive using existing file descriptor +.\" Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FDOPEN" "3" "September 23, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fdopen\fR +\- open zip archive using open file descriptor +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_fdopen\fR(\fIint\ fd\fR, \fIint\ flags\fR, \fIint\ *errorp\fR); +.PD +.SH "DESCRIPTION" +The zip archive specified by the open file descriptor +\fIfd\fR +is opened and a pointer to a +\fIstruct zip\fR, +used to manipulate the archive, is returned. +In contrast to +zip_open(3), +using +\fBzip_fdopen\fR +the archive can only be opened in read-only mode. +The +\fIfd\fR +argument may not be used any longer after calling +\fBzip_fdopen\fR. +The +\fIflags\fR +are specified by +\fIor\fR'ing +the following values, or 0 for none of them. +.RS 6n +.TP 15n +\fRZIP_CHECKCONS\fR +Perform additional stricter consistency checks on the archive, and +error if they fail. +.RE +.PP +If an error occurs and +\fIerrorp\fR +is +non-\fRNULL\fR, +it will be set to the corresponding error code. +.SH "RETURN VALUES" +Upon successful completion +\fBzip_fdopen\fR() +returns a +\fIstruct zip\fR +pointer, and +\fIfd\fR +should not be used any longer, nor passed to +close(2). +Otherwise, +\fRNULL\fR +is returned and +\fI*errorp\fR +is set to indicate the error. +In the error case, +\fIfd\fR +remains unchanged. +.SH "ERRORS" +The file specified by +\fIfd\fR +is prepared for use by +libzip(3) +unless: +.TP 19n +[\fRZIP_ER_INCONS\fR] +Inconsistencies were found in the file specified by +\fIpath\fR. +This error is often caused by specifying +\fRZIP_CHECKCONS\fR +but can also happen without it. +.TP 19n +[\fRZIP_ER_INVAL\fR] +The +\fIflags\fR +argument is invalid. +Not all +zip_open(3) +flags are allowed for +\fBzip_fdopen\fR, +see +\fIDESCRIPTION\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_NOZIP\fR] +The file specified by +\fIfd\fR +is not a zip archive. +.TP 19n +[\fRZIP_ER_OPEN\fR] +The file specified by +\fIfd\fR +could not be prepared for use by +libzip(3). +.TP 19n +[\fRZIP_ER_OPNOTSUPP\fR] +.br +This functionality has been disabled at compile time. +.TP 19n +[\fRZIP_ER_READ\fR] +A read error occurred; see +\fIerrno\fR +for details. +.TP 19n +[\fRZIP_ER_SEEK\fR] +The file specified by +\fIfd\fR +does not allow seeks. +.SH "SEE ALSO" +libzip(3), +zip_close(3), +zip_error_strerror(3), +zip_open(3) +.SH "HISTORY" +\fBzip_fdopen\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_fdopen.mdoc b/deps/libzip/man/zip_fdopen.mdoc new file mode 100644 index 00000000000000..ae6f9e2943facf --- /dev/null +++ b/deps/libzip/man/zip_fdopen.mdoc @@ -0,0 +1,149 @@ +.\" zip_fdopen.mdoc -- open zip archive using existing file descriptor +.\" Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 23, 2022 +.Dt ZIP_FDOPEN 3 +.Os +.Sh NAME +.Nm zip_fdopen +.Nd open zip archive using open file descriptor +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_t * +.Fn zip_fdopen "int fd" "int flags" "int *errorp" +.Sh DESCRIPTION +The zip archive specified by the open file descriptor +.Ar fd +is opened and a pointer to a +.Ft struct zip , +used to manipulate the archive, is returned. +In contrast to +.Xr zip_open 3 , +using +.Nm zip_fdopen +the archive can only be opened in read-only mode. +The +.Ar fd +argument may not be used any longer after calling +.Nm zip_fdopen . +The +.Fa flags +are specified by +.Em or Ns No 'ing +the following values, or 0 for none of them. +.Bl -tag -offset indent -width ZIP_CHECKCONS +.It Dv ZIP_CHECKCONS +Perform additional stricter consistency checks on the archive, and +error if they fail. +.El +.Pp +If an error occurs and +.Ar errorp +is +.No non- Ns Dv NULL , +it will be set to the corresponding error code. +.Sh RETURN VALUES +Upon successful completion +.Fn zip_fdopen +returns a +.Ft struct zip +pointer, and +.Ar fd +should not be used any longer, nor passed to +.Xr close 2 . +Otherwise, +.Dv NULL +is returned and +.Ar *errorp +is set to indicate the error. +In the error case, +.Ar fd +remains unchanged. +.Sh ERRORS +The file specified by +.Ar fd +is prepared for use by +.Xr libzip 3 +unless: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INCONS +Inconsistencies were found in the file specified by +.Ar path . +This error is often caused by specifying +.Dv ZIP_CHECKCONS +but can also happen without it. +.It Bq Er ZIP_ER_INVAL +The +.Ar flags +argument is invalid. +Not all +.Xr zip_open 3 +flags are allowed for +.Nm zip_fdopen , +see +.Sx DESCRIPTION . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_NOZIP +The file specified by +.Ar fd +is not a zip archive. +.It Bq Er ZIP_ER_OPEN +The file specified by +.Ar fd +could not be prepared for use by +.Xr libzip 3 . +.It Bq Er ZIP_ER_OPNOTSUPP +This functionality has been disabled at compile time. +.It Bq Er ZIP_ER_READ +A read error occurred; see +.Va errno +for details. +.It Bq Er ZIP_ER_SEEK +The file specified by +.Ar fd +does not allow seeks. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 , +.Xr zip_error_strerror 3 , +.Xr zip_open 3 +.Sh HISTORY +.Fn zip_fdopen +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_add.html b/deps/libzip/man/zip_file_add.html new file mode 100644 index 00000000000000..1eda5aa152eae2 --- /dev/null +++ b/deps/libzip/man/zip_file_add.html @@ -0,0 +1,178 @@ + + + + + + + ZIP_FILE_ADD(3) + + + + + + + + +
ZIP_FILE_ADD(3)Library Functions ManualZIP_FILE_ADD(3)
+
+
+

+zip_file_add, zip_file_replace + — +
add file to zip archive or replace file in zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_file_add(zip_t + *archive, const char + *name, zip_source_t + *source, zip_flags_t + flags);

+

int +
+ zip_file_replace(zip_t + *archive, zip_uint64_t + index, zip_source_t + *source, zip_flags_t + flags);

+
+
+

+The function zip_file_add() adds a file to a zip + archive, while zip_file_replace() replaces an existing + file in a zip archive. The argument archive specifies + the zip archive to which the file should be added. name + is the file's name in the zip archive (for + zip_file_add()), while index + specifies which file should be replaced (for + zip_file_replace()). The flags + argument can be any combination of ZIP_FL_OVERWRITE + with one of ZIP_FL_ENC_*: +
+
+
Overwrite any existing file of the same name. For + zip_file_add only.
+
+
Guess encoding of name (default). (Only CP-437 and + UTF-8 are recognized.)
+
+
Interpret name as UTF-8.
+
+
Interpret name as code page 437 (CP-437).
+
+The data is obtained from the source argument, see + zip_source(3). +

NOTE: + zip_source_free(3) should not + be called on a source after it was used successfully + in a zip_file_add or + zip_file_replace call.

+
+
+

+Upon successful completion, zip_file_add() returns the + index of the new file in the archive, and + zip_file_replace() returns 0. Otherwise, -1 is + returned and the error code in archive is set to + indicate the error. +
+
+

+
+
+zip_source_t *s;
+const char buf[]="teststring";
+
+if ((s=zip_source_buffer(archive, buf, sizeof(buf), 0)) == NULL ||
+    zip_file_add(archive, name, s, ZIP_FL_ENC_UTF_8) < 0) {
+    zip_source_free(s);
+    printf("error adding file: %s\n", zip_strerror(archive));
+}
+
+
+
+
+

+zip_file_add() and + zip_file_replace() fail if: +
+
[]
+
There is already a file called name in the archive. + (Only applies to zip_file_add(), and only if + ZIP_FL_OVERWRITE is not provided).
+
[]
+
source or name are + NULL, or index is + invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
Archive was opened in read-only mode.
+
+
+
+

+libzip(3), + zip_source(3) +
+
+

+zip_file_add() and + zip_file_replace() were added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 22, 2020NiH
+ + diff --git a/deps/libzip/man/zip_file_add.man b/deps/libzip/man/zip_file_add.man new file mode 100644 index 00000000000000..f9ecb961465f99 --- /dev/null +++ b/deps/libzip/man/zip_file_add.man @@ -0,0 +1,183 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_add.mdoc -- add files to zip archive +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_ADD" "3" "September 22, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_add\fR, +\fBzip_file_replace\fR +\- add file to zip archive or replace file in zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_file_add\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *name\fR, \fIzip_source_t\ *source\fR, \fIzip_flags_t\ flags\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_replace\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_source_t\ *source\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_file_add\fR() +adds a file to a zip archive, while +\fBzip_file_replace\fR() +replaces an existing file in a zip archive. +The argument +\fIarchive\fR +specifies the zip archive to which the file should be added. +\fIname\fR +is the file's name in the zip archive (for +\fBzip_file_add\fR()), +while +\fIindex\fR +specifies which file should be replaced (for +\fBzip_file_replace\fR()). +The +\fIflags\fR +argument can be any combination of +\fRZIP_FL_OVERWRITE\fR +with one of +\fRZIP_FL_ENC_*\fR: +.TP 22n +\fRZIP_FL_OVERWRITE\fR +Overwrite any existing file of the same name. +For +\fBzip_file_add\fR +only. +.TP 22n +\fRZIP_FL_ENC_GUESS\fR +Guess encoding of +\fIname\fR +(default). +(Only CP-437 and UTF-8 are recognized.) +.TP 22n +\fRZIP_FL_ENC_UTF_8\fR +Interpret +\fIname\fR +as UTF-8. +.TP 22n +\fRZIP_FL_ENC_CP437\fR +Interpret +\fIname\fR +as code page 437 (CP-437). +.PD 0 +.PP +The data is obtained from the +\fIsource\fR +argument, see +zip_source(3). +.PD +.PP +\fINOTE\fR: +zip_source_free(3) +should not be called on a +\fIsource\fR +after it was used successfully in a +\fBzip_file_add\fR +or +\fBzip_file_replace\fR +call. +.SH "RETURN VALUES" +Upon successful completion, +\fBzip_file_add\fR() +returns the index of the new file in the archive, and +\fBzip_file_replace\fR() +returns 0. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "EXAMPLES" +.nf +.RS 6n +zip_source_t *s; +const char buf[]="teststring"; + +if ((s=zip_source_buffer(archive, buf, sizeof(buf), 0)) == NULL || + zip_file_add(archive, name, s, ZIP_FL_ENC_UTF_8) < 0) { + zip_source_free(s); + printf("error adding file: %s\en", zip_strerror(archive)); +} +.RE +.fi +.SH "ERRORS" +\fBzip_file_add\fR() +and +\fBzip_file_replace\fR() +fail if: +.TP 19n +[\fRZIP_ER_EXISTS\fR] +There is already a file called +\fIname\fR +in the archive. +(Only applies to +\fBzip_file_add\fR(), +and only if +\fRZIP_FL_OVERWRITE\fR +is not provided). +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIsource\fR +or +\fIname\fR +are +\fRNULL\fR, +or +\fIindex\fR +is invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_RDONLY\fR] +Archive was opened in read-only mode. +.SH "SEE ALSO" +libzip(3), +zip_source(3) +.SH "HISTORY" +\fBzip_file_add\fR() +and +\fBzip_file_replace\fR() +were added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_add.mdoc b/deps/libzip/man/zip_file_add.mdoc new file mode 100644 index 00000000000000..aace5d50d185d6 --- /dev/null +++ b/deps/libzip/man/zip_file_add.mdoc @@ -0,0 +1,164 @@ +.\" zip_file_add.mdoc -- add files to zip archive +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 22, 2020 +.Dt ZIP_FILE_ADD 3 +.Os +.Sh NAME +.Nm zip_file_add , +.Nm zip_file_replace +.Nd add file to zip archive or replace file in zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_file_add "zip_t *archive" "const char *name" "zip_source_t *source" "zip_flags_t flags" +.Ft int +.Fn zip_file_replace "zip_t *archive" "zip_uint64_t index" "zip_source_t *source" "zip_flags_t flags" +.Sh DESCRIPTION +The function +.Fn zip_file_add +adds a file to a zip archive, while +.Fn zip_file_replace +replaces an existing file in a zip archive. +The argument +.Ar archive +specifies the zip archive to which the file should be added. +.Ar name +is the file's name in the zip archive (for +.Fn zip_file_add ) , +while +.Ar index +specifies which file should be replaced (for +.Fn zip_file_replace ) . +The +.Ar flags +argument can be any combination of +.Dv ZIP_FL_OVERWRITE +with one of +.Dv ZIP_FL_ENC_* : +.Bl -tag -width XZIPXFLXENCXSTRICTXX +.It Dv ZIP_FL_OVERWRITE +Overwrite any existing file of the same name. +For +.Nm zip_file_add +only. +.It Dv ZIP_FL_ENC_GUESS +Guess encoding of +.Ar name +(default). +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_UTF_8 +Interpret +.Ar name +as UTF-8. +.It Dv ZIP_FL_ENC_CP437 +Interpret +.Ar name +as code page 437 (CP-437). +.El +The data is obtained from the +.Ar source +argument, see +.Xr zip_source 3 . +.Pp +.Em NOTE : +.Xr zip_source_free 3 +should not be called on a +.Ar source +after it was used successfully in a +.Nm zip_file_add +or +.Nm zip_file_replace +call. +.Sh RETURN VALUES +Upon successful completion, +.Fn zip_file_add +returns the index of the new file in the archive, and +.Fn zip_file_replace +returns 0. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh EXAMPLES +.Bd -literal -offset indent +zip_source_t *s; +const char buf[]="teststring"; + +if ((s=zip_source_buffer(archive, buf, sizeof(buf), 0)) == NULL || + zip_file_add(archive, name, s, ZIP_FL_ENC_UTF_8) < 0) { + zip_source_free(s); + printf("error adding file: %s\en", zip_strerror(archive)); +} +.Ed +.Sh ERRORS +.Fn zip_file_add +and +.Fn zip_file_replace +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_EXISTS +There is already a file called +.Ar name +in the archive. +(Only applies to +.Fn zip_file_add , +and only if +.Dv ZIP_FL_OVERWRITE +is not provided). +.It Bq Er ZIP_ER_INVAL +.Ar source +or +.Ar name +are +.Dv NULL , +or +.Ar index +is invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_RDONLY +Archive was opened in read-only mode. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_file_add +and +.Fn zip_file_replace +were added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_attributes_init.html b/deps/libzip/man/zip_file_attributes_init.html new file mode 100644 index 00000000000000..f2195094e70e37 --- /dev/null +++ b/deps/libzip/man/zip_file_attributes_init.html @@ -0,0 +1,97 @@ + + + + + + + ZIP_FILE_ATTRIBUTES_INIT(3) + + + + + + + + +
ZIP_FILE_ATTRIBUTES_INIT(3)Library Functions ManualZIP_FILE_ATTRIBUTES_INIT(3)
+
+
+

+zip_file_attributes_init — +
initialize zip file attributes structure
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_file_attributes_init(zip_file_attributes_t + *attributes);

+
+
+

+The zip_file_attributes_init() initializes a + zip_file_attributes_t structure with default values. It + must be called before modifying such a structure for the first time. +
+
+

+libzip(3), + zip_source_function(3) +
+
+

+zip_file_attributes_init() was added in libzip 1.7.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 17, 2020NiH
+ + diff --git a/deps/libzip/man/zip_file_attributes_init.man b/deps/libzip/man/zip_file_attributes_init.man new file mode 100644 index 00000000000000..7c72d605a2a326 --- /dev/null +++ b/deps/libzip/man/zip_file_attributes_init.man @@ -0,0 +1,66 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_attributes_init.mdoc -- initialize attributes structure +.\" Copyright (C) 2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_ATTRIBUTES_INIT" "3" "April 17, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_attributes_init\fR +\- initialize zip file attributes structure +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_file_attributes_init\fR(\fIzip_file_attributes_t\ *attributes\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_attributes_init\fR() +initializes a +\fIzip_file_attributes_t\fR +structure with default values. +It must be called before modifying such a structure for the first time. +.SH "SEE ALSO" +libzip(3), +zip_source_function(3) +.SH "HISTORY" +\fBzip_file_attributes_init\fR() +was added in libzip 1.7.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_attributes_init.mdoc b/deps/libzip/man/zip_file_attributes_init.mdoc new file mode 100644 index 00000000000000..bb6a8f6a52447e --- /dev/null +++ b/deps/libzip/man/zip_file_attributes_init.mdoc @@ -0,0 +1,61 @@ +.\" zip_file_attributes_init.mdoc -- initialize attributes structure +.\" Copyright (C) 2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 17, 2020 +.Dt ZIP_FILE_ATTRIBUTES_INIT 3 +.Os +.Sh NAME +.Nm zip_file_attributes_init +.Nd initialize zip file attributes structure +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_file_attributes_init "zip_file_attributes_t *attributes" +.Sh DESCRIPTION +The +.Fn zip_file_attributes_init +initializes a +.Vt zip_file_attributes_t +structure with default values. +It must be called before modifying such a structure for the first time. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source_function 3 +.Sh HISTORY +.Fn zip_file_attributes_init +was added in libzip 1.7.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_extra_field_delete.html b/deps/libzip/man/zip_file_extra_field_delete.html new file mode 100644 index 00000000000000..0b93bd93629db1 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_delete.html @@ -0,0 +1,159 @@ + + + + + + + ZIP_FILE_EXTRA_FIELD_DELETE(3) + + + + + + + + +
ZIP_FILE_EXTRA_FIELD_DELETE(3)Library Functions ManualZIP_FILE_EXTRA_FIELD_DELETE(3)
+
+
+

+zip_file_extra_field_delete, + zip_file_extra_field_delete_by_id — +
delete extra field for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_extra_field_delete(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + extra_field_index, + zip_flags_t flags);

+

int +
+ zip_file_extra_field_delete_by_id(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + extra_field_id, + zip_uint16_t + extra_field_index, + zip_flags_t flags);

+
+
+

+The zip_file_extra_field_delete() function deletes the + extra field with index extra_field_index for the file at + position index in the zip archive. +

If extra_field_index is + ZIP_EXTRA_FIELD_ALL, then all extra fields will be + deleted.

+

The following flags are supported:

+
+
+
+
Delete extra fields from the archive's central directory.
+
+
Delete extra fields from the local file headers.
+
+
+

The zip_file_extra_field_delete_by_id() + function deletes the extra field with ID (two-byte signature) + extra_field_id and index + extra_field_index (in other words, the + extra_field_index'th extra + field with ID extra_field_id) The other arguments are + the same as for zip_file_extra_field_delete() + (ZIP_EXTRA_FIELD_ALL will delete all extra fields of + the specified ID).

+

Please note that due to the library design, the index of an extra + field may be different between central directory and local file headers. For + this reason, it is not allowed to specify both + ZIP_FL_CENTRAL and + ZIP_FL_LOCAL in flags, except + when deleting all extra fields (i.e., + extra_field_index being + ZIP_EXTRA_FIELD_ALL).

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+zip_file_extra_field_delete() and + zip_file_extra_field_delete_by_id() fail if: +
+
[]
+
index is not a valid file index in + archive.
+
+
+
+

+libzip(3), + zip_file_extra_field_get(3), + zip_file_extra_field_set(3), + zip_file_extra_fields_count(3) +
+
+

+zip_file_extra_field_delete() and + zip_file_extra_field_delete_by_id() were added in + libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_extra_field_delete.man b/deps/libzip/man/zip_file_extra_field_delete.man new file mode 100644 index 00000000000000..6d173325eeede4 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_delete.man @@ -0,0 +1,141 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_extra_field_delete.mdoc -- delete extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_EXTRA_FIELD_DELETE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_extra_field_delete\fR, +\fBzip_file_extra_field_delete_by_id\fR +\- delete extra field for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_field_delete\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ extra_field_index\fR, \fIzip_flags_t\ flags\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_field_delete_by_id\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ extra_field_id\fR, \fIzip_uint16_t\ extra_field_index\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_extra_field_delete\fR() +function deletes the extra field with index +\fIextra_field_index\fR +for the file at position +\fIindex\fR +in the zip archive. +.PP +If +\fIextra_field_index\fR +is +\fRZIP_EXTRA_FIELD_ALL\fR, +then all extra fields will be deleted. +.PP +The following +\fIflags\fR +are supported: +.RS 6n +.TP 18n +\fRZIP_FL_CENTRAL\fR +Delete extra fields from the archive's central directory. +.TP 18n +\fRZIP_FL_LOCAL\fR +Delete extra fields from the local file headers. +.RE +.PP +The +\fBzip_file_extra_field_delete_by_id\fR() +function deletes the extra field with ID (two-byte signature) +\fIextra_field_id\fR +and index +\fIextra_field_index\fR +(in other words, the +\fIextra_field_index\fR'th +extra field with ID +\fIextra_field_id\fR) +The other arguments are the same as for +\fBzip_file_extra_field_delete\fR() +(\fRZIP_EXTRA_FIELD_ALL\fR +will delete all extra fields of the specified ID). +.PP +Please note that due to the library design, the index of an extra +field may be different between central directory and local file +headers. +For this reason, it is not allowed to specify both +\fRZIP_FL_CENTRAL\fR +and +\fRZIP_FL_LOCAL\fR +in +\fIflags\fR, +except when deleting all extra fields (i.e., +\fIextra_field_index\fR +being +\fRZIP_EXTRA_FIELD_ALL\fR). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_extra_field_delete\fR() +and +\fBzip_file_extra_field_delete_by_id\fR() +fail if: +.TP 19n +[\fRZIP_ER_NOENT\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_file_extra_field_get(3), +zip_file_extra_field_set(3), +zip_file_extra_fields_count(3) +.SH "HISTORY" +\fBzip_file_extra_field_delete\fR() +and +\fBzip_file_extra_field_delete_by_id\fR() +were added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_extra_field_delete.mdoc b/deps/libzip/man/zip_file_extra_field_delete.mdoc new file mode 100644 index 00000000000000..e65fdd51f31d30 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_delete.mdoc @@ -0,0 +1,130 @@ +.\" zip_file_extra_field_delete.mdoc -- delete extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_EXTRA_FIELD_DELETE 3 +.Os +.Sh NAME +.Nm zip_file_extra_field_delete , +.Nm zip_file_extra_field_delete_by_id +.Nd delete extra field for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_extra_field_delete "zip_t *archive" "zip_uint64_t index" "zip_uint16_t extra_field_index" "zip_flags_t flags" +.Ft int +.Fn zip_file_extra_field_delete_by_id "zip_t *archive" "zip_uint64_t index" "zip_uint16_t extra_field_id" "zip_uint16_t extra_field_index" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_extra_field_delete +function deletes the extra field with index +.Ar extra_field_index +for the file at position +.Ar index +in the zip archive. +.Pp +If +.Ar extra_field_index +is +.Dv ZIP_EXTRA_FIELD_ALL , +then all extra fields will be deleted. +.Pp +The following +.Ar flags +are supported: +.Bl -tag -width ZIP_FL_CENTRALXX -offset indent +.It Dv ZIP_FL_CENTRAL +Delete extra fields from the archive's central directory. +.It Dv ZIP_FL_LOCAL +Delete extra fields from the local file headers. +.El +.Pp +The +.Fn zip_file_extra_field_delete_by_id +function deletes the extra field with ID (two-byte signature) +.Ar extra_field_id +and index +.Ar extra_field_index +(in other words, the +.Ar extra_field_index Ns No 'th +extra field with ID +.Ar extra_field_id ) +The other arguments are the same as for +.Fn zip_file_extra_field_delete +.Dv ( ZIP_EXTRA_FIELD_ALL +will delete all extra fields of the specified ID). +.Pp +Please note that due to the library design, the index of an extra +field may be different between central directory and local file +headers. +For this reason, it is not allowed to specify both +.Dv ZIP_FL_CENTRAL +and +.Dv ZIP_FL_LOCAL +in +.Ar flags , +except when deleting all extra fields (i.e., +.Ar extra_field_index +being +.Dv ZIP_EXTRA_FIELD_ALL ) . +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_extra_field_delete +and +.Fn zip_file_extra_field_delete_by_id +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_NOENT +.Ar index +is not a valid file index in +.Ar archive . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_extra_field_get 3 , +.Xr zip_file_extra_field_set 3 , +.Xr zip_file_extra_fields_count 3 +.Sh HISTORY +.Fn zip_file_extra_field_delete +and +.Fn zip_file_extra_field_delete_by_id +were added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_extra_field_get.html b/deps/libzip/man/zip_file_extra_field_get.html new file mode 100644 index 00000000000000..aa2a0667ad9f60 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_get.html @@ -0,0 +1,176 @@ + + + + + + + ZIP_FILE_EXTRA_FIELD_GET(3) + + + + + + + + +
ZIP_FILE_EXTRA_FIELD_GET(3)Library Functions ManualZIP_FILE_EXTRA_FIELD_GET(3)
+
+
+

+zip_file_extra_field_get, + zip_file_extra_field_get_by_id — +
get extra field for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const zip_uint8_t * +
+ zip_file_extra_field_get(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + extra_field_index, + zip_uint16_t *idp, + zip_uint16_t *lenp, + zip_flags_t flags);

+

const zip_uint8_t * +
+ zip_file_extra_field_get_by_id(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + extra_field_id, + zip_uint16_t + extra_field_index, + zip_uint16_t *lenp, + zip_flags_t flags);

+
+
+

+The zip_file_extra_field_get() function returns the + extra field with index extra_field_index for the file at + position index in the zip archive. This pointer should + not be modified or free(3)'d, and becomes + invalid when archive is closed. If + idp is not NULL, the integer to + which it points will be set to the ID (two-byte signature) of the selected + extra field. If lenp is not + NULL, the integer to which it points will be set to + the length of the extra field. Generally speaking, lenp + and idp should be passed since only the extra field data + is returned (i.e., neither the ID nor the length, if the + idp and lenp arguments are not + provided). +

The following flags are supported:

+
+
+
+
Return extra fields from the archive's central directory.
+
+
Return extra fields from the local file headers.
+
+
Return the original unchanged extra fields, ignoring any changes + made.
+
+
+

The zip_file_extra_field_get_by_id() + function returns the extra field with ID (two-byte signature) + extra_field_id and index + extra_field_index (in other words, the + extra_field_index'th extra + field with ID extra_field_id) The other arguments are + the same as for zip_file_extra_field_get().

+
+
+

+Upon successful completion, a pointer to an extra field is returned, or + NULL if there is no extra field with that + extra_field_index for the file with index + index. In case of an error, NULL + is returned and the error code in archive is set to + indicate the error. +
+
+

+zip_file_extra_field_get() and + zip_file_extra_field_get_by_id() fail if: +
+
[]
+
index is not a valid file index in + archive, or extra_field_index + is not a valid extra file index (for ID + extra_field_id).
+
+
+
+

+libzip(3), + zip_file_extra_field_delete(3), + zip_file_extra_field_set(3), + zip_file_extra_fields_count(3) +
+
+

+zip_file_extra_field_get() and + zip_file_extra_field_get_by_id() were added in libzip + 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+

+Please note that the extra field IDs 0x0001 (ZIP64 extension), 0x6375 (Infozip + UTF-8 comment), and 0x7075 (Infozip UTF-8 file name) can not be read using + zip_file_extra_field_get() since they are used by + libzip(3) internally. +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_extra_field_get.man b/deps/libzip/man/zip_file_extra_field_get.man new file mode 100644 index 00000000000000..b3a472d2c8fb2b --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_get.man @@ -0,0 +1,169 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_extra_field_get.mdoc -- get extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_EXTRA_FIELD_GET" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_extra_field_get\fR, +\fBzip_file_extra_field_get_by_id\fR +\- get extra field for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst zip_uint8_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_field_get\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ extra_field_index\fR, \fIzip_uint16_t\ *idp\fR, \fIzip_uint16_t\ *lenp\fR, \fIzip_flags_t\ flags\fR); +.PD +.PP +\fIconst zip_uint8_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_field_get_by_id\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ extra_field_id\fR, \fIzip_uint16_t\ extra_field_index\fR, \fIzip_uint16_t\ *lenp\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_extra_field_get\fR() +function returns the extra field with index +\fIextra_field_index\fR +for the file at position +\fIindex\fR +in the zip archive. +This pointer should not be modified or +free(3)'d, +and becomes invalid when +\fIarchive\fR +is closed. +If +\fIidp\fR +is not +\fRNULL\fR, +the integer to which it points will be set to the ID (two-byte +signature) of the selected extra field. +If +\fIlenp\fR +is not +\fRNULL\fR, +the integer to which it points will be set to the length of the +extra field. +Generally speaking, +\fIlenp\fR +and +\fIidp\fR +should be passed since only the extra field data is returned (i.e., +neither the ID nor the length, if the +\fIidp\fR +and +\fIlenp\fR +arguments are not provided). +.PP +The following +\fIflags\fR +are supported: +.RS 6n +.TP 20n +\fRZIP_FL_CENTRAL\fR +Return extra fields from the archive's central directory. +.TP 20n +\fRZIP_FL_LOCAL\fR +Return extra fields from the local file headers. +.TP 20n +\fRZIP_FL_UNCHANGED\fR +Return the original unchanged extra fields, ignoring any changes made. +.RE +.PP +The +\fBzip_file_extra_field_get_by_id\fR() +function returns the extra field with ID (two-byte signature) +\fIextra_field_id\fR +and index +\fIextra_field_index\fR +(in other words, the +\fIextra_field_index\fR'th +extra field with ID +\fIextra_field_id\fR) +The other arguments are the same as for +\fBzip_file_extra_field_get\fR(). +.SH "RETURN VALUES" +Upon successful completion, a pointer to an extra field is returned, +or +\fRNULL\fR +if there is no extra field with that +\fIextra_field_index\fR +for the file with index +\fIindex\fR. +In case of an error, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_extra_field_get\fR() +and +\fBzip_file_extra_field_get_by_id\fR() +fail if: +.TP 19n +[\fRZIP_ER_NOENT\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR, +or +\fIextra_field_index\fR +is not a valid extra file index (for ID +\fIextra_field_id\fR). +.SH "SEE ALSO" +libzip(3), +zip_file_extra_field_delete(3), +zip_file_extra_field_set(3), +zip_file_extra_fields_count(3) +.SH "HISTORY" +\fBzip_file_extra_field_get\fR() +and +\fBzip_file_extra_field_get_by_id\fR() +were added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> +.SH "CAVEATS" +Please note that the extra field IDs 0x0001 (ZIP64 extension), +0x6375 (Infozip UTF-8 comment), and +0x7075 (Infozip UTF-8 file name) can not be read using +\fBzip_file_extra_field_get\fR() +since they are used by +libzip(3) +internally. diff --git a/deps/libzip/man/zip_file_extra_field_get.mdoc b/deps/libzip/man/zip_file_extra_field_get.mdoc new file mode 100644 index 00000000000000..ee48c2ac20f234 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_get.mdoc @@ -0,0 +1,157 @@ +.\" zip_file_extra_field_get.mdoc -- get extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_EXTRA_FIELD_GET 3 +.Os +.Sh NAME +.Nm zip_file_extra_field_get , +.Nm zip_file_extra_field_get_by_id +.Nd get extra field for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const zip_uint8_t * +.Fn zip_file_extra_field_get "zip_t *archive" "zip_uint64_t index" "zip_uint16_t extra_field_index" "zip_uint16_t *idp" "zip_uint16_t *lenp" "zip_flags_t flags" +.Ft const zip_uint8_t * +.Fn zip_file_extra_field_get_by_id "zip_t *archive" "zip_uint64_t index" "zip_uint16_t extra_field_id" "zip_uint16_t extra_field_index" "zip_uint16_t *lenp" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_extra_field_get +function returns the extra field with index +.Ar extra_field_index +for the file at position +.Ar index +in the zip archive. +This pointer should not be modified or +.Xr free 3 Ap d , +and becomes invalid when +.Ar archive +is closed. +If +.Ar idp +is not +.Dv NULL , +the integer to which it points will be set to the ID (two-byte +signature) of the selected extra field. +If +.Ar lenp +is not +.Dv NULL , +the integer to which it points will be set to the length of the +extra field. +Generally speaking, +.Ar lenp +and +.Ar idp +should be passed since only the extra field data is returned (i.e., +neither the ID nor the length, if the +.Ar idp +and +.Ar lenp +arguments are not provided). +.Pp +The following +.Ar flags +are supported: +.Bl -tag -width ZIP_FL_UNCHANGEDXX -offset indent +.It Dv ZIP_FL_CENTRAL +Return extra fields from the archive's central directory. +.It Dv ZIP_FL_LOCAL +Return extra fields from the local file headers. +.It Dv ZIP_FL_UNCHANGED +Return the original unchanged extra fields, ignoring any changes made. +.El +.Pp +The +.Fn zip_file_extra_field_get_by_id +function returns the extra field with ID (two-byte signature) +.Ar extra_field_id +and index +.Ar extra_field_index +(in other words, the +.Ar extra_field_index Ns No 'th +extra field with ID +.Ar extra_field_id ) +The other arguments are the same as for +.Fn zip_file_extra_field_get . +.Sh RETURN VALUES +Upon successful completion, a pointer to an extra field is returned, +or +.Dv NULL +if there is no extra field with that +.Ar extra_field_index +for the file with index +.Ar index . +In case of an error, +.Dv NULL +is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_extra_field_get +and +.Fn zip_file_extra_field_get_by_id +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_NOENT +.Ar index +is not a valid file index in +.Ar archive , +or +.Ar extra_field_index +is not a valid extra file index (for ID +.Ar extra_field_id ) . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_extra_field_delete 3 , +.Xr zip_file_extra_field_set 3 , +.Xr zip_file_extra_fields_count 3 +.Sh HISTORY +.Fn zip_file_extra_field_get +and +.Fn zip_file_extra_field_get_by_id +were added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at +.Sh CAVEATS +Please note that the extra field IDs 0x0001 (ZIP64 extension), +0x6375 (Infozip UTF-8 comment), and +0x7075 (Infozip UTF-8 file name) can not be read using +.Fn zip_file_extra_field_get +since they are used by +.Xr libzip 3 +internally. diff --git a/deps/libzip/man/zip_file_extra_field_set.html b/deps/libzip/man/zip_file_extra_field_set.html new file mode 100644 index 00000000000000..d672974bdd6de3 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_set.html @@ -0,0 +1,148 @@ + + + + + + + ZIP_FILE_EXTRA_FIELD_SET(3) + + + + + + + + +
ZIP_FILE_EXTRA_FIELD_SET(3)Library Functions ManualZIP_FILE_EXTRA_FIELD_SET(3)
+
+
+

+zip_file_extra_field_set — +
set extra field for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_extra_field_set(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + extra_field_id, + zip_uint16_t + extra_field_index, const + zip_uint8_t *extra_field_data, + zip_uint16_t len, + zip_flags_t flags);

+
+
+

+The zip_file_extra_field_set() function sets the extra + field with ID (two-byte signature) extra_field_id and + index extra_field_index for the file at position + index in the zip archive. The extra field's data will be + set to extra_field_data and length + len. If a new entry shall be appended, set + extra_field_index to + ZIP_EXTRA_FIELD_NEW. +

At least one of the following flags must be + set:

+
+
+
+
Set extra field in the archive's central directory.
+
+
Set extra field in the local file headers.
+
+
+

Please note that the extra field IDs 0x0001 (ZIP64 extension), + 0x6375 (Infozip UTF-8 comment), and 0x7075 (Infozip UTF-8 file name) can not + be set using zip_file_extra_field_set() since they + are set by libzip(3) automatically when + needed.

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+zip_file_extra_field_set() fails if: +
+
[]
+
The extra field size is too large (ID and length need 4 bytes; the maximum + length of all extra fields for one file combined is 65536 bytes). This + error also occurs if extra_field_index is too + large.
+
[]
+
Required memory could not be allocated.
+
[]
+
index is not a valid file index in + archive.
+
+
+
+

+libzip(3), + zip_file_extra_field_delete(3), + zip_file_extra_field_get(3), + zip_file_extra_fields_count(3) +
+
+

+zip_file_extra_field_set() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_extra_field_set.man b/deps/libzip/man/zip_file_extra_field_set.man new file mode 100644 index 00000000000000..bb8a16eb74a877 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_set.man @@ -0,0 +1,123 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_extra_field_set.mdoc -- set extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_EXTRA_FIELD_SET" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_extra_field_set\fR +\- set extra field for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_field_set\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ extra_field_id\fR, \fIzip_uint16_t\ extra_field_index\fR, \fIconst\ zip_uint8_t\ *extra_field_data\fR, \fIzip_uint16_t\ len\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_extra_field_set\fR() +function sets the extra field with ID (two-byte signature) +\fIextra_field_id\fR +and index +\fIextra_field_index\fR +for the file at position +\fIindex\fR +in the zip archive. +The extra field's data will be set to +\fIextra_field_data\fR +and length +\fIlen\fR. +If a new entry shall be appended, set +\fIextra_field_index\fR +to +\fRZIP_EXTRA_FIELD_NEW\fR. +.PP +At least one of the following +\fIflags\fR +must be set: +.RS 6n +.TP 18n +\fRZIP_FL_CENTRAL\fR +Set extra field in the archive's central directory. +.TP 18n +\fRZIP_FL_LOCAL\fR +Set extra field in the local file headers. +.RE +.PP +Please note that the extra field IDs 0x0001 (ZIP64 extension), +0x6375 (Infozip UTF-8 comment), and +0x7075 (Infozip UTF-8 file name) can not be set using +\fBzip_file_extra_field_set\fR() +since they are set by +libzip(3) +automatically when needed. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_extra_field_set\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +The extra field size is too large (ID and length need 4 bytes; the +maximum length of all extra fields for one file combined is 65536 +bytes). +This error also occurs if +\fIextra_field_index\fR +is too large. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_NOENT\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_file_extra_field_delete(3), +zip_file_extra_field_get(3), +zip_file_extra_fields_count(3) +.SH "HISTORY" +\fBzip_file_extra_field_set\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_extra_field_set.mdoc b/deps/libzip/man/zip_file_extra_field_set.mdoc new file mode 100644 index 00000000000000..836b97d722b06c --- /dev/null +++ b/deps/libzip/man/zip_file_extra_field_set.mdoc @@ -0,0 +1,115 @@ +.\" zip_file_extra_field_set.mdoc -- set extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_EXTRA_FIELD_SET 3 +.Os +.Sh NAME +.Nm zip_file_extra_field_set +.Nd set extra field for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_extra_field_set "zip_t *archive" "zip_uint64_t index" "zip_uint16_t extra_field_id" "zip_uint16_t extra_field_index" "const zip_uint8_t *extra_field_data" "zip_uint16_t len" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_extra_field_set +function sets the extra field with ID (two-byte signature) +.Ar extra_field_id +and index +.Ar extra_field_index +for the file at position +.Ar index +in the zip archive. +The extra field's data will be set to +.Ar extra_field_data +and length +.Ar len . +If a new entry shall be appended, set +.Ar extra_field_index +to +.Dv ZIP_EXTRA_FIELD_NEW . +.Pp +At least one of the following +.Ar flags +must be set: +.Bl -tag -width ZIP_FL_CENTRALXX -offset indent +.It Dv ZIP_FL_CENTRAL +Set extra field in the archive's central directory. +.It Dv ZIP_FL_LOCAL +Set extra field in the local file headers. +.El +.Pp +Please note that the extra field IDs 0x0001 (ZIP64 extension), +0x6375 (Infozip UTF-8 comment), and +0x7075 (Infozip UTF-8 file name) can not be set using +.Fn zip_file_extra_field_set +since they are set by +.Xr libzip 3 +automatically when needed. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_extra_field_set +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +The extra field size is too large (ID and length need 4 bytes; the +maximum length of all extra fields for one file combined is 65536 +bytes). +This error also occurs if +.Ar extra_field_index +is too large. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_NOENT +.Ar index +is not a valid file index in +.Ar archive . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_extra_field_delete 3 , +.Xr zip_file_extra_field_get 3 , +.Xr zip_file_extra_fields_count 3 +.Sh HISTORY +.Fn zip_file_extra_field_set +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_extra_fields_count.html b/deps/libzip/man/zip_file_extra_fields_count.html new file mode 100644 index 00000000000000..a496b0ba1214c6 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_fields_count.html @@ -0,0 +1,149 @@ + + + + + + + ZIP_FILE_EXTRA_FIELDS_COUNT(3) + + + + + + + + +
ZIP_FILE_EXTRA_FIELDS_COUNT(3)Library Functions ManualZIP_FILE_EXTRA_FIELDS_COUNT(3)
+
+
+

+zip_file_extra_fields_count, + zip_file_extra_fields_count_by_id — +
count extra fields for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int16_t +
+ zip_file_extra_fields_count(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags);

+

zip_int16_t +
+ zip_file_extra_fields_count_by_id(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + extra_field_id, + zip_flags_t flags);

+
+
+

+The zip_file_extra_fields_count() function counts the + extra fields for the file at position index in the zip + archive. +

The following flags are supported:

+
+
+
+
Count extra fields from the archive's central directory.
+
+
Count extra fields from the local file headers.
+
+
Count the original unchanged extra fields, ignoring any changes made.
+
+
+

The zip_file_extra_fields_count_by_id() + function counts the extra fields with ID (two-byte signature) + extra_field_id. The other arguments are the same as + for zip_file_extra_fields_count().

+

Extra fields that are the same in the central directory and the + local file header are merged into one. Therefore, the counts with + ZIP_FL_CENTRAL and + ZIP_FL_LOCAL do not need to add up to the same value + as when given ZIP_FL_CENTRAL|ZIP_FL_LOCAL at the + same time.

+
+
+

+Upon successful completion, the requested number of extra fields is returned. + Otherwise, -1 is returned and the error code in archive + is set to indicate the error. +
+
+

+zip_file_extra_fields_count() and + zip_file_extra_fields_count_by_id() fail if: +
+
[]
+
index is not a valid file index in + archive.
+
+
+
+

+libzip(3), + zip_file_extra_field_delete(3), + zip_file_extra_field_get(3), + zip_file_extra_field_set(3) +
+
+

+zip_file_extra_fields_count() and + zip_file_extra_fields_count_by_id() were added in + libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_extra_fields_count.man b/deps/libzip/man/zip_file_extra_fields_count.man new file mode 100644 index 00000000000000..0e0228be341719 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_fields_count.man @@ -0,0 +1,124 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_extra_fields_count.mdoc -- count extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_EXTRA_FIELDS_COUNT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_extra_fields_count\fR, +\fBzip_file_extra_fields_count_by_id\fR +\- count extra fields for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int16_t\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_fields_count\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR); +.PD +.PP +\fIzip_int16_t\fR +.br +.PD 0 +.HP 4n +\fBzip_file_extra_fields_count_by_id\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ extra_field_id\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_extra_fields_count\fR() +function counts the extra fields for the file at position +\fIindex\fR +in the zip archive. +.PP +The following +\fIflags\fR +are supported: +.RS 6n +.TP 18n +\fRZIP_FL_CENTRAL\fR +Count extra fields from the archive's central directory. +.TP 18n +\fRZIP_FL_LOCAL\fR +Count extra fields from the local file headers. +.TP 18n +\fRZIP_FL_UNCHANGED\fR +Count the original unchanged extra fields, ignoring any changes made. +.RE +.PP +The +\fBzip_file_extra_fields_count_by_id\fR() +function counts the extra fields with ID (two-byte signature) +\fIextra_field_id\fR. +The other arguments are the same as for +\fBzip_file_extra_fields_count\fR(). +.PP +Extra fields that are the same in the central directory and the local file +header are merged into one. +Therefore, the counts with +\fRZIP_FL_CENTRAL\fR +and +\fRZIP_FL_LOCAL\fR +do not need to add up to the same value as when given +\fRZIP_FL_CENTRAL|ZIP_FL_LOCAL\fR +at the same time. +.SH "RETURN VALUES" +Upon successful completion, the requested number of extra fields is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_extra_fields_count\fR() +and +\fBzip_file_extra_fields_count_by_id\fR() +fail if: +.TP 19n +[\fRZIP_ER_NOENT\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_file_extra_field_delete(3), +zip_file_extra_field_get(3), +zip_file_extra_field_set(3) +.SH "HISTORY" +\fBzip_file_extra_fields_count\fR() +and +\fBzip_file_extra_fields_count_by_id\fR() +were added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_extra_fields_count.mdoc b/deps/libzip/man/zip_file_extra_fields_count.mdoc new file mode 100644 index 00000000000000..c9e98f764d7f31 --- /dev/null +++ b/deps/libzip/man/zip_file_extra_fields_count.mdoc @@ -0,0 +1,113 @@ +.\" zip_file_extra_fields_count.mdoc -- count extra field for file in zip +.\" Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_EXTRA_FIELDS_COUNT 3 +.Os +.Sh NAME +.Nm zip_file_extra_fields_count , +.Nm zip_file_extra_fields_count_by_id +.Nd count extra fields for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int16_t +.Fn zip_file_extra_fields_count "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" +.Ft zip_int16_t +.Fn zip_file_extra_fields_count_by_id "zip_t *archive" "zip_uint64_t index" "zip_uint16_t extra_field_id" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_extra_fields_count +function counts the extra fields for the file at position +.Ar index +in the zip archive. +.Pp +The following +.Ar flags +are supported: +.Bl -tag -width ZIP_FL_CENTRALXX -offset indent +.It Dv ZIP_FL_CENTRAL +Count extra fields from the archive's central directory. +.It Dv ZIP_FL_LOCAL +Count extra fields from the local file headers. +.It Dv ZIP_FL_UNCHANGED +Count the original unchanged extra fields, ignoring any changes made. +.El +.Pp +The +.Fn zip_file_extra_fields_count_by_id +function counts the extra fields with ID (two-byte signature) +.Ar extra_field_id . +The other arguments are the same as for +.Fn zip_file_extra_fields_count . +.Pp +Extra fields that are the same in the central directory and the local file +header are merged into one. +Therefore, the counts with +.Dv ZIP_FL_CENTRAL +and +.Dv ZIP_FL_LOCAL +do not need to add up to the same value as when given +.Dv ZIP_FL_CENTRAL|ZIP_FL_LOCAL +at the same time. +.Sh RETURN VALUES +Upon successful completion, the requested number of extra fields is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_extra_fields_count +and +.Fn zip_file_extra_fields_count_by_id +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_NOENT +.Ar index +is not a valid file index in +.Ar archive . +.\" TODO: _zip_read_local_ef errors +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_extra_field_delete 3 , +.Xr zip_file_extra_field_get 3 , +.Xr zip_file_extra_field_set 3 +.Sh HISTORY +.Fn zip_file_extra_fields_count +and +.Fn zip_file_extra_fields_count_by_id +were added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_get_comment.html b/deps/libzip/man/zip_file_get_comment.html new file mode 100644 index 00000000000000..dc31fda8fc10ba --- /dev/null +++ b/deps/libzip/man/zip_file_get_comment.html @@ -0,0 +1,143 @@ + + + + + + + ZIP_FILE_GET_COMMENT(3) + + + + + + + + +
ZIP_FILE_GET_COMMENT(3)Library Functions ManualZIP_FILE_GET_COMMENT(3)
+
+
+

+zip_file_get_comment — +
get comment for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_file_get_comment(zip_t + *archive, zip_uint64_t + index, zip_uint32_t + *lenp, zip_flags_t + flags);

+
+
+

+The zip_file_get_comment() function returns the comment + for the file at position index in the zip archive. The + name is in UTF-8 encoding unless ZIP_FL_ENC_RAW was + specified (see below). This pointer should not be modified or + free(3)'d, and becomes invalid when + archive is closed. If lenp is not + NULL, the integer to which it points will be set to + the length of the comment. If flags is set to + ZIP_FL_UNCHANGED, the original unchanged comment is + returned. +

Additionally, the following flags are + supported:

+
+
+
+
Return the unmodified comment as it is in the ZIP archive.
+
+
(Default.) Guess the encoding of the comment in the ZIP archive and + convert it to UTF-8, if necessary. (Only CP-437 and UTF-8 are + recognized.)
+
+
Follow the ZIP specification for file names and extend it to file + comments, expecting them to be encoded in CP-437 in the ZIP archive + (except if it is a UTF-8 comment from the special extra field). Convert it + to UTF-8.
+
+
+Note: ASCII is a subset of both CP-437 and UTF-8. +
+
+

+Upon successful completion, a pointer to the comment is returned, or + NULL if there is no comment. In case of an error, + NULL is returned and the error code in + archive is set to indicate the error. +
+
+

+zip_file_get_comment() fails if: +
+
[]
+
index is not a valid file index in + archive.
+
+
+
+

+libzip(3), + zip_file_set_comment(3), + zip_get_archive_comment(3) +
+
+

+zip_file_get_comment() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 22, 2020NiH
+ + diff --git a/deps/libzip/man/zip_file_get_comment.man b/deps/libzip/man/zip_file_get_comment.man new file mode 100644 index 00000000000000..bc582faff2a00f --- /dev/null +++ b/deps/libzip/man/zip_file_get_comment.man @@ -0,0 +1,126 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_get_comment.mdoc -- get comment for file in zip +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_GET_COMMENT" "3" "September 22, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_get_comment\fR +\- get comment for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_file_get_comment\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint32_t\ *lenp\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_get_comment\fR() +function returns the comment for the file at position +\fIindex\fR +in the zip archive. +The name is in UTF-8 encoding unless +\fRZIP_FL_ENC_RAW\fR +was specified (see below). +This pointer should not be modified or +free(3)'d, +and becomes invalid when +\fIarchive\fR +is closed. +If +\fIlenp\fR +is not +\fRNULL\fR, +the integer to which it points will be set to the length of the +comment. +If +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original unchanged comment is returned. +.PP +Additionally, the following +\fIflags\fR +are supported: +.RS 6n +.TP 21n +\fRZIP_FL_ENC_RAW\fR +Return the unmodified comment as it is in the ZIP archive. +.TP 21n +\fRZIP_FL_ENC_GUESS\fR +(Default.) +Guess the encoding of the comment in the ZIP archive and convert it +to UTF-8, if necessary. +(Only CP-437 and UTF-8 are recognized.) +.TP 21n +\fRZIP_FL_ENC_STRICT\fR +Follow the ZIP specification for file names and extend it to file +comments, expecting them to be encoded in CP-437 in the ZIP archive +(except if it is a UTF-8 comment from the special extra field). +Convert it to UTF-8. +.RE +\fINote\fR: +ASCII is a subset of both CP-437 and UTF-8. +.SH "RETURN VALUES" +Upon successful completion, a pointer to the comment is returned, +or +\fRNULL\fR +if there is no comment. +In case of an error, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_get_comment\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_file_set_comment(3), +zip_get_archive_comment(3) +.SH "HISTORY" +\fBzip_file_get_comment\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_get_comment.mdoc b/deps/libzip/man/zip_file_get_comment.mdoc new file mode 100644 index 00000000000000..9fc337b200abe9 --- /dev/null +++ b/deps/libzip/man/zip_file_get_comment.mdoc @@ -0,0 +1,119 @@ +.\" zip_file_get_comment.mdoc -- get comment for file in zip +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 22, 2020 +.Dt ZIP_FILE_GET_COMMENT 3 +.Os +.Sh NAME +.Nm zip_file_get_comment +.Nd get comment for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_file_get_comment "zip_t *archive" "zip_uint64_t index" "zip_uint32_t *lenp" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_get_comment +function returns the comment for the file at position +.Ar index +in the zip archive. +The name is in UTF-8 encoding unless +.Dv ZIP_FL_ENC_RAW +was specified (see below). +This pointer should not be modified or +.Xr free 3 Ap d , +and becomes invalid when +.Ar archive +is closed. +If +.Ar lenp +is not +.Dv NULL , +the integer to which it points will be set to the length of the +comment. +If +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original unchanged comment is returned. +.Pp +Additionally, the following +.Ar flags +are supported: +.Bl -tag -width ZIP_FL_ENC_STRICTXX -offset indent +.It Dv ZIP_FL_ENC_RAW +Return the unmodified comment as it is in the ZIP archive. +.It Dv ZIP_FL_ENC_GUESS +(Default.) +Guess the encoding of the comment in the ZIP archive and convert it +to UTF-8, if necessary. +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_STRICT +Follow the ZIP specification for file names and extend it to file +comments, expecting them to be encoded in CP-437 in the ZIP archive +(except if it is a UTF-8 comment from the special extra field). +Convert it to UTF-8. +.El +.Em Note : +ASCII is a subset of both CP-437 and UTF-8. +.Sh RETURN VALUES +Upon successful completion, a pointer to the comment is returned, +or +.Dv NULL +if there is no comment. +In case of an error, +.Dv NULL +is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_get_comment +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_set_comment 3 , +.Xr zip_get_archive_comment 3 +.Sh HISTORY +.Fn zip_file_get_comment +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_get_error.html b/deps/libzip/man/zip_file_get_error.html new file mode 100644 index 00000000000000..51eccfef11120a --- /dev/null +++ b/deps/libzip/man/zip_file_get_error.html @@ -0,0 +1,95 @@ + + + + + + + ZIP_FILE_GET_ERROR(3) + + + + + + + + +
ZIP_FILE_GET_ERROR(3)Library Functions ManualZIP_FILE_GET_ERROR(3)
+
+
+

+zip_file_get_error — +
extract zip_error from zip_file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_error_t * +
+ zip_file_get_error(zip_file_t + *zf);

+
+
+

+zip_file_get_error() function returns the zip_error + associated with the zip_file zf. +
+
+

+libzip(3) +
+
+

+zip_file_get_error() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_get_error.man b/deps/libzip/man/zip_file_get_error.man new file mode 100644 index 00000000000000..7d78d7721c96d7 --- /dev/null +++ b/deps/libzip/man/zip_file_get_error.man @@ -0,0 +1,62 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_get_error.mdoc -- extract zip_error from zip_file +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_GET_ERROR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_get_error\fR +\- extract zip_error from zip_file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_error_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_file_get_error\fR(\fIzip_file_t\ *zf\fR); +.PD +.SH "DESCRIPTION" +\fBzip_file_get_error\fR() +function returns the zip_error associated with the zip_file +\fIzf\fR. +.SH "SEE ALSO" +libzip(3) +.SH "HISTORY" +\fBzip_file_get_error\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_get_error.mdoc b/deps/libzip/man/zip_file_get_error.mdoc new file mode 100644 index 00000000000000..32b7a2aa4f9118 --- /dev/null +++ b/deps/libzip/man/zip_file_get_error.mdoc @@ -0,0 +1,57 @@ +.\" zip_file_get_error.mdoc -- extract zip_error from zip_file +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_GET_ERROR 3 +.Os +.Sh NAME +.Nm zip_file_get_error +.Nd extract zip_error from zip_file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_error_t * +.Fn zip_file_get_error "zip_file_t *zf" +.Sh DESCRIPTION +.Fn zip_file_get_error +function returns the zip_error associated with the zip_file +.Ar zf . +.Sh SEE ALSO +.Xr libzip 3 +.Sh HISTORY +.Fn zip_file_get_error +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_get_external_attributes.html b/deps/libzip/man/zip_file_get_external_attributes.html new file mode 100644 index 00000000000000..3630851feb70b4 --- /dev/null +++ b/deps/libzip/man/zip_file_get_external_attributes.html @@ -0,0 +1,176 @@ + + + + + + + ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3) + + + + + + + + +
ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3)Library Functions ManualZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3)
+
+
+

+zip_file_get_external_attributes — +
get external attributes for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_get_external_attributes(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags, zip_uint8_t + *opsys, zip_uint32_t + *attributes);

+
+
+

+The zip_file_get_external_attributes() function returns + the operating system and external attributes for the file at position + index in the zip archive. The external attributes + usually contain the operating system-specific file permissions. If + flags is set to + ZIP_FL_UNCHANGED, the original unchanged values are + returned. If opsys or attributes + are NULL, they are not filled in. +

The following operating systems are defined by the zip + specification:

+ +

The defines above follow the PKWARE Inc. Appnote; please note that + the InfoZIP Appnote has a slightly different mapping.

+
+
+

+Upon successful completion, 0 is returned. In case of an error, + -1 is returned and the error code in + archive is set to indicate the error. +
+
+

+The following code can be used to expand attributes if the + operating system is ZIP_OPSYS_DOS. +
+
+#include <sys/stat.h>
+
+#define FA_RDONLY       0x01            // FILE_ATTRIBUTE_READONLY
+#define FA_DIREC        0x10            // FILE_ATTRIBUTE_DIRECTORY
+
+static mode_t
+_zip_dos_attr2mode(zip_uint32_t attr)
+{
+   mode_t m = S_IRUSR | S_IRGRP | S_IROTH;
+   if (0 == (attr & FA_RDONLY))
+      m |= S_IWUSR | S_IWGRP | S_IWOTH;
+
+   if (attr & FA_DIREC)
+      m = (S_IFDIR | (m & ~S_IFMT)) | S_IXUSR | S_IXGRP | S_IXOTH;
+
+   return m;
+}
+
+
+
+
+

+zip_file_get_external_attributes() fails if: +
+
[]
+
index is not a valid file index in + archive.
+
+
+
+

+libzip(3), + zip_file_set_external_attributes(3) +
+
+

+zip_file_get_external_attributes() was added in libzip + 0.11.2. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_get_external_attributes.man b/deps/libzip/man/zip_file_get_external_attributes.man new file mode 100644 index 00000000000000..43156028eb8a00 --- /dev/null +++ b/deps/libzip/man/zip_file_get_external_attributes.man @@ -0,0 +1,174 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_get_external_attributes.mdoc -- get external attributes for file in zip +.\" Copyright (C) 2013-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_GET_EXTERNAL_ATTRIBUTES" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_get_external_attributes\fR +\- get external attributes for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_get_external_attributes\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR, \fIzip_uint8_t\ *opsys\fR, \fIzip_uint32_t\ *attributes\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_get_external_attributes\fR() +function returns the operating system and external attributes for the +file at position +\fIindex\fR +in the zip archive. +The external attributes usually contain the operating system-specific +file permissions. +If +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original unchanged values are returned. +If +\fIopsys\fR +or +\fIattributes\fR +are +\fRNULL\fR, +they are not filled in. +.PP +The following operating systems are defined by the zip specification: +.RS 6n +.PD 0 +.PP +\fRZIP_OPSYS_ACORN_RISC\fR +.PP +\fRZIP_OPSYS_ALTERNATE_MVS\fR +.PP +\fRZIP_OPSYS_AMIGA\fR +.PP +\fRZIP_OPSYS_ATARI_ST\fR +.PP +\fRZIP_OPSYS_BEOS\fR +.PP +\fRZIP_OPSYS_CPM\fR +.PP +\fRZIP_OPSYS_DOS\fR +.PP +\fRZIP_OPSYS_MACINTOSH\fR +.PP +\fRZIP_OPSYS_MVS\fR +.PP +\fRZIP_OPSYS_OPENVMS\fR +.PP +\fRZIP_OPSYS_OS_2\fR +.PP +\fRZIP_OPSYS_OS_400\fR +.PP +\fRZIP_OPSYS_OS_X\fR +.PP +\fRZIP_OPSYS_TANDEM\fR +.PP +\fRZIP_OPSYS_UNIX\fR +.PP +\fRZIP_OPSYS_VFAT\fR +.PP +\fRZIP_OPSYS_VM_CMS\fR +.PP +\fRZIP_OPSYS_VSE\fR +.PP +\fRZIP_OPSYS_WINDOWS_NTFS\fR +(uncommon, use +\fRZIP_OPSYS_DOS\fR +instead) +.PP +\fRZIP_OPSYS_Z_SYSTEM\fR +.RE +.PD +.PP +The defines above follow the PKWARE Inc. Appnote; please note that +the InfoZIP Appnote has a slightly different mapping. +.SH "RETURN VALUES" +Upon successful completion, 0 is returned. +In case of an error, +\fR\-1\fR +is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "EXAMPLES" +The following code can be used to expand +\fIattributes\fR +if the operating system is +\fRZIP_OPSYS_DOS\fR. +.nf +.sp +.RS 0n +#include + +#define FA_RDONLY 0x01 // FILE_ATTRIBUTE_READONLY +#define FA_DIREC 0x10 // FILE_ATTRIBUTE_DIRECTORY + +static mode_t +_zip_dos_attr2mode(zip_uint32_t attr) +{ + mode_t m = S_IRUSR | S_IRGRP | S_IROTH; + if (0 == (attr & FA_RDONLY)) + m |= S_IWUSR | S_IWGRP | S_IWOTH; + + if (attr & FA_DIREC) + m = (S_IFDIR | (m & ~S_IFMT)) | S_IXUSR | S_IXGRP | S_IXOTH; + + return m; +} +.RE +.fi +.SH "ERRORS" +\fBzip_file_get_external_attributes\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_file_set_external_attributes(3) +.SH "HISTORY" +\fBzip_file_get_external_attributes\fR() +was added in libzip 0.11.2. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_get_external_attributes.mdoc b/deps/libzip/man/zip_file_get_external_attributes.mdoc new file mode 100644 index 00000000000000..dfc070fcf0afb3 --- /dev/null +++ b/deps/libzip/man/zip_file_get_external_attributes.mdoc @@ -0,0 +1,165 @@ +.\" zip_file_get_external_attributes.mdoc -- get external attributes for file in zip +.\" Copyright (C) 2013-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_GET_EXTERNAL_ATTRIBUTES 3 +.Os +.Sh NAME +.Nm zip_file_get_external_attributes +.Nd get external attributes for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_get_external_attributes "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" "zip_uint8_t *opsys" "zip_uint32_t *attributes" +.Sh DESCRIPTION +The +.Fn zip_file_get_external_attributes +function returns the operating system and external attributes for the +file at position +.Ar index +in the zip archive. +The external attributes usually contain the operating system-specific +file permissions. +If +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original unchanged values are returned. +If +.Ar opsys +or +.Ar attributes +are +.Dv NULL , +they are not filled in. +.Pp +The following operating systems are defined by the zip specification: +.Bl -item -compact -offset indent +.It +.Dv ZIP_OPSYS_ACORN_RISC +.It +.Dv ZIP_OPSYS_ALTERNATE_MVS +.It +.Dv ZIP_OPSYS_AMIGA +.It +.Dv ZIP_OPSYS_ATARI_ST +.It +.Dv ZIP_OPSYS_BEOS +.It +.Dv ZIP_OPSYS_CPM +.It +.Dv ZIP_OPSYS_DOS +.It +.Dv ZIP_OPSYS_MACINTOSH +.It +.Dv ZIP_OPSYS_MVS +.It +.Dv ZIP_OPSYS_OPENVMS +.It +.Dv ZIP_OPSYS_OS_2 +.It +.Dv ZIP_OPSYS_OS_400 +.It +.Dv ZIP_OPSYS_OS_X +.It +.Dv ZIP_OPSYS_TANDEM +.It +.Dv ZIP_OPSYS_UNIX +.It +.Dv ZIP_OPSYS_VFAT +.It +.Dv ZIP_OPSYS_VM_CMS +.It +.Dv ZIP_OPSYS_VSE +.It +.Dv ZIP_OPSYS_WINDOWS_NTFS +(uncommon, use +.Dv ZIP_OPSYS_DOS +instead) +.It +.Dv ZIP_OPSYS_Z_SYSTEM +.El +.Pp +The defines above follow the PKWARE Inc. Appnote; please note that +the InfoZIP Appnote has a slightly different mapping. +.Sh RETURN VALUES +Upon successful completion, 0 is returned. +In case of an error, +.Dv \-1 +is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh EXAMPLES +The following code can be used to expand +.Ar attributes +if the operating system is +.Dv ZIP_OPSYS_DOS . +.Bd -literal +#include + +#define FA_RDONLY 0x01 // FILE_ATTRIBUTE_READONLY +#define FA_DIREC 0x10 // FILE_ATTRIBUTE_DIRECTORY + +static mode_t +_zip_dos_attr2mode(zip_uint32_t attr) +{ + mode_t m = S_IRUSR | S_IRGRP | S_IROTH; + if (0 == (attr & FA_RDONLY)) + m |= S_IWUSR | S_IWGRP | S_IWOTH; + + if (attr & FA_DIREC) + m = (S_IFDIR | (m & ~S_IFMT)) | S_IXUSR | S_IXGRP | S_IXOTH; + + return m; +} +.Ed +.Sh ERRORS +.Fn zip_file_get_external_attributes +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_set_external_attributes 3 +.Sh HISTORY +.Fn zip_file_get_external_attributes +was added in libzip 0.11.2. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_rename.html b/deps/libzip/man/zip_file_rename.html new file mode 100644 index 00000000000000..435d904ab35d02 --- /dev/null +++ b/deps/libzip/man/zip_file_rename.html @@ -0,0 +1,132 @@ + + + + + + + ZIP_FILE_RENAME(3) + + + + + + + + +
ZIP_FILE_RENAME(3)Library Functions ManualZIP_FILE_RENAME(3)
+
+
+

+zip_file_rename — +
rename file in zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_rename(zip_t + *archive, zip_uint64_t + index, const char + *name, zip_flags_t + flags);

+
+
+

+The file at position index in the zip archive + archive is renamed to name. The + flags argument can be any of: +
+
+
Guess encoding of name (default). (Only CP-437 and + UTF-8 are recognized.)
+
+
Interpret name as UTF-8.
+
+
Interpret name as code page 437 (CP-437).
+
+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+zip_file_rename() fails if: +
+
[]
+
The file to be renamed has been deleted from the archive.
+
[]
+
There is already a file called name in the + archive.
+
[]
+
index is not a valid file index in + archive, name is + NULL, the empty string, or not a valid UTF-8 + encoded string. Also a file cannot be renamed to a directory or vice + versa. Directories are denoted by a trailing slash.
+
+
+
+

+libzip(3), + zip_unchange(3) +
+
+

+zip_file_rename() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 22, 2020NiH
+ + diff --git a/deps/libzip/man/zip_file_rename.man b/deps/libzip/man/zip_file_rename.man new file mode 100644 index 00000000000000..d30b639b2d4871 --- /dev/null +++ b/deps/libzip/man/zip_file_rename.man @@ -0,0 +1,111 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_rename.mdoc -- rename file in zip archive +.\" Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_RENAME" "3" "September 22, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_rename\fR +\- rename file in zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_rename\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIconst\ char\ *name\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The file at position +\fIindex\fR +in the zip archive +\fIarchive\fR +is renamed to +\fIname\fR. +The +\fIflags\fR +argument can be any of: +.TP 22n +\fRZIP_FL_ENC_GUESS\fR +Guess encoding of +\fIname\fR +(default). +(Only CP-437 and UTF-8 are recognized.) +.TP 22n +\fRZIP_FL_ENC_UTF_8\fR +Interpret +\fIname\fR +as UTF-8. +.TP 22n +\fRZIP_FL_ENC_CP437\fR +Interpret +\fIname\fR +as code page 437 (CP-437). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_rename\fR() +fails if: +.TP 19n +[\fRZIP_ER_DELETED\fR] +The file to be renamed has been deleted from the archive. +.TP 19n +[\fRZIP_ER_EXISTS\fR] +There is already a file called +\fIname\fR +in the archive. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR, +\fIname is\fR +\fRNULL\fR, +the empty string, or not a valid UTF-8 encoded string. +Also a file cannot be renamed to a directory or vice versa. +Directories are denoted by a trailing slash. +.SH "SEE ALSO" +libzip(3), +zip_unchange(3) +.SH "HISTORY" +\fBzip_file_rename\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_rename.mdoc b/deps/libzip/man/zip_file_rename.mdoc new file mode 100644 index 00000000000000..d1628ac540420c --- /dev/null +++ b/deps/libzip/man/zip_file_rename.mdoc @@ -0,0 +1,104 @@ +.\" zip_file_rename.mdoc -- rename file in zip archive +.\" Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 22, 2020 +.Dt ZIP_FILE_RENAME 3 +.Os +.Sh NAME +.Nm zip_file_rename +.Nd rename file in zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_rename "zip_t *archive" "zip_uint64_t index" "const char *name" "zip_flags_t flags" +.Sh DESCRIPTION +The file at position +.Ar index +in the zip archive +.Ar archive +is renamed to +.Ar name . +The +.Ar flags +argument can be any of: +.Bl -tag -width XZIPXFLXENCXSTRICTXX +.It Dv ZIP_FL_ENC_GUESS +Guess encoding of +.Ar name +(default). +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_UTF_8 +Interpret +.Ar name +as UTF-8. +.It Dv ZIP_FL_ENC_CP437 +Interpret +.Ar name +as code page 437 (CP-437). +.El +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_rename +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_DELETED +The file to be renamed has been deleted from the archive. +.It Bq Er ZIP_ER_EXISTS +There is already a file called +.Ar name +in the archive. +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive , +.Ar name is +.Dv NULL , +the empty string, or not a valid UTF-8 encoded string. +Also a file cannot be renamed to a directory or vice versa. +Directories are denoted by a trailing slash. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_unchange 3 +.Sh HISTORY +.Fn zip_file_rename +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_set_comment.html b/deps/libzip/man/zip_file_set_comment.html new file mode 100644 index 00000000000000..2a606dc8f03f81 --- /dev/null +++ b/deps/libzip/man/zip_file_set_comment.html @@ -0,0 +1,137 @@ + + + + + + + ZIP_FILE_SET_COMMENT(3) + + + + + + + + +
ZIP_FILE_SET_COMMENT(3)Library Functions ManualZIP_FILE_SET_COMMENT(3)
+
+
+

+zip_file_set_comment — +
set comment for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_set_comment(zip_t + *archive, zip_uint64_t + index, const char + *comment, zip_uint16_t + len, zip_flags_t + flags);

+
+
+

+The zip_file_set_comment() function sets the comment for + the file at position index in the zip archive to + comment of length len. If + comment is NULL and + len is 0, the file comment will be removed. The + flags argument can be any of: +
+
+
Guess encoding of comment (default). (Only CP-437 + and UTF-8 are recognized.)
+
+
Interpret comment as UTF-8.
+
+
Interpret comment as code page 437 (CP-437).
+
+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_file_set_comment() fails if: +
+
[]
+
index is not a valid file index in + archive, or len is less than 0 + or longer than the maximum comment length in a zip file (65535), or + comment is not a valid UTF-8 encoded string.
+
[]
+
Required memory could not be allocated.
+
[]
+
The archive was opened in read-only mode.
+
+
+
+

+libzip(3), + zip_file_get_comment(3), + zip_get_archive_comment(3), + zip_set_archive_comment(3) +
+
+

+zip_file_set_comment() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 22, 2020NiH
+ + diff --git a/deps/libzip/man/zip_file_set_comment.man b/deps/libzip/man/zip_file_set_comment.man new file mode 100644 index 00000000000000..b1ee11d0d5c9a3 --- /dev/null +++ b/deps/libzip/man/zip_file_set_comment.man @@ -0,0 +1,123 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_set_comment.mdoc -- set comment for file in zip +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_SET_COMMENT" "3" "September 22, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_set_comment\fR +\- set comment for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_set_comment\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIconst\ char\ *comment\fR, \fIzip_uint16_t\ len\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_set_comment\fR() +function sets the comment for the file at position +\fIindex\fR +in the zip archive to +\fIcomment\fR +of length +\fIlen\fR. +If +\fIcomment\fR +is +\fRNULL\fR +and +\fIlen\fR +is 0, the file comment will be removed. +The +\fIflags\fR +argument can be any of: +.TP 22n +\fRZIP_FL_ENC_GUESS\fR +Guess encoding of +\fIcomment\fR +(default). +(Only CP-437 and UTF-8 are recognized.) +.TP 22n +\fRZIP_FL_ENC_UTF_8\fR +Interpret +\fIcomment\fR +as UTF-8. +.TP 22n +\fRZIP_FL_ENC_CP437\fR +Interpret +\fIcomment\fR +as code page 437 (CP-437). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_set_comment\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR, +or +\fIlen\fR +is less than 0 or longer than the maximum comment length in a zip file +(65535), or +\fIcomment\fR +is not a valid UTF-8 encoded string. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_RDONLY\fR] +The +\fIarchive\fR +was opened in read-only mode. +.SH "SEE ALSO" +libzip(3), +zip_file_get_comment(3), +zip_get_archive_comment(3), +zip_set_archive_comment(3) +.SH "HISTORY" +\fBzip_file_set_comment\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_set_comment.mdoc b/deps/libzip/man/zip_file_set_comment.mdoc new file mode 100644 index 00000000000000..2e96531b09348a --- /dev/null +++ b/deps/libzip/man/zip_file_set_comment.mdoc @@ -0,0 +1,116 @@ +.\" zip_file_set_comment.mdoc -- set comment for file in zip +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 22, 2020 +.Dt ZIP_FILE_SET_COMMENT 3 +.Os +.Sh NAME +.Nm zip_file_set_comment +.Nd set comment for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_set_comment "zip_t *archive" "zip_uint64_t index" "const char *comment" "zip_uint16_t len" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_set_comment +function sets the comment for the file at position +.Ar index +in the zip archive to +.Ar comment +of length +.Ar len . +If +.Ar comment +is +.Dv NULL +and +.Ar len +is 0, the file comment will be removed. +The +.Ar flags +argument can be any of: +.Bl -tag -width XZIPXFLXENCXSTRICTXX +.It Dv ZIP_FL_ENC_GUESS +Guess encoding of +.Ar comment +(default). +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_UTF_8 +Interpret +.Ar comment +as UTF-8. +.It Dv ZIP_FL_ENC_CP437 +Interpret +.Ar comment +as code page 437 (CP-437). +.El +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_set_comment +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive , +or +.Ar len +is less than 0 or longer than the maximum comment length in a zip file +(65535), or +.Ar comment +is not a valid UTF-8 encoded string. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_RDONLY +The +.Ar archive +was opened in read-only mode. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_get_comment 3 , +.Xr zip_get_archive_comment 3 , +.Xr zip_set_archive_comment 3 +.Sh HISTORY +.Fn zip_file_set_comment +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_set_encryption.html b/deps/libzip/man/zip_file_set_encryption.html new file mode 100644 index 00000000000000..a6c483f030aae1 --- /dev/null +++ b/deps/libzip/man/zip_file_set_encryption.html @@ -0,0 +1,150 @@ + + + + + + + ZIP_FILE_SET_ENCRYPTION(3) + + + + + + + + +
ZIP_FILE_SET_ENCRYPTION(3)Library Functions ManualZIP_FILE_SET_ENCRYPTION(3)
+
+
+

+zip_file_set_encryption — +
set encryption method for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_set_encryption(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + method, const char + *password);

+
+
+

+The zip_file_set_encryption() function sets the + encryption method for the file at position index in the + zip archive to method using the password + password. The method is the same + as returned by zip_stat(3). For the + method argument, currently only the following values are + supported: +
+
+
No encryption.
+
+
Winzip AES-128 encryption.
+
+
Winzip AES-192 encryption.
+
+
Winzip AES-256 encryption.
+
+
Traditional PKWare encryption. Do not use this method, it is not secure. + It is only provided for backwards compatibility.
+
+

If password is NULL, + the default password provided by + zip_set_default_password(3) + is used.

+

The current encryption method for a file in a zip archive can be + determined using zip_stat(3).

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_file_set_encryption() fails if: +
+
[]
+
Unsupported compression method requested.
+
[]
+
index is not a valid file index in + archive, or the argument combination is + invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
Read-only zip file, no changes allowed.
+
+
+
+

+libzip(3), + zip_encryption_method_supported(3), + zip_fopen_encrypted(3), + zip_fopen_index_encrypted(3), + zip_set_default_password(3), + zip_stat(3) +
+
+

+zip_file_set_encryption() was added in libzip 1.2.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 2, 2020NiH
+ + diff --git a/deps/libzip/man/zip_file_set_encryption.man b/deps/libzip/man/zip_file_set_encryption.man new file mode 100644 index 00000000000000..12941beb358eb0 --- /dev/null +++ b/deps/libzip/man/zip_file_set_encryption.man @@ -0,0 +1,132 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_set_encryption.mdoc -- set encryption method for file +.\" Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_SET_ENCRYPTION" "3" "April 2, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_set_encryption\fR +\- set encryption method for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_set_encryption\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ method\fR, \fIconst\ char\ *password\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_set_encryption\fR() +function sets the encryption method for the file at position +\fIindex\fR +in the zip archive to +\fImethod\fR +using the password +\fIpassword\fR. +The +\fImethod\fR +is the same as returned by +zip_stat(3). +For the +\fImethod\fR +argument, currently only the following values are supported: +.TP 19n +\fRZIP_EM_NONE\fR +No encryption. +.TP 19n +\fRZIP_EM_AES_128\fR +Winzip AES-128 encryption. +.TP 19n +\fRZIP_EM_AES_192\fR +Winzip AES-192 encryption. +.TP 19n +\fRZIP_EM_AES_256\fR +Winzip AES-256 encryption. +.TP 19n +\fRZIP_EM_TRAD_PKWARE\fR +.br +Traditional PKWare encryption. +Do not use this method, it is not secure. +It is only provided for backwards compatibility. +.PP +If +\fIpassword\fR +is +\fRNULL\fR, +the default password provided by +zip_set_default_password(3) +is used. +.PP +The current encryption method for a file in a zip archive can be +determined using +zip_stat(3). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_set_encryption\fR() +fails if: +.TP 19n +[\fRZIP_ER_ENCRNOTSUPP\fR] +Unsupported compression method requested. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR, +or the argument combination is invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_RDONLY\fR] +Read-only zip file, no changes allowed. +.SH "SEE ALSO" +libzip(3), +zip_encryption_method_supported(3), +zip_fopen_encrypted(3), +zip_fopen_index_encrypted(3), +zip_set_default_password(3), +zip_stat(3) +.SH "HISTORY" +\fBzip_file_set_encryption\fR() +was added in libzip 1.2.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_set_encryption.mdoc b/deps/libzip/man/zip_file_set_encryption.mdoc new file mode 100644 index 00000000000000..5c91470ce11fdb --- /dev/null +++ b/deps/libzip/man/zip_file_set_encryption.mdoc @@ -0,0 +1,121 @@ +.\" zip_file_set_encryption.mdoc -- set encryption method for file +.\" Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 2, 2020 +.Dt ZIP_FILE_SET_ENCRYPTION 3 +.Os +.Sh NAME +.Nm zip_file_set_encryption +.Nd set encryption method for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_set_encryption "zip_t *archive" "zip_uint64_t index" "zip_uint16_t method" "const char *password" +.Sh DESCRIPTION +The +.Fn zip_file_set_encryption +function sets the encryption method for the file at position +.Ar index +in the zip archive to +.Ar method +using the password +.Ar password . +The +.Ar method +is the same as returned by +.Xr zip_stat 3 . +For the +.Ar method +argument, currently only the following values are supported: +.Bl -tag -width ZIP_CM_DEFLATE_XX +.It Dv ZIP_EM_NONE +No encryption. +.It Dv ZIP_EM_AES_128 +Winzip AES-128 encryption. +.It Dv ZIP_EM_AES_192 +Winzip AES-192 encryption. +.It Dv ZIP_EM_AES_256 +Winzip AES-256 encryption. +.It Dv ZIP_EM_TRAD_PKWARE +Traditional PKWare encryption. +Do not use this method, it is not secure. +It is only provided for backwards compatibility. +.El +.Pp +If +.Ar password +is +.Dv NULL , +the default password provided by +.Xr zip_set_default_password 3 +is used. +.Pp +The current encryption method for a file in a zip archive can be +determined using +.Xr zip_stat 3 . +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_set_encryption +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_ENCRNOTSUPP +Unsupported compression method requested. +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive , +or the argument combination is invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_RDONLY +Read-only zip file, no changes allowed. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_encryption_method_supported 3 , +.Xr zip_fopen_encrypted 3 , +.Xr zip_fopen_index_encrypted 3 , +.Xr zip_set_default_password 3 , +.Xr zip_stat 3 +.Sh HISTORY +.Fn zip_file_set_encryption +was added in libzip 1.2.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_set_external_attributes.html b/deps/libzip/man/zip_file_set_external_attributes.html new file mode 100644 index 00000000000000..59e923912f8d8a --- /dev/null +++ b/deps/libzip/man/zip_file_set_external_attributes.html @@ -0,0 +1,125 @@ + + + + + + + ZIP_FILE_SET_EXTERNAL_ATTRIBUTES(3) + + + + + + + + +
ZIP_FILE_SET_EXTERNAL_ATTRIBUTES(3)Library Functions ManualZIP_FILE_SET_EXTERNAL_ATTRIBUTES(3)
+
+
+

+zip_file_set_external_attributes — +
set external attributes for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_set_external_attributes(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags, zip_uint8_t + opsys, zip_uint32_t + attributes);

+
+
+

+The zip_file_set_external_attributes() function sets the + operating system and external attributes for the file at position + index in the zip archive. Currently, no + flags are supported. +

For a list of known opsys values, see + zip_file_get_external_attributes(3).

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_file_set_external_attributes() fails if: +
+
[]
+
index is not a valid file index in + archive.
+
[]
+
Required memory could not be allocated.
+
[]
+
The archive was opened in read-only mode.
+
+
+
+

+libzip(3), + zip_file_get_external_attributes(3) +
+
+

+zip_file_set_external_attributes() was added in libzip + 0.11.2. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_set_external_attributes.man b/deps/libzip/man/zip_file_set_external_attributes.man new file mode 100644 index 00000000000000..982c4a2d51ce60 --- /dev/null +++ b/deps/libzip/man/zip_file_set_external_attributes.man @@ -0,0 +1,95 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_set_external_attributes.mdoc -- set external attributes for file in zip +.\" Copyright (C) 2013-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_SET_EXTERNAL_ATTRIBUTES" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_set_external_attributes\fR +\- set external attributes for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_set_external_attributes\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR, \fIzip_uint8_t\ opsys\fR, \fIzip_uint32_t\ attributes\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_set_external_attributes\fR() +function sets the operating system and external attributes for the +file at position +\fIindex\fR +in the zip archive. +Currently, no +\fIflags\fR +are supported. +.PP +For a list of known +\fIopsys\fR +values, see +zip_file_get_external_attributes(3). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_set_external_attributes\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_RDONLY\fR] +The +\fIarchive\fR +was opened in read-only mode. +.SH "SEE ALSO" +libzip(3), +zip_file_get_external_attributes(3) +.SH "HISTORY" +\fBzip_file_set_external_attributes\fR() +was added in libzip 0.11.2. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_set_external_attributes.mdoc b/deps/libzip/man/zip_file_set_external_attributes.mdoc new file mode 100644 index 00000000000000..e85e41d3a13163 --- /dev/null +++ b/deps/libzip/man/zip_file_set_external_attributes.mdoc @@ -0,0 +1,89 @@ +.\" zip_file_set_external_attributes.mdoc -- set external attributes for file in zip +.\" Copyright (C) 2013-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_SET_EXTERNAL_ATTRIBUTES 3 +.Os +.Sh NAME +.Nm zip_file_set_external_attributes +.Nd set external attributes for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_set_external_attributes "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" "zip_uint8_t opsys" "zip_uint32_t attributes" +.Sh DESCRIPTION +The +.Fn zip_file_set_external_attributes +function sets the operating system and external attributes for the +file at position +.Ar index +in the zip archive. +Currently, no +.Ar flags +are supported. +.Pp +For a list of known +.Ar opsys +values, see +.Xr zip_file_get_external_attributes 3 . +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_set_external_attributes +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_RDONLY +The +.Ar archive +was opened in read-only mode. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_get_external_attributes 3 +.Sh HISTORY +.Fn zip_file_set_external_attributes +was added in libzip 0.11.2. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_file_set_mtime.html b/deps/libzip/man/zip_file_set_mtime.html new file mode 100644 index 00000000000000..89f7bb52e20209 --- /dev/null +++ b/deps/libzip/man/zip_file_set_mtime.html @@ -0,0 +1,167 @@ + + + + + + + ZIP_FILE_SET_MTIME(3) + + + + + + + + +
ZIP_FILE_SET_MTIME(3)Library Functions ManualZIP_FILE_SET_MTIME(3)
+
+
+

+zip_file_set_dostime, + zip_file_set_mtime — +
set last modification time (mtime) for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_file_set_dostime(zip_t + *archive, zip_uint64_t + index, zip_uint16_t + dostime, zip_uint16_t + dosdate, zip_flags_t + flags);

+

int +
+ zip_file_set_mtime(zip_t + *archive, zip_uint64_t + index, time_t + mtime, zip_flags_t + flags);

+
+
+

+The zip_file_set_mtime() function sets the last + modification time (mtime) for the file at position index + in the zip archive to mtime. Currently, no support for + any flags is implemented. +

In the zip archive, the time and date are saved as two 16-bit + integers. To set the values directly, call the + zip_file_set_dostime() function. The values of the + time bytes are defined as follows:

+
+
+
0-4
+
seconds divided by two (1-2 = 1, 3-4 = 2, ...)
+
5-10
+
minute (0-59)
+
11-15
+
hour (0-23)
+
+
+

The values of the date bytes are defined as follows:

+
+
+
0-4
+
day of the month (1-31)
+
5-8
+
month (January = 1, February = 2, ...)
+
9-15
+
year offset from 1980 (1980 = 0, 1981 = 1, ...)
+
+
+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_file_set_dostime() and + zip_file_set_mtime() fail if: +
+
[]
+
index is not a valid file index in + archive.
+
[]
+
Required memory could not be allocated.
+
[]
+
Traditional PKWare encryption uses the file's mtime, therefore it cannot + be changed without re-encrypting the data.
+
[]
+
The archive was opened in read-only mode.
+
+
+
+

+libzip(3), + zip_stat(3) +
+
+

+zip_file_set_mtime() was added in libzip 1.0. + zip_file_set_dostime() was added in libzip 1.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+

+Following historical practice, the zip_file_set_mtime() + function translates the time from the zip archive into the local time zone. If + you want to avoid this, use the zip_file_set_dostime() + function instead. +
+
+ + + + + +
June 18, 2022NiH
+ + diff --git a/deps/libzip/man/zip_file_set_mtime.man b/deps/libzip/man/zip_file_set_mtime.man new file mode 100644 index 00000000000000..a9b3990d21e34d --- /dev/null +++ b/deps/libzip/man/zip_file_set_mtime.man @@ -0,0 +1,145 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_set_mtime.mdoc -- set mtime for file in zip +.\" Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_SET_MTIME" "3" "June 18, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_set_dostime\fR, +\fBzip_file_set_mtime\fR +\- set last modification time (mtime) for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_set_dostime\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_uint16_t\ dostime\fR, \fIzip_uint16_t\ dosdate\fR, \fIzip_flags_t\ flags\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_set_mtime\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fItime_t\ mtime\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_file_set_mtime\fR() +function sets the last modification time (mtime) for the file at +position +\fIindex\fR +in the zip archive to +\fImtime\fR. +Currently, no support for any +\fIflags\fR +is implemented. +.PP +In the zip archive, the time and date are saved as two 16-bit integers. +To set the values directly, call the +\fBzip_file_set_dostime\fR() +function. +The values of the time bytes are defined as follows: +.RS 6n +.TP 7n +0-4 +seconds divided by two (1-2 = 1, 3-4 = 2, ...) +.TP 7n +5-10 +minute (0-59) +.TP 7n +11-15 +hour (0-23) +.RE +.PP +The values of the date bytes are defined as follows: +.RS 6n +.TP 7n +0-4 +day of the month (1-31) +.TP 7n +5-8 +month (January = 1, February = 2, ...) +.TP 7n +9-15 +year offset from 1980 (1980 = 0, 1981 = 1, ...) +.RE +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_file_set_dostime\fR() +and +\fBzip_file_set_mtime\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_OPNOTSUPP\fR] +.br +Traditional PKWare encryption uses the file's mtime, therefore it cannot be changed without re-encrypting the data. +.TP 19n +[\fRZIP_ER_RDONLY\fR] +The +\fIarchive\fR +was opened in read-only mode. +.SH "SEE ALSO" +libzip(3), +zip_stat(3) +.SH "HISTORY" +\fBzip_file_set_mtime\fR() +was added in libzip 1.0. +\fBzip_file_set_dostime\fR() +was added in libzip 1.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> +.SH "CAVEATS" +Following historical practice, the +\fBzip_file_set_mtime\fR() +function translates the time from the zip archive into the local time +zone. +If you want to avoid this, use the +\fBzip_file_set_dostime\fR() +function instead. diff --git a/deps/libzip/man/zip_file_set_mtime.mdoc b/deps/libzip/man/zip_file_set_mtime.mdoc new file mode 100644 index 00000000000000..43e3b8035b22d9 --- /dev/null +++ b/deps/libzip/man/zip_file_set_mtime.mdoc @@ -0,0 +1,126 @@ +.\" zip_file_set_mtime.mdoc -- set mtime for file in zip +.\" Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd June 18, 2022 +.Dt ZIP_FILE_SET_MTIME 3 +.Os +.Sh NAME +.Nm zip_file_set_dostime , +.Nm zip_file_set_mtime +.Nd set last modification time (mtime) for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_file_set_dostime "zip_t *archive" "zip_uint64_t index" "zip_uint16_t dostime" "zip_uint16_t dosdate" "zip_flags_t flags" +.Ft int +.Fn zip_file_set_mtime "zip_t *archive" "zip_uint64_t index" "time_t mtime" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_file_set_mtime +function sets the last modification time (mtime) for the file at +position +.Ar index +in the zip archive to +.Ar mtime . +Currently, no support for any +.Ar flags +is implemented. +.Pp +In the zip archive, the time and date are saved as two 16-bit integers. +To set the values directly, call the +.Fn zip_file_set_dostime +function. +The values of the time bytes are defined as follows: +.Bl -tag -width 5n -offset indent +.It 0-4 +seconds divided by two (1-2 = 1, 3-4 = 2, ...) +.It 5-10 +minute (0-59) +.It 11-15 +hour (0-23) +.El +.Pp +The values of the date bytes are defined as follows: +.Bl -tag -width 5n -offset indent +.It 0-4 +day of the month (1-31) +.It 5-8 +month (January = 1, February = 2, ...) +.It 9-15 +year offset from 1980 (1980 = 0, 1981 = 1, ...) +.El +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_file_set_dostime +and +.Fn zip_file_set_mtime +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_OPNOTSUPP +Traditional PKWare encryption uses the file's mtime, therefore it cannot be changed without re-encrypting the data. +.It Bq Er ZIP_ER_RDONLY +The +.Ar archive +was opened in read-only mode. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_stat 3 +.Sh HISTORY +.Fn zip_file_set_mtime +was added in libzip 1.0. +.Fn zip_file_set_dostime +was added in libzip 1.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at +.Sh CAVEATS +Following historical practice, the +.Fn zip_file_set_mtime +function translates the time from the zip archive into the local time +zone. +If you want to avoid this, use the +.Fn zip_file_set_dostime +function instead. diff --git a/deps/libzip/man/zip_file_strerror.html b/deps/libzip/man/zip_file_strerror.html new file mode 100644 index 00000000000000..6451c3fe7273a2 --- /dev/null +++ b/deps/libzip/man/zip_file_strerror.html @@ -0,0 +1,115 @@ + + + + + + + ZIP_FILE_STRERROR(3) + + + + + + + + +
ZIP_FILE_STRERROR(3)Library Functions ManualZIP_FILE_STRERROR(3)
+
+
+

+zip_file_strerror, zip_strerror + — +
get string representation for a zip error
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_file_strerror(zip_file_t + *file);

+

const char * +
+ zip_strerror(zip_t + *archive);

+
+
+

+The zip_strerror() function returns a string describing + the last error for the zip archive archive, while the + zip_file_strerror() function does the same for a zip + file file (one file in an archive). The returned string + must not be modified or freed, and becomes invalid when + archive or file, respectively, is + closed or on the next call to zip_strerror() or + zip_file_strerror(), respectively, for the same + archive. +
+
+

+zip_file_strerror() and + zip_strerror() return a pointer to the error string. +
+
+

+libzip(3), + zip_error_strerror(3) +
+
+

+zip_file_strerror() and + zip_strerror() were added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_file_strerror.man b/deps/libzip/man/zip_file_strerror.man new file mode 100644 index 00000000000000..ef6f31ddaa522a --- /dev/null +++ b/deps/libzip/man/zip_file_strerror.man @@ -0,0 +1,95 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_strerror.mdoc -- get string representation for a zip error +.\" Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FILE_STRERROR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_file_strerror\fR, +\fBzip_strerror\fR +\- get string representation for a zip error +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_file_strerror\fR(\fIzip_file_t\ *file\fR); +.PD +.PP +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_strerror\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_strerror\fR() +function returns a string describing the last error for the zip archive +\fIarchive\fR, +while the +\fBzip_file_strerror\fR() +function does the same for a zip file +\fIfile\fR +(one file in an archive). +The returned string must not be modified or freed, and becomes invalid when +\fIarchive\fR +or +\fIfile\fR, +respectively, +is closed or on the next call to +\fBzip_strerror\fR() +or +\fBzip_file_strerror\fR(), +respectively, +for the same archive. +.SH "RETURN VALUES" +\fBzip_file_strerror\fR() +and +\fBzip_strerror\fR() +return a pointer to the error string. +.SH "SEE ALSO" +libzip(3), +zip_error_strerror(3) +.SH "HISTORY" +\fBzip_file_strerror\fR() +and +\fBzip_strerror\fR() +were added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_file_strerror.mdoc b/deps/libzip/man/zip_file_strerror.mdoc new file mode 100644 index 00000000000000..1f0225fd38ce55 --- /dev/null +++ b/deps/libzip/man/zip_file_strerror.mdoc @@ -0,0 +1,85 @@ +.\" zip_file_strerror.mdoc -- get string representation for a zip error +.\" Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FILE_STRERROR 3 +.Os +.Sh NAME +.Nm zip_file_strerror , +.Nm zip_strerror +.Nd get string representation for a zip error +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_file_strerror "zip_file_t *file" +.Ft const char * +.Fn zip_strerror "zip_t *archive" +.Sh DESCRIPTION +The +.Fn zip_strerror +function returns a string describing the last error for the zip archive +.Ar archive , +while the +.Fn zip_file_strerror +function does the same for a zip file +.Ar file +(one file in an archive). +The returned string must not be modified or freed, and becomes invalid when +.Ar archive +or +.Ar file , +respectively, +is closed or on the next call to +.Fn zip_strerror +or +.Fn zip_file_strerror , +respectively, +for the same archive. +.Sh RETURN VALUES +.Fn zip_file_strerror +and +.Fn zip_strerror +return a pointer to the error string. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_strerror 3 +.Sh HISTORY +.Fn zip_file_strerror +and +.Fn zip_strerror +were added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_fopen.html b/deps/libzip/man/zip_fopen.html new file mode 100644 index 00000000000000..6c7b63a00f15f5 --- /dev/null +++ b/deps/libzip/man/zip_fopen.html @@ -0,0 +1,172 @@ + + + + + + + ZIP_FOPEN(3) + + + + + + + + +
ZIP_FOPEN(3)Library Functions ManualZIP_FOPEN(3)
+
+
+

+zip_fopen, zip_fopen_index + — +
open file in zip archive for reading
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_file_t * +
+ zip_fopen(zip_t + *archive, const char + *fname, zip_flags_t + flags);

+

zip_file_t * +
+ zip_fopen_index(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags);

+
+
+

+The zip_fopen() function opens the file name + fname in archive. The + flags argument specifies how the name lookup should be + done, according to the values are described in + zip_name_locate(3). Also, the + following values may be or'ed to it. +
+
+
+
Read the compressed data. Otherwise the data is uncompressed by + zip_fread().
+
+
Read the original data from the zip archive, ignoring any changes made to + the file; this is not supported by all data sources.
+
+
+

The zip_fopen_index() function opens the + file at position index.

+

If encrypted data is encountered, the functions call + zip_fopen_encrypted(3) or + zip_fopen_index_encrypted(3) + respectively, using the default password set with + zip_set_default_password(3).

+
+
+

+Upon successful completion, a struct zip_file pointer is + returned. Otherwise, NULL is returned and the error + code in archive is set to indicate the error. +
+
+

+
+
[]
+
The file data has been changed and the data source does not support + rereading data.
+
[]
+
The compression method used is not supported.
+
[]
+
The encryption method used is not supported.
+
[]
+
Required memory could not be allocated.
+
[]
+
The file is encrypted, but no password has been provided.
+
[]
+
A file read error occurred.
+
[]
+
A file seek error occurred.
+
[]
+
The provided password does not match the password used for encryption. + Note that some incorrect passwords are not detected by the check done by + zip_fopen().
+
[]
+
Initializing the zlib stream failed.
+
+

The function zip_fopen() may also fail and + set zip_err for any of the errors specified for the + routine + zip_name_locate(3).

+

The function zip_fopen_index() may also + fail with ZIP_ER_INVAL if + index is invalid.

+
+
+

+libzip(3), + zip_fclose(3), + zip_fread(3), + zip_fseek(3), + zip_get_num_entries(3), + zip_name_locate(3), + zip_set_default_password(3) +
+
+

+zip_fopen() and + zip_fopen_index() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_fopen.man b/deps/libzip/man/zip_fopen.man new file mode 100644 index 00000000000000..66e0c5131d7bf9 --- /dev/null +++ b/deps/libzip/man/zip_fopen.man @@ -0,0 +1,167 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fopen.mdoc -- open file in zip archive for reading +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FOPEN" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fopen\fR, +\fBzip_fopen_index\fR +\- open file in zip archive for reading +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_file_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_fopen\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *fname\fR, \fIzip_flags_t\ flags\fR); +.PD +.PP +\fIzip_file_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_fopen_index\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_fopen\fR() +function opens the file name +\fIfname\fR +in +\fIarchive\fR. +The +\fIflags\fR +argument specifies how the name lookup should be done, according to +the values are described in +zip_name_locate(3). +Also, the following values may be +\fIor\fR'ed +to it. +.RS 6n +.TP 19n +\fRZIP_FL_COMPRESSED\fR +Read the compressed data. +Otherwise the data is uncompressed by +\fBzip_fread\fR(). +.TP 19n +\fRZIP_FL_UNCHANGED\fR +Read the original data from the zip archive, ignoring any changes made +to the file; this is not supported by all data sources. +.RE +.PP +The +\fBzip_fopen_index\fR() +function opens the file at position +\fIindex\fR. +.PP +If encrypted data is encountered, the functions call +zip_fopen_encrypted(3) +or +zip_fopen_index_encrypted(3) +respectively, using the default password set with +zip_set_default_password(3). +.SH "RETURN VALUES" +Upon successful completion, a +\fIstruct zip_file\fR +pointer is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +.TP 19n +[\fRZIP_ER_CHANGED\fR] +The file data has been changed and the data source does +not support rereading data. +.TP 19n +[\fRZIP_ER_COMPNOTSUPP\fR] +The compression method used is not supported. +.TP 19n +[\fRZIP_ER_ENCRNOTSUPP\fR] +The encryption method used is not supported. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_NOPASSWD\fR] +The file is encrypted, but no password has been provided. +.TP 19n +[\fRZIP_ER_READ\fR] +A file read error occurred. +.TP 19n +[\fRZIP_ER_SEEK\fR] +A file seek error occurred. +.TP 19n +[\fRZIP_ER_WRONGPASSWD\fR] +The provided password does not match the password used for encryption. +Note that some incorrect passwords are not detected by the check done by +\fBzip_fopen\fR(). +.TP 19n +[\fRZIP_ER_ZLIB\fR] +Initializing the zlib stream failed. +.PP +The function +\fBzip_fopen\fR() +may also fail and set +\fIzip_err\fR +for any of the errors specified for the routine +zip_name_locate(3). +.PP +The function +\fBzip_fopen_index\fR() +may also fail with +\fRZIP_ER_INVAL\fR +if +\fIindex\fR +is invalid. +.SH "SEE ALSO" +libzip(3), +zip_fclose(3), +zip_fread(3), +zip_fseek(3), +zip_get_num_entries(3), +zip_name_locate(3), +zip_set_default_password(3) +.SH "HISTORY" +\fBzip_fopen\fR() +and +\fBzip_fopen_index\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_fopen.mdoc b/deps/libzip/man/zip_fopen.mdoc new file mode 100644 index 00000000000000..8c3a30c12554d7 --- /dev/null +++ b/deps/libzip/man/zip_fopen.mdoc @@ -0,0 +1,148 @@ +.\" zip_fopen.mdoc -- open file in zip archive for reading +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_FOPEN 3 +.Os +.Sh NAME +.Nm zip_fopen , +.Nm zip_fopen_index +.Nd open file in zip archive for reading +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_file_t * +.Fn zip_fopen "zip_t *archive" "const char *fname" "zip_flags_t flags" +.Ft zip_file_t * +.Fn zip_fopen_index "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_fopen +function opens the file name +.Ar fname +in +.Ar archive . +The +.Ar flags +argument specifies how the name lookup should be done, according to +the values are described in +.Xr zip_name_locate 3 . +Also, the following values may be +.Em or Ns No 'ed +to it. +.Bl -tag -offset indent -width ZIP_FL_COMPRESSED +.It Dv ZIP_FL_COMPRESSED +Read the compressed data. +Otherwise the data is uncompressed by +.Fn zip_fread . +.It Dv ZIP_FL_UNCHANGED +Read the original data from the zip archive, ignoring any changes made +to the file; this is not supported by all data sources. +.El +.Pp +The +.Fn zip_fopen_index +function opens the file at position +.Ar index . +.Pp +If encrypted data is encountered, the functions call +.Xr zip_fopen_encrypted 3 +or +.Xr zip_fopen_index_encrypted 3 +respectively, using the default password set with +.Xr zip_set_default_password 3 . +.Sh RETURN VALUES +Upon successful completion, a +.Ft struct zip_file +pointer is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Bl -tag -width Er +.It Bq Er ZIP_ER_CHANGED +The file data has been changed and the data source does +not support rereading data. +.It Bq Er ZIP_ER_COMPNOTSUPP +The compression method used is not supported. +.It Bq Er ZIP_ER_ENCRNOTSUPP +The encryption method used is not supported. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_NOPASSWD +The file is encrypted, but no password has been provided. +.It Bq Er ZIP_ER_READ +A file read error occurred. +.It Bq Er ZIP_ER_SEEK +A file seek error occurred. +.It Bq Er ZIP_ER_WRONGPASSWD +The provided password does not match the password used for encryption. +Note that some incorrect passwords are not detected by the check done by +.Fn zip_fopen . +.It Bq Er ZIP_ER_ZLIB +Initializing the zlib stream failed. +.El +.Pp +The function +.Fn zip_fopen +may also fail and set +.Va zip_err +for any of the errors specified for the routine +.Xr zip_name_locate 3 . +.Pp +The function +.Fn zip_fopen_index +may also fail with +.Er ZIP_ER_INVAL +if +.Ar index +is invalid. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fclose 3 , +.Xr zip_fread 3 , +.Xr zip_fseek 3 , +.Xr zip_get_num_entries 3 , +.Xr zip_name_locate 3 , +.Xr zip_set_default_password 3 +.Sh HISTORY +.Fn zip_fopen +and +.Fn zip_fopen_index +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_fopen_encrypted.html b/deps/libzip/man/zip_fopen_encrypted.html new file mode 100644 index 00000000000000..388466e5cae956 --- /dev/null +++ b/deps/libzip/man/zip_fopen_encrypted.html @@ -0,0 +1,158 @@ + + + + + + + ZIP_FOPEN_ENCRYPTED(3) + + + + + + + + +
ZIP_FOPEN_ENCRYPTED(3)Library Functions ManualZIP_FOPEN_ENCRYPTED(3)
+
+
+

+zip_fopen_encrypted, + zip_fopen_index_encrypted — +
open encrypted file in zip archive for reading
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_file_t * +
+ zip_fopen_encrypted(zip_t + *archive, const char + *fname, zip_flags_t + flags, const char + *password);

+

zip_file_t * +
+ zip_fopen_index_encrypted(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags, const char + *password);

+
+
+

+The zip_fopen_encrypted() function opens the encrypted + file name fname in archive using + the password given in the password argument. If + password is NULL or the empty + string, the default password is used (see + zip_set_default_password(3)). + The flags argument are the same as for + zip_fopen(3). +

The zip_fopen_index_encrypted() function + opens the file at position index, see + zip_fopen_index(3). These + functions are called automatically by + zip_fopen(3); you only need to call + them if you want to specify a non-default password (see + zip_set_default_password(3)).

+
+
+

+Upon successful completion, a struct zip_file pointer is + returned. Otherwise, NULL is returned and the error + code in archive is set to indicate the error. +
+
+

+
+
[]
+
No password was provided.
+
+

The function zip_fopen_encrypted() may + also fail and set zip_err for any of the errors + specified for the routine + zip_fopen(3).

+

The function zip_fopen_index_encrypted() + may also fail and set zip_err for any of the errors + specified for the routine + zip_fopen_index(3).

+
+
+

+libzip(3), + zip_fclose(3), + zip_fopen(3), + zip_fread(3), + zip_get_num_entries(3), + zip_name_locate(3) +
+
+

+zip_fopen_encrypted() and + zip_fopen_index_encrypted() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+

+The zip file format provides very limited possibility for password verification + (a short hash of is compared against one byte in the zip archive). For this + reason, reading a file while using an incorrect password may immediately fail + with ZIP_ER_WRONGPASSWD, but if the mismatch is not + detected, a zlib error may be returned later instead. Since zlib errors can + also be caused by broken compressed data, there is no way to make sure if the + password was incorrect or if it was correct, but the compressed data was + invalid. +
+
+ + + + + +
September 15, 2020NiH
+ + diff --git a/deps/libzip/man/zip_fopen_encrypted.man b/deps/libzip/man/zip_fopen_encrypted.man new file mode 100644 index 00000000000000..c0b00b51ed278f --- /dev/null +++ b/deps/libzip/man/zip_fopen_encrypted.man @@ -0,0 +1,144 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fopen_encrypted.mdoc -- open encrypted file in zip archive for reading +.\" Copyright (C) 2011-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FOPEN_ENCRYPTED" "3" "September 15, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fopen_encrypted\fR, +\fBzip_fopen_index_encrypted\fR +\- open encrypted file in zip archive for reading +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_file_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_fopen_encrypted\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *fname\fR, \fIzip_flags_t\ flags\fR, \fIconst\ char\ *password\fR); +.PD +.PP +\fIzip_file_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_fopen_index_encrypted\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR, \fIconst\ char\ *password\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_fopen_encrypted\fR() +function opens the encrypted file name +\fIfname\fR +in +\fIarchive\fR +using the password given in the +\fIpassword\fR +argument. +If +\fIpassword\fR +is +\fRNULL\fR +or the empty string, the default password is used (see +zip_set_default_password(3)). +The +\fIflags\fR +argument are the same as for +zip_fopen(3). +.PP +The +\fBzip_fopen_index_encrypted\fR() +function opens the file at position +\fIindex\fR, +see +zip_fopen_index(3). +These functions are called automatically by +zip_fopen(3); +you only need to call them if you want to specify a non-default password +(see +zip_set_default_password(3)). +.SH "RETURN VALUES" +Upon successful completion, a +\fIstruct zip_file\fR +pointer is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +.TP 22n +[\fRZIP_ER_NOPASSWD\fR] +No password was provided. +.PP +The function +\fBzip_fopen_encrypted\fR() +may also fail and set +\fIzip_err\fR +for any of the errors specified for the routine +zip_fopen(3). +.PP +The function +\fBzip_fopen_index_encrypted\fR() +may also fail and set +\fIzip_err\fR +for any of the errors specified for the routine +zip_fopen_index(3). +.SH "SEE ALSO" +libzip(3), +zip_fclose(3), +zip_fopen(3), +zip_fread(3), +zip_get_num_entries(3), +zip_name_locate(3) +.SH "HISTORY" +\fBzip_fopen_encrypted\fR() +and +\fBzip_fopen_index_encrypted\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> +.SH "CAVEATS" +The zip file format provides very limited possibility for password +verification (a short hash of is compared against one byte in the zip +archive). +For this reason, reading a file while using an incorrect password may +immediately fail with +\fRZIP_ER_WRONGPASSWD\fR, +but if the mismatch is not detected, a zlib error may be returned +later instead. +Since zlib errors can also be caused by broken compressed data, there +is no way to make sure if the password was incorrect or if it was +correct, but the compressed data was invalid. diff --git a/deps/libzip/man/zip_fopen_encrypted.mdoc b/deps/libzip/man/zip_fopen_encrypted.mdoc new file mode 100644 index 00000000000000..9ec69cfd2e8b55 --- /dev/null +++ b/deps/libzip/man/zip_fopen_encrypted.mdoc @@ -0,0 +1,135 @@ +.\" zip_fopen_encrypted.mdoc -- open encrypted file in zip archive for reading +.\" Copyright (C) 2011-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 15, 2020 +.Dt ZIP_FOPEN_ENCRYPTED 3 +.Os +.Sh NAME +.Nm zip_fopen_encrypted , +.Nm zip_fopen_index_encrypted +.Nd open encrypted file in zip archive for reading +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_file_t * +.Fn zip_fopen_encrypted "zip_t *archive" "const char *fname" "zip_flags_t flags" "const char *password" +.Ft zip_file_t * +.Fn zip_fopen_index_encrypted "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" "const char *password" +.Sh DESCRIPTION +The +.Fn zip_fopen_encrypted +function opens the encrypted file name +.Ar fname +in +.Ar archive +using the password given in the +.Ar password +argument. +If +.Ar password +is +.Dv NULL +or the empty string, the default password is used (see +.Xr zip_set_default_password 3 ) . +The +.Ar flags +argument are the same as for +.Xr zip_fopen 3 . +.Pp +The +.Fn zip_fopen_index_encrypted +function opens the file at position +.Ar index , +see +.Xr zip_fopen_index 3 . +These functions are called automatically by +.Xr zip_fopen 3 ; +you only need to call them if you want to specify a non-default password +(see +.Xr zip_set_default_password 3 ) . +.Sh RETURN VALUES +Upon successful completion, a +.Ft struct zip_file +pointer is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Bl -tag -width ZIP_ER_ENCRNOTSUPPXX +.It Bq Er ZIP_ER_NOPASSWD +No password was provided. +.El +.Pp +The function +.Fn zip_fopen_encrypted +may also fail and set +.Va zip_err +for any of the errors specified for the routine +.Xr zip_fopen 3 . +.Pp +The function +.Fn zip_fopen_index_encrypted +may also fail and set +.Va zip_err +for any of the errors specified for the routine +.Xr zip_fopen_index 3 . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fclose 3 , +.Xr zip_fopen 3 , +.Xr zip_fread 3 , +.Xr zip_get_num_entries 3 , +.Xr zip_name_locate 3 +.Sh HISTORY +.Fn zip_fopen_encrypted +and +.Fn zip_fopen_index_encrypted +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at +.Sh CAVEATS +The zip file format provides very limited possibility for password +verification (a short hash of is compared against one byte in the zip +archive). +For this reason, reading a file while using an incorrect password may +immediately fail with +.Er ZIP_ER_WRONGPASSWD , +but if the mismatch is not detected, a zlib error may be returned +later instead. +Since zlib errors can also be caused by broken compressed data, there +is no way to make sure if the password was incorrect or if it was +correct, but the compressed data was invalid. diff --git a/deps/libzip/man/zip_fread.html b/deps/libzip/man/zip_fread.html new file mode 100644 index 00000000000000..fbb850be122af8 --- /dev/null +++ b/deps/libzip/man/zip_fread.html @@ -0,0 +1,113 @@ + + + + + + + ZIP_FREAD(3) + + + + + + + + +
ZIP_FREAD(3)Library Functions ManualZIP_FREAD(3)
+
+
+

+zip_fread — +
read from file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_fread(zip_file_t + *file, void *buf, + zip_uint64_t nbytes);

+
+
+

+The zip_fread() function reads up to + nbytes bytes from file into + buf from the current position in the file (see + zip_fseek(3)). After reading, the + current position is updated by the number of bytes read. +
+
+

+If successful, the number of bytes actually read is returned. When + zip_fread() is called after reaching the end of the + file, 0 is returned. In case of error, -1 is returned. +
+
+

+libzip(3), + zip_fclose(3), + zip_fopen(3), + zip_fseek(3) +
+
+

+zip_fread() was added in libzip 0.6. In libzip 0.10 the + return type was changed from ssize_t to + zip_int64_t. In libzip 0.10 the type of + nbytes was changed from size_t to + zip_uint64_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
November 3, 2022NiH
+ + diff --git a/deps/libzip/man/zip_fread.man b/deps/libzip/man/zip_fread.man new file mode 100644 index 00000000000000..62348f6d84eb51 --- /dev/null +++ b/deps/libzip/man/zip_fread.man @@ -0,0 +1,89 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fread.mdoc -- read from file +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FREAD" "3" "November 3, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fread\fR +\- read from file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_fread\fR(\fIzip_file_t\ *file\fR, \fIvoid\ *buf\fR, \fIzip_uint64_t\ nbytes\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_fread\fR() +function reads up to +\fInbytes\fR +bytes from +\fIfile\fR +into +\fIbuf\fR +from the current position in the file (see +zip_fseek(3)). +After reading, the current position is updated by the number of bytes read. +.SH "RETURN VALUES" +If successful, the number of bytes actually read is returned. +When +\fBzip_fread\fR() +is called after reaching the end of the file, 0 is returned. +In case of error, \-1 is returned. +.SH "SEE ALSO" +libzip(3), +zip_fclose(3), +zip_fopen(3), +zip_fseek(3) +.SH "HISTORY" +\fBzip_fread\fR() +was added in libzip 0.6. +In libzip 0.10 the return type was changed from +\fIssize_t\fR +to +\fIzip_int64_t\fR. +In libzip 0.10 the type of +\fInbytes\fR +was changed from +\fIsize_t\fR +to +\fIzip_uint64_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_fread.mdoc b/deps/libzip/man/zip_fread.mdoc new file mode 100644 index 00000000000000..952369523324fa --- /dev/null +++ b/deps/libzip/man/zip_fread.mdoc @@ -0,0 +1,84 @@ +.\" zip_fread.mdoc -- read from file +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd November 3, 2022 +.Dt ZIP_FREAD 3 +.Os +.Sh NAME +.Nm zip_fread +.Nd read from file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_fread "zip_file_t *file" "void *buf" "zip_uint64_t nbytes" +.Sh DESCRIPTION +The +.Fn zip_fread +function reads up to +.Ar nbytes +bytes from +.Ar file +into +.Ar buf +from the current position in the file (see +.Xr zip_fseek 3 ) . +After reading, the current position is updated by the number of bytes read. +.Sh RETURN VALUES +If successful, the number of bytes actually read is returned. +When +.Fn zip_fread +is called after reaching the end of the file, 0 is returned. +In case of error, \-1 is returned. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fclose 3 , +.Xr zip_fopen 3 , +.Xr zip_fseek 3 +.Sh HISTORY +.Fn zip_fread +was added in libzip 0.6. +In libzip 0.10 the return type was changed from +.Vt ssize_t +to +.Vt zip_int64_t . +In libzip 0.10 the type of +.Ar nbytes +was changed from +.Vt size_t +to +.Vt zip_uint64_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_fseek.html b/deps/libzip/man/zip_fseek.html new file mode 100644 index 00000000000000..84c6a66c1c2435 --- /dev/null +++ b/deps/libzip/man/zip_fseek.html @@ -0,0 +1,121 @@ + + + + + + + ZIP_FSEEK(3) + + + + + + + + +
ZIP_FSEEK(3)Library Functions ManualZIP_FSEEK(3)
+
+
+

+zip_fseek, zip_file_is_seekable + — +
seek in file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int8_t +
+ zip_fseek(zip_file_t + *file, zip_int64_t + offset, int + whence);

+

int +
+ zip_file_is_seekable(zip_file_t + *file);

+
+
+

+The zip_fseek() function seeks to the specified + offset relative to whence, just + like fseek(3). +

zip_fseek only works on uncompressed + (stored), unencrypted data. When called on compressed or encrypted data it + will return an error.

+

The zip_file_is_seekable() function + returns 1 if a file is seekable.

+
+
+

+If successful, zip_fseek() returns 0. Otherwise, -1 is + returned. +

zip_file_is_seekable() returns 1 if a file + is seekable and 0 if not. On an invalid argument, it returns -1.

+
+
+

+libzip(3), + zip_fclose(3), + zip_fopen(3), + zip_fread(3), + zip_ftell(3) +
+
+

+zip_fseek() was added in libzip 1.2.0. + zip_file_is_seekable() was added in libzip 1.9.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
November 13, 2021NiH
+ + diff --git a/deps/libzip/man/zip_fseek.man b/deps/libzip/man/zip_fseek.man new file mode 100644 index 00000000000000..17a25507512422 --- /dev/null +++ b/deps/libzip/man/zip_fseek.man @@ -0,0 +1,98 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fseek.mdoc -- seek in file +.\" Copyright (C) 2016-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FSEEK" "3" "November 13, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fseek\fR, +\fBzip_file_is_seekable\fR +\- seek in file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int8_t\fR +.br +.PD 0 +.HP 4n +\fBzip_fseek\fR(\fIzip_file_t\ *file\fR, \fIzip_int64_t\ offset\fR, \fIint\ whence\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_file_is_seekable\fR(\fIzip_file_t\ *file\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_fseek\fR() +function seeks to the specified +\fIoffset\fR +relative to +\fIwhence\fR, +just like +fseek(3). +.PP +\fBzip_fseek\fR +only works on uncompressed (stored), unencrypted data. +When called on compressed or encrypted data it will return an error. +.PP +The +\fBzip_file_is_seekable\fR() +function returns 1 if a file is seekable. +.SH "RETURN VALUES" +If successful, +\fBzip_fseek\fR() +returns 0. +Otherwise, \-1 is returned. +.PP +\fBzip_file_is_seekable\fR() +returns 1 if a file is seekable and 0 if not. +On an invalid argument, it returns \-1. +.SH "SEE ALSO" +libzip(3), +zip_fclose(3), +zip_fopen(3), +zip_fread(3), +zip_ftell(3) +.SH "HISTORY" +\fBzip_fseek\fR() +was added in libzip 1.2.0. +\fBzip_file_is_seekable\fR() +was added in libzip 1.9.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_fseek.mdoc b/deps/libzip/man/zip_fseek.mdoc new file mode 100644 index 00000000000000..580b6da0a06049 --- /dev/null +++ b/deps/libzip/man/zip_fseek.mdoc @@ -0,0 +1,88 @@ +.\" zip_fseek.mdoc -- seek in file +.\" Copyright (C) 2016-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd November 13, 2021 +.Dt ZIP_FSEEK 3 +.Os +.Sh NAME +.Nm zip_fseek , +.Nm zip_file_is_seekable +.Nd seek in file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int8_t +.Fn zip_fseek "zip_file_t *file" "zip_int64_t offset" "int whence" +.Ft int +.Fn zip_file_is_seekable "zip_file_t *file" +.Sh DESCRIPTION +The +.Fn zip_fseek +function seeks to the specified +.Ar offset +relative to +.Ar whence , +just like +.Xr fseek 3 . +.Pp +.Nm +only works on uncompressed (stored), unencrypted data. +When called on compressed or encrypted data it will return an error. +.Pp +The +.Fn zip_file_is_seekable +function returns 1 if a file is seekable. +.Sh RETURN VALUES +If successful, +.Fn zip_fseek +returns 0. +Otherwise, \-1 is returned. +.Pp +.Fn zip_file_is_seekable +returns 1 if a file is seekable and 0 if not. +On an invalid argument, it returns \-1. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fclose 3 , +.Xr zip_fopen 3 , +.Xr zip_fread 3 , +.Xr zip_ftell 3 +.Sh HISTORY +.Fn zip_fseek +was added in libzip 1.2.0. +.Fn zip_file_is_seekable +was added in libzip 1.9.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_ftell.html b/deps/libzip/man/zip_ftell.html new file mode 100644 index 00000000000000..8c890542cef87c --- /dev/null +++ b/deps/libzip/man/zip_ftell.html @@ -0,0 +1,105 @@ + + + + + + + ZIP_FTELL(3) + + + + + + + + +
ZIP_FTELL(3)Library Functions ManualZIP_FTELL(3)
+
+
+

+zip_ftell — +
tell position in file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_ftell(zip_file_t + *file);

+
+
+

+The zip_ftell() function reports the current offset in + the file. +
+
+

+If successful, zip_ftell returns the current file + position. Otherwise, -1 is returned. +
+
+

+libzip(3), + zip_fclose(3), + zip_fopen(3), + zip_fread(3), + zip_fseek(3) +
+
+

+zip_ftell() was added in libzip 1.2.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
July 21, 2020NiH
+ + diff --git a/deps/libzip/man/zip_ftell.man b/deps/libzip/man/zip_ftell.man new file mode 100644 index 00000000000000..9d531743d0e2c2 --- /dev/null +++ b/deps/libzip/man/zip_ftell.man @@ -0,0 +1,71 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_ftell.mdoc -- tell position in file +.\" Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_FTELL" "3" "July 21, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_ftell\fR +\- tell position in file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_ftell\fR(\fIzip_file_t\ *file\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_ftell\fR() +function reports the current offset in the file. +.SH "RETURN VALUES" +If successful, +\fBzip_ftell\fR +returns the current file position. +Otherwise, \-1 is returned. +.SH "SEE ALSO" +libzip(3), +zip_fclose(3), +zip_fopen(3), +zip_fread(3), +zip_fseek(3) +.SH "HISTORY" +\fBzip_ftell\fR() +was added in libzip 1.2.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_ftell.mdoc b/deps/libzip/man/zip_ftell.mdoc new file mode 100644 index 00000000000000..02635a0417f86f --- /dev/null +++ b/deps/libzip/man/zip_ftell.mdoc @@ -0,0 +1,66 @@ +.\" zip_ftell.mdoc -- tell position in file +.\" Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd July 21, 2020 +.Dt ZIP_FTELL 3 +.Os +.Sh NAME +.Nm zip_ftell +.Nd tell position in file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_ftell "zip_file_t *file" +.Sh DESCRIPTION +The +.Fn zip_ftell +function reports the current offset in the file. +.Sh RETURN VALUES +If successful, +.Nm +returns the current file position. +Otherwise, \-1 is returned. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fclose 3 , +.Xr zip_fopen 3 , +.Xr zip_fread 3 , +.Xr zip_fseek 3 +.Sh HISTORY +.Fn zip_ftell +was added in libzip 1.2.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_archive_comment.html b/deps/libzip/man/zip_get_archive_comment.html new file mode 100644 index 00000000000000..ec585dc5b981ac --- /dev/null +++ b/deps/libzip/man/zip_get_archive_comment.html @@ -0,0 +1,131 @@ + + + + + + + ZIP_GET_ARCHIVE_COMMENT(3) + + + + + + + + +
ZIP_GET_ARCHIVE_COMMENT(3)Library Functions ManualZIP_GET_ARCHIVE_COMMENT(3)
+
+
+

+zip_get_archive_comment — +
get zip archive comment
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_get_archive_comment(zip_t + *archive, int + *lenp, zip_flags_t + flags);

+
+
+

+The zip_get_archive_comment() function returns the + comment for the entire zip archive. The return value is in UTF-8 encoding + unless ZIP_FL_ENC_RAW was specified (see below). This + pointer should not be modified or + free(3)'d, and becomes invalid when + archive is closed. If lenp is not + NULL, the integer to which it points will be set to + the length of the comment. If flags is set to + ZIP_FL_UNCHANGED, the original unchanged comment is + returned. +

Additionally, the following flags are + supported:

+
+
+
+
Return the unmodified archive comment as it is in the ZIP archive.
+
+
(Default.) Guess the encoding of the archive comment in the ZIP archive + and convert it to UTF-8, if necessary. (Only CP-437 and UTF-8 are + recognized.)
+
+
Follow the ZIP specification for file names and extend it to the archive + comment, thus also expecting it in CP-437 encoding. Convert it to + UTF-8.
+
+
+Note: ASCII is a subset of both CP-437 and UTF-8. +
+
+

+Upon successful completion, a pointer to the comment is returned, or + NULL if there is no comment. +
+
+

+libzip(3), + zip_file_get_comment(3) +
+
+

+zip_get_archive_comment() was added in libzip 0.7. In + libzip 0.11 the type of flags was changed from + int to zip_flags_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 22, 2020NiH
+ + diff --git a/deps/libzip/man/zip_get_archive_comment.man b/deps/libzip/man/zip_get_archive_comment.man new file mode 100644 index 00000000000000..f74dc90b48b139 --- /dev/null +++ b/deps/libzip/man/zip_get_archive_comment.man @@ -0,0 +1,115 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_archive_comment.mdoc -- get zip archive comment +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_ARCHIVE_COMMENT" "3" "September 22, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_archive_comment\fR +\- get zip archive comment +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_get_archive_comment\fR(\fIzip_t\ *archive\fR, \fIint\ *lenp\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_get_archive_comment\fR() +function returns the comment for the entire zip archive. +The return value is in UTF-8 encoding unless +\fRZIP_FL_ENC_RAW\fR +was specified (see below). +This pointer should not be modified or +free(3)'d, +and becomes invalid when +\fIarchive\fR +is closed. +If +\fIlenp\fR +is not +\fRNULL\fR, +the integer to which it points will be set to the length of the +comment. +If +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original unchanged comment is returned. +.PP +Additionally, the following +\fIflags\fR +are supported: +.RS 6n +.TP 21n +\fRZIP_FL_ENC_RAW\fR +Return the unmodified archive comment as it is in the ZIP archive. +.TP 21n +\fRZIP_FL_ENC_GUESS\fR +(Default.) +Guess the encoding of the archive comment in the ZIP archive and convert it +to UTF-8, if necessary. +(Only CP-437 and UTF-8 are recognized.) +.TP 21n +\fRZIP_FL_ENC_STRICT\fR +Follow the ZIP specification for file names and extend it to the +archive comment, thus also expecting it in CP-437 encoding. +Convert it to UTF-8. +.RE +\fINote\fR: +ASCII is a subset of both CP-437 and UTF-8. +.SH "RETURN VALUES" +Upon successful completion, a pointer to the comment is returned, +or +\fRNULL\fR +if there is no comment. +.SH "SEE ALSO" +libzip(3), +zip_file_get_comment(3) +.SH "HISTORY" +\fBzip_get_archive_comment\fR() +was added in libzip 0.7. +In libzip 0.11 the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_archive_comment.mdoc b/deps/libzip/man/zip_get_archive_comment.mdoc new file mode 100644 index 00000000000000..370924e3f78b44 --- /dev/null +++ b/deps/libzip/man/zip_get_archive_comment.mdoc @@ -0,0 +1,112 @@ +.\" zip_get_archive_comment.mdoc -- get zip archive comment +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 22, 2020 +.Dt ZIP_GET_ARCHIVE_COMMENT 3 +.Os +.Sh NAME +.Nm zip_get_archive_comment +.Nd get zip archive comment +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_get_archive_comment "zip_t *archive" "int *lenp" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_get_archive_comment +function returns the comment for the entire zip archive. +The return value is in UTF-8 encoding unless +.Dv ZIP_FL_ENC_RAW +was specified (see below). +This pointer should not be modified or +.Xr free 3 Ap d , +and becomes invalid when +.Ar archive +is closed. +If +.Ar lenp +is not +.Dv NULL , +the integer to which it points will be set to the length of the +comment. +If +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original unchanged comment is returned. +.Pp +Additionally, the following +.Ar flags +are supported: +.Bl -tag -width ZIP_FL_ENC_STRICTXX -offset indent +.It Dv ZIP_FL_ENC_RAW +Return the unmodified archive comment as it is in the ZIP archive. +.It Dv ZIP_FL_ENC_GUESS +(Default.) +Guess the encoding of the archive comment in the ZIP archive and convert it +to UTF-8, if necessary. +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_STRICT +Follow the ZIP specification for file names and extend it to the +archive comment, thus also expecting it in CP-437 encoding. +Convert it to UTF-8. +.El +.Em Note : +ASCII is a subset of both CP-437 and UTF-8. +.Sh RETURN VALUES +Upon successful completion, a pointer to the comment is returned, +or +.Dv NULL +if there is no comment. +.\" In case of an error, +.\" .Dv NULL +.\" is returned and the error code in +.\" .Ar archive +.\" is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_get_comment 3 +.Sh HISTORY +.Fn zip_get_archive_comment +was added in libzip 0.7. +In libzip 0.11 the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_archive_flag.html b/deps/libzip/man/zip_get_archive_flag.html new file mode 100644 index 00000000000000..23cab56cbbfb37 --- /dev/null +++ b/deps/libzip/man/zip_get_archive_flag.html @@ -0,0 +1,118 @@ + + + + + + + ZIP_GET_ARCHIVE_FLAG(3) + + + + + + + + +
ZIP_GET_ARCHIVE_FLAG(3)Library Functions ManualZIP_GET_ARCHIVE_FLAG(3)
+
+
+

+zip_get_archive_flag — +
get status flags for zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_get_archive_flag(zip_t + *archive, zip_flags_t + flag, zip_flags_t + flags);

+
+
+

+The zip_get_archive_flag() function returns if the flag + flag is set for the archive + archive. The archive flags might have been changed with + zip_set_archive_flag(); if flags + is set to ZIP_FL_UNCHANGED, the original unchanged + flags are tested. +

Supported flags are:

+
+
+
The archive is read-only.
+
+
+
+

+zip_get_archive_flag() returns 1 if + flag is set for archive, 0 if not, + and -1 if an error occurred. +
+
+

+libzip(3), + zip_set_archive_flag(3) +
+
+

+zip_get_archive_flag() was added in libzip 0.9. In + libzip 0.11 the type of flag was changed from + int to zip_flags_t m and the type + of flags was changed from int to + zip_flags_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_get_archive_flag.man b/deps/libzip/man/zip_get_archive_flag.man new file mode 100644 index 00000000000000..81c5d07618026d --- /dev/null +++ b/deps/libzip/man/zip_get_archive_flag.man @@ -0,0 +1,98 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_archive_flag.mdoc -- get comment for file in zip +.\" Copyright (C) 2008-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_ARCHIVE_FLAG" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_archive_flag\fR +\- get status flags for zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_get_archive_flag\fR(\fIzip_t\ *archive\fR, \fIzip_flags_t\ flag\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_get_archive_flag\fR() +function returns if the flag +\fIflag\fR +is set for the archive +\fIarchive\fR. +The archive flags might have been changed with +\fBzip_set_archive_flag\fR(); +if +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original unchanged flags are tested. +.PP +Supported flags are: +.TP 20n +\fRZIP_AFL_RDONLY\fR +The archive is read-only. +.SH "RETURN VALUES" +\fBzip_get_archive_flag\fR() +returns 1 if +\fIflag\fR +is set for +\fIarchive\fR, +0 if not, +and \-1 if an error occurred. +.SH "SEE ALSO" +libzip(3), +zip_set_archive_flag(3) +.SH "HISTORY" +\fBzip_get_archive_flag\fR() +was added in libzip 0.9. +In libzip 0.11 the type of +\fIflag\fR +was changed from +\fIint\fR +to +\fIzip_flags_t m\fR +and the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_archive_flag.mdoc b/deps/libzip/man/zip_get_archive_flag.mdoc new file mode 100644 index 00000000000000..4909819c84fe7a --- /dev/null +++ b/deps/libzip/man/zip_get_archive_flag.mdoc @@ -0,0 +1,94 @@ +.\" zip_get_archive_flag.mdoc -- get comment for file in zip +.\" Copyright (C) 2008-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_GET_ARCHIVE_FLAG 3 +.Os +.Sh NAME +.Nm zip_get_archive_flag +.Nd get status flags for zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_get_archive_flag "zip_t *archive" "zip_flags_t flag" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_get_archive_flag +function returns if the flag +.Ar flag +is set for the archive +.Ar archive . +The archive flags might have been changed with +.Fn zip_set_archive_flag ; +if +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original unchanged flags are tested. +.Pp +Supported flags are: +.Bl -tag -width XZIPXAFLXRDONLYXXX +.It Dv ZIP_AFL_RDONLY +The archive is read-only. +.El +.Sh RETURN VALUES +.Fn zip_get_archive_flag +returns 1 if +.Ar flag +is set for +.Ar archive , +0 if not, +and \-1 if an error occurred. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_set_archive_flag 3 +.Sh HISTORY +.Fn zip_get_archive_flag +was added in libzip 0.9. +In libzip 0.11 the type of +.Ar flag +was changed from +.Vt int +to +.Vt zip_flags_t m +and the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_error.html b/deps/libzip/man/zip_get_error.html new file mode 100644 index 00000000000000..efdcd6b4c50fa2 --- /dev/null +++ b/deps/libzip/man/zip_get_error.html @@ -0,0 +1,97 @@ + + + + + + + ZIP_GET_ERROR(3) + + + + + + + + +
ZIP_GET_ERROR(3)Library Functions ManualZIP_GET_ERROR(3)
+
+
+

+zip_get_error — +
get zip error for archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_error_t * +
+ zip_get_error(zip_t + *archive);

+
+
+

+The zip_get_error() function returns the zip error for + the zip archive archive. +
+
+

+libzip(3), + zip_error_code_system(3), + zip_error_code_zip(3) +
+
+

+zip_get_error() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_get_error.man b/deps/libzip/man/zip_get_error.man new file mode 100644 index 00000000000000..e5cf4a5f02ecbb --- /dev/null +++ b/deps/libzip/man/zip_get_error.man @@ -0,0 +1,65 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_error.mdoc -- get zip_error for archive +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_ERROR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_error\fR +\- get zip error for archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_error_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_get_error\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_get_error\fR() +function returns the zip error for the zip archive +\fIarchive\fR. +.SH "SEE ALSO" +libzip(3), +zip_error_code_system(3), +zip_error_code_zip(3) +.SH "HISTORY" +\fBzip_get_error\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_error.mdoc b/deps/libzip/man/zip_get_error.mdoc new file mode 100644 index 00000000000000..6406993d65d20e --- /dev/null +++ b/deps/libzip/man/zip_get_error.mdoc @@ -0,0 +1,60 @@ +.\" zip_get_error.mdoc -- get zip_error for archive +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_GET_ERROR 3 +.Os +.Sh NAME +.Nm zip_get_error +.Nd get zip error for archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_error_t * +.Fn zip_get_error "zip_t *archive" +.Sh DESCRIPTION +The +.Fn zip_get_error +function returns the zip error for the zip archive +.Ar archive . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_code_system 3 , +.Xr zip_error_code_zip 3 +.Sh HISTORY +.Fn zip_get_error +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_file_comment.html b/deps/libzip/man/zip_get_file_comment.html new file mode 100644 index 00000000000000..c883577ad87d1b --- /dev/null +++ b/deps/libzip/man/zip_get_file_comment.html @@ -0,0 +1,105 @@ + + + + + + + ZIP_GET_FILE_COMMENT(3) + + + + + + + + +
ZIP_GET_FILE_COMMENT(3)Library Functions ManualZIP_GET_FILE_COMMENT(3)
+
+
+

+zip_get_file_comment — +
get comment for file in zip (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_get_file_comment(zip_t + *archive, zip_uint64_t + index, int *lenp, + int flags);

+
+
+

+The zip_get_file_comment() function is the obsolete + version of + zip_file_get_comment(3). + The only differences are the types of the lenp and + flags arguments. +
+
+

+libzip(3), + zip_file_get_comment(3) +
+
+

+zip_get_file_comment() was added in libzip 0.7. In + libzip 0.10 the type of index was changed from + int to zip_uint64_t. It was + deprecated in libzip 0.11, use zip_file_get_comment() + instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_get_file_comment.man b/deps/libzip/man/zip_get_file_comment.man new file mode 100644 index 00000000000000..c789330de707e1 --- /dev/null +++ b/deps/libzip/man/zip_get_file_comment.man @@ -0,0 +1,78 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_file_comment.mdoc -- get comment for file in zip +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_FILE_COMMENT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_file_comment\fR +\- get comment for file in zip (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_get_file_comment\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIint\ *lenp\fR, \fIint\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_get_file_comment\fR() +function is the obsolete version of +zip_file_get_comment(3). +The only differences are the types of the +\fIlenp\fR +and +\fIflags\fR +arguments. +.SH "SEE ALSO" +libzip(3), +zip_file_get_comment(3) +.SH "HISTORY" +\fBzip_get_file_comment\fR() +was added in libzip 0.7. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +It was deprecated in libzip 0.11, use +\fBzip_file_get_comment\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_file_comment.mdoc b/deps/libzip/man/zip_get_file_comment.mdoc new file mode 100644 index 00000000000000..9551d3fc12be18 --- /dev/null +++ b/deps/libzip/man/zip_get_file_comment.mdoc @@ -0,0 +1,73 @@ +.\" zip_get_file_comment.mdoc -- get comment for file in zip +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_GET_FILE_COMMENT 3 +.Os +.Sh NAME +.Nm zip_get_file_comment +.Nd get comment for file in zip (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_get_file_comment "zip_t *archive" "zip_uint64_t index" "int *lenp" "int flags" +.Sh DESCRIPTION +The +.Fn zip_get_file_comment +function is the obsolete version of +.Xr zip_file_get_comment 3 . +The only differences are the types of the +.Ar lenp +and +.Ar flags +arguments. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_get_comment 3 +.Sh HISTORY +.Fn zip_get_file_comment +was added in libzip 0.7. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +It was deprecated in libzip 0.11, use +.Fn zip_file_get_comment +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_name.html b/deps/libzip/man/zip_get_name.html new file mode 100644 index 00000000000000..dc10e6976c78a0 --- /dev/null +++ b/deps/libzip/man/zip_get_name.html @@ -0,0 +1,146 @@ + + + + + + + ZIP_GET_NAME(3) + + + + + + + + +
ZIP_GET_NAME(3)Library Functions ManualZIP_GET_NAME(3)
+
+
+

+zip_get_name — +
get name of file by index
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_get_name(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags);

+
+
+

+The zip_get_name() function returns the name of the file + at position index in archive. The + name is in UTF-8 encoding unless ZIP_FL_ENC_RAW was + specified (see below). +

If flags is set to + ZIP_FL_UNCHANGED, the original unchanged filename is + returned. The returned string must not be modified or freed, and becomes + invalid when archive is closed.

+

Additionally, the following flags are + supported:

+
+
+
+
Return the unmodified names as it is in the ZIP archive.
+
+
(Default.) Guess the encoding of the name in the ZIP archive and convert + it to UTF-8, if necessary. (Only CP-437 and UTF-8 are recognized.)
+
+
Follow the ZIP specification and expect CP-437 encoded names in the ZIP + archive (except if they are explicitly marked as UTF-8). Convert it to + UTF-8.
+
+
+Note: ASCII is a subset of both CP-437 and UTF-8. +
+
+

+Upon successful completion, a pointer to the name is returned. Otherwise, + NULL and the error code in + archive is set to indicate the error. +
+
+

+zip_get_name() fails if: +
+
[]
+
index refers to a file that has been deleted (see + zip_delete(3)).
+
[]
+
index is not a valid file index in + archive, or index points to an + added file and ZIP_FL_UNCHANGED is set.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_name_locate(3) +
+
+

+zip_get_name() was added in libzip 0.6. In libzip 0.10 + the type of index was changed from + int to zip_uint64_t. In libzip + 0.11 the type of flags was changed from + int to zip_flags_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 22, 2020NiH
+ + diff --git a/deps/libzip/man/zip_get_name.man b/deps/libzip/man/zip_get_name.man new file mode 100644 index 00000000000000..2095137cc4146b --- /dev/null +++ b/deps/libzip/man/zip_get_name.man @@ -0,0 +1,141 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_name.mdoc -- get name of file by index +.\" Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_NAME" "3" "September 22, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_name\fR +\- get name of file by index +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_get_name\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_get_name\fR() +function returns the name of the file at position +\fIindex\fR +in +\fIarchive\fR. +The name is in UTF-8 encoding unless +\fRZIP_FL_ENC_RAW\fR +was specified (see below). +.PP +If +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original unchanged filename is returned. +The returned string must not be modified or freed, and becomes invalid when +\fIarchive\fR +is closed. +.PP +Additionally, the following +\fIflags\fR +are supported: +.RS 6n +.TP 21n +\fRZIP_FL_ENC_RAW\fR +Return the unmodified names as it is in the ZIP archive. +.TP 21n +\fRZIP_FL_ENC_GUESS\fR +(Default.) +Guess the encoding of the name in the ZIP archive and convert it +to UTF-8, if necessary. +(Only CP-437 and UTF-8 are recognized.) +.TP 21n +\fRZIP_FL_ENC_STRICT\fR +Follow the ZIP specification and expect CP-437 encoded names in +the ZIP archive (except if they are explicitly marked as UTF-8). +Convert it to UTF-8. +.RE +\fINote\fR: +ASCII is a subset of both CP-437 and UTF-8. +.SH "RETURN VALUES" +Upon successful completion, a pointer to the name is returned. +Otherwise, +\fRNULL\fR +and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_get_name\fR() +fails if: +.TP 19n +[\fRZIP_ER_DELETED\fR] +\fIindex\fR +refers to a file that has been deleted +(see +zip_delete(3)). +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR, +or +\fIindex\fR +points to an added file and +\fRZIP_FL_UNCHANGED\fR +is set. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_name_locate(3) +.SH "HISTORY" +\fBzip_get_name\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +In libzip 0.11 the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_name.mdoc b/deps/libzip/man/zip_get_name.mdoc new file mode 100644 index 00000000000000..783cd3d28dd3e2 --- /dev/null +++ b/deps/libzip/man/zip_get_name.mdoc @@ -0,0 +1,132 @@ +.\" zip_get_name.mdoc -- get name of file by index +.\" Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 22, 2020 +.Dt ZIP_GET_NAME 3 +.Os +.Sh NAME +.Nm zip_get_name +.Nd get name of file by index +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_get_name "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_get_name +function returns the name of the file at position +.Ar index +in +.Ar archive . +The name is in UTF-8 encoding unless +.Dv ZIP_FL_ENC_RAW +was specified (see below). +.Pp +If +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original unchanged filename is returned. +The returned string must not be modified or freed, and becomes invalid when +.Ar archive +is closed. +.Pp +Additionally, the following +.Ar flags +are supported: +.Bl -tag -width ZIP_FL_ENC_STRICTXX -offset indent +.It Dv ZIP_FL_ENC_RAW +Return the unmodified names as it is in the ZIP archive. +.It Dv ZIP_FL_ENC_GUESS +(Default.) +Guess the encoding of the name in the ZIP archive and convert it +to UTF-8, if necessary. +(Only CP-437 and UTF-8 are recognized.) +.It Dv ZIP_FL_ENC_STRICT +Follow the ZIP specification and expect CP-437 encoded names in +the ZIP archive (except if they are explicitly marked as UTF-8). +Convert it to UTF-8. +.El +.Em Note : +ASCII is a subset of both CP-437 and UTF-8. +.Sh RETURN VALUES +Upon successful completion, a pointer to the name is returned. +Otherwise, +.Dv NULL +and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_get_name +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_DELETED +.Ar index +refers to a file that has been deleted +(see +.Xr zip_delete 3 ) . +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive , +or +.Ar index +points to an added file and +.Dv ZIP_FL_UNCHANGED +is set. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_name_locate 3 +.Sh HISTORY +.Fn zip_get_name +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +In libzip 0.11 the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_num_entries.html b/deps/libzip/man/zip_get_num_entries.html new file mode 100644 index 00000000000000..4020cdba8075a4 --- /dev/null +++ b/deps/libzip/man/zip_get_num_entries.html @@ -0,0 +1,116 @@ + + + + + + + ZIP_GET_NUM_ENTRIES(3) + + + + + + + + +
ZIP_GET_NUM_ENTRIES(3)Library Functions ManualZIP_GET_NUM_ENTRIES(3)
+
+
+

+zip_get_num_entries — +
get number of entries in archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_get_num_entries(zip_t + *archive, zip_flags_t + flags);

+
+
+

+The zip_get_num_entries() function returns the number of + entries in archive. Entries are all files that are + present in the original archive or that were added while the archive is open. + This includes deleted files, since indices are not renumbered until the + archive is closed. (This allows to refer to deleted files, e. g. to undelete + them.) +

If flags is set to + ZIP_FL_UNCHANGED, the original number of files is + returned.

+
+
+

+zip_get_num_entries() returns the number of entries in + the zip archive, or -1 if archive is + NULL. +
+
+

+libzip(3), + zip_fopen_index(3), + zip_stat_index(3) +
+
+

+zip_get_num_entries() was added in libzip 0.10. In + libzip 0.11 the return type was changed from + zip_uint64_t to zip_int64_t. In + libzip 0.11 the type of flags was changed from + int to zip_flags_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
August 19, 2022NiH
+ + diff --git a/deps/libzip/man/zip_get_num_entries.man b/deps/libzip/man/zip_get_num_entries.man new file mode 100644 index 00000000000000..5c07997aa1d832 --- /dev/null +++ b/deps/libzip/man/zip_get_num_entries.man @@ -0,0 +1,93 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_num_entries.mdoc -- get number of files in archive +.\" Copyright (C) 2011-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_NUM_ENTRIES" "3" "August 19, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_num_entries\fR +\- get number of entries in archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_get_num_entries\fR(\fIzip_t\ *archive\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_get_num_entries\fR() +function returns the number of entries in +\fIarchive\fR. +Entries are all files that are present in the original archive or that +were added while the archive is open. +This includes deleted files, since +indices are not renumbered until the archive is closed. +(This allows to refer to deleted files, e. g. to undelete them.) +.PP +If +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original number of files is returned. +.SH "RETURN VALUES" +\fBzip_get_num_entries\fR() +returns the number of entries in the zip archive, +or \-1 if +\fIarchive\fR +is +\fRNULL\fR. +.SH "SEE ALSO" +libzip(3), +zip_fopen_index(3), +zip_stat_index(3) +.SH "HISTORY" +\fBzip_get_num_entries\fR() +was added in libzip 0.10. +In libzip 0.11 the return type was changed from +\fIzip_uint64_t\fR +to +\fIzip_int64_t\fR. +In libzip 0.11 the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_num_entries.mdoc b/deps/libzip/man/zip_get_num_entries.mdoc new file mode 100644 index 00000000000000..ec1de6856d5196 --- /dev/null +++ b/deps/libzip/man/zip_get_num_entries.mdoc @@ -0,0 +1,88 @@ +.\" zip_get_num_entries.mdoc -- get number of files in archive +.\" Copyright (C) 2011-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd August 19, 2022 +.Dt ZIP_GET_NUM_ENTRIES 3 +.Os +.Sh NAME +.Nm zip_get_num_entries +.Nd get number of entries in archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_get_num_entries "zip_t *archive" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_get_num_entries +function returns the number of entries in +.Ar archive . +Entries are all files that are present in the original archive or that +were added while the archive is open. +This includes deleted files, since +indices are not renumbered until the archive is closed. +(This allows to refer to deleted files, e. g. to undelete them.) +.Pp +If +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original number of files is returned. +.Sh RETURN VALUES +.Fn zip_get_num_entries +returns the number of entries in the zip archive, +or \-1 if +.Ar archive +is +.Dv NULL . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fopen_index 3 , +.Xr zip_stat_index 3 +.Sh HISTORY +.Fn zip_get_num_entries +was added in libzip 0.10. +In libzip 0.11 the return type was changed from +.Vt zip_uint64_t +to +.Vt zip_int64_t . +In libzip 0.11 the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_get_num_files.html b/deps/libzip/man/zip_get_num_files.html new file mode 100644 index 00000000000000..cee42799a22791 --- /dev/null +++ b/deps/libzip/man/zip_get_num_files.html @@ -0,0 +1,110 @@ + + + + + + + ZIP_GET_NUM_FILES(3) + + + + + + + + +
ZIP_GET_NUM_FILES(3)Library Functions ManualZIP_GET_NUM_FILES(3)
+
+
+

+zip_get_num_files — +
get number of files in archive (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_get_num_files(zip_t + *archive);

+
+
+

+This function is deprecated. Use + zip_get_num_entries(3) + instead. +

The zip_get_num_files() function returns + the number of files in archive.

+
+
+

+zip_get_num_files() returns the number of files in the + zip archive, or -1 if archive is + NULL. +
+
+

+libzip(3), + zip_fopen_index(3), + zip_stat_index(3) +
+
+

+zip_get_num_files() was added in libzip 0.6. It was + deprecated in libzip 0.11, use + zip_get_num_entries(instead) + instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_get_num_files.man b/deps/libzip/man/zip_get_num_files.man new file mode 100644 index 00000000000000..266f56f4d11049 --- /dev/null +++ b/deps/libzip/man/zip_get_num_files.man @@ -0,0 +1,80 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_get_num_files.mdoc -- get number of files in archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_GET_NUM_FILES" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_num_files\fR +\- get number of files in archive (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_get_num_files\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +\fIThis function is deprecated\fR. +\fIUse\fR +zip_get_num_entries(3) +\fIinstead\fR. +.PP +The +\fBzip_get_num_files\fR() +function returns the number of files in +\fIarchive\fR. +.SH "RETURN VALUES" +\fBzip_get_num_files\fR() +returns the number of files in the zip archive, +or \-1 if +\fIarchive\fR +is +\fRNULL\fR. +.SH "SEE ALSO" +libzip(3), +zip_fopen_index(3), +zip_stat_index(3) +.SH "HISTORY" +\fBzip_get_num_files\fR() +was added in libzip 0.6. +It was deprecated in libzip 0.11, use +\fBzip_get_num_entries\fR(\fIinstead\fR) +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_get_num_files.mdoc b/deps/libzip/man/zip_get_num_files.mdoc new file mode 100644 index 00000000000000..e53ed65cd7b18c --- /dev/null +++ b/deps/libzip/man/zip_get_num_files.mdoc @@ -0,0 +1,75 @@ +.\" zip_get_num_files.mdoc -- get number of files in archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_GET_NUM_FILES 3 +.Os +.Sh NAME +.Nm zip_get_num_files +.Nd get number of files in archive (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_get_num_files "zip_t *archive" +.Sh DESCRIPTION +.Em This function is deprecated . +.Em Use +.Xr zip_get_num_entries 3 +.Em instead . +.Pp +The +.Fn zip_get_num_files +function returns the number of files in +.Ar archive . +.Sh RETURN VALUES +.Fn zip_get_num_files +returns the number of files in the zip archive, +or \-1 if +.Ar archive +is +.Dv NULL . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fopen_index 3 , +.Xr zip_stat_index 3 +.Sh HISTORY +.Fn zip_get_num_files +was added in libzip 0.6. +It was deprecated in libzip 0.11, use +.Fn zip_get_num_entries instead +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_libzip_version.html b/deps/libzip/man/zip_libzip_version.html new file mode 100644 index 00000000000000..474e9df0e397e9 --- /dev/null +++ b/deps/libzip/man/zip_libzip_version.html @@ -0,0 +1,98 @@ + + + + + + + ZIP_LIBZIP_VERSION(3) + + + + + + + + +
ZIP_LIBZIP_VERSION(3)Library Functions ManualZIP_LIBZIP_VERSION(3)
+
+
+

+zip_libzip_version — +
return run-time version of library
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

const char * +
+ zip_libzip_version(void);

+
+
+

+zip_libzip_version returns the version number of the + library as string in the format “$MAJOR.$MINOR.$MICRO$SUFFIX” + where $MAJOR is the major version, + $MINOR the minor, $MICRO the + micro, and $SUFFIX a suffix that's only set for + development versions. +
+
+

+libzip(3) +
+
+

+zip_libzip_version() was added in libzip 1.3.1. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_libzip_version.man b/deps/libzip/man/zip_libzip_version.man new file mode 100644 index 00000000000000..384e0cc01bf6ef --- /dev/null +++ b/deps/libzip/man/zip_libzip_version.man @@ -0,0 +1,71 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_libzip_version.mdoc -- return run-time version of library +.\" Copyright (C) 2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_LIBZIP_VERSION" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_libzip_version\fR +\- return run-time version of library +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIconst char *\fR +.br +.PD 0 +.HP 4n +\fBzip_libzip_version\fR(\fIvoid\fR); +.PD +.SH "DESCRIPTION" +\fBzip_libzip_version\fR +returns the version number of the library as string in the format +\(lq$MAJOR.$MINOR.$MICRO$SUFFIX\(rq +where +\fI$MAJOR\fR +is the major version, +\fI$MINOR\fR +the minor, +\fI$MICRO\fR +the micro, and +\fI$SUFFIX\fR +a suffix that's only set for development versions. +.SH "SEE ALSO" +libzip(3) +.SH "HISTORY" +\fBzip_libzip_version\fR() +was added in libzip 1.3.1. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_libzip_version.mdoc b/deps/libzip/man/zip_libzip_version.mdoc new file mode 100644 index 00000000000000..3ee31fb7fcda7e --- /dev/null +++ b/deps/libzip/man/zip_libzip_version.mdoc @@ -0,0 +1,66 @@ +.\" zip_libzip_version.mdoc -- return run-time version of library +.\" Copyright (C) 2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_LIBZIP_VERSION 3 +.Os +.Sh NAME +.Nm zip_libzip_version +.Nd return run-time version of library +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft const char * +.Fn zip_libzip_version void +.Sh DESCRIPTION +.Nm +returns the version number of the library as string in the format +.Dq $MAJOR.$MINOR.$MICRO$SUFFIX +where +.Ar $MAJOR +is the major version, +.Ar $MINOR +the minor, +.Ar $MICRO +the micro, and +.Ar $SUFFIX +a suffix that's only set for development versions. +.Sh SEE ALSO +.Xr libzip 3 +.Sh HISTORY +.Fn zip_libzip_version +was added in libzip 1.3.1. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_name_locate.html b/deps/libzip/man/zip_name_locate.html new file mode 100644 index 00000000000000..f543db29d64e9f --- /dev/null +++ b/deps/libzip/man/zip_name_locate.html @@ -0,0 +1,163 @@ + + + + + + + ZIP_NAME_LOCATE(3) + + + + + + + + +
ZIP_NAME_LOCATE(3)Library Functions ManualZIP_NAME_LOCATE(3)
+
+
+

+zip_name_locate — +
get index of file by name
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_name_locate(zip_t + *archive, const char + *fname, zip_flags_t + flags);

+
+
+

+The zip_name_locate() function returns the index of the + file named fname in archive. If + archive does not contain a file with that name, -1 is + returned. +

If neither ZIP_FL_ENC_RAW nor + ZIP_FL_ENC_STRICT are specified, guess the encoding + of the name in the ZIP archive and convert it to UTF-8, if necessary, before + comparing.

+

If neither ZIP_FL_ENC_CP437 nor + ZIP_FL_ENC_UTF_8 are specified, guess the encoding + of fname.

+

Only CP-437 and UTF-8 are recognized.

+

The flags are specified by + or'ing the following values, or 0 + for none of them.

+
+
+
+
Ignore case distinctions. (Will only work well if the file names are + ASCII.) With this flag, zip_name_locate() will be + slow for archives with many files.
+
+
Ignore directory part of file name in archive. With this flag, + zip_name_locate() will be slow for archives with + many files.
+
+
This flag has no effect (its value is 0); it can be used to explicitly + denote the absence of encoding flags.
+
+
Compare fname against the unmodified names as they + are in the ZIP archive, without converting them to UTF-8.
+
+
Follow the ZIP specification and expect CP-437 encoded names in the ZIP + archive (except if they are explicitly marked as UTF-8). Convert them to + UTF-8 before comparing.
+
+
fname is encoded as CP-437.
+
+
fname is encoded as UTF-8.
+
+
+

Note: ASCII is a subset of both CP-437 and + UTF-8.

+
+
+

+zip_name_locate() returns the index of the file named + fname or -1, if archive does not + contain an entry of that name. +
+
+

+zip_name_locate() fails if: +
+
[]
+
One of the arguments is invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
No entry of the name fname is found in the + archive.
+
+
+
+

+libzip(3), + zip_get_name(3) +
+
+

+zip_name_locate() was added in libzip 0.6. In libzip + 0.11 the return type was changed from int to + zip_int64_t. In libzip 0.11 the type of + flags was changed from int to + zip_flags_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
March 15, 2022NiH
+ + diff --git a/deps/libzip/man/zip_name_locate.man b/deps/libzip/man/zip_name_locate.man new file mode 100644 index 00000000000000..e7039d1c3322db --- /dev/null +++ b/deps/libzip/man/zip_name_locate.man @@ -0,0 +1,161 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_name_locate.mdoc -- get index of file by name +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_NAME_LOCATE" "3" "March 15, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_name_locate\fR +\- get index of file by name +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_name_locate\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *fname\fR, \fIzip_flags_t\ flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_name_locate\fR() +function returns the index of the file named +\fIfname\fR +in +\fIarchive\fR. +If +\fIarchive\fR +does not contain a file with that name, \-1 is returned. +.PP +If neither +\fRZIP_FL_ENC_RAW\fR +nor +\fRZIP_FL_ENC_STRICT\fR +are specified, guess the encoding of the name in the ZIP archive and convert it +to UTF-8, if necessary, before comparing. +.PP +If neither +\fRZIP_FL_ENC_CP437\fR +nor +\fRZIP_FL_ENC_UTF_8\fR +are specified, guess the encoding of +\fIfname\fR. +.PP +Only CP-437 and UTF-8 are recognized. +.PP +The +\fIflags\fR +are specified by +\fIor\fR'ing +the following values, or 0 for none of them. +.RS 6n +.TP 19n +\fRZIP_FL_NOCASE\fR +Ignore case distinctions. +(Will only work well if the file names are ASCII.) +With this flag, +\fBzip_name_locate\fR() +will be slow for archives with many files. +.TP 19n +\fRZIP_FL_NODIR\fR +Ignore directory part of file name in archive. +With this flag, +\fBzip_name_locate\fR() +will be slow for archives with many files. +.TP 19n +\fRZIP_FL_ENC_GUESS\fR +This flag has no effect (its value is 0); it can be used to explicitly denote the absence of encoding flags. +.TP 19n +\fRZIP_FL_ENC_RAW\fR +Compare +\fIfname\fR +against the unmodified names as they are in the ZIP archive, without converting them to UTF-8. +.TP 19n +\fRZIP_FL_ENC_STRICT\fR +Follow the ZIP specification and expect CP-437 encoded names in +the ZIP archive (except if they are explicitly marked as UTF-8). +Convert them to UTF-8 before comparing. +.TP 19n +\fRZIP_FL_ENC_CP437\fR +\fIfname\fR +is encoded as CP-437. +.TP 19n +\fRZIP_FL_ENC_UTF_8\fR +\fIfname\fR +is encoded as UTF-8. +.RE +.PP +\fINote\fR: +ASCII is a subset of both CP-437 and UTF-8. +.SH "RETURN VALUES" +\fBzip_name_locate\fR() +returns the index of the file named +\fIfname\fR +or \-1, if +\fIarchive\fR +does not contain an entry of that name. +.SH "ERRORS" +\fBzip_name_locate\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +One of the arguments is invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_NOENT\fR] +No entry of the name +\fIfname\fR +is found in the archive. +.SH "SEE ALSO" +libzip(3), +zip_get_name(3) +.SH "HISTORY" +\fBzip_name_locate\fR() +was added in libzip 0.6. +In libzip 0.11 the return type was changed from +\fIint\fR +to +\fIzip_int64_t\fR. +In libzip 0.11 the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_name_locate.mdoc b/deps/libzip/man/zip_name_locate.mdoc new file mode 100644 index 00000000000000..008f05691e3090 --- /dev/null +++ b/deps/libzip/man/zip_name_locate.mdoc @@ -0,0 +1,148 @@ +.\" zip_name_locate.mdoc -- get index of file by name +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd March 15, 2022 +.Dt ZIP_NAME_LOCATE 3 +.Os +.Sh NAME +.Nm zip_name_locate +.Nd get index of file by name +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_name_locate "zip_t *archive" "const char *fname" "zip_flags_t flags" +.Sh DESCRIPTION +The +.Fn zip_name_locate +function returns the index of the file named +.Ar fname +in +.Ar archive . +If +.Ar archive +does not contain a file with that name, \-1 is returned. +.Pp +If neither +.Dv ZIP_FL_ENC_RAW +nor +.Dv ZIP_FL_ENC_STRICT +are specified, guess the encoding of the name in the ZIP archive and convert it +to UTF-8, if necessary, before comparing. +.Pp +If neither +.Dv ZIP_FL_ENC_CP437 +nor +.Dv ZIP_FL_ENC_UTF_8 +are specified, guess the encoding of +.Ar fname . +.Pp +Only CP-437 and UTF-8 are recognized. +.Pp +The +.Fa flags +are specified by +.Em or Ns No 'ing +the following values, or 0 for none of them. +.Bl -tag -offset indent -width ZIP_FL_ENC_STRICT +.It Dv ZIP_FL_NOCASE +Ignore case distinctions. +(Will only work well if the file names are ASCII.) +With this flag, +.Fn zip_name_locate +will be slow for archives with many files. +.It Dv ZIP_FL_NODIR +Ignore directory part of file name in archive. +With this flag, +.Fn zip_name_locate +will be slow for archives with many files. +.It Dv ZIP_FL_ENC_GUESS +This flag has no effect (its value is 0); it can be used to explicitly denote the absence of encoding flags. +.It Dv ZIP_FL_ENC_RAW +Compare +.Ar fname +against the unmodified names as they are in the ZIP archive, without converting them to UTF-8. +.It Dv ZIP_FL_ENC_STRICT +Follow the ZIP specification and expect CP-437 encoded names in +the ZIP archive (except if they are explicitly marked as UTF-8). +Convert them to UTF-8 before comparing. +.It Dv ZIP_FL_ENC_CP437 +.Ar fname +is encoded as CP-437. +.It Dv ZIP_FL_ENC_UTF_8 +.Ar fname +is encoded as UTF-8. +.El +.Pp +.Em Note : +ASCII is a subset of both CP-437 and UTF-8. +.Sh RETURN VALUES +.Fn zip_name_locate +returns the index of the file named +.Ar fname +or \-1, if +.Ar archive +does not contain an entry of that name. +.Sh ERRORS +.Fn zip_name_locate +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +One of the arguments is invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_NOENT +No entry of the name +.Ar fname +is found in the archive. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_get_name 3 +.Sh HISTORY +.Fn zip_name_locate +was added in libzip 0.6. +In libzip 0.11 the return type was changed from +.Vt int +to +.Vt zip_int64_t . +In libzip 0.11 the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_open.html b/deps/libzip/man/zip_open.html new file mode 100644 index 00000000000000..4163e5174af795 --- /dev/null +++ b/deps/libzip/man/zip_open.html @@ -0,0 +1,200 @@ + + + + + + + ZIP_OPEN(3) + + + + + + + + +
ZIP_OPEN(3)Library Functions ManualZIP_OPEN(3)
+
+
+

+zip_open, zip_open_from_source + — +
open zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_t * +
+ zip_open(const + char *path, int + flags, int + *errorp);

+

zip_t * +
+ zip_open_from_source(zip_source_t + *zs, int flags, + zip_error_t *ze);

+
+
+

+The zip_open() function opens the zip archive specified + by path and returns a pointer to a + struct zip, used to manipulate the archive. The + flags are specified by + or'ing the following values, or 0 + for none of them. +
+
+
+
Perform additional stricter consistency checks on the archive, and error + if they fail.
+
+
Create the archive if it does not exist.
+
+
Error if archive already exists.
+
+
If archive exists, ignore its current contents. In other words, handle it + the same way as an empty archive.
+
+
Open archive in read-only mode.
+
+
+

If an error occurs and errorp is + non-NULL, it will be set to the corresponding error + code.

+

The zip_open_from_source() function opens + a zip archive encapsulated by the zip_source zs using + the provided flags. In case of error, the zip_error + ze is filled in.

+
+
+

+Upon successful completion zip_open() and + zip_open_from_source() return a struct + zip pointer. Otherwise, NULL is returned and + zip_open() sets *errorp to + indicate the error, while + zip_open_from(source) sets + ze to indicate the error. +
+
+

+Here's an example of how you could report errors during + zip_open: +
+
+    zip_t *za;
+    int err;
+
+    if ((za = zip_open(name, 0, &err)) == NULL) {
+        zip_error_t error;
+        zip_error_init_with_code(&error, err);
+        fprintf(stderr, "%s: cannot open zip archive '%s': %s\n",
+	        progname, name, zip_error_strerror(&error));
+        zip_error_fini(&error);
+        return -1;
+    }
+
+
+
+
+

+The archive specified by path is opened unless: +
+
[]
+
The file specified by path exists and + ZIP_EXCL is set.
+
[]
+
Inconsistencies were found in the file specified by + path. This error is often caused by specifying + ZIP_CHECKCONS but can also happen without it.
+
[]
+
The path argument is + NULL.
+
[]
+
Required memory could not be allocated.
+
[]
+
The file specified by path does not exist and + ZIP_CREATE is not set.
+
[]
+
The file specified by path is not a zip + archive.
+
[]
+
The file specified by path could not be opened.
+
[]
+
A read error occurred; see errno for details.
+
[]
+
The file specified by path does not allow + seeks.
+
+For newly created archives, zip_open() does not try to + create the file; this is done when calling + zip_close(3) and any errors, like + missing write permissions, will be reported then. +
+
+

+libzip(3), + zip_close(3), + zip_error_strerror(3), + zip_fdopen(3) +
+
+

+zip_open() and + zip_open_from_source() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
October 9, 2022NiH
+ + diff --git a/deps/libzip/man/zip_open.man b/deps/libzip/man/zip_open.man new file mode 100644 index 00000000000000..6c35c2039f78bf --- /dev/null +++ b/deps/libzip/man/zip_open.man @@ -0,0 +1,220 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_open.mdoc -- open zip archive +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_OPEN" "3" "October 9, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_open\fR, +\fBzip_open_from_source\fR +\- open zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_open\fR(\fIconst\ char\ *path\fR, \fIint\ flags\fR, \fIint\ *errorp\fR); +.PD +.PP +\fIzip_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_open_from_source\fR(\fIzip_source_t\ *zs\fR, \fIint\ flags\fR, \fIzip_error_t\ *ze\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_open\fR() +function opens the zip archive specified by +\fIpath\fR +and returns a pointer to a +\fIstruct zip\fR, +used to manipulate the archive. +The +\fIflags\fR +are specified by +\fIor\fR'ing +the following values, or 0 for none of them. +.RS 6n +.TP 15n +\fRZIP_CHECKCONS\fR +Perform additional stricter consistency checks on the archive, and +error if they fail. +.TP 15n +\fRZIP_CREATE\fR +Create the archive if it does not exist. +.TP 15n +\fRZIP_EXCL\fR +Error if archive already exists. +.TP 15n +\fRZIP_TRUNCATE\fR +If archive exists, ignore its current contents. +In other words, handle it the same way as an empty archive. +.TP 15n +\fRZIP_RDONLY\fR +Open archive in read-only mode. +.RE +.PP +If an error occurs and +\fIerrorp\fR +is +non-\fRNULL\fR, +it will be set to the corresponding error code. +.PP +The +\fBzip_open_from_source\fR() +function opens a zip archive encapsulated by the zip_source +\fIzs\fR +using the provided +\fIflags\fR. +In case of error, the zip_error +\fIze\fR +is filled in. +.SH "RETURN VALUES" +Upon successful completion +\fBzip_open\fR() +and +\fBzip_open_from_source\fR() +return a +\fIstruct zip\fR +pointer. +Otherwise, +\fRNULL\fR +is returned and +\fBzip_open\fR() +sets +\fI*errorp\fR +to indicate the error, while +\fBzip_open_from\fR(\fIsource\fR) +sets +\fIze\fR +to indicate the error. +.SH "EXAMPLES" +Here's an example of how you could report errors during +\fBzip_open\fR: +.nf +.sp +.RS 0n + zip_t *za; + int err; + + if ((za = zip_open(name, 0, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\en", + progname, name, zip_error_strerror(&error)); + zip_error_fini(&error); + return -1; + } +.RE +.fi +.SH "ERRORS" +The archive specified by +\fIpath\fR +is opened unless: +.TP 19n +[\fRZIP_ER_EXISTS\fR] +The file specified by +\fIpath\fR +exists and +\fRZIP_EXCL\fR +is set. +.TP 19n +[\fRZIP_ER_INCONS\fR] +Inconsistencies were found in the file specified by +\fIpath\fR. +This error is often caused by specifying +\fRZIP_CHECKCONS\fR +but can also happen without it. +.TP 19n +[\fRZIP_ER_INVAL\fR] +The +\fIpath\fR +argument is +\fRNULL\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_NOENT\fR] +The file specified by +\fIpath\fR +does not exist and +\fRZIP_CREATE\fR +is not set. +.TP 19n +[\fRZIP_ER_NOZIP\fR] +The file specified by +\fIpath\fR +is not a zip archive. +.TP 19n +[\fRZIP_ER_OPEN\fR] +The file specified by +\fIpath\fR +could not be opened. +.TP 19n +[\fRZIP_ER_READ\fR] +A read error occurred; see +\fIerrno\fR +for details. +.TP 19n +[\fRZIP_ER_SEEK\fR] +The file specified by +\fIpath\fR +does not allow seeks. +.PD 0 +.PP +For newly created archives, +\fBzip_open\fR() +does not try to create the file; this is done when calling +zip_close(3) +and any errors, like missing write permissions, will +be reported then. +.PD +.SH "SEE ALSO" +libzip(3), +zip_close(3), +zip_error_strerror(3), +zip_fdopen(3) +.SH "HISTORY" +\fBzip_open\fR() +and +\fBzip_open_from_source\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_open.mdoc b/deps/libzip/man/zip_open.mdoc new file mode 100644 index 00000000000000..d5c87ad559fa09 --- /dev/null +++ b/deps/libzip/man/zip_open.mdoc @@ -0,0 +1,192 @@ +.\" zip_open.mdoc -- open zip archive +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd October 9, 2022 +.Dt ZIP_OPEN 3 +.Os +.Sh NAME +.Nm zip_open , +.Nm zip_open_from_source +.Nd open zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_t * +.Fn zip_open "const char *path" "int flags" "int *errorp" +.Ft zip_t * +.Fn zip_open_from_source "zip_source_t *zs" "int flags" "zip_error_t *ze" +.Sh DESCRIPTION +The +.Fn zip_open +function opens the zip archive specified by +.Ar path +and returns a pointer to a +.Ft struct zip , +used to manipulate the archive. +The +.Fa flags +are specified by +.Em or Ns No 'ing +the following values, or 0 for none of them. +.Bl -tag -offset indent -width ZIP_CHECKCONS +.It Dv ZIP_CHECKCONS +Perform additional stricter consistency checks on the archive, and +error if they fail. +.It Dv ZIP_CREATE +Create the archive if it does not exist. +.It Dv ZIP_EXCL +Error if archive already exists. +.It Dv ZIP_TRUNCATE +If archive exists, ignore its current contents. +In other words, handle it the same way as an empty archive. +.It Dv ZIP_RDONLY +Open archive in read-only mode. +.El +.Pp +If an error occurs and +.Ar errorp +is +.Pf non- Dv NULL , +it will be set to the corresponding error code. +.Pp +The +.Fn zip_open_from_source +function opens a zip archive encapsulated by the zip_source +.Fa zs +using the provided +.Fa flags . +In case of error, the zip_error +.Fa ze +is filled in. +.Sh RETURN VALUES +Upon successful completion +.Fn zip_open +and +.Fn zip_open_from_source +return a +.Ft struct zip +pointer. +Otherwise, +.Dv NULL +is returned and +.Fn zip_open +sets +.Ar *errorp +to indicate the error, while +.Fn zip_open_from source +sets +.Ar ze +to indicate the error. +.Sh EXAMPLES +Here's an example of how you could report errors during +.Nm : +.Bd -literal + zip_t *za; + int err; + + if ((za = zip_open(name, 0, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\en", + progname, name, zip_error_strerror(&error)); + zip_error_fini(&error); + return -1; + } +.Ed +.Sh ERRORS +The archive specified by +.Ar path +is opened unless: +.Bl -tag -width Er +.It Bq Er ZIP_ER_EXISTS +The file specified by +.Ar path +exists and +.Dv ZIP_EXCL +is set. +.It Bq Er ZIP_ER_INCONS +Inconsistencies were found in the file specified by +.Ar path . +This error is often caused by specifying +.Dv ZIP_CHECKCONS +but can also happen without it. +.It Bq Er ZIP_ER_INVAL +The +.Ar path +argument is +.Dv NULL . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_NOENT +The file specified by +.Ar path +does not exist and +.Dv ZIP_CREATE +is not set. +.It Bq Er ZIP_ER_NOZIP +The file specified by +.Ar path +is not a zip archive. +.It Bq Er ZIP_ER_OPEN +The file specified by +.Ar path +could not be opened. +.It Bq Er ZIP_ER_READ +A read error occurred; see +.Va errno +for details. +.It Bq Er ZIP_ER_SEEK +The file specified by +.Ar path +does not allow seeks. +.El +For newly created archives, +.Fn zip_open +does not try to create the file; this is done when calling +.Xr zip_close 3 +and any errors, like missing write permissions, will +be reported then. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 , +.Xr zip_error_strerror 3 , +.Xr zip_fdopen 3 +.Sh HISTORY +.Fn zip_open +and +.Fn zip_open_from_source +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_register_cancel_callback_with_state.html b/deps/libzip/man/zip_register_cancel_callback_with_state.html new file mode 100644 index 00000000000000..fffa9866d79091 --- /dev/null +++ b/deps/libzip/man/zip_register_cancel_callback_with_state.html @@ -0,0 +1,119 @@ + + + + + + + ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3) + + + + + + + + +
ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)Library Functions ManualZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)
+
+
+

+zip_register_cancel_callback_with_state — +
allow cancelling during zip_close
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

typedef int (*zip_cancel_callback)(zip_t *, void + *);

+

void +
+ zip_register_cancel_callback_with_state(zip_t + *archive, + zip_cancel_callback + callback, void + (*ud_free)(void *), void + *ud);

+
+
+

+This function can be used to cancel writing of a zip archive during + zip_close(3). +

The + zip_register_cancel_callback_with_state() function + registers a callback function callback for the zip + archive archive. The ud_free + function is called during cleanup for deleting the userdata supplied in + ud.

+

The callback function is called during + zip_close(3) in regular intervals + (after every zip archive entry that's completely written to disk, and while + writing data for entries) with zip archive archive and + the user-provided user-data ud as arguments. When the + callback function returns a non-zero value, writing is cancelled and + zip_close(3) returns an error.

+

The callback function should be fast, since it will be called + often.

+
+
+

+libzip(3), + zip_close(3), + zip_register_progress_callback_with_state(3) +
+
+

+zip_register_cancel_callback_with_state() was added in + libzip 1.6.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
June 18, 2022NiH
+ + diff --git a/deps/libzip/man/zip_register_cancel_callback_with_state.man b/deps/libzip/man/zip_register_cancel_callback_with_state.man new file mode 100644 index 00000000000000..28a46a45c934e7 --- /dev/null +++ b/deps/libzip/man/zip_register_cancel_callback_with_state.man @@ -0,0 +1,90 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_register_cancel_callback_with_state.mdoc -- allow cancelling during zip_close +.\" Copyright (C) 2021-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE" "3" "June 18, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_register_cancel_callback_with_state\fR +\- allow cancelling during zip_close +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fItypedef int (*zip_cancel_callback)(zip_t *, void *);\fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_register_cancel_callback_with_state\fR(\fIzip_t\ *archive\fR, \fIzip_cancel_callback\ callback\fR, \fIvoid\ (*ud_free)(void\ *)\fR, \fIvoid\ *ud\fR); +.PD +.SH "DESCRIPTION" +This function can be used to cancel writing of a zip archive during +zip_close(3). +.PP +The +\fBzip_register_cancel_callback_with_state\fR() +function registers a callback function +\fIcallback\fR +for the zip archive +\fIarchive\fR. +The +\fIud_free\fR +function is called during cleanup for deleting the userdata supplied in +\fIud\fR. +.PP +The callback function is called during +zip_close(3) +in regular intervals (after every zip archive entry that's completely +written to disk, and while writing data for entries) with zip archive +\fIarchive\fR +and the user-provided user-data +\fIud\fR +as arguments. +When the callback function returns a non-zero value, writing is cancelled and +zip_close(3) +returns an error. +.PP +The callback function should be fast, since it will be called often. +.SH "SEE ALSO" +libzip(3), +zip_close(3), +zip_register_progress_callback_with_state(3) +.SH "HISTORY" +\fBzip_register_cancel_callback_with_state\fR() +was added in libzip 1.6.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_register_cancel_callback_with_state.mdoc b/deps/libzip/man/zip_register_cancel_callback_with_state.mdoc new file mode 100644 index 00000000000000..b0712cbbb0b140 --- /dev/null +++ b/deps/libzip/man/zip_register_cancel_callback_with_state.mdoc @@ -0,0 +1,84 @@ +.\" zip_register_cancel_callback_with_state.mdoc -- allow cancelling during zip_close +.\" Copyright (C) 2021-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd June 18, 2022 +.Dt ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE 3 +.Os +.Sh NAME +.Nm zip_register_cancel_callback_with_state +.Nd allow cancelling during zip_close +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Vt typedef int (*zip_cancel_callback)(zip_t *, void *); +.Ft void +.Fn zip_register_cancel_callback_with_state "zip_t *archive" "zip_cancel_callback callback" "void (*ud_free)(void *)" "void *ud" +.Sh DESCRIPTION +This function can be used to cancel writing of a zip archive during +.Xr zip_close 3 . +.Pp +The +.Fn zip_register_cancel_callback_with_state +function registers a callback function +.Ar callback +for the zip archive +.Ar archive . +The +.Ar ud_free +function is called during cleanup for deleting the userdata supplied in +.Ar ud . +.Pp +The callback function is called during +.Xr zip_close 3 +in regular intervals (after every zip archive entry that's completely +written to disk, and while writing data for entries) with zip archive +.Ar archive +and the user-provided user-data +.Ar ud +as arguments. +When the callback function returns a non-zero value, writing is cancelled and +.Xr zip_close 3 +returns an error. +.Pp +The callback function should be fast, since it will be called often. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 , +.Xr zip_register_progress_callback_with_state 3 +.Sh HISTORY +.Fn zip_register_cancel_callback_with_state +was added in libzip 1.6.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_register_progress_callback.html b/deps/libzip/man/zip_register_progress_callback.html new file mode 100644 index 00000000000000..5ba547b0bb1371 --- /dev/null +++ b/deps/libzip/man/zip_register_progress_callback.html @@ -0,0 +1,111 @@ + + + + + + + ZIP_REGISTER_PROGRESS_CALLBACK(3) + + + + + + + + +
ZIP_REGISTER_PROGRESS_CALLBACK(3)Library Functions ManualZIP_REGISTER_PROGRESS_CALLBACK(3)
+
+
+

+zip_register_progress_callback — +
provide updates during zip_close (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

typedef void + (*zip_progress_callback_t)(double);

+

void +
+ zip_register_progress_callback(zip_t + *archive, + zip_progress_callback_t + progress_callback);

+
+
+

+The function zip_register_progress_callback() is the + obsolete version of + zip_register_progress_callback_with_state(3). +

The zip_register_progress_callback() + function registers a callback function + progress_callback for the zip archive + archive. This function is called during + zip_close(3) after every zip archive + entry that's completely written to disk. The value is a + double in the range from 0.0 to 1.0. This can be used + to provide progress indicators for user interfaces.

+
+
+

+libzip(3), + zip_close(3) +
+
+

+zip_register_progress_callback() was added in libzip + 1.2.0. It was deprecated in libzip 1.3.0, use + zip_register_progress_callback_with_state() instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_register_progress_callback.man b/deps/libzip/man/zip_register_progress_callback.man new file mode 100644 index 00000000000000..2a1ed23d9a56ec --- /dev/null +++ b/deps/libzip/man/zip_register_progress_callback.man @@ -0,0 +1,83 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_register_progress_callback.mdoc -- provide updates during zip_close +.\" Copyright (C) 2016-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_REGISTER_PROGRESS_CALLBACK" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_register_progress_callback\fR +\- provide updates during zip_close (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fItypedef void (*zip_progress_callback_t)(double);\fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_register_progress_callback\fR(\fIzip_t\ *archive\fR, \fIzip_progress_callback_t\ progress_callback\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_register_progress_callback\fR() +is the obsolete version of +zip_register_progress_callback_with_state(3). +.PP +The +\fBzip_register_progress_callback\fR() +function registers a callback function +\fIprogress_callback\fR +for the zip archive +\fIarchive\fR. +This function is called during +zip_close(3) +after every zip archive entry that's completely written to disk. +The value is a +\fIdouble\fR +in the range from 0.0 to 1.0. +This can be used to provide progress indicators for user interfaces. +.SH "SEE ALSO" +libzip(3), +zip_close(3) +.SH "HISTORY" +\fBzip_register_progress_callback\fR() +was added in libzip 1.2.0. +It was deprecated in libzip 1.3.0, use +\fBzip_register_progress_callback_with_state\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_register_progress_callback.mdoc b/deps/libzip/man/zip_register_progress_callback.mdoc new file mode 100644 index 00000000000000..f512bb0b83b250 --- /dev/null +++ b/deps/libzip/man/zip_register_progress_callback.mdoc @@ -0,0 +1,77 @@ +.\" zip_register_progress_callback.mdoc -- provide updates during zip_close +.\" Copyright (C) 2016-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_REGISTER_PROGRESS_CALLBACK 3 +.Os +.Sh NAME +.Nm zip_register_progress_callback +.Nd provide updates during zip_close (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Vt typedef void (*zip_progress_callback_t)(double); +.Ft void +.Fn zip_register_progress_callback "zip_t *archive" "zip_progress_callback_t progress_callback" +.Sh DESCRIPTION +The function +.Fn zip_register_progress_callback +is the obsolete version of +.Xr zip_register_progress_callback_with_state 3 . +.Pp +The +.Fn zip_register_progress_callback +function registers a callback function +.Ar progress_callback +for the zip archive +.Ar archive . +This function is called during +.Xr zip_close 3 +after every zip archive entry that's completely written to disk. +The value is a +.Vt double +in the range from 0.0 to 1.0. +This can be used to provide progress indicators for user interfaces. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 +.Sh HISTORY +.Fn zip_register_progress_callback +was added in libzip 1.2.0. +It was deprecated in libzip 1.3.0, use +.Fn zip_register_progress_callback_with_state +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_register_progress_callback_with_state.html b/deps/libzip/man/zip_register_progress_callback_with_state.html new file mode 100644 index 00000000000000..086a16e0cd1e30 --- /dev/null +++ b/deps/libzip/man/zip_register_progress_callback_with_state.html @@ -0,0 +1,119 @@ + + + + + + + ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE(3) + + + + + + + + +
ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE(3)Library Functions ManualZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE(3)
+
+
+

+zip_register_progress_callback_with_state — +
provide updates during zip_close
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

typedef void (*zip_progress_callback)(zip_t *, + double, void *);

+

void +
+ zip_register_progress_callback_with_state(zip_t + *archive, double + precision, + zip_progress_callback + callback, void + (*ud_free)(void *), void + *ud);

+
+
+

+The zip_register_progress_callback_with_state() function + registers a callback function callback for the zip + archive archive. The precision + argument is a double in the range from 0.00 to 1.0 that defines the smallest + change for which the callback should be called (to avoid too frequent calls). + The ud_free function is called during cleanup for + deleting the userdata supplied in ud. +

The callback function is called during + zip_close(3) in regular intervals + (after every zip archive entry that's completely written to disk, and while + writing data for entries) with zip archive archive, + the current progression state as a double, and the + user-provided user-data ud as arguments. The + progression state is a double in the range from 0.0 to + 1.0. This can be used to provide progress indicators for user + interfaces.

+
+
+

+libzip(3), + zip_close(3), + zip_register_cancel_callback_with_state(3) +
+
+

+zip_register_progress_callback_with_state() was added in + libzip 1.3.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_register_progress_callback_with_state.man b/deps/libzip/man/zip_register_progress_callback_with_state.man new file mode 100644 index 00000000000000..867930ec794897 --- /dev/null +++ b/deps/libzip/man/zip_register_progress_callback_with_state.man @@ -0,0 +1,93 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_register_progress_callback_with_state.mdoc -- provide updates during zip_close +.\" Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_register_progress_callback_with_state\fR +\- provide updates during zip_close +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fItypedef void (*zip_progress_callback)(zip_t *, double, void *);\fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_register_progress_callback_with_state\fR(\fIzip_t\ *archive\fR, \fIdouble\ precision\fR, \fIzip_progress_callback\ callback\fR, \fIvoid\ (*ud_free)(void\ *)\fR, \fIvoid\ *ud\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_register_progress_callback_with_state\fR() +function registers a callback function +\fIcallback\fR +for the zip archive +\fIarchive\fR. +The +\fIprecision\fR +argument is a double in the range from 0.00 to 1.0 that defines the +smallest change for which the callback should be called (to avoid too +frequent calls). +The +\fIud_free\fR +function is called during cleanup for deleting the userdata supplied in +\fIud\fR. +.PP +The callback function is called during +zip_close(3) +in regular intervals (after every zip archive entry that's completely +written to disk, and while writing data for entries) with zip archive +\fIarchive\fR, +the current progression state as a +\fIdouble\fR, +and the user-provided user-data +\fIud\fR +as arguments. +The progression state is a +\fIdouble\fR +in the range from 0.0 to 1.0. +This can be used to provide progress indicators for user interfaces. +.SH "SEE ALSO" +libzip(3), +zip_close(3), +zip_register_cancel_callback_with_state(3) +.SH "HISTORY" +\fBzip_register_progress_callback_with_state\fR() +was added in libzip 1.3.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_register_progress_callback_with_state.mdoc b/deps/libzip/man/zip_register_progress_callback_with_state.mdoc new file mode 100644 index 00000000000000..0a6a75fc2a88a9 --- /dev/null +++ b/deps/libzip/man/zip_register_progress_callback_with_state.mdoc @@ -0,0 +1,87 @@ +.\" zip_register_progress_callback_with_state.mdoc -- provide updates during zip_close +.\" Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE 3 +.Os +.Sh NAME +.Nm zip_register_progress_callback_with_state +.Nd provide updates during zip_close +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Vt typedef void (*zip_progress_callback)(zip_t *, double, void *); +.Ft void +.Fn zip_register_progress_callback_with_state "zip_t *archive" "double precision" "zip_progress_callback callback" "void (*ud_free)(void *)" "void *ud" +.Sh DESCRIPTION +The +.Fn zip_register_progress_callback_with_state +function registers a callback function +.Ar callback +for the zip archive +.Ar archive . +The +.Ar precision +argument is a double in the range from 0.00 to 1.0 that defines the +smallest change for which the callback should be called (to avoid too +frequent calls). +The +.Ar ud_free +function is called during cleanup for deleting the userdata supplied in +.Ar ud . +.Pp +The callback function is called during +.Xr zip_close 3 +in regular intervals (after every zip archive entry that's completely +written to disk, and while writing data for entries) with zip archive +.Ar archive , +the current progression state as a +.Vt double , +and the user-provided user-data +.Ar ud +as arguments. +The progression state is a +.Vt double +in the range from 0.0 to 1.0. +This can be used to provide progress indicators for user interfaces. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 , +.Xr zip_register_cancel_callback_with_state 3 +.Sh HISTORY +.Fn zip_register_progress_callback_with_state +was added in libzip 1.3.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_rename.html b/deps/libzip/man/zip_rename.html new file mode 100644 index 00000000000000..ea0405df77cd98 --- /dev/null +++ b/deps/libzip/man/zip_rename.html @@ -0,0 +1,104 @@ + + + + + + + ZIP_RENAME(3) + + + + + + + + +
ZIP_RENAME(3)Library Functions ManualZIP_RENAME(3)
+
+
+

+zip_rename — +
rename file in zip archive (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_rename(zip_t + *archive, zip_uint64_t + index, const char + *name);

+
+
+

+zip_rename() is the obsolete version of + zip_file_rename(3). It is the + same as calling + zip_file_rename(3) with an empty + flags argument. +
+
+

+libzip(3), + zip_file_rename(3) +
+
+

+zip_rename() was added in libzip 0.6. In libzip 0.10 the + type of index was changed from int + to zip_uint64_t. It was deprecated in libzip 0.11, use + zip_file_rename() instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_rename.man b/deps/libzip/man/zip_rename.man new file mode 100644 index 00000000000000..0abc5f9b142dbf --- /dev/null +++ b/deps/libzip/man/zip_rename.man @@ -0,0 +1,75 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_rename.mdoc -- rename file in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_RENAME" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_rename\fR +\- rename file in zip archive (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_rename\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIconst\ char\ *name\fR); +.PD +.SH "DESCRIPTION" +\fBzip_rename\fR() +is the obsolete version of +zip_file_rename(3). +It is the same as calling +zip_file_rename(3) +with an empty flags argument. +.SH "SEE ALSO" +libzip(3), +zip_file_rename(3) +.SH "HISTORY" +\fBzip_rename\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +It was deprecated in libzip 0.11, use +\fBzip_file_rename\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_rename.mdoc b/deps/libzip/man/zip_rename.mdoc new file mode 100644 index 00000000000000..3be9fc499dc84c --- /dev/null +++ b/deps/libzip/man/zip_rename.mdoc @@ -0,0 +1,70 @@ +.\" zip_rename.mdoc -- rename file in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_RENAME 3 +.Os +.Sh NAME +.Nm zip_rename +.Nd rename file in zip archive (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_rename "zip_t *archive" "zip_uint64_t index" "const char *name" +.Sh DESCRIPTION +.Fn zip_rename +is the obsolete version of +.Xr zip_file_rename 3 . +It is the same as calling +.Xr zip_file_rename 3 +with an empty flags argument. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_rename 3 +.Sh HISTORY +.Fn zip_rename +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +It was deprecated in libzip 0.11, use +.Fn zip_file_rename +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_set_archive_comment.html b/deps/libzip/man/zip_set_archive_comment.html new file mode 100644 index 00000000000000..ecab6e7185a937 --- /dev/null +++ b/deps/libzip/man/zip_set_archive_comment.html @@ -0,0 +1,124 @@ + + + + + + + ZIP_SET_ARCHIVE_COMMENT(3) + + + + + + + + +
ZIP_SET_ARCHIVE_COMMENT(3)Library Functions ManualZIP_SET_ARCHIVE_COMMENT(3)
+
+
+

+zip_set_archive_comment — +
set zip archive comment
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_set_archive_comment(zip_t + *archive, const char + *comment, zip_uint16_t + len);

+
+
+

+The zip_set_archive_comment() function sets the comment + for the entire zip archive. If comment is + NULL and len is 0, the archive + comment will be removed. comment must be encoded in + ASCII or UTF-8. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_set_archive_comment() fails if: +
+
[]
+
len is less than 0 or longer than the maximum + comment length in a zip file (65535), or comment is + not a valid UTF-8 encoded string.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_get_comment(3), + zip_file_set_comment(3), + zip_get_archive_comment(3) +
+
+

+zip_set_archive_comment() was added in libzip 0.7. In + libzip 0.11 the type of len was changed from + int to zip_uint16_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_set_archive_comment.man b/deps/libzip/man/zip_set_archive_comment.man new file mode 100644 index 00000000000000..ced9b11d254782 --- /dev/null +++ b/deps/libzip/man/zip_set_archive_comment.man @@ -0,0 +1,98 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_set_archive_comment.mdoc -- set zip archive comment +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SET_ARCHIVE_COMMENT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_set_archive_comment\fR +\- set zip archive comment +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_set_archive_comment\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *comment\fR, \fIzip_uint16_t\ len\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_set_archive_comment\fR() +function sets the comment for the entire zip archive. +If +\fIcomment\fR +is +\fRNULL\fR +and +\fIlen\fR +is 0, the archive comment will be removed. +\fIcomment\fR +must be encoded in ASCII or UTF-8. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_set_archive_comment\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIlen\fR +is less than 0 or longer than the maximum comment length in a zip file +(65535), or +\fIcomment\fR +is not a valid UTF-8 encoded string. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_get_comment(3), +zip_file_set_comment(3), +zip_get_archive_comment(3) +.SH "HISTORY" +\fBzip_set_archive_comment\fR() +was added in libzip 0.7. +In libzip 0.11 the type of +\fIlen\fR +was changed from +\fIint\fR +to +\fIzip_uint16_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_set_archive_comment.mdoc b/deps/libzip/man/zip_set_archive_comment.mdoc new file mode 100644 index 00000000000000..60250ae6707732 --- /dev/null +++ b/deps/libzip/man/zip_set_archive_comment.mdoc @@ -0,0 +1,93 @@ +.\" zip_set_archive_comment.mdoc -- set zip archive comment +.\" Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SET_ARCHIVE_COMMENT 3 +.Os +.Sh NAME +.Nm zip_set_archive_comment +.Nd set zip archive comment +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_set_archive_comment "zip_t *archive" "const char *comment" "zip_uint16_t len" +.Sh DESCRIPTION +The +.Fn zip_set_archive_comment +function sets the comment for the entire zip archive. +If +.Ar comment +is +.Dv NULL +and +.Ar len +is 0, the archive comment will be removed. +.Ar comment +must be encoded in ASCII or UTF-8. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_set_archive_comment +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar len +is less than 0 or longer than the maximum comment length in a zip file +(65535), or +.Ar comment +is not a valid UTF-8 encoded string. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_get_comment 3 , +.Xr zip_file_set_comment 3 , +.Xr zip_get_archive_comment 3 +.Sh HISTORY +.Fn zip_set_archive_comment +was added in libzip 0.7. +In libzip 0.11 the type of +.Ar len +was changed from +.Vt int +to +.Vt zip_uint16_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_set_archive_flag.html b/deps/libzip/man/zip_set_archive_flag.html new file mode 100644 index 00000000000000..a40b0b21f2dda5 --- /dev/null +++ b/deps/libzip/man/zip_set_archive_flag.html @@ -0,0 +1,107 @@ + + + + + + + ZIP_SET_ARCHIVE_FLAG(3) + + + + + + + + +
ZIP_SET_ARCHIVE_FLAG(3)Library Functions ManualZIP_SET_ARCHIVE_FLAG(3)
+
+
+

+zip_set_archive_flag — +
set zip archive flag
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_set_archive_flag(zip_t + *archive, zip_flags_t + flag, int + value);

+
+
+

+The zip_set_archive_flag() function sets the flag + flag for the archive archive to + the value value. +

Currently there are no supported flags.

+
+
+

+Upon successful completion 0 is returned, and -1 if an error occurred. +
+
+

+libzip(3), + zip_get_archive_flag(3) +
+
+

+zip_set_archive_flag() was added in libzip 0.9. In + libzip 0.11 the type of flag was changed from + int to zip_flags_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_set_archive_flag.man b/deps/libzip/man/zip_set_archive_flag.man new file mode 100644 index 00000000000000..85e0c3c324de39 --- /dev/null +++ b/deps/libzip/man/zip_set_archive_flag.man @@ -0,0 +1,79 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_set_archive_flag.mdoc -- set zip archive flag +.\" Copyright (C) 2008-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SET_ARCHIVE_FLAG" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_set_archive_flag\fR +\- set zip archive flag +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_set_archive_flag\fR(\fIzip_t\ *archive\fR, \fIzip_flags_t\ flag\fR, \fIint\ value\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_set_archive_flag\fR() +function sets the flag +\fIflag\fR +for the archive +\fIarchive\fR +to the value +\fIvalue\fR. +.PP +Currently there are no supported flags. +.SH "RETURN VALUES" +Upon successful completion 0 is returned, and \-1 if an error +occurred. +.SH "SEE ALSO" +libzip(3), +zip_get_archive_flag(3) +.SH "HISTORY" +\fBzip_set_archive_flag\fR() +was added in libzip 0.9. +In libzip 0.11 the type of +\fIflag\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_set_archive_flag.mdoc b/deps/libzip/man/zip_set_archive_flag.mdoc new file mode 100644 index 00000000000000..4a1c8a09416d8f --- /dev/null +++ b/deps/libzip/man/zip_set_archive_flag.mdoc @@ -0,0 +1,74 @@ +.\" zip_set_archive_flag.mdoc -- set zip archive flag +.\" Copyright (C) 2008-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SET_ARCHIVE_FLAG 3 +.Os +.Sh NAME +.Nm zip_set_archive_flag +.Nd set zip archive flag +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_set_archive_flag "zip_t *archive" "zip_flags_t flag" "int value" +.Sh DESCRIPTION +The +.Fn zip_set_archive_flag +function sets the flag +.Ar flag +for the archive +.Ar archive +to the value +.Ar value . +.Pp +Currently there are no supported flags. +.Sh RETURN VALUES +Upon successful completion 0 is returned, and \-1 if an error +occurred. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_get_archive_flag 3 +.Sh HISTORY +.Fn zip_set_archive_flag +was added in libzip 0.9. +In libzip 0.11 the type of +.Ar flag +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_set_default_password.html b/deps/libzip/man/zip_set_default_password.html new file mode 100644 index 00000000000000..bd582b998443d1 --- /dev/null +++ b/deps/libzip/man/zip_set_default_password.html @@ -0,0 +1,123 @@ + + + + + + + ZIP_SET_DEFAULT_PASSWORD(3) + + + + + + + + +
ZIP_SET_DEFAULT_PASSWORD(3)Library Functions ManualZIP_SET_DEFAULT_PASSWORD(3)
+
+
+

+zip_set_default_password — +
set default password for encrypted files in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_set_default_password(zip_t + *archive, const char + *password);

+
+
+

+The zip_set_default_password() function sets the default + password used when accessing encrypted files. If + password is NULL or the empty + string, the default password is unset. +

If you prefer a different password for single files, use + zip_fopen_encrypted(3) + instead of zip_fopen(3). Usually, + however, the same password is used for every file in an zip archive.

+

The password is not verified when calling this function. See the + CAVEATS section in + zip_fopen_encrypted(3) for + more details about password handling.

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_set_default_password() fails if: +
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_fopen(3), + zip_fopen_encrypted(3) +
+
+

+zip_set_default_password() was added in libzip 0.10. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 15, 2020NiH
+ + diff --git a/deps/libzip/man/zip_set_default_password.man b/deps/libzip/man/zip_set_default_password.man new file mode 100644 index 00000000000000..a5bc433f97ebe8 --- /dev/null +++ b/deps/libzip/man/zip_set_default_password.man @@ -0,0 +1,94 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_set_default_password.mdoc -- set default password for zip +.\" Copyright (C) 2011-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SET_DEFAULT_PASSWORD" "3" "September 15, 2020" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_set_default_password\fR +\- set default password for encrypted files in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_set_default_password\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *password\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_set_default_password\fR() +function sets the default password used when accessing encrypted files. +If +\fIpassword\fR +is +\fRNULL\fR +or the empty string, the default password is unset. +.PP +If you prefer a different password for single files, use +zip_fopen_encrypted(3) +instead of +zip_fopen(3). +Usually, however, the same password is used for every file in an +zip archive. +.PP +The password is not verified when calling this function. +See the +\fICAVEATS\fR +section in +zip_fopen_encrypted(3) +for more details about password handling. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_set_default_password\fR() +fails if: +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_fopen(3), +zip_fopen_encrypted(3) +.SH "HISTORY" +\fBzip_set_default_password\fR() +was added in libzip 0.10. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_set_default_password.mdoc b/deps/libzip/man/zip_set_default_password.mdoc new file mode 100644 index 00000000000000..8ec1fa1930ae5f --- /dev/null +++ b/deps/libzip/man/zip_set_default_password.mdoc @@ -0,0 +1,90 @@ +.\" zip_set_default_password.mdoc -- set default password for zip +.\" Copyright (C) 2011-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 15, 2020 +.Dt ZIP_SET_DEFAULT_PASSWORD 3 +.Os +.Sh NAME +.Nm zip_set_default_password +.Nd set default password for encrypted files in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_set_default_password "zip_t *archive" "const char *password" +.Sh DESCRIPTION +The +.Fn zip_set_default_password +function sets the default password used when accessing encrypted files. +If +.Ar password +is +.Dv NULL +or the empty string, the default password is unset. +.Pp +If you prefer a different password for single files, use +.Xr zip_fopen_encrypted 3 +instead of +.Xr zip_fopen 3 . +Usually, however, the same password is used for every file in an +zip archive. +.Pp +The password is not verified when calling this function. +See the +.Sx CAVEATS +section in +.Xr zip_fopen_encrypted 3 +for more details about password handling. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_set_default_password +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_fopen 3 , +.Xr zip_fopen_encrypted 3 +.Sh HISTORY +.Fn zip_set_default_password +was added in libzip 0.10. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_set_file_comment.html b/deps/libzip/man/zip_set_file_comment.html new file mode 100644 index 00000000000000..8c420cb24dc49b --- /dev/null +++ b/deps/libzip/man/zip_set_file_comment.html @@ -0,0 +1,109 @@ + + + + + + + ZIP_SET_FILE_COMMENT(3) + + + + + + + + +
ZIP_SET_FILE_COMMENT(3)Library Functions ManualZIP_SET_FILE_COMMENT(3)
+
+
+

+zip_set_file_comment — +
set comment for file in zip (obsolete interface)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_set_file_comment(zip_t + *archive, zip_uint64_t + index, const char + *comment, int + len);

+
+
+

+The zip_set_file_comment() function is the obsolete + version of + zip_file_set_comment(3). + The only differences are the type of the len argument + and the additional flags argument. + zip_set_file_comment() is the same as calling + zip_file_set_comment(3) + with an empty flags argument. +
+
+

+libzip(3), + zip_file_set_comment(3) +
+
+

+zip_set_file_comment() was added in libzip 0.7. In + libzip 0.10 the type of index was changed from + int to zip_uint64_t. It was + deprecated in libzip 0.11, use zip_file_set_comment() + instead. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_set_file_comment.man b/deps/libzip/man/zip_set_file_comment.man new file mode 100644 index 00000000000000..305d2c49f5cd0a --- /dev/null +++ b/deps/libzip/man/zip_set_file_comment.man @@ -0,0 +1,84 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_set_file_comment.mdoc -- set comment for file in zip +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SET_FILE_COMMENT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_set_file_comment\fR +\- set comment for file in zip (obsolete interface) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_set_file_comment\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIconst\ char\ *comment\fR, \fIint\ len\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_set_file_comment\fR() +function is the obsolete version of +zip_file_set_comment(3). +The only differences are the type of the +\fIlen\fR +argument and the additional +\fIflags\fR +argument. +\fBzip_set_file_comment\fR() +is the same as calling +zip_file_set_comment(3) +with an empty +\fIflags\fR +argument. +.SH "SEE ALSO" +libzip(3), +zip_file_set_comment(3) +.SH "HISTORY" +\fBzip_set_file_comment\fR() +was added in libzip 0.7. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +It was deprecated in libzip 0.11, use +\fBzip_file_set_comment\fR() +instead. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_set_file_comment.mdoc b/deps/libzip/man/zip_set_file_comment.mdoc new file mode 100644 index 00000000000000..56b14bda24f4ab --- /dev/null +++ b/deps/libzip/man/zip_set_file_comment.mdoc @@ -0,0 +1,79 @@ +.\" zip_set_file_comment.mdoc -- set comment for file in zip +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SET_FILE_COMMENT 3 +.Os +.Sh NAME +.Nm zip_set_file_comment +.Nd set comment for file in zip (obsolete interface) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_set_file_comment "zip_t *archive" "zip_uint64_t index" "const char *comment" "int len" +.Sh DESCRIPTION +The +.Fn zip_set_file_comment +function is the obsolete version of +.Xr zip_file_set_comment 3 . +The only differences are the type of the +.Ar len +argument and the additional +.Ar flags +argument. +.Fn zip_set_file_comment +is the same as calling +.Xr zip_file_set_comment 3 +with an empty +.Ar flags +argument. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_set_comment 3 +.Sh HISTORY +.Fn zip_set_file_comment +was added in libzip 0.7. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +It was deprecated in libzip 0.11, use +.Fn zip_file_set_comment +instead. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_set_file_compression.html b/deps/libzip/man/zip_set_file_compression.html new file mode 100644 index 00000000000000..26d86cb157f7f6 --- /dev/null +++ b/deps/libzip/man/zip_set_file_compression.html @@ -0,0 +1,162 @@ + + + + + + + ZIP_SET_FILE_COMPRESSION(3) + + + + + + + + +
ZIP_SET_FILE_COMPRESSION(3)Library Functions ManualZIP_SET_FILE_COMPRESSION(3)
+
+
+

+zip_set_file_compression — +
set compression method for file in zip
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_set_file_compression(zip_t + *archive, zip_uint64_t + index, zip_int32_t + comp, zip_uint32_t + comp_flags);

+
+
+

+The zip_set_file_compression() function sets the + compression method for the file at position index in the + zip archive to comp with the compression method specific + comp_flags. The comp is the same + as returned by zip_stat(3). For the + comp argument, currently only the following values are + supported: +
+
+
default compression; currently the same as + ZIP_CM_DEFLATE, but flags + are ignored.
+
+
Store the file uncompressed.
+
+
Compress the file using the bzip2(1) + algorithm.
+
+
Deflate the file with the zlib(3) + algorithm and default options.
+
+
Use the xz(1) algorithm for + compression
+
+
Use the zstd(1) algorithm for + compression
+
+

NOTE: Only the deflate and store methods can be + assumed to be universally supported.

+

The comp_flags argument defines the + compression level. This value is dependent on the compression algorithm. In + general, lower numbers mean faster de/compression and higher numbers mean + slower de/compression. For ZIP_CM_BZIP, + ZIP_CM_DEFLATE, and + ZIP_CM_XZ 1 is the fastest compression and 9 the + best, 0 chooses the default. For ZIP_CM_ZSTD + possible values are + ZSTD_minCLevel(3) to + ZSTD_maxCLevel(3).

+

Further compression method specific flags might be added over + time.

+

The current compression method for a file in a zip archive can be + determined using zip_stat(3).

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+zip_set_file_compression() fails if: +
+
[]
+
Unsupported compression method requested.
+
[]
+
index is not a valid file index in + archive, or the argument combination is + invalid.
+
[]
+
Read-only zip file, no changes allowed.
+
+
+
+

+libzip(3), + zip_compression_method_supported(3), + zip_stat(3) +
+
+

+zip_set_file_compression() was added in libzip 0.11. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
June 18, 2021NiH
+ + diff --git a/deps/libzip/man/zip_set_file_compression.man b/deps/libzip/man/zip_set_file_compression.man new file mode 100644 index 00000000000000..cd21be80c4844f --- /dev/null +++ b/deps/libzip/man/zip_set_file_compression.man @@ -0,0 +1,155 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_set_file_compression.mdoc -- set compression method and its flags +.\" Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SET_FILE_COMPRESSION" "3" "June 18, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_set_file_compression\fR +\- set compression method for file in zip +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_set_file_compression\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_int32_t\ comp\fR, \fIzip_uint32_t\ comp_flags\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_set_file_compression\fR() +function sets the compression method for the file at position +\fIindex\fR +in the zip archive to +\fIcomp\fR +with the compression method specific +\fIcomp_flags\fR. +The +\fIcomp\fR +is the same as returned by +zip_stat(3). +For the +\fIcomp\fR +argument, currently only the following values are supported: +.TP 19n +\fRZIP_CM_DEFAULT\fR +default compression; currently the same as +\fRZIP_CM_DEFLATE\fR, +but +\fIflags\fR +are ignored. +.TP 19n +\fRZIP_CM_STORE\fR +Store the file uncompressed. +.TP 19n +\fRZIP_CM_BZIP2\fR +Compress the file using the +bzip2(1) +algorithm. +.TP 19n +\fRZIP_CM_DEFLATE\fR +Deflate the file with the +zlib(3) +algorithm and default options. +.TP 19n +\fRZIP_CM_XZ\fR +Use the +xz(1) +algorithm for compression +.TP 19n +\fRZIP_CM_ZSTD\fR +Use the +zstd(1) +algorithm for compression +.PP +\fINOTE\fR: +Only the deflate and store methods can be assumed to be universally +supported. +.PP +The +\fIcomp_flags\fR +argument defines the compression level. +This value is dependent on the compression algorithm. +In general, lower numbers mean faster de/compression and higher +numbers mean slower de/compression. +For +\fRZIP_CM_BZIP\fR, +\fRZIP_CM_DEFLATE\fR, +and +\fRZIP_CM_XZ\fR +1 is the fastest compression and 9 the best, 0 chooses the default. +For +\fRZIP_CM_ZSTD\fR +possible values are +ZSTD_minCLevel(3) +to +ZSTD_maxCLevel(3). +.PP +Further compression method specific flags might be added over time. +.PP +The current compression method for a file in a zip archive can be +determined using +zip_stat(3). +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_set_file_compression\fR() +fails if: +.TP 19n +[\fRZIP_ER_COMPNOTSUPP\fR] +Unsupported compression method requested. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIarchive\fR, +or the argument combination is invalid. +.TP 19n +[\fRZIP_ER_RDONLY\fR] +Read-only zip file, no changes allowed. +.SH "SEE ALSO" +libzip(3), +zip_compression_method_supported(3), +zip_stat(3) +.SH "HISTORY" +\fBzip_set_file_compression\fR() +was added in libzip 0.11. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_set_file_compression.mdoc b/deps/libzip/man/zip_set_file_compression.mdoc new file mode 100644 index 00000000000000..102dfcd855ed7f --- /dev/null +++ b/deps/libzip/man/zip_set_file_compression.mdoc @@ -0,0 +1,145 @@ +.\" zip_set_file_compression.mdoc -- set compression method and its flags +.\" Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd June 18, 2021 +.Dt ZIP_SET_FILE_COMPRESSION 3 +.Os +.Sh NAME +.Nm zip_set_file_compression +.Nd set compression method for file in zip +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_set_file_compression "zip_t *archive" "zip_uint64_t index" "zip_int32_t comp" "zip_uint32_t comp_flags" +.Sh DESCRIPTION +The +.Fn zip_set_file_compression +function sets the compression method for the file at position +.Ar index +in the zip archive to +.Ar comp +with the compression method specific +.Ar comp_flags . +The +.Ar comp +is the same as returned by +.Xr zip_stat 3 . +For the +.Ar comp +argument, currently only the following values are supported: +.Bl -tag -width ZIP_CM_DEFLATE_XX +.It Dv ZIP_CM_DEFAULT +default compression; currently the same as +.Dv ZIP_CM_DEFLATE , +but +.Ar flags +are ignored. +.It Dv ZIP_CM_STORE +Store the file uncompressed. +.It Dv ZIP_CM_BZIP2 +Compress the file using the +.Xr bzip2 1 +algorithm. +.It Dv ZIP_CM_DEFLATE +Deflate the file with the +.Xr zlib 3 +algorithm and default options. +.It Dv ZIP_CM_XZ +Use the +.Xr xz 1 +algorithm for compression +.It Dv ZIP_CM_ZSTD +Use the +.Xr zstd 1 +algorithm for compression +.El +.Pp +.Em NOTE : +Only the deflate and store methods can be assumed to be universally +supported. +.Pp +The +.Ar comp_flags +argument defines the compression level. +This value is dependent on the compression algorithm. +In general, lower numbers mean faster de/compression and higher +numbers mean slower de/compression. +For +.Dv ZIP_CM_BZIP , +.Dv ZIP_CM_DEFLATE , +and +.Dv ZIP_CM_XZ +1 is the fastest compression and 9 the best, 0 chooses the default. +For +.Dv ZIP_CM_ZSTD +possible values are +.Xr ZSTD_minCLevel 3 +to +.Xr ZSTD_maxCLevel 3 . +.Pp +Further compression method specific flags might be added over time. +.Pp +The current compression method for a file in a zip archive can be +determined using +.Xr zip_stat 3 . +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_set_file_compression +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_COMPNOTSUPP +Unsupported compression method requested. +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar archive , +or the argument combination is invalid. +.It Bq Er ZIP_ER_RDONLY +Read-only zip file, no changes allowed. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_compression_method_supported 3 , +.Xr zip_stat 3 +.Sh HISTORY +.Fn zip_set_file_compression +was added in libzip 0.11. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source.html b/deps/libzip/man/zip_source.html new file mode 100644 index 00000000000000..3d27b7379a8ead --- /dev/null +++ b/deps/libzip/man/zip_source.html @@ -0,0 +1,119 @@ + + + + + + + ZIP_SOURCE(3) + + + + + + + + +
ZIP_SOURCE(3)Library Functions ManualZIP_SOURCE(3)
+
+
+

+zip_source — +
zip data source structure
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t *zs;

+
+
+

+A struct zip_source is a data source used by + libzip(3) for adding or replacing file + contents for a file in a zip archive. If the source supports seeking, it can + also be used to open zip archives from. It is created by calling one of + zip_source_buffer(3), + zip_source_buffer_create(3), + zip_source_file(3), + zip_source_file_create(3), + zip_source_filep(3), + zip_source_filep_create(3), + zip_source_function(3), + zip_source_function_create(3), + zip_source_window(3), or + zip_source_zip(3). + zip_source_t is reference counted, and created with a + reference count of 1. + zip_open_from_source(3), + zip_file_add(3), and + zip_file_replace(3) will + decrement the reference count of the zip_source_t when + they are done using it, so + zip_source_free(3) only needs to + be called when these functions return an error. Use + zip_source_keep(3) to increase + the reference count, for example if you need the source after + zip_close(3). +
+
+

+libzip(3), + zip_source_buffer(3), + zip_source_file(3), + zip_source_filep(3), + zip_source_free(3), + zip_source_function(3), + zip_source_window(3), + zip_source_zip(3) +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source.man b/deps/libzip/man/zip_source.man new file mode 100644 index 00000000000000..3467ca8359fd63 --- /dev/null +++ b/deps/libzip/man/zip_source.man @@ -0,0 +1,91 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source.mdoc -- description of zip data source +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source\fR +\- zip data source structure +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *zs\fR; +.SH "DESCRIPTION" +A +\fIstruct zip_source\fR +is a data source used by +libzip(3) +for adding or replacing file contents for a file in a zip archive. +If the source supports seeking, it can also be used to open zip archives from. +It is created by calling one of +zip_source_buffer(3), +zip_source_buffer_create(3), +zip_source_file(3), +zip_source_file_create(3), +zip_source_filep(3), +zip_source_filep_create(3), +zip_source_function(3), +zip_source_function_create(3), +zip_source_window(3), +or +zip_source_zip(3). +\fIzip_source_t\fR +is reference counted, and created with a reference count of 1. +zip_open_from_source(3), +zip_file_add(3), +and +zip_file_replace(3) +will decrement the reference count of the +\fIzip_source_t\fR +when they are done using it, so +zip_source_free(3) +only needs to be called when these functions return an error. +Use +zip_source_keep(3) +to increase the reference count, for example if you need the source after +zip_close(3). +.SH "SEE ALSO" +libzip(3), +zip_source_buffer(3), +zip_source_file(3), +zip_source_filep(3), +zip_source_free(3), +zip_source_function(3), +zip_source_window(3), +zip_source_zip(3) +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source.mdoc b/deps/libzip/man/zip_source.mdoc new file mode 100644 index 00000000000000..acbd89adaf6d3a --- /dev/null +++ b/deps/libzip/man/zip_source.mdoc @@ -0,0 +1,90 @@ +.\" zip_source.mdoc -- description of zip data source +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE 3 +.Os +.Sh NAME +.Nm zip_source +.Nd zip data source structure +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Vt zip_source_t *zs ; +.Sh DESCRIPTION +A +.Vt struct zip_source +is a data source used by +.Xr libzip 3 +for adding or replacing file contents for a file in a zip archive. +If the source supports seeking, it can also be used to open zip archives from. +It is created by calling one of +.Xr zip_source_buffer 3 , +.Xr zip_source_buffer_create 3 , +.Xr zip_source_file 3 , +.Xr zip_source_file_create 3 , +.Xr zip_source_filep 3 , +.Xr zip_source_filep_create 3 , +.Xr zip_source_function 3 , +.Xr zip_source_function_create 3 , +.Xr zip_source_window 3 , +or +.Xr zip_source_zip 3 . +.Vt zip_source_t +is reference counted, and created with a reference count of 1. +.Xr zip_open_from_source 3 , +.Xr zip_file_add 3 , +and +.Xr zip_file_replace 3 +will decrement the reference count of the +.Vt zip_source_t +when they are done using it, so +.Xr zip_source_free 3 +only needs to be called when these functions return an error. +Use +.Xr zip_source_keep 3 +to increase the reference count, for example if you need the source after +.Xr zip_close 3 . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source_buffer 3 , +.Xr zip_source_file 3 , +.Xr zip_source_filep 3 , +.Xr zip_source_free 3 , +.Xr zip_source_function 3 , +.Xr zip_source_window 3 , +.Xr zip_source_zip 3 +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_begin_write.html b/deps/libzip/man/zip_source_begin_write.html new file mode 100644 index 00000000000000..483dbd5bf8cc43 --- /dev/null +++ b/deps/libzip/man/zip_source_begin_write.html @@ -0,0 +1,123 @@ + + + + + + + ZIP_SOURCE_BEGIN_WRITE(3) + + + + + + + + +
ZIP_SOURCE_BEGIN_WRITE(3)Library Functions ManualZIP_SOURCE_BEGIN_WRITE(3)
+
+
+

+zip_source_begin_write, + zip_source_begin_write_cloning — +
prepare zip source for writing
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_begin_write(zip_source_t + *source);

+

int +
+ zip_source_begin_write_cloning(zip_source_t + *source, zip_uint64_t + offset);

+
+
+

+The functions zip_source_begin_write() and + zip_source_begin_write_cloning() prepare + source for writing. Usually this involves creating + temporary files or allocating buffers. +

zip_source_begin_write_cloning() preserves + the first offset bytes of the original file. This is + done efficiently, and writes to source won't overwrite + the original data until zip_commit_write() is + called.

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3), + zip_source_commit_write(3), + zip_source_rollback_write(3), + zip_source_seek_write(3), + zip_source_tell_write(3), + zip_source_write(3) +
+
+

+zip_source_begin_write() was added in libzip 1.0. +

zip_source_begin_write_cloning() was added + in libzip 1.4.0.

+
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_begin_write.man b/deps/libzip/man/zip_source_begin_write.man new file mode 100644 index 00000000000000..8b77a772345b1b --- /dev/null +++ b/deps/libzip/man/zip_source_begin_write.man @@ -0,0 +1,99 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_begin_write.mdoc -- prepare zip source for writing +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_BEGIN_WRITE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_begin_write\fR, +\fBzip_source_begin_write_cloning\fR +\- prepare zip source for writing +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_begin_write\fR(\fIzip_source_t\ *source\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_begin_write_cloning\fR(\fIzip_source_t\ *source\fR, \fIzip_uint64_t\ offset\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_begin_write\fR() +and +\fBzip_source_begin_write_cloning\fR() +prepare +\fIsource\fR +for writing. +Usually this involves creating temporary files or allocating buffers. +.PP +\fBzip_source_begin_write_cloning\fR() +preserves the first +\fIoffset\fR +bytes of the original file. +This is done efficiently, and writes to +\fIsource\fR +won't overwrite the original data until +\fBzip_commit_write\fR() +is called. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_commit_write(3), +zip_source_rollback_write(3), +zip_source_seek_write(3), +zip_source_tell_write(3), +zip_source_write(3) +.SH "HISTORY" +\fBzip_source_begin_write\fR() +was added in libzip 1.0. +.PP +\fBzip_source_begin_write_cloning\fR() +was added in libzip 1.4.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_begin_write.mdoc b/deps/libzip/man/zip_source_begin_write.mdoc new file mode 100644 index 00000000000000..28f12a0d9dc62c --- /dev/null +++ b/deps/libzip/man/zip_source_begin_write.mdoc @@ -0,0 +1,89 @@ +.\" zip_source_begin_write.mdoc -- prepare zip source for writing +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_BEGIN_WRITE 3 +.Os +.Sh NAME +.Nm zip_source_begin_write , +.Nm zip_source_begin_write_cloning +.Nd prepare zip source for writing +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_begin_write "zip_source_t *source" +.Ft int +.Fn zip_source_begin_write_cloning "zip_source_t *source" "zip_uint64_t offset" +.Sh DESCRIPTION +The functions +.Fn zip_source_begin_write +and +.Fn zip_source_begin_write_cloning +prepare +.Fa source +for writing. +Usually this involves creating temporary files or allocating buffers. +.Pp +.Fn zip_source_begin_write_cloning +preserves the first +.Ar offset +bytes of the original file. +This is done efficiently, and writes to +.Ar source +won't overwrite the original data until +.Fn zip_commit_write +is called. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_commit_write 3 , +.Xr zip_source_rollback_write 3 , +.Xr zip_source_seek_write 3 , +.Xr zip_source_tell_write 3 , +.Xr zip_source_write 3 +.Sh HISTORY +.Fn zip_source_begin_write +was added in libzip 1.0. +.Pp +.Fn zip_source_begin_write_cloning +was added in libzip 1.4.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_buffer.html b/deps/libzip/man/zip_source_buffer.html new file mode 100644 index 00000000000000..fcc461aac82236 --- /dev/null +++ b/deps/libzip/man/zip_source_buffer.html @@ -0,0 +1,135 @@ + + + + + + + ZIP_SOURCE_BUFFER(3) + + + + + + + + +
ZIP_SOURCE_BUFFER(3)Library Functions ManualZIP_SOURCE_BUFFER(3)
+
+
+

+zip_source_buffer, + zip_source_buffer_create — +
create zip data source from buffer
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_buffer(zip_t + *archive, const void + *data, zip_uint64_t + len, int + freep);

+

zip_source_t * +
+ zip_source_buffer_create(const + void *data, zip_uint64_t + len, int freep, + zip_error_t *error);

+
+
+

+The functions zip_source_buffer() and + zip_source_buffer_create() create a zip source from + the buffer data of size len. If + freep is non-zero, the buffer will be freed when it is + no longer needed. data must remain valid for the + lifetime of the created source. +

The source can be used to open a zip archive from.

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_buffer() and + zip_source_buffer_create() fail if: +
+
[]
+
len is greater than zero and + data is NULL.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_open_from_source(3), + zip_source(3) +
+
+

+zip_source_buffer() and + zip_source_buffer_create() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_buffer.man b/deps/libzip/man/zip_source_buffer.man new file mode 100644 index 00000000000000..cd127c2ee03a05 --- /dev/null +++ b/deps/libzip/man/zip_source_buffer.man @@ -0,0 +1,112 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_buffer.mdoc -- create zip data source from buffer +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_BUFFER" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_buffer\fR, +\fBzip_source_buffer_create\fR +\- create zip data source from buffer +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_buffer\fR(\fIzip_t\ *archive\fR, \fIconst\ void\ *data\fR, \fIzip_uint64_t\ len\fR, \fIint\ freep\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_buffer_create\fR(\fIconst\ void\ *data\fR, \fIzip_uint64_t\ len\fR, \fIint\ freep\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_buffer\fR() +and +\fBzip_source_buffer_create\fR() +create a zip source from the buffer +\fIdata\fR +of size +\fIlen\fR. +If +\fIfreep\fR +is non-zero, the buffer will be freed when it is no longer needed. +\fIdata\fR +must remain valid for the lifetime of the created source. +.PP +The source can be used to open a zip archive from. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_buffer\fR() +and +\fBzip_source_buffer_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIlen\fR +is greater than zero and +\fIdata\fR +is +\fRNULL\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_open_from_source(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_buffer\fR() +and +\fBzip_source_buffer_create\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_buffer.mdoc b/deps/libzip/man/zip_source_buffer.mdoc new file mode 100644 index 00000000000000..88daf20f311018 --- /dev/null +++ b/deps/libzip/man/zip_source_buffer.mdoc @@ -0,0 +1,102 @@ +.\" zip_source_buffer.mdoc -- create zip data source from buffer +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_BUFFER 3 +.Os +.Sh NAME +.Nm zip_source_buffer , +.Nm zip_source_buffer_create +.Nd create zip data source from buffer +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_buffer "zip_t *archive" "const void *data" "zip_uint64_t len" "int freep" +.Ft zip_source_t * +.Fn zip_source_buffer_create "const void *data" "zip_uint64_t len" "int freep" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_buffer +and +.Fn zip_source_buffer_create +create a zip source from the buffer +.Ar data +of size +.Ar len . +If +.Ar freep +is non-zero, the buffer will be freed when it is no longer needed. +.Ar data +must remain valid for the lifetime of the created source. +.Pp +The source can be used to open a zip archive from. +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_buffer +and +.Fn zip_source_buffer_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar len +is greater than zero and +.Ar data +is +.Dv NULL . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_open_from_source 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_buffer +and +.Fn zip_source_buffer_create +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_buffer_fragment.html b/deps/libzip/man/zip_source_buffer_fragment.html new file mode 100644 index 00000000000000..c817591ae75e60 --- /dev/null +++ b/deps/libzip/man/zip_source_buffer_fragment.html @@ -0,0 +1,150 @@ + + + + + + + ZIP_SOURCE_BUFFER_FRAGMENT(3) + + + + + + + + +
ZIP_SOURCE_BUFFER_FRAGMENT(3)Library Functions ManualZIP_SOURCE_BUFFER_FRAGMENT(3)
+
+
+

+zip_source_buffer_fragment, + zip_source_buffer_fragment_create — +
create zip data source from multiple buffer
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_buffer_fragment(zip_t + *archive, + zip_buffer_fragment_t + *fragments, zip_uint64_t + nfragments, int + freep);

+

zip_source_t * +
+ zip_source_buffer_fragment_create(zip_buffer_fragment_t + *fragments, zip_uint64_t + nfragments, int + freep, zip_error_t + *error);

+
+
+

+The functions zip_source_buffer_fragment() and + zip_source_buffer_fragment_create() create a zip + source from the data in fragments. + nfragments specifies the number of fragments. If + freep is non-zero, the data will be freed when it is no + longer needed. +
+
+struct zip_stat {
+    zip_uint8_t *data;    /* pointer to the actual data */
+    zip_uint64_t length;  /* length of this fragment */
+};
+
+
+

The data fragments point to must remain + valid for the lifetime of the created source. + fragments itself can be discarded once the source is + created.

+

The source can be used to open a zip archive from.

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_buffer() and + zip_source_buffer_create() fail if: +
+
[]
+
nfragments is greater than zero and + fragments is NULL.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_open_from_source(3), + zip_source(3) +
+
+

+zip_source_buffer_fragment() and + zip_source_buffer_fragment_create() were added in + libzip 1.4.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_buffer_fragment.man b/deps/libzip/man/zip_source_buffer_fragment.man new file mode 100644 index 00000000000000..ea18171b93cb15 --- /dev/null +++ b/deps/libzip/man/zip_source_buffer_fragment.man @@ -0,0 +1,125 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_buffer_fragment.mdoc -- create zip data source from multiple buffers +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_BUFFER_FRAGMENT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_buffer_fragment\fR, +\fBzip_source_buffer_fragment_create\fR +\- create zip data source from multiple buffer +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_buffer_fragment\fR(\fIzip_t\ *archive\fR, \fIzip_buffer_fragment_t\ *fragments\fR, \fIzip_uint64_t\ nfragments\fR, \fIint\ freep\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_buffer_fragment_create\fR(\fIzip_buffer_fragment_t\ *fragments\fR, \fIzip_uint64_t\ nfragments\fR, \fIint\ freep\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_buffer_fragment\fR() +and +\fBzip_source_buffer_fragment_create\fR() +create a zip source from the data in +\fIfragments\fR. +\fInfragments\fR +specifies the number of fragments. +If +\fIfreep\fR +is non-zero, the data will be freed when it is no longer needed. +.nf +.sp +.RS 0n +struct zip_stat { + zip_uint8_t *data; /* pointer to the actual data */ + zip_uint64_t length; /* length of this fragment */ +}; +.RE +.fi +.PP +The data +\fIfragments\fR +point to must remain valid for the lifetime of the created source. +\fIfragments\fR +itself can be discarded once the source is created. +.PP +The source can be used to open a zip archive from. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_buffer\fR() +and +\fBzip_source_buffer_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fInfragments\fR +is greater than zero and +\fIfragments\fR +is +\fRNULL\fR. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_open_from_source(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_buffer_fragment\fR() +and +\fBzip_source_buffer_fragment_create\fR() +were added in libzip 1.4.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_buffer_fragment.mdoc b/deps/libzip/man/zip_source_buffer_fragment.mdoc new file mode 100644 index 00000000000000..54ce31c96c51ea --- /dev/null +++ b/deps/libzip/man/zip_source_buffer_fragment.mdoc @@ -0,0 +1,112 @@ +.\" zip_source_buffer_fragment.mdoc -- create zip data source from multiple buffers +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_BUFFER_FRAGMENT 3 +.Os +.Sh NAME +.Nm zip_source_buffer_fragment , +.Nm zip_source_buffer_fragment_create +.Nd create zip data source from multiple buffer +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_buffer_fragment "zip_t *archive" "zip_buffer_fragment_t *fragments" "zip_uint64_t nfragments" "int freep" +.Ft zip_source_t * +.Fn zip_source_buffer_fragment_create "zip_buffer_fragment_t *fragments" "zip_uint64_t nfragments" "int freep" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_buffer_fragment +and +.Fn zip_source_buffer_fragment_create +create a zip source from the data in +.Ar fragments . +.Ar nfragments +specifies the number of fragments. +If +.Ar freep +is non-zero, the data will be freed when it is no longer needed. +.Bd -literal +struct zip_stat { + zip_uint8_t *data; /* pointer to the actual data */ + zip_uint64_t length; /* length of this fragment */ +}; +.Ed +.Pp +The data +.Ar fragments +point to must remain valid for the lifetime of the created source. +.Ar fragments +itself can be discarded once the source is created. +.Pp +The source can be used to open a zip archive from. +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_buffer +and +.Fn zip_source_buffer_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar nfragments +is greater than zero and +.Ar fragments +is +.Dv NULL . +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_open_from_source 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_buffer_fragment +and +.Fn zip_source_buffer_fragment_create +were added in libzip 1.4.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_close.html b/deps/libzip/man/zip_source_close.html new file mode 100644 index 00000000000000..5ac0c2d18503be --- /dev/null +++ b/deps/libzip/man/zip_source_close.html @@ -0,0 +1,105 @@ + + + + + + + ZIP_SOURCE_CLOSE(3) + + + + + + + + +
ZIP_SOURCE_CLOSE(3)Library Functions ManualZIP_SOURCE_CLOSE(3)
+
+
+

+zip_source_close — +
close zip_source (which was open for reading)
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_close(zip_source_t + *source);

+
+
+

+The function zip_source_close() closes + source, indicating that no more data will be read. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3), + zip_source_free(3), + zip_source_open(3) +
+
+

+zip_source_close() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_close.man b/deps/libzip/man/zip_source_close.man new file mode 100644 index 00000000000000..d5e578f0272203 --- /dev/null +++ b/deps/libzip/man/zip_source_close.man @@ -0,0 +1,72 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_close.mdoc -- close zip source (open for reading) +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_CLOSE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_close\fR +\- close zip_source (which was open for reading) +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_close\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_close\fR() +closes +\fIsource\fR, +indicating that no more data will be read. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_free(3), +zip_source_open(3) +.SH "HISTORY" +\fBzip_source_close\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_close.mdoc b/deps/libzip/man/zip_source_close.mdoc new file mode 100644 index 00000000000000..1f012ce50de5f8 --- /dev/null +++ b/deps/libzip/man/zip_source_close.mdoc @@ -0,0 +1,67 @@ +.\" zip_source_close.mdoc -- close zip source (open for reading) +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_CLOSE 3 +.Os +.Sh NAME +.Nm zip_source_close +.Nd close zip_source (which was open for reading) +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_close "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_close +closes +.Fa source , +indicating that no more data will be read. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_free 3 , +.Xr zip_source_open 3 +.Sh HISTORY +.Fn zip_source_close +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_commit_write.html b/deps/libzip/man/zip_source_commit_write.html new file mode 100644 index 00000000000000..4c613a50f66044 --- /dev/null +++ b/deps/libzip/man/zip_source_commit_write.html @@ -0,0 +1,109 @@ + + + + + + + ZIP_SOURCE_COMMIT_WRITE(3) + + + + + + + + +
ZIP_SOURCE_COMMIT_WRITE(3)Library Functions ManualZIP_SOURCE_COMMIT_WRITE(3)
+
+
+

+zip_source_commit_write — +
finalize changes to zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_commit_write(zip_source_t + *source);

+
+
+

+The function zip_source_commit_write() finishes writing + data to source and replaces the original with the newly + written data. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3), + zip_source_begin_write(3), + zip_source_rollback_write(3), + zip_source_seek_write(3), + zip_source_tell_write(3), + zip_source_write(3) +
+
+

+zip_source_commit_write() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_commit_write.man b/deps/libzip/man/zip_source_commit_write.man new file mode 100644 index 00000000000000..c13fcbc55f10ce --- /dev/null +++ b/deps/libzip/man/zip_source_commit_write.man @@ -0,0 +1,75 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_commit_write.mdoc -- finalize changes to zip source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_COMMIT_WRITE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_commit_write\fR +\- finalize changes to zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_commit_write\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_commit_write\fR() +finishes writing data to +\fIsource\fR +and replaces the original with the newly written data. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_begin_write(3), +zip_source_rollback_write(3), +zip_source_seek_write(3), +zip_source_tell_write(3), +zip_source_write(3) +.SH "HISTORY" +\fBzip_source_commit_write\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_commit_write.mdoc b/deps/libzip/man/zip_source_commit_write.mdoc new file mode 100644 index 00000000000000..e44a31d5eb3610 --- /dev/null +++ b/deps/libzip/man/zip_source_commit_write.mdoc @@ -0,0 +1,70 @@ +.\" zip_source_commit_write.mdoc -- finalize changes to zip source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_COMMIT_WRITE 3 +.Os +.Sh NAME +.Nm zip_source_commit_write +.Nd finalize changes to zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_commit_write "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_commit_write +finishes writing data to +.Fa source +and replaces the original with the newly written data. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_begin_write 3 , +.Xr zip_source_rollback_write 3 , +.Xr zip_source_seek_write 3 , +.Xr zip_source_tell_write 3 , +.Xr zip_source_write 3 +.Sh HISTORY +.Fn zip_source_commit_write +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_error.html b/deps/libzip/man/zip_source_error.html new file mode 100644 index 00000000000000..cbe80ce2916af2 --- /dev/null +++ b/deps/libzip/man/zip_source_error.html @@ -0,0 +1,97 @@ + + + + + + + ZIP_SOURCE_ERROR(3) + + + + + + + + +
ZIP_SOURCE_ERROR(3)Library Functions ManualZIP_SOURCE_ERROR(3)
+
+
+

+zip_source_error — +
get zip error for data source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_error_t * +
+ zip_source_error(zip_source_t + *source);

+
+
+

+The zip_source_error() function returns the zip error + for the data source source. +
+
+

+libzip(3), + zip_error_code_system(3), + zip_error_code_zip(3) +
+
+

+zip_source_error() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_error.man b/deps/libzip/man/zip_source_error.man new file mode 100644 index 00000000000000..b5d99e0d41dff8 --- /dev/null +++ b/deps/libzip/man/zip_source_error.man @@ -0,0 +1,65 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_error.mdoc -- get zip_error for data source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_ERROR" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_error\fR +\- get zip error for data source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_error_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_error\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_source_error\fR() +function returns the zip error for the data source +\fIsource\fR. +.SH "SEE ALSO" +libzip(3), +zip_error_code_system(3), +zip_error_code_zip(3) +.SH "HISTORY" +\fBzip_source_error\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_error.mdoc b/deps/libzip/man/zip_source_error.mdoc new file mode 100644 index 00000000000000..e82eff7059283f --- /dev/null +++ b/deps/libzip/man/zip_source_error.mdoc @@ -0,0 +1,60 @@ +.\" zip_source_error.mdoc -- get zip_error for data source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_ERROR 3 +.Os +.Sh NAME +.Nm zip_source_error +.Nd get zip error for data source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_error_t * +.Fn zip_source_error "zip_source_t *source" +.Sh DESCRIPTION +The +.Fn zip_source_error +function returns the zip error for the data source +.Ar source . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_error_code_system 3 , +.Xr zip_error_code_zip 3 +.Sh HISTORY +.Fn zip_source_error +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_file.html b/deps/libzip/man/zip_source_file.html new file mode 100644 index 00000000000000..97bbbdf2687de9 --- /dev/null +++ b/deps/libzip/man/zip_source_file.html @@ -0,0 +1,141 @@ + + + + + + + ZIP_SOURCE_FILE(3) + + + + + + + + +
ZIP_SOURCE_FILE(3)Library Functions ManualZIP_SOURCE_FILE(3)
+
+
+

+zip_source_file, + zip_source_file_create — +
create data source from a file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_file(zip_t + *archive, const char + *fname, zip_uint64_t + start, zip_int64_t + len);

+

zip_source_t * +
+ zip_source_file_create(const + char *fname, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The functions zip_source_file() and + zip_source_file_create() create a zip source from a + file. They open fname and read len + bytes from offset start from it. If + len is 0 or -1, the whole file (starting from + start) is used. +

If the file supports seek, the source can be used to open a zip + archive from.

+

The file is opened and read when the data from the source is used, + usually by zip_close() or + zip_open_from_source().

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_file() and + zip_source_file_create() fail if: +
+
[]
+
fname, start, or + len are invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
Opening fname failed.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3) +
+
+

+zip_source_file() and + zip_source_file_create() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_file.man b/deps/libzip/man/zip_source_file.man new file mode 100644 index 00000000000000..c55075fae5b187 --- /dev/null +++ b/deps/libzip/man/zip_source_file.man @@ -0,0 +1,125 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_file.mdoc -- create data source from a file +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_FILE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_file\fR, +\fBzip_source_file_create\fR +\- create data source from a file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_file\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *fname\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_file_create\fR(\fIconst\ char\ *fname\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_file\fR() +and +\fBzip_source_file_create\fR() +create a zip source from a file. +They open +\fIfname\fR +and read +\fIlen\fR +bytes from offset +\fIstart\fR +from it. +If +\fIlen\fR +is 0 or \-1, the whole file (starting from +\fIstart\fR) +is used. +.PP +If the file supports seek, the source can be used to open a zip archive from. +.PP +The file is opened and read when the data from the source is used, usually by +\fBzip_close\fR() +or +\fBzip_open_from_source\fR(). +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_file\fR() +and +\fBzip_source_file_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIfname\fR, +\fIstart\fR, +or +\fIlen\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_OPEN\fR] +Opening +\fIfname\fR +failed. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_file\fR() +and +\fBzip_source_file_create\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_file.mdoc b/deps/libzip/man/zip_source_file.mdoc new file mode 100644 index 00000000000000..fffce0b45f98e4 --- /dev/null +++ b/deps/libzip/man/zip_source_file.mdoc @@ -0,0 +1,114 @@ +.\" zip_source_file.mdoc -- create data source from a file +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_FILE 3 +.Os +.Sh NAME +.Nm zip_source_file , +.Nm zip_source_file_create +.Nd create data source from a file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_file "zip_t *archive" "const char *fname" "zip_uint64_t start" "zip_int64_t len" +.Ft zip_source_t * +.Fn zip_source_file_create "const char *fname" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_file +and +.Fn zip_source_file_create +create a zip source from a file. +They open +.Ar fname +and read +.Ar len +bytes from offset +.Ar start +from it. +If +.Ar len +is 0 or \-1, the whole file (starting from +.Ar start ) +is used. +.Pp +If the file supports seek, the source can be used to open a zip archive from. +.Pp +The file is opened and read when the data from the source is used, usually by +.Fn zip_close +or +.Fn zip_open_from_source . +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_file +and +.Fn zip_source_file_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar fname , +.Ar start , +or +.Ar len +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_OPEN +Opening +.Ar fname +failed. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_file +and +.Fn zip_source_file_create +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_filep.html b/deps/libzip/man/zip_source_filep.html new file mode 100644 index 00000000000000..dec6149edfad12 --- /dev/null +++ b/deps/libzip/man/zip_source_filep.html @@ -0,0 +1,137 @@ + + + + + + + ZIP_SOURCE_FILEP(3) + + + + + + + + +
ZIP_SOURCE_FILEP(3)Library Functions ManualZIP_SOURCE_FILEP(3)
+
+
+

+zip_source_filep, + zip_source_filep_create — +
create data source from FILE *
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_filep(zip_t + *archive, FILE + *file, zip_uint64_t + start, zip_int64_t + len);

+

zip_source_t * +
+ zip_source_filep_create(FILE + *file, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The functions zip_source_filep() and + zip_source_filep_create() create a zip source from a + file stream. They read len bytes from offset + start from the open file stream + file. If len is 0 or -1, the whole + file (starting from start) is used. +

If the file stream supports seeking, the source can be used to + open a read-only zip archive from.

+

The file stream is closed when the source is being freed, usually + by zip_close(3).

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_filep() fails if: +
+
[]
+
file, start, or + len are invalid.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3) +
+
+

+zip_source_filep() and + zip_source_filep_create() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_filep.man b/deps/libzip/man/zip_source_filep.man new file mode 100644 index 00000000000000..8b10b99fb2611f --- /dev/null +++ b/deps/libzip/man/zip_source_filep.man @@ -0,0 +1,117 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_filep.mdoc -- create data source from a file stream +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_FILEP" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_filep\fR, +\fBzip_source_filep_create\fR +\- create data source from FILE * +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_filep\fR(\fIzip_t\ *archive\fR, \fIFILE\ *file\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_filep_create\fR(\fIFILE\ *file\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_filep\fR() +and +\fBzip_source_filep_create\fR() +create a zip source from a file stream. +They read +\fIlen\fR +bytes from offset +\fIstart\fR +from the open file stream +\fIfile\fR. +If +\fIlen\fR +is 0 or \-1, the whole file (starting from +\fIstart\fR) +is used. +.PP +If the file stream supports seeking, the source can be used to open +a read-only zip archive from. +.PP +The file stream is closed when the source is being freed, usually +by +zip_close(3). +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_filep\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIfile\fR, +\fIstart\fR, +or +\fIlen\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_filep\fR() +and +\fBzip_source_filep_create\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_filep.mdoc b/deps/libzip/man/zip_source_filep.mdoc new file mode 100644 index 00000000000000..7ee13d3d690543 --- /dev/null +++ b/deps/libzip/man/zip_source_filep.mdoc @@ -0,0 +1,107 @@ +.\" zip_source_filep.mdoc -- create data source from a file stream +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_FILEP 3 +.Os +.Sh NAME +.Nm zip_source_filep , +.Nm zip_source_filep_create +.Nd create data source from FILE * +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_filep "zip_t *archive" "FILE *file" "zip_uint64_t start" "zip_int64_t len" +.Ft zip_source_t * +.Fn zip_source_filep_create "FILE *file" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_filep +and +.Fn zip_source_filep_create +create a zip source from a file stream. +They read +.Ar len +bytes from offset +.Ar start +from the open file stream +.Ar file . +If +.Ar len +is 0 or \-1, the whole file (starting from +.Ar start ) +is used. +.Pp +If the file stream supports seeking, the source can be used to open +a read-only zip archive from. +.Pp +The file stream is closed when the source is being freed, usually +by +.Xr zip_close 3 . +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_filep +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar file , +.Ar start , +or +.Ar len +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_filep +and +.Fn zip_source_filep_create +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_free.html b/deps/libzip/man/zip_source_free.html new file mode 100644 index 00000000000000..48839a8c0b9224 --- /dev/null +++ b/deps/libzip/man/zip_source_free.html @@ -0,0 +1,104 @@ + + + + + + + ZIP_SOURCE_FREE(3) + + + + + + + + +
ZIP_SOURCE_FREE(3)Library Functions ManualZIP_SOURCE_FREE(3)
+
+
+

+zip_source_free — +
free zip data source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_source_free(zip_source_t + *source);

+
+
+

+The function zip_source_free() decrements the reference + count of source and frees it if the reference count + drops to 0. If source is NULL, + it does nothing. +

NOTE: This function should not be called on a + source after it was used successfully in a + zip_open_from_source(3), + zip_file_add(3), or + zip_file_replace(3) call.

+
+
+

+libzip(3), + zip_source(3), + zip_source_keep(3) +
+
+

+zip_source_free() was added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_free.man b/deps/libzip/man/zip_source_free.man new file mode 100644 index 00000000000000..0ae5d6af865981 --- /dev/null +++ b/deps/libzip/man/zip_source_free.man @@ -0,0 +1,81 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_free.mdoc -- free zip data source +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_FREE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_free\fR +\- free zip data source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_source_free\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_free\fR() +decrements the reference count of +\fIsource\fR +and frees it if the reference count drops to 0. +If +\fIsource\fR +is +\fRNULL\fR, +it does nothing. +.PP +\fINOTE\fR: +This function should not be called on a +\fIsource\fR +after it was used successfully in a +zip_open_from_source(3), +zip_file_add(3), +or +zip_file_replace(3) +call. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_keep(3) +.SH "HISTORY" +\fBzip_source_free\fR() +was added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_free.mdoc b/deps/libzip/man/zip_source_free.mdoc new file mode 100644 index 00000000000000..e97ae3bc93537b --- /dev/null +++ b/deps/libzip/man/zip_source_free.mdoc @@ -0,0 +1,76 @@ +.\" zip_source_free.mdoc -- free zip data source +.\" Copyright (C) 2004-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_FREE 3 +.Os +.Sh NAME +.Nm zip_source_free +.Nd free zip data source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_source_free "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_free +decrements the reference count of +.Ar source +and frees it if the reference count drops to 0. +If +.Ar source +is +.Dv NULL , +it does nothing. +.Pp +.Em NOTE : +This function should not be called on a +.Ar source +after it was used successfully in a +.Xr zip_open_from_source 3 , +.Xr zip_file_add 3 , +or +.Xr zip_file_replace 3 +call. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_keep 3 +.Sh HISTORY +.Fn zip_source_free +was added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_function.html b/deps/libzip/man/zip_source_function.html new file mode 100644 index 00000000000000..6f8267078e8133 --- /dev/null +++ b/deps/libzip/man/zip_source_function.html @@ -0,0 +1,390 @@ + + + + + + + ZIP_SOURCE_FUNCTION(3) + + + + + + + + +
ZIP_SOURCE_FUNCTION(3)Library Functions ManualZIP_SOURCE_FUNCTION(3)
+
+
+

+zip_source_function, + zip_source_function_create — +
create data source from function
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_function(zip_t + *archive, + zip_source_callback fn, + void *userdata);

+

zip_source_t * +
+ zip_source_function_create(zip_source_callback + fn, void *userdata, + zip_error_t *error);

+
+
+

+The functions zip_source_function() and + zip_source_function_create() create a zip source from + the user-provided function fn, which must be of the + following type: +

typedef zip_int64_t + (*zip_source_callback)(void + *userdata, void *data, + zip_uint64_t len, zip_source_cmd_t + cmd);

+

archive or error are + used for reporting errors and can be NULL.

+

When called by the library, the first argument is the + userdata argument supplied to the function. The next + two arguments are a buffer data of size + len when data is passed in or expected to be returned, + or else NULL and 0. The last argument, + cmd, specifies which action the function should + perform.

+

Depending on the uses, there are three useful sets of commands to + be supported by a zip_source_callback():

+
+
read source
+
Providing streamed data (for file data added to archives). Must support + ZIP_SOURCE_OPEN, + ZIP_SOURCE_READ, + ZIP_SOURCE_CLOSE, + ZIP_SOURCE_STAT, and + ZIP_SOURCE_ERROR.
+
seekable read source
+
Same as previous, but from a source allowing reading from arbitrary + offsets (also for read-only zip archive). Must additionally support + ZIP_SOURCE_SEEK, + ZIP_SOURCE_TELL, and + ZIP_SOURCE_SUPPORTS.
+
read/write source
+
Same as previous, but additionally allowing writing (also for writable zip + archives). Must additionally support + ZIP_SOURCE_BEGIN_WRITE, + ZIP_SOURCE_COMMIT_WRITE, + ZIP_SOURCE_ROLLBACK_WRITE, + ZIP_SOURCE_SEEK_WRITE, + ZIP_SOURCE_TELL_WRITE, and + ZIP_SOURCE_REMOVE. +

On top of the above, supporting the pseudo-command + ZIP_SOURCE_SUPPORTS_REOPEN allows calling + zip_source_open() again after calling + zip_source_close().

+
+
+
+

ZIP_SOURCE_ACCEPT_EMPTY

+Return 1 if an empty source should be accepted as a valid zip archive. This is + the default if this command is not supported by a source. File system backed + sources should return 0. +
+
+

ZIP_SOURCE_BEGIN_WRITE

+Prepare the source for writing. Use this to create any temporary file(s). +
+
+

ZIP_SOURCE_BEGIN_WRITE_CLONING

+Prepare the source for writing, keeping the first len + bytes of the original file. Only implement this command if it is more + efficient than copying the data, and if it does not destructively overwrite + the original file (you still have to be able to execute + ZIP_SOURCE_ROLLBACK_WRITE). +

The next write should happen at byte + offset.

+
+
+

ZIP_SOURCE_CLOSE

+Reading is done. +
+
+

ZIP_SOURCE_COMMIT_WRITE

+Finish writing to the source. Replace the original data with the newly written + data. Clean up temporary files or internal buffers. Subsequently opening and + reading from the source should return the newly written data. +
+
+

ZIP_SOURCE_ERROR

+Get error information. data points to an array of two + ints, which should be filled with the libzip error code and the corresponding + system error code for the error that occurred. See + zip_errors(3) for details on the + error codes. If the source stores error information in a zip_error_t, use + zip_error_to_data(3) and + return its return value. Otherwise, return 2 * sizeof(int). +
+
+

ZIP_SOURCE_FREE

+Clean up and free all resources, including userdata. The + callback function will not be called again. +
+
+

ZIP_SOURCE_GET_FILE_ATTRIBUTES

+Provide information about various data. Then the data should be put in the + appropriate entry in the passed zip_file_attributes_t + argument, and the appropriate ZIP_FILE_ATTRIBUTES_* + value must be or'ed into the valid member to denote that + the corresponding data has been provided. A + zip_file_attributes_t structure can be initialized using + zip_file_attributes_init(3). +
+
ASCII mode
+
If a file is a plaintext file in ASCII. Can be used by extraction tools to + automatically convert line endings (part of the internal file attributes). + Member ascii, flag + ZIP_FILE_ATTRIBUTES_ASCII.
+
General Purpose Bit Flags (limited to Compression Flags)
+
The general purpose bit flag in the zip in the local and central directory + headers contain information about the compression method. Member + general_purpose_bit_flags and + general_purpose_bit_mask to denote which members + have been set; flag + ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS.
+
External File Attributes
+
The external file attributes (usually operating system-specific). Member + external_file_attributes, flag + ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES.
+
Version Needed
+
A minimum version needed required to unpack this entry (in the usual + "major * 10 + minor" format). Member + version_needed, flag + ZIP_FILE_ATTRIBUTES_VERSION_NEEDED.
+
Operating System
+
One of the operating systems as defined by the + ZIP_OPSYS_* variables (see + zip.h). This value affects the interpretation of + the external file attributes. Member host_system, + flag ZIP_FILE_ATTRIBUTES_HOST_SYSTEM.
+
+
+
+

ZIP_SOURCE_OPEN

+Prepare for reading. +
+
+

ZIP_SOURCE_READ

+Read data into the buffer data of size + len. Return the number of bytes placed into + data on success, and zero for end-of-file. +
+
+

ZIP_SOURCE_REMOVE

+Remove the underlying file. This is called if a zip archive is empty when + closed. +
+
+

ZIP_SOURCE_ROLLBACK_WRITE

+Abort writing to the source. Discard written data. Clean up temporary files or + internal buffers. Subsequently opening and reading from the source should + return the original data. +
+
+

ZIP_SOURCE_SEEK

+Specify position to read next byte from, like + fseek(3). Use + ZIP_SOURCE_GET_ARGS(3) to + decode the arguments into the following struct: +
+
+struct zip_source_args_seek {
+    zip_int64_t offset;
+    int whence;
+};
+
+
+

If the size of the source's data is known, use + zip_source_seek_compute_offset(3) + to validate the arguments and compute the new offset.

+
+
+

ZIP_SOURCE_SEEK_WRITE

+Specify position to write next byte to, like + fseek(3). See + ZIP_SOURCE_SEEK for details. +
+
+

ZIP_SOURCE_STAT

+Get meta information for the input data. data points to an + allocated struct zip_stat, which should be initialized + using zip_stat_init(3) and then + filled in. +

For uncompressed, unencrypted data, all information is optional. + However, fill in as much information as is readily available.

+

If the data is compressed, + ZIP_STAT_COMP_METHOD, + ZIP_STAT_SIZE, and + ZIP_STAT_CRC must be filled in.

+

If the data is encrypted, + ZIP_STAT_ENCRYPTION_METHOD, + ZIP_STAT_COMP_METHOD, + ZIP_STAT_SIZE, and + ZIP_STAT_CRC must be filled in.

+

Information only available after the source has been read (e.g., + size) can be omitted in an earlier call. NOTE: + zip_source_function() may be called with this + argument even after being called with + ZIP_SOURCE_CLOSE.

+

Return sizeof(struct zip_stat) on success.

+
+
+

ZIP_SOURCE_SUPPORTS

+Return bitmap specifying which commands are supported. Use + zip_source_make_command_bitmap(3). + If this command is not implemented, the source is assumed to be a read source + without seek support. +
+
+

ZIP_SOURCE_TELL

+Return the current read offset in the source, like + ftell(3). +
+
+

ZIP_SOURCE_TELL_WRITE

+Return the current write offset in the source, like + ftell(3). +
+
+

ZIP_SOURCE_WRITE

+Write data to the source. Return number of bytes written. +
+
+

ZIP_SOURCE_SUPPORTS_REOPEN

+This command is never actually invoked, support for it signals the ability to + handle multiple open/read/close cycles. +
+
+

+Commands should return -1 on error. ZIP_SOURCE_ERROR + will be called to retrieve the error code. On success, commands return 0, + unless specified otherwise in the description above. +
+
+

+The library will always issue ZIP_SOURCE_OPEN before + issuing ZIP_SOURCE_READ, + ZIP_SOURCE_SEEK, or + ZIP_SOURCE_TELL. When it no longer wishes to read from + this source, it will issue ZIP_SOURCE_CLOSE. If the + library wishes to read the data again, it will issue + ZIP_SOURCE_OPEN a second time. If the function is + unable to provide the data again, it should return -1. +

ZIP_SOURCE_BEGIN_WRITE or + ZIP_SOURCE_BEGIN_WRITE_CLONING will be called before + ZIP_SOURCE_WRITE, + ZIP_SOURCE_SEEK_WRITE, or + ZIP_SOURCE_TELL_WRITE. When writing is complete, + either ZIP_SOURCE_COMMIT_WRITE or + ZIP_SOURCE_ROLLBACK_WRITE will be called.

+

ZIP_SOURCE_ACCEPT_EMPTY, + ZIP_SOURCE_GET_FILE_ATTRIBUTES, and + ZIP_SOURCE_STAT can be issued at any time.

+

ZIP_SOURCE_ERROR will only be issued in + response to the function returning -1.

+

ZIP_SOURCE_FREE will be the last command + issued; if ZIP_SOURCE_OPEN was called and succeeded, + ZIP_SOURCE_CLOSE will be called before + ZIP_SOURCE_FREE, and similarly for + ZIP_SOURCE_BEGIN_WRITE or + ZIP_SOURCE_BEGIN_WRITE_CLONING and + ZIP_SOURCE_COMMIT_WRITE or + ZIP_SOURCE_ROLLBACK_WRITE.

+
+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error (unless it is NULL). +
+
+

+zip_source_function() fails if: +
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_attributes_init(3), + zip_file_replace(3), + zip_source(3), + zip_stat_init(3) +
+
+

+zip_source_function() and + zip_source_function_create() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
June 28, 2022NiH
+ + diff --git a/deps/libzip/man/zip_source_function.man b/deps/libzip/man/zip_source_function.man new file mode 100644 index 00000000000000..7e00cec1e83c4d --- /dev/null +++ b/deps/libzip/man/zip_source_function.man @@ -0,0 +1,423 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_function.mdoc -- create data source from function +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_FUNCTION" "3" "June 28, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_function\fR, +\fBzip_source_function_create\fR +\- create data source from function +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_function\fR(\fIzip_t\ *archive\fR, \fIzip_source_callback\ fn\fR, \fIvoid\ *userdata\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_function_create\fR(\fIzip_source_callback\ fn\fR, \fIvoid\ *userdata\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_function\fR() +and +\fBzip_source_function_create\fR() +create a zip source from the user-provided function +\fIfn\fR, +which must be of the following type: +.PP +\fItypedef zip_int64_t\fR +\fB\fR(*\fPzip_source_callback\fR)\fP\fR(\fIvoid\ *userdata\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ len\fR, \fIzip_source_cmd_t\ cmd\fR) +.PP +\fIarchive\fR +or +\fIerror\fR +are used for reporting errors and can be +\fRNULL\fR. +.PP +When called by the library, the first argument is the +\fIuserdata\fR +argument supplied to the function. +The next two arguments are a buffer +\fIdata\fR +of size +\fIlen\fR +when data is passed in or expected to be returned, or else +\fRNULL\fR +and 0. +The last argument, +\fIcmd\fR, +specifies which action the function should perform. +.PP +Depending on the uses, there are three useful sets of commands to be supported by a +\fBzip_source_callback\fR(): +.TP 24n +read source +Providing streamed data (for file data added to archives). +Must support +\fRZIP_SOURCE_OPEN\fR, +\fRZIP_SOURCE_READ\fR, +\fRZIP_SOURCE_CLOSE\fR, +\fRZIP_SOURCE_STAT\fR, +and +\fRZIP_SOURCE_ERROR\fR. +.TP 24n +seekable read source +Same as previous, but from a source allowing reading from arbitrary +offsets (also for read-only zip archive). +Must additionally support +\fRZIP_SOURCE_SEEK\fR, +\fRZIP_SOURCE_TELL\fR, +and +\fRZIP_SOURCE_SUPPORTS\fR. +.TP 24n +read/write source +Same as previous, but additionally allowing writing (also for writable +zip archives). +Must additionally support +\fRZIP_SOURCE_BEGIN_WRITE\fR, +\fRZIP_SOURCE_COMMIT_WRITE\fR, +\fRZIP_SOURCE_ROLLBACK_WRITE\fR, +\fRZIP_SOURCE_SEEK_WRITE\fR, +\fRZIP_SOURCE_TELL_WRITE\fR, +and +\fRZIP_SOURCE_REMOVE\fR. +.sp +On top of the above, supporting the pseudo-command +\fRZIP_SOURCE_SUPPORTS_REOPEN\fR +allows calling +\fBzip_source_open\fR() +again after calling +\fBzip_source_close\fR(). +.SS "\fRZIP_SOURCE_ACCEPT_EMPTY\fR" +Return 1 if an empty source should be accepted as a valid zip archive. +This is the default if this command is not supported by a source. +File system backed sources should return 0. +.SS "\fRZIP_SOURCE_BEGIN_WRITE\fR" +Prepare the source for writing. +Use this to create any temporary file(s). +.SS "\fRZIP_SOURCE_BEGIN_WRITE_CLONING\fR" +Prepare the source for writing, keeping the first +\fIlen\fR +bytes of the original file. +Only implement this command if it is more efficient than copying the +data, and if it does not destructively overwrite the original file +(you still have to be able to execute +\fRZIP_SOURCE_ROLLBACK_WRITE\fR). +.PP +The next write should happen at byte +\fIoffset\fR. +.SS "\fRZIP_SOURCE_CLOSE\fR" +Reading is done. +.SS "\fRZIP_SOURCE_COMMIT_WRITE\fR" +Finish writing to the source. +Replace the original data with the newly written data. +Clean up temporary files or internal buffers. +Subsequently opening and reading from the source should return the +newly written data. +.SS "\fRZIP_SOURCE_ERROR\fR" +Get error information. +\fIdata\fR +points to an array of two ints, which should be filled with the libzip +error code and the corresponding system error code for the error that +occurred. +See +zip_errors(3) +for details on the error codes. +If the source stores error information in a zip_error_t, use +zip_error_to_data(3) +and return its return value. +Otherwise, return 2 * sizeof(int). +.SS "\fRZIP_SOURCE_FREE\fR" +Clean up and free all resources, including +\fIuserdata\fR. +The callback function will not be called again. +.SS "\fRZIP_SOURCE_GET_FILE_ATTRIBUTES\fR" +Provide information about various data. +Then the data should be put in the appropriate entry in the passed +\fIzip_file_attributes_t\fR +argument, and the appropriate +\fRZIP_FILE_ATTRIBUTES_*\fR +value must be or'ed into the +\fIvalid\fR +member to denote that the corresponding data has been provided. +A +\fIzip_file_attributes_t\fR +structure can be initialized using +zip_file_attributes_init(3). +.TP 12n +ASCII mode +If a file is a plaintext file in ASCII. +Can be used by extraction tools to automatically convert line endings +(part of the internal file attributes). +Member +\fIascii\fR, +flag +\fRZIP_FILE_ATTRIBUTES_ASCII\fR. +.TP 12n +General Purpose Bit Flags (limited to Compression Flags) +The general purpose bit flag in the zip in the local and central +directory headers contain information about the compression method. +Member +\fIgeneral_purpose_bit_flags\fR +and +\fIgeneral_purpose_bit_mask\fR +to denote which members have been set; +flag +\fRZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS\fR. +.TP 12n +External File Attributes +The external file attributes (usually operating system-specific). +Member +\fIexternal_file_attributes\fR, +flag +\fRZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES\fR. +.TP 12n +Version Needed +A minimum version needed required to unpack this entry (in the usual +"major * 10 + minor" format). +Member +\fIversion_needed\fR, +flag +\fRZIP_FILE_ATTRIBUTES_VERSION_NEEDED\fR. +.TP 12n +Operating System +One of the operating systems as defined by the +\fRZIP_OPSYS_*\fR +variables (see +\fIzip.h\fR). +This value affects the interpretation of the external file attributes. +Member +\fIhost_system\fR, +flag +\fRZIP_FILE_ATTRIBUTES_HOST_SYSTEM\fR. +.SS "\fRZIP_SOURCE_OPEN\fR" +Prepare for reading. +.SS "\fRZIP_SOURCE_READ\fR" +Read data into the buffer +\fIdata\fR +of size +\fIlen\fR. +Return the number of bytes placed into +\fIdata\fR +on success, and zero for end-of-file. +.SS "\fRZIP_SOURCE_REMOVE\fR" +Remove the underlying file. +This is called if a zip archive is empty when closed. +.SS "\fRZIP_SOURCE_ROLLBACK_WRITE\fR" +Abort writing to the source. +Discard written data. +Clean up temporary files or internal buffers. +Subsequently opening and reading from the source should return the +original data. +.SS "\fRZIP_SOURCE_SEEK\fR" +Specify position to read next byte from, like +fseek(3). +Use +ZIP_SOURCE_GET_ARGS(3) +to decode the arguments into the following struct: +.nf +.sp +.RS 0n +struct zip_source_args_seek { + zip_int64_t offset; + int whence; +}; +.RE +.fi +.PP +If the size of the source's data is known, use +zip_source_seek_compute_offset(3) +to validate the arguments and compute the new offset. +.SS "\fRZIP_SOURCE_SEEK_WRITE\fR" +Specify position to write next byte to, like +fseek(3). +See +\fRZIP_SOURCE_SEEK\fR +for details. +.SS "\fRZIP_SOURCE_STAT\fR" +Get meta information for the input data. +\fIdata\fR +points to an allocated +\fIstruct zip_stat\fR, +which should be initialized using +zip_stat_init(3) +and then filled in. +.PP +For uncompressed, unencrypted data, all information is optional. +However, fill in as much information as is readily available. +.PP +If the data is compressed, +\fRZIP_STAT_COMP_METHOD\fR, +\fRZIP_STAT_SIZE\fR, +and +\fRZIP_STAT_CRC\fR +must be filled in. +.PP +If the data is encrypted, +\fRZIP_STAT_ENCRYPTION_METHOD\fR, +\fRZIP_STAT_COMP_METHOD\fR, +\fRZIP_STAT_SIZE\fR, +and +\fRZIP_STAT_CRC\fR +must be filled in. +.PP +Information only available after the source has been read (e.g., size) +can be omitted in an earlier call. +\fINOTE\fR: +\fBzip_source_function\fR() +may be called with this argument even after being called with +\fRZIP_SOURCE_CLOSE\fR. +.PP +Return sizeof(struct zip_stat) on success. +.SS "\fRZIP_SOURCE_SUPPORTS\fR" +Return bitmap specifying which commands are supported. +Use +zip_source_make_command_bitmap(3). +If this command is not implemented, the source is assumed to be a +read source without seek support. +.SS "\fRZIP_SOURCE_TELL\fR" +Return the current read offset in the source, like +ftell(3). +.SS "\fRZIP_SOURCE_TELL_WRITE\fR" +Return the current write offset in the source, like +ftell(3). +.SS "\fRZIP_SOURCE_WRITE\fR" +Write data to the source. +Return number of bytes written. +.SS "\fRZIP_SOURCE_SUPPORTS_REOPEN\fR" +This command is never actually invoked, support for it signals the +ability to handle multiple open/read/close cycles. +.SS "Return Values" +Commands should return \-1 on error. +\fRZIP_SOURCE_ERROR\fR +will be called to retrieve the error code. +On success, commands return 0, unless specified otherwise in the +description above. +.SS "Calling Conventions" +The library will always issue +\fRZIP_SOURCE_OPEN\fR +before issuing +\fRZIP_SOURCE_READ\fR, +\fRZIP_SOURCE_SEEK\fR, +or +\fRZIP_SOURCE_TELL\fR. +When it no longer wishes to read from this source, it will issue +\fRZIP_SOURCE_CLOSE\fR. +If the library wishes to read the data again, it will issue +\fRZIP_SOURCE_OPEN\fR +a second time. +If the function is unable to provide the data again, it should +return \-1. +.PP +\fRZIP_SOURCE_BEGIN_WRITE\fR +or +\fRZIP_SOURCE_BEGIN_WRITE_CLONING\fR +will be called before +\fRZIP_SOURCE_WRITE\fR, +\fRZIP_SOURCE_SEEK_WRITE\fR, +or +\fRZIP_SOURCE_TELL_WRITE\fR. +When writing is complete, either +\fRZIP_SOURCE_COMMIT_WRITE\fR +or +\fRZIP_SOURCE_ROLLBACK_WRITE\fR +will be called. +.PP +\fRZIP_SOURCE_ACCEPT_EMPTY\fR, +\fRZIP_SOURCE_GET_FILE_ATTRIBUTES\fR, +and +\fRZIP_SOURCE_STAT\fR +can be issued at any time. +.PP +\fRZIP_SOURCE_ERROR\fR +will only be issued in response to the function +returning \-1. +.PP +\fRZIP_SOURCE_FREE\fR +will be the last command issued; +if +\fRZIP_SOURCE_OPEN\fR +was called and succeeded, +\fRZIP_SOURCE_CLOSE\fR +will be called before +\fRZIP_SOURCE_FREE\fR, +and similarly for +\fRZIP_SOURCE_BEGIN_WRITE\fR +or +\fRZIP_SOURCE_BEGIN_WRITE_CLONING\fR +and +\fRZIP_SOURCE_COMMIT_WRITE\fR +or +\fRZIP_SOURCE_ROLLBACK_WRITE\fR. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error (unless +it is +\fRNULL\fR). +.SH "ERRORS" +\fBzip_source_function\fR() +fails if: +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_attributes_init(3), +zip_file_replace(3), +zip_source(3), +zip_stat_init(3) +.SH "HISTORY" +\fBzip_source_function\fR() +and +\fBzip_source_function_create\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_function.mdoc b/deps/libzip/man/zip_source_function.mdoc new file mode 100644 index 00000000000000..3f85b61e917249 --- /dev/null +++ b/deps/libzip/man/zip_source_function.mdoc @@ -0,0 +1,409 @@ +.\" zip_source_function.mdoc -- create data source from function +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd June 28, 2022 +.Dt ZIP_SOURCE_FUNCTION 3 +.Os +.Sh NAME +.Nm zip_source_function , +.Nm zip_source_function_create +.Nd create data source from function +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_function "zip_t *archive" "zip_source_callback fn" "void *userdata" +.Ft zip_source_t * +.Fn zip_source_function_create "zip_source_callback fn" "void *userdata" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_function +and +.Fn zip_source_function_create +create a zip source from the user-provided function +.Ar fn , +which must be of the following type: +.Pp +.Ft typedef zip_int64_t +.Fo \fR(*\fPzip_source_callback\fR)\fP +.Fa "void *userdata" "void *data" "zip_uint64_t len" "zip_source_cmd_t cmd" +.Fc +.Pp +.Ar archive +or +.Ar error +are used for reporting errors and can be +.Dv NULL . +.Pp +When called by the library, the first argument is the +.Ar userdata +argument supplied to the function. +The next two arguments are a buffer +.Ar data +of size +.Ar len +when data is passed in or expected to be returned, or else +.Dv NULL +and 0. +The last argument, +.Ar cmd , +specifies which action the function should perform. +.Pp +Depending on the uses, there are three useful sets of commands to be supported by a +.Fn zip_source_callback : +.Bl -tag -width seekable-read-sourceXX +.It read source +Providing streamed data (for file data added to archives). +Must support +.Dv ZIP_SOURCE_OPEN , +.Dv ZIP_SOURCE_READ , +.Dv ZIP_SOURCE_CLOSE , +.Dv ZIP_SOURCE_STAT , +and +.Dv ZIP_SOURCE_ERROR . +.It seekable read source +Same as previous, but from a source allowing reading from arbitrary +offsets (also for read-only zip archive). +Must additionally support +.Dv ZIP_SOURCE_SEEK , +.Dv ZIP_SOURCE_TELL , +and +.Dv ZIP_SOURCE_SUPPORTS . +.It read/write source +Same as previous, but additionally allowing writing (also for writable +zip archives). +Must additionally support +.Dv ZIP_SOURCE_BEGIN_WRITE , +.Dv ZIP_SOURCE_COMMIT_WRITE , +.Dv ZIP_SOURCE_ROLLBACK_WRITE , +.Dv ZIP_SOURCE_SEEK_WRITE , +.Dv ZIP_SOURCE_TELL_WRITE , +and +.Dv ZIP_SOURCE_REMOVE . +.Pp +On top of the above, supporting the pseudo-command +.Dv ZIP_SOURCE_SUPPORTS_REOPEN +allows calling +.Fn zip_source_open +again after calling +.Fn zip_source_close . +.El +.Ss Dv ZIP_SOURCE_ACCEPT_EMPTY +Return 1 if an empty source should be accepted as a valid zip archive. +This is the default if this command is not supported by a source. +File system backed sources should return 0. +.Ss Dv ZIP_SOURCE_BEGIN_WRITE +Prepare the source for writing. +Use this to create any temporary file(s). +.Ss Dv ZIP_SOURCE_BEGIN_WRITE_CLONING +Prepare the source for writing, keeping the first +.Ar len +bytes of the original file. +Only implement this command if it is more efficient than copying the +data, and if it does not destructively overwrite the original file +(you still have to be able to execute +.Dv ZIP_SOURCE_ROLLBACK_WRITE ) . +.Pp +The next write should happen at byte +.Ar offset . +.Ss Dv ZIP_SOURCE_CLOSE +Reading is done. +.Ss Dv ZIP_SOURCE_COMMIT_WRITE +Finish writing to the source. +Replace the original data with the newly written data. +Clean up temporary files or internal buffers. +Subsequently opening and reading from the source should return the +newly written data. +.Ss Dv ZIP_SOURCE_ERROR +Get error information. +.Ar data +points to an array of two ints, which should be filled with the libzip +error code and the corresponding system error code for the error that +occurred. +See +.Xr zip_errors 3 +for details on the error codes. +If the source stores error information in a zip_error_t, use +.Xr zip_error_to_data 3 +and return its return value. +Otherwise, return 2 * sizeof(int). +.Ss Dv ZIP_SOURCE_FREE +Clean up and free all resources, including +.Ar userdata . +The callback function will not be called again. +.Ss Dv ZIP_SOURCE_GET_FILE_ATTRIBUTES +Provide information about various data. +Then the data should be put in the appropriate entry in the passed +.Vt zip_file_attributes_t +argument, and the appropriate +.Dv ZIP_FILE_ATTRIBUTES_* +value must be or'ed into the +.Ar valid +member to denote that the corresponding data has been provided. +A +.Vt zip_file_attributes_t +structure can be initialized using +.Xr zip_file_attributes_init 3 . +.Bl -tag -width 10n +.It ASCII mode +If a file is a plaintext file in ASCII. +Can be used by extraction tools to automatically convert line endings +(part of the internal file attributes). +Member +.Ar ascii , +flag +.Dv ZIP_FILE_ATTRIBUTES_ASCII . +.It General Purpose Bit Flags (limited to Compression Flags) +The general purpose bit flag in the zip in the local and central +directory headers contain information about the compression method. +Member +.Ar general_purpose_bit_flags +and +.Ar general_purpose_bit_mask +to denote which members have been set; +flag +.Dv ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS . +.It External File Attributes +The external file attributes (usually operating system-specific). +Member +.Ar external_file_attributes , +flag +.Dv ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES . +.It Version Needed +A minimum version needed required to unpack this entry (in the usual +"major * 10 + minor" format). +Member +.Ar version_needed , +flag +.Dv ZIP_FILE_ATTRIBUTES_VERSION_NEEDED . +.It Operating System +One of the operating systems as defined by the +.Dv ZIP_OPSYS_* +variables (see +.Pa zip.h ) . +This value affects the interpretation of the external file attributes. +Member +.Ar host_system , +flag +.Dv ZIP_FILE_ATTRIBUTES_HOST_SYSTEM . +.El +.Ss Dv ZIP_SOURCE_OPEN +Prepare for reading. +.Ss Dv ZIP_SOURCE_READ +Read data into the buffer +.Ar data +of size +.Ar len . +Return the number of bytes placed into +.Ar data +on success, and zero for end-of-file. +.Ss Dv ZIP_SOURCE_REMOVE +Remove the underlying file. +This is called if a zip archive is empty when closed. +.Ss Dv ZIP_SOURCE_ROLLBACK_WRITE +Abort writing to the source. +Discard written data. +Clean up temporary files or internal buffers. +Subsequently opening and reading from the source should return the +original data. +.Ss Dv ZIP_SOURCE_SEEK +Specify position to read next byte from, like +.Xr fseek 3 . +Use +.Xr ZIP_SOURCE_GET_ARGS 3 +to decode the arguments into the following struct: +.Bd -literal +struct zip_source_args_seek { + zip_int64_t offset; + int whence; +}; +.Ed +.Pp +If the size of the source's data is known, use +.Xr zip_source_seek_compute_offset 3 +to validate the arguments and compute the new offset. +.Ss Dv ZIP_SOURCE_SEEK_WRITE +Specify position to write next byte to, like +.Xr fseek 3 . +See +.Dv ZIP_SOURCE_SEEK +for details. +.Ss Dv ZIP_SOURCE_STAT +Get meta information for the input data. +.Ar data +points to an allocated +.Vt struct zip_stat , +which should be initialized using +.Xr zip_stat_init 3 +and then filled in. +.Pp +For uncompressed, unencrypted data, all information is optional. +However, fill in as much information as is readily available. +.Pp +If the data is compressed, +.Dv ZIP_STAT_COMP_METHOD , +.Dv ZIP_STAT_SIZE , +and +.Dv ZIP_STAT_CRC +must be filled in. +.Pp +If the data is encrypted, +.Dv ZIP_STAT_ENCRYPTION_METHOD , +.Dv ZIP_STAT_COMP_METHOD , +.Dv ZIP_STAT_SIZE , +and +.Dv ZIP_STAT_CRC +must be filled in. +.Pp +Information only available after the source has been read (e.g., size) +can be omitted in an earlier call. +.Em NOTE : +.Fn zip_source_function +may be called with this argument even after being called with +.Dv ZIP_SOURCE_CLOSE . +.Pp +Return sizeof(struct zip_stat) on success. +.Ss Dv ZIP_SOURCE_SUPPORTS +Return bitmap specifying which commands are supported. +Use +.Xr zip_source_make_command_bitmap 3 . +If this command is not implemented, the source is assumed to be a +read source without seek support. +.Ss Dv ZIP_SOURCE_TELL +Return the current read offset in the source, like +.Xr ftell 3 . +.Ss Dv ZIP_SOURCE_TELL_WRITE +Return the current write offset in the source, like +.Xr ftell 3 . +.Ss Dv ZIP_SOURCE_WRITE +Write data to the source. +Return number of bytes written. +.Ss Dv ZIP_SOURCE_SUPPORTS_REOPEN +This command is never actually invoked, support for it signals the +ability to handle multiple open/read/close cycles. +.Ss Return Values +Commands should return \-1 on error. +.Dv ZIP_SOURCE_ERROR +will be called to retrieve the error code. +On success, commands return 0, unless specified otherwise in the +description above. +.Ss Calling Conventions +The library will always issue +.Dv ZIP_SOURCE_OPEN +before issuing +.Dv ZIP_SOURCE_READ , +.Dv ZIP_SOURCE_SEEK , +or +.Dv ZIP_SOURCE_TELL . +When it no longer wishes to read from this source, it will issue +.Dv ZIP_SOURCE_CLOSE . +If the library wishes to read the data again, it will issue +.Dv ZIP_SOURCE_OPEN +a second time. +If the function is unable to provide the data again, it should +return \-1. +.Pp +.Dv ZIP_SOURCE_BEGIN_WRITE +or +.Dv ZIP_SOURCE_BEGIN_WRITE_CLONING +will be called before +.Dv ZIP_SOURCE_WRITE , +.Dv ZIP_SOURCE_SEEK_WRITE , +or +.Dv ZIP_SOURCE_TELL_WRITE . +When writing is complete, either +.Dv ZIP_SOURCE_COMMIT_WRITE +or +.Dv ZIP_SOURCE_ROLLBACK_WRITE +will be called. +.Pp +.Dv ZIP_SOURCE_ACCEPT_EMPTY , +.Dv ZIP_SOURCE_GET_FILE_ATTRIBUTES , +and +.Dv ZIP_SOURCE_STAT +can be issued at any time. +.Pp +.Dv ZIP_SOURCE_ERROR +will only be issued in response to the function +returning \-1. +.Pp +.Dv ZIP_SOURCE_FREE +will be the last command issued; +if +.Dv ZIP_SOURCE_OPEN +was called and succeeded, +.Dv ZIP_SOURCE_CLOSE +will be called before +.Dv ZIP_SOURCE_FREE , +and similarly for +.Dv ZIP_SOURCE_BEGIN_WRITE +or +.Dv ZIP_SOURCE_BEGIN_WRITE_CLONING +and +.Dv ZIP_SOURCE_COMMIT_WRITE +or +.Dv ZIP_SOURCE_ROLLBACK_WRITE . +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error (unless +it is +.Dv NULL ) . +.Sh ERRORS +.Fn zip_source_function +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_attributes_init 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 , +.Xr zip_stat_init 3 +.Sh HISTORY +.Fn zip_source_function +and +.Fn zip_source_function_create +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_is_deleted.html b/deps/libzip/man/zip_source_is_deleted.html new file mode 100644 index 00000000000000..14b806bfc5293e --- /dev/null +++ b/deps/libzip/man/zip_source_is_deleted.html @@ -0,0 +1,103 @@ + + + + + + + ZIP_SOURCE_IS_DELETED(3) + + + + + + + + +
ZIP_SOURCE_IS_DELETED(3)Library Functions ManualZIP_SOURCE_IS_DELETED(3)
+
+
+

+zip_source_is_deleted — +
check if zip_source is deleted
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_is_deleted(zip_source_t + *source);

+
+
+

+The function zip_source_is_deleted() returns whether the + zip_source was deleted. This can for example happen when all entries are + removed from a zip archive. +
+
+

+zip_source_is_deleted() returns 1 if the zip_source is + deleted and 0 otherwise. +
+
+

+libzip(3), + zip_source(3) +
+
+

+zip_source_is_deleted() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_is_deleted.man b/deps/libzip/man/zip_source_is_deleted.man new file mode 100644 index 00000000000000..0ee28ec3ab577f --- /dev/null +++ b/deps/libzip/man/zip_source_is_deleted.man @@ -0,0 +1,67 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_is_deleted.mdoc -- check if zip source is deleted +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_IS_DELETED" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_is_deleted\fR +\- check if zip_source is deleted +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_is_deleted\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_is_deleted\fR() +returns whether the zip_source was deleted. +This can for example happen when all entries are removed from a zip archive. +.SH "RETURN VALUES" +\fBzip_source_is_deleted\fR() +returns 1 if the zip_source is deleted and 0 otherwise. +.SH "SEE ALSO" +libzip(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_is_deleted\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_is_deleted.mdoc b/deps/libzip/man/zip_source_is_deleted.mdoc new file mode 100644 index 00000000000000..9bd309d9d7f4d7 --- /dev/null +++ b/deps/libzip/man/zip_source_is_deleted.mdoc @@ -0,0 +1,62 @@ +.\" zip_source_is_deleted.mdoc -- check if zip source is deleted +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_IS_DELETED 3 +.Os +.Sh NAME +.Nm zip_source_is_deleted +.Nd check if zip_source is deleted +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_is_deleted "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_is_deleted +returns whether the zip_source was deleted. +This can for example happen when all entries are removed from a zip archive. +.Sh RETURN VALUES +.Fn zip_source_is_deleted +returns 1 if the zip_source is deleted and 0 otherwise. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_is_deleted +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_keep.html b/deps/libzip/man/zip_source_keep.html new file mode 100644 index 00000000000000..0219d64a04e7f6 --- /dev/null +++ b/deps/libzip/man/zip_source_keep.html @@ -0,0 +1,97 @@ + + + + + + + ZIP_SOURCE_KEEP(3) + + + + + + + + +
ZIP_SOURCE_KEEP(3)Library Functions ManualZIP_SOURCE_KEEP(3)
+
+
+

+zip_source_keep — +
increment reference count of zip data source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_source_keep(zip_source_t + *source);

+
+
+

+The function zip_source_keep() increments the reference + count of source. +
+
+

+libzip(3), + zip_source(3), + zip_source_free(3) +
+
+

+zip_source_keep() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_keep.man b/deps/libzip/man/zip_source_keep.man new file mode 100644 index 00000000000000..78a2d395872246 --- /dev/null +++ b/deps/libzip/man/zip_source_keep.man @@ -0,0 +1,65 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_keep.mdoc -- increment reference count of zip data source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_KEEP" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_keep\fR +\- increment reference count of zip data source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_source_keep\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_keep\fR() +increments the reference count of +\fIsource\fR. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_free(3) +.SH "HISTORY" +\fBzip_source_keep\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_keep.mdoc b/deps/libzip/man/zip_source_keep.mdoc new file mode 100644 index 00000000000000..0984d6c527e59c --- /dev/null +++ b/deps/libzip/man/zip_source_keep.mdoc @@ -0,0 +1,60 @@ +.\" zip_source_keep.mdoc -- increment reference count of zip data source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_KEEP 3 +.Os +.Sh NAME +.Nm zip_source_keep +.Nd increment reference count of zip data source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_source_keep "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_keep +increments the reference count of +.Ar source . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_free 3 +.Sh HISTORY +.Fn zip_source_keep +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_layered.html b/deps/libzip/man/zip_source_layered.html new file mode 100644 index 00000000000000..554647a6105a8e --- /dev/null +++ b/deps/libzip/man/zip_source_layered.html @@ -0,0 +1,213 @@ + + + + + + + ZIP_SOURCE_LAYERED(3) + + + + + + + + +
ZIP_SOURCE_LAYERED(3)Library Functions ManualZIP_SOURCE_LAYERED(3)
+
+
+

+zip_source_layered, + zip_source_layered_create — +
create layered data source from function
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_layered(zip_t + *archive, zip_source_t + *source, + zip_source_layered_callback + fn, void + *userdata);

+

zip_source_t * +
+ zip_source_layered_create(zip_source_t + *source, + zip_source_layered_callback + fn, void *userdata, + zip_error_t *error);

+
+
+

+The functions zip_source_layered() and + zip_source_layered_create() create a layered zip + source from the user-provided function fn, which must be + of the following type: +

typedef zip_int64_t + (*p_source_layered_callback)(zip_source_t + *source, void *userdata, void + *data, zip_uint64_t length, + zip_source_cmd_t cmd);

+

archive or error are + used for reporting errors and can be NULL.

+

When called by the library, the first argument is the + source of the lower layer, the second argument is the + userdata argument supplied to the function. The next + two arguments are a buffer data of size + length when data is passed in or expected to be + returned, or else NULL and 0. The last argument, + cmd, specifies which action the function should + perform.

+

See + zip_source_function(3) for + a description of the commands.

+

A layered source transforms the data or metadata of the source + below in some way. Layered sources can't support writing and are not + sufficient to cleanly add support for additional compression or encryption + methods. This may be revised in a later release of libzip.

+

The interaction with the lower layer depends on the command:

+
+

ZIP_SOURCE_ACCEPT_EMPTY

+If the layered source supports this command, the lower layer is not called + automatically. Otherwise, the return value of the lower source is used. +
+
+

ZIP_SOURCE_CLOSE

+The lower layer is closed after the callback returns. +
+
+

ZIP_SOURCE_ERROR

+The lower layer is not called automatically. If you need to retrieve error + information from the lower layer, use + zip_error_set_from_source(3) + or + zip_source_pass_to_lower_layer(3). +
+
+

ZIP_SOURCE_FREE

+The lower layer is freed after the callback returns. +
+
+

ZIP_SOURCE_GET_FILE_ATTRIBUTES

+The attributes of the lower layer are merged with the attributes returned by the + callback: information set by the callback wins over the lower layer, with the + following exceptions: the higher version_needed is used, + and general_purpose_bit_flags are only overwritten if + the corresponding bit is set in + general_purpose_bit_mask. +
+
+

ZIP_SOURCE_OPEN

+The lower layer is opened before the callback is called. +
+
+

ZIP_SOURCE_READ

+The lower layer is not called automatically. +
+
+

ZIP_SOURCE_SEEK

+The lower layer is not called automatically. +
+
+

ZIP_SOURCE_STAT

+data contains the stat information from the lower layer + when the callback is called. +
+
+

ZIP_SOURCE_SUPPORTS

+data contains the bitmap of commands supported by the + lower layer when the callback is called. Since layered sources can't support + writing, all commands related to writing are stripped from the returned + support bitmap. +
+
+

ZIP_SOURCE_TELL

+The lower layer is not called automatically. +
+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error (unless it is NULL). +
+
+

+zip_source_layered() fails if: +
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_attributes_init(3), + zip_file_replace(3), + zip_source(3), + zip_source_function(3), + zip_source_pass_to_lower_layer(3) +
+
+

+zip_source_layered() and + zip_source_layered_create() were added in libzip 1.10. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 5, 2022NiH
+ + diff --git a/deps/libzip/man/zip_source_layered.man b/deps/libzip/man/zip_source_layered.man new file mode 100644 index 00000000000000..00b737660920c9 --- /dev/null +++ b/deps/libzip/man/zip_source_layered.man @@ -0,0 +1,169 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_layered.mdoc -- create layered source from function +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_LAYERED" "3" "December 5, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_layered\fR, +\fBzip_source_layered_create\fR +\- create layered data source from function +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_layered\fR(\fIzip_t\ *archive\fR, \fIzip_source_t\ *source\fR, \fIzip_source_layered_callback\ fn\fR, \fIvoid\ *userdata\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_layered_create\fR(\fIzip_source_t\ *source\fR, \fIzip_source_layered_callback\ fn\fR, \fIvoid\ *userdata\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_layered\fR() +and +\fBzip_source_layered_create\fR() +create a layered zip source from the user-provided function +\fIfn\fR, +which must be of the following type: +.PP +\fItypedef zip_int64_t\fR +\fB\fR(*\zip_source_layered_callback\fR)\fP\fR(\fIzip_source_t\ *source\fR, \fIvoid\ *userdata\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ length\fR, \fIzip_source_cmd_t\ cmd\fR) +.PP +\fIarchive\fR +or +\fIerror\fR +are used for reporting errors and can be +\fRNULL\fR. +.PP +When called by the library, the first argument is the +\fIsource\fR +of the lower layer, the second argument is the +\fIuserdata\fR +argument supplied to the function. +The next two arguments are a buffer +\fIdata\fR +of size +\fIlength\fR +when data is passed in or expected to be returned, or else +\fRNULL\fR +and 0. +The last argument, +\fIcmd\fR, +specifies which action the function should perform. +.PP +See +zip_source_function(3) +for a description of the commands. +.PP +A layered source transforms the data or metadata of the source below in some way. +Layered sources can't support writing and are not sufficient to cleanly add support for additional compression or encryption methods. +This may be revised in a later release of libzip. +.PP +The interaction with the lower layer depends on the command: +.SS "\fRZIP_SOURCE_ACCEPT_EMPTY\fR" +If the layered source supports this command, the lower layer is not called automatically. +Otherwise, the return value of the lower source is used. +.SS "\fRZIP_SOURCE_CLOSE\fR" +The lower layer is closed after the callback returns. +.SS "\fRZIP_SOURCE_ERROR\fR" +The lower layer is not called automatically. +If you need to retrieve error information from the lower layer, use +zip_error_set_from_source(3) +or +zip_source_pass_to_lower_layer(3). +.SS "\fRZIP_SOURCE_FREE\fR" +The lower layer is freed after the callback returns. +.SS "\fRZIP_SOURCE_GET_FILE_ATTRIBUTES\fR" +The attributes of the lower layer are merged with the attributes returned by the callback: information set by the callback wins over the lower layer, with the following exceptions: the higher +\fIversion_needed\fR +is used, and +\fIgeneral_purpose_bit_flags\fR +are only overwritten if the corresponding bit is set in +\fIgeneral_purpose_bit_mask\fR. +.SS "\fRZIP_SOURCE_OPEN\fR" +The lower layer is opened before the callback is called. +.SS "\fRZIP_SOURCE_READ\fR" +The lower layer is not called automatically. +.SS "\fRZIP_SOURCE_SEEK\fR" +The lower layer is not called automatically. +.SS "\fRZIP_SOURCE_STAT\fR" +\fIdata\fR +contains the stat information from the lower layer when the callback is called. +.SS "\fRZIP_SOURCE_SUPPORTS\fR" +\fIdata\fR +contains the bitmap of commands supported by the lower layer when the callback is called. +Since layered sources can't support writing, all commands related to writing are stripped from the returned support bitmap. +.SS "\fRZIP_SOURCE_TELL\fR" +The lower layer is not called automatically. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error (unless +it is +\fRNULL\fR). +.SH "ERRORS" +\fBzip_source_layered\fR() +fails if: +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_attributes_init(3), +zip_file_replace(3), +zip_source(3), +zip_source_function(3), +zip_source_pass_to_lower_layer(3) +.SH "HISTORY" +\fBzip_source_layered\fR() +and +\fBzip_source_layered_create\fR() +were added in libzip 1.10. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_layered.mdoc b/deps/libzip/man/zip_source_layered.mdoc new file mode 100644 index 00000000000000..521c5dcc4ce056 --- /dev/null +++ b/deps/libzip/man/zip_source_layered.mdoc @@ -0,0 +1,163 @@ +.\" zip_source_layered.mdoc -- create layered source from function +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt ZIP_SOURCE_LAYERED 3 +.Os +.Sh NAME +.Nm zip_source_layered , +.Nm zip_source_layered_create +.Nd create layered data source from function +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_layered "zip_t *archive" "zip_source_t *source" "zip_source_layered_callback fn" "void *userdata" +.Ft zip_source_t * +.Fn zip_source_layered_create "zip_source_t *source" "zip_source_layered_callback fn" "void *userdata" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_layered +and +.Fn zip_source_layered_create +create a layered zip source from the user-provided function +.Ar fn , +which must be of the following type: +.Pp +.Ft typedef zip_int64_t +.Fo \fR(*\zip_source_layered_callback\fR)\fP +.Fa "zip_source_t *source" "void *userdata" "void *data" "zip_uint64_t length" "zip_source_cmd_t cmd" +.Fc +.Pp +.Ar archive +or +.Ar error +are used for reporting errors and can be +.Dv NULL . +.Pp +When called by the library, the first argument is the +.Ar source +of the lower layer, the second argument is the +.Ar userdata +argument supplied to the function. +The next two arguments are a buffer +.Ar data +of size +.Ar length +when data is passed in or expected to be returned, or else +.Dv NULL +and 0. +The last argument, +.Ar cmd , +specifies which action the function should perform. +.Pp +See +.Xr zip_source_function 3 +for a description of the commands. +.Pp +A layered source transforms the data or metadata of the source below in some way. +Layered sources can't support writing and are not sufficient to cleanly add support for additional compression or encryption methods. +This may be revised in a later release of libzip. +.Pp +The interaction with the lower layer depends on the command: +.El +.Ss Dv ZIP_SOURCE_ACCEPT_EMPTY +If the layered source supports this command, the lower layer is not called automatically. +Otherwise, the return value of the lower source is used. +.Ss Dv ZIP_SOURCE_CLOSE +The lower layer is closed after the callback returns. +.Ss Dv ZIP_SOURCE_ERROR +The lower layer is not called automatically. +If you need to retrieve error information from the lower layer, use +.Xr zip_error_set_from_source 3 +or +.Xr zip_source_pass_to_lower_layer 3 . +.Ss Dv ZIP_SOURCE_FREE +The lower layer is freed after the callback returns. +.Ss Dv ZIP_SOURCE_GET_FILE_ATTRIBUTES +The attributes of the lower layer are merged with the attributes returned by the callback: information set by the callback wins over the lower layer, with the following exceptions: the higher +.Ar version_needed +is used, and +.Ar general_purpose_bit_flags +are only overwritten if the corresponding bit is set in +.Ar general_purpose_bit_mask . +.Ss Dv ZIP_SOURCE_OPEN +The lower layer is opened before the callback is called. +.Ss Dv ZIP_SOURCE_READ +The lower layer is not called automatically. +.Ss Dv ZIP_SOURCE_SEEK +The lower layer is not called automatically. +.Ss Dv ZIP_SOURCE_STAT +.Ar data +contains the stat information from the lower layer when the callback is called. +.Ss Dv ZIP_SOURCE_SUPPORTS +.Ar data +contains the bitmap of commands supported by the lower layer when the callback is called. +Since layered sources can't support writing, all commands related to writing are stripped from the returned support bitmap. +.Ss Dv ZIP_SOURCE_TELL +The lower layer is not called automatically. +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error (unless +it is +.Dv NULL ) . +.Sh ERRORS +.Fn zip_source_layered +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_attributes_init 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 , +.Xr zip_source_function 3 , +.Xr zip_source_pass_to_lower_layer 3 +.Sh HISTORY +.Fn zip_source_layered +and +.Fn zip_source_layered_create +were added in libzip 1.10. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_make_command_bitmap.html b/deps/libzip/man/zip_source_make_command_bitmap.html new file mode 100644 index 00000000000000..28c3ad82584cd7 --- /dev/null +++ b/deps/libzip/man/zip_source_make_command_bitmap.html @@ -0,0 +1,99 @@ + + + + + + + ZIP_SOURCE_MAKE_COMMAND_BITMAP(3) + + + + + + + + +
ZIP_SOURCE_MAKE_COMMAND_BITMAP(3)Library Functions ManualZIP_SOURCE_MAKE_COMMAND_BITMAP(3)
+
+
+

+zip_source_make_command_bitmap — +
create bitmap of supported source operations
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_source_make_command_bitmap(zip_source_cmd_t + command, ...);

+
+
+

+The zip_source_make_command_bitmap() function returns a + bitmap of source commands suitable as return value for + ZIP_SOURCE_SUPPORTS. It includes all the commands from + the argument list, which must be terminated by -1. +
+
+

+libzip(3), + zip_source_function(3) +
+
+

+zip_source_make_command_bitmap() was added in libzip + 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_make_command_bitmap.man b/deps/libzip/man/zip_source_make_command_bitmap.man new file mode 100644 index 00000000000000..6cba12f4248b71 --- /dev/null +++ b/deps/libzip/man/zip_source_make_command_bitmap.man @@ -0,0 +1,67 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_make_command_bitmap -- create bitmap of supported source operations +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_MAKE_COMMAND_BITMAP" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_make_command_bitmap\fR +\- create bitmap of supported source operations +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_source_make_command_bitmap\fR(\fIzip_source_cmd_t\ command\fR, \fI...\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_source_make_command_bitmap\fR() +function returns a bitmap of source commands suitable as return value +for +\fRZIP_SOURCE_SUPPORTS\fR. +It includes all the commands from the argument list, which must be +terminated by \-1. +.SH "SEE ALSO" +libzip(3), +zip_source_function(3) +.SH "HISTORY" +\fBzip_source_make_command_bitmap\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_make_command_bitmap.mdoc b/deps/libzip/man/zip_source_make_command_bitmap.mdoc new file mode 100644 index 00000000000000..2b327e14d3a62c --- /dev/null +++ b/deps/libzip/man/zip_source_make_command_bitmap.mdoc @@ -0,0 +1,62 @@ +.\" zip_source_make_command_bitmap -- create bitmap of supported source operations +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_MAKE_COMMAND_BITMAP 3 +.Os +.Sh NAME +.Nm zip_source_make_command_bitmap +.Nd create bitmap of supported source operations +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_make_command_bitmap "zip_source_cmd_t command" "..." +.Sh DESCRIPTION +The +.Fn zip_source_make_command_bitmap +function returns a bitmap of source commands suitable as return value +for +.Dv ZIP_SOURCE_SUPPORTS . +It includes all the commands from the argument list, which must be +terminated by \-1. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source_function 3 +.Sh HISTORY +.Fn zip_source_make_command_bitmap +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_open.html b/deps/libzip/man/zip_source_open.html new file mode 100644 index 00000000000000..443d9fb595b4c1 --- /dev/null +++ b/deps/libzip/man/zip_source_open.html @@ -0,0 +1,108 @@ + + + + + + + ZIP_SOURCE_OPEN(3) + + + + + + + + +
ZIP_SOURCE_OPEN(3)Library Functions ManualZIP_SOURCE_OPEN(3)
+
+
+

+zip_source_open — +
open zip_source for reading
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_open(zip_source_t + *source);

+
+
+

+The function zip_source_open() opens + source for reading. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3), + zip_source_begin_write(3), + zip_source_close(3), + zip_source_read(3), + zip_source_seek(3), + zip_source_tell(3) +
+
+

+zip_source_open() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_open.man b/deps/libzip/man/zip_source_open.man new file mode 100644 index 00000000000000..2bf19207d5ad02 --- /dev/null +++ b/deps/libzip/man/zip_source_open.man @@ -0,0 +1,75 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_open.mdoc -- open zip source for reading +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_OPEN" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_open\fR +\- open zip_source for reading +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_open\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_open\fR() +opens +\fIsource\fR +for reading. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_begin_write(3), +zip_source_close(3), +zip_source_read(3), +zip_source_seek(3), +zip_source_tell(3) +.SH "HISTORY" +\fBzip_source_open\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_open.mdoc b/deps/libzip/man/zip_source_open.mdoc new file mode 100644 index 00000000000000..521ba8808d048b --- /dev/null +++ b/deps/libzip/man/zip_source_open.mdoc @@ -0,0 +1,70 @@ +.\" zip_source_open.mdoc -- open zip source for reading +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_OPEN 3 +.Os +.Sh NAME +.Nm zip_source_open +.Nd open zip_source for reading +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_open "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_open +opens +.Fa source +for reading. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_begin_write 3 , +.Xr zip_source_close 3 , +.Xr zip_source_read 3 , +.Xr zip_source_seek 3 , +.Xr zip_source_tell 3 +.Sh HISTORY +.Fn zip_source_open +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_pass_to_lower_layer.mdoc b/deps/libzip/man/zip_source_pass_to_lower_layer.mdoc new file mode 100644 index 00000000000000..aaafc236ffad86 --- /dev/null +++ b/deps/libzip/man/zip_source_pass_to_lower_layer.mdoc @@ -0,0 +1,64 @@ +.\" zip_source_pass_to_lower_layer.mdoc -- pass command to lower layer +.\" Copyright (C) 2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt ZIP_SOURCE_PASS_TO_LOWER_LAYER 3 +.Os +.Sh NAME +.Nm zip_source_pass_to_lower_layer +.Nd pass command to lower layer +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_pass_to_lower_layer "zip_source_t *source" "void *data" "zip_uint64_t length" "zip_source_cmd_t command" +.Sh DESCRIPTION +The functions +.Fn zip_source_pass_to_lower_layer +is used in a layered source callback to pass commands for which you don't want to change the result to the lower layer. +You can use it in the +.Dv default +case of the callback. +.Sh RETURN VALUES +The return value is meant to be returned by the callback. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_layered 3 +.Sh HISTORY +.Fn zip_source_pass_to_lower_layer +was added in libzip 1.10. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_read.html b/deps/libzip/man/zip_source_read.html new file mode 100644 index 00000000000000..0fbde0ad101965 --- /dev/null +++ b/deps/libzip/man/zip_source_read.html @@ -0,0 +1,113 @@ + + + + + + + ZIP_SOURCE_READ(3) + + + + + + + + +
ZIP_SOURCE_READ(3)Library Functions ManualZIP_SOURCE_READ(3)
+
+
+

+zip_source_read — +
read data from zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_source_read(zip_source_t + *source, void + *data, zip_uint64_t + len);

+
+
+

+The function zip_source_read() reads up to + len bytes of data from source at + the current read offset into the buffer data. +

The zip source source has to be opened for + reading by calling + zip_source_open(3) first.

+
+
+

+Upon successful completion the number of bytes read is returned. When + zip_source_read() is called after reaching the end of + the file, 0 is returned. Otherwise, -1 is returned and the error information + in source is set to indicate the error. +
+
+

+libzip(3), + zip_source(3), + zip_source_seek(3), + zip_source_tell(3), + zip_source_write(3) +
+
+

+zip_source_read() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
September 28, 2021NiH
+ + diff --git a/deps/libzip/man/zip_source_read.man b/deps/libzip/man/zip_source_read.man new file mode 100644 index 00000000000000..c9f77b745acedf --- /dev/null +++ b/deps/libzip/man/zip_source_read.man @@ -0,0 +1,85 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_read.mdoc -- read data from zip source +.\" Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_READ" "3" "September 28, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_read\fR +\- read data from zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_source_read\fR(\fIzip_source_t\ *source\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ len\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_read\fR() +reads up to +\fIlen\fR +bytes of data from +\fIsource\fR +at the current read offset into the buffer +\fIdata\fR. +.PP +The zip source +\fIsource\fR +has to be opened for reading by calling +zip_source_open(3) +first. +.SH "RETURN VALUES" +Upon successful completion the number of bytes read is returned. +When +\fBzip_source_read\fR() +is called after reaching the end of the file, 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_seek(3), +zip_source_tell(3), +zip_source_write(3) +.SH "HISTORY" +\fBzip_source_read\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_read.mdoc b/deps/libzip/man/zip_source_read.mdoc new file mode 100644 index 00000000000000..348984169e80b6 --- /dev/null +++ b/deps/libzip/man/zip_source_read.mdoc @@ -0,0 +1,80 @@ +.\" zip_source_read.mdoc -- read data from zip source +.\" Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd September 28, 2021 +.Dt ZIP_SOURCE_READ 3 +.Os +.Sh NAME +.Nm zip_source_read +.Nd read data from zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_read "zip_source_t *source" "void *data" "zip_uint64_t len" +.Sh DESCRIPTION +The function +.Fn zip_source_read +reads up to +.Ar len +bytes of data from +.Ar source +at the current read offset into the buffer +.Ar data . +.Pp +The zip source +.Ar source +has to be opened for reading by calling +.Xr zip_source_open 3 +first. +.Sh RETURN VALUES +Upon successful completion the number of bytes read is returned. +When +.Fn zip_source_read +is called after reaching the end of the file, 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_seek 3 , +.Xr zip_source_tell 3 , +.Xr zip_source_write 3 +.Sh HISTORY +.Fn zip_source_read +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_rollback_write.html b/deps/libzip/man/zip_source_rollback_write.html new file mode 100644 index 00000000000000..b21bc4f06abc66 --- /dev/null +++ b/deps/libzip/man/zip_source_rollback_write.html @@ -0,0 +1,103 @@ + + + + + + + ZIP_SOURCE_ROLLBACK_WRITE(3) + + + + + + + + +
ZIP_SOURCE_ROLLBACK_WRITE(3)Library Functions ManualZIP_SOURCE_ROLLBACK_WRITE(3)
+
+
+

+zip_source_rollback_write — +
undo changes to zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_source_rollback_write(zip_source_t + *source);

+
+
+

+The function zip_source_rollback_write() reverts changes + written to source, restoring the data before + zip_source_begin_write(3) + was called. Usually this removes temporary files or frees buffers. +
+
+

+libzip(3), + zip_source(3), + zip_source_begin_write(3), + zip_source_commit_write(3), + zip_source_seek_write(3), + zip_source_tell_write(3), + zip_source_write(3) +
+
+

+zip_source_rollback_write() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
November 3, 2021NiH
+ + diff --git a/deps/libzip/man/zip_source_rollback_write.man b/deps/libzip/man/zip_source_rollback_write.man new file mode 100644 index 00000000000000..ab330bc93cec4a --- /dev/null +++ b/deps/libzip/man/zip_source_rollback_write.man @@ -0,0 +1,73 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_rollback_write.mdoc -- undo changes to zip source +.\" Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_ROLLBACK_WRITE" "3" "November 3, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_rollback_write\fR +\- undo changes to zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_source_rollback_write\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_rollback_write\fR() +reverts changes written to +\fIsource\fR, +restoring the data before +zip_source_begin_write(3) +was called. +Usually this removes temporary files or frees buffers. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_begin_write(3), +zip_source_commit_write(3), +zip_source_seek_write(3), +zip_source_tell_write(3), +zip_source_write(3) +.SH "HISTORY" +\fBzip_source_rollback_write\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_rollback_write.mdoc b/deps/libzip/man/zip_source_rollback_write.mdoc new file mode 100644 index 00000000000000..1e8b6e11d444d6 --- /dev/null +++ b/deps/libzip/man/zip_source_rollback_write.mdoc @@ -0,0 +1,68 @@ +.\" zip_source_rollback_write.mdoc -- undo changes to zip source +.\" Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd November 3, 2021 +.Dt ZIP_SOURCE_ROLLBACK_WRITE 3 +.Os +.Sh NAME +.Nm zip_source_rollback_write +.Nd undo changes to zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_source_rollback_write "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_rollback_write +reverts changes written to +.Fa source , +restoring the data before +.Xr zip_source_begin_write 3 +was called. +Usually this removes temporary files or frees buffers. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_begin_write 3 , +.Xr zip_source_commit_write 3 , +.Xr zip_source_seek_write 3 , +.Xr zip_source_tell_write 3 , +.Xr zip_source_write 3 +.Sh HISTORY +.Fn zip_source_rollback_write +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_seek.html b/deps/libzip/man/zip_source_seek.html new file mode 100644 index 00000000000000..e7cd3a9b11d4cb --- /dev/null +++ b/deps/libzip/man/zip_source_seek.html @@ -0,0 +1,120 @@ + + + + + + + ZIP_SOURCE_SEEK(3) + + + + + + + + +
ZIP_SOURCE_SEEK(3)Library Functions ManualZIP_SOURCE_SEEK(3)
+
+
+

+zip_source_seek — +
set read offset in zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_seek(zip_source_t + *source, zip_int64_t + offset, int + whence);

+
+
+

+The function zip_source_seek() sets the current read + offset for source. Just like in + fseek(3), depending on the + whence argument, the offset is + counted relative from: +
+
+
+
start of file
+
+
current read offset in file
+
+
end of file
+
+
+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3), + zip_source_read(3), + zip_source_tell(3) +
+
+

+zip_source_seek() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_seek.man b/deps/libzip/man/zip_source_seek.man new file mode 100644 index 00000000000000..1d5673d53bc062 --- /dev/null +++ b/deps/libzip/man/zip_source_seek.man @@ -0,0 +1,89 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_seek.mdoc -- set read offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_SEEK" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_seek\fR +\- set read offset in zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_seek\fR(\fIzip_source_t\ *source\fR, \fIzip_int64_t\ offset\fR, \fIint\ whence\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_seek\fR() +sets the current read offset for +\fIsource\fR. +Just like in +fseek(3), +depending on the +\fIwhence\fR +argument, the +\fIoffset\fR +is counted relative from: +.RS 6n +.TP 12n +\fRSEEK_SET\fR +start of file +.TP 12n +\fRSEEK_CUR\fR +current read offset in file +.TP 12n +\fRSEEK_END\fR +end of file +.RE +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_read(3), +zip_source_tell(3) +.SH "HISTORY" +\fBzip_source_seek\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_seek.mdoc b/deps/libzip/man/zip_source_seek.mdoc new file mode 100644 index 00000000000000..8cf3ada967505b --- /dev/null +++ b/deps/libzip/man/zip_source_seek.mdoc @@ -0,0 +1,81 @@ +.\" zip_source_seek.mdoc -- set read offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_SEEK 3 +.Os +.Sh NAME +.Nm zip_source_seek +.Nd set read offset in zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_seek "zip_source_t *source" "zip_int64_t offset" "int whence" +.Sh DESCRIPTION +The function +.Fn zip_source_seek +sets the current read offset for +.Fa source . +Just like in +.Xr fseek 3 , +depending on the +.Ar whence +argument, the +.Ar offset +is counted relative from: +.Bl -tag -width SEEK_CURXX -offset indent +.It Dv SEEK_SET +start of file +.It Dv SEEK_CUR +current read offset in file +.It Dv SEEK_END +end of file +.El +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_read 3 , +.Xr zip_source_tell 3 +.Sh HISTORY +.Fn zip_source_seek +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_seek_compute_offset.html b/deps/libzip/man/zip_source_seek_compute_offset.html new file mode 100644 index 00000000000000..fdc4f76ceaad38 --- /dev/null +++ b/deps/libzip/man/zip_source_seek_compute_offset.html @@ -0,0 +1,119 @@ + + + + + + + ZIP_SOURCE_SEEK_COMPUTE_OFFSET(3) + + + + + + + + +
ZIP_SOURCE_SEEK_COMPUTE_OFFSET(3)Library Functions ManualZIP_SOURCE_SEEK_COMPUTE_OFFSET(3)
+
+
+

+zip_source_seek_compute_offset — +
validate arguments and compute offset
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_source_seek_compute_offset(zip_uint64_t + offset, zip_uint64_t + length, void *data, + zip_uint64_t data_length, + zip_error_t *error);

+
+
+

+Use this function to compute the offset for a + ZIP_SOURCE_SEEK or + ZIP_SOURCE_SEEK_WRITE command. + data and data_length are the + arguments to the source callback, offset is the current + offset and length is the length of the source data or, + for ZIP_SOURCE_SEEK_WRITE, the amount of data written. +
+
+

+On success, it returns the new offset, on error it returns -1 and sets + error. +
+
+

+zip_source_seek_compute_offset() fails if: +
+
[]
+
One of the arguments is invalid or the seek would place the offset outside + the data.
+
+
+
+

+zip_source_function(3) +
+
+

+zip_source_seek_compute_offset() was added in libzip + 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_seek_compute_offset.man b/deps/libzip/man/zip_source_seek_compute_offset.man new file mode 100644 index 00000000000000..bbaeac14626344 --- /dev/null +++ b/deps/libzip/man/zip_source_seek_compute_offset.man @@ -0,0 +1,85 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_seek_compute_offset.mdoc - validate arguments and compute offset +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_SEEK_COMPUTE_OFFSET" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_seek_compute_offset\fR +\- validate arguments and compute offset +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_source_seek_compute_offset\fR(\fIzip_uint64_t\ offset\fR, \fIzip_uint64_t\ length\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ data_length\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +Use this function to compute the offset for a +\fRZIP_SOURCE_SEEK\fR +or +\fRZIP_SOURCE_SEEK_WRITE\fR +command. +\fIdata\fR +and +\fIdata_length\fR +are the arguments to the source callback, +\fIoffset\fR +is the current offset and +\fIlength\fR +is the length of the source data or, for +\fRZIP_SOURCE_SEEK_WRITE\fR, +the amount of data written. +.SH "RETURN VALUES" +On success, it returns the new offset, on error it returns \-1 and +sets +\fIerror\fR. +.SH "ERRORS" +\fBzip_source_seek_compute_offset\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +One of the arguments is invalid or the seek would place the offset +outside the data. +.SH "SEE ALSO" +zip_source_function(3) +.SH "HISTORY" +\fBzip_source_seek_compute_offset\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_seek_compute_offset.mdoc b/deps/libzip/man/zip_source_seek_compute_offset.mdoc new file mode 100644 index 00000000000000..c3701a5870a844 --- /dev/null +++ b/deps/libzip/man/zip_source_seek_compute_offset.mdoc @@ -0,0 +1,81 @@ +.\" zip_source_seek_compute_offset.mdoc - validate arguments and compute offset +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_SEEK_COMPUTE_OFFSET 3 +.Os +.Sh NAME +.Nm zip_source_seek_compute_offset +.Nd validate arguments and compute offset +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_seek_compute_offset "zip_uint64_t offset" "zip_uint64_t length" "void *data" "zip_uint64_t data_length" "zip_error_t *error" +.Sh DESCRIPTION +Use this function to compute the offset for a +.Dv ZIP_SOURCE_SEEK +or +.Dv ZIP_SOURCE_SEEK_WRITE +command. +.Ar data +and +.Ar data_length +are the arguments to the source callback, +.Ar offset +is the current offset and +.Ar length +is the length of the source data or, for +.Dv ZIP_SOURCE_SEEK_WRITE , +the amount of data written. +.Sh RETURN VALUES +On success, it returns the new offset, on error it returns \-1 and +sets +.Ar error . +.Sh ERRORS +.Fn zip_source_seek_compute_offset +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +One of the arguments is invalid or the seek would place the offset +outside the data. +.El +.Sh SEE ALSO +.Xr zip_source_function 3 +.Sh HISTORY +.Fn zip_source_seek_compute_offset +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_seek_write.html b/deps/libzip/man/zip_source_seek_write.html new file mode 100644 index 00000000000000..76e18f1d7b6b85 --- /dev/null +++ b/deps/libzip/man/zip_source_seek_write.html @@ -0,0 +1,123 @@ + + + + + + + ZIP_SOURCE_SEEK_WRITE(3) + + + + + + + + +
ZIP_SOURCE_SEEK_WRITE(3)Library Functions ManualZIP_SOURCE_SEEK_WRITE(3)
+
+
+

+zip_source_seek_write — +
set write offset in zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_seek_write(zip_source_t + *source, zip_int64_t + offset, int + whence);

+
+
+

+The function zip_source_seek_write() sets the current + write offset for source. Just like in + fseek(3), depending on the + whence argument, the offset is + counted relative from: +
+
+
+
start of file
+
+
current write offset in file
+
+
end of file
+
+
+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3), + zip_source_begin_write(3), + zip_source_commit_write(3), + zip_source_rollback_write(3), + zip_source_tell_write(3), + zip_source_write(3) +
+
+

+zip_source_seek_write() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_seek_write.man b/deps/libzip/man/zip_source_seek_write.man new file mode 100644 index 00000000000000..bf6a2bc3477697 --- /dev/null +++ b/deps/libzip/man/zip_source_seek_write.man @@ -0,0 +1,92 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_seek_write.mdoc -- set write offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_SEEK_WRITE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_seek_write\fR +\- set write offset in zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_seek_write\fR(\fIzip_source_t\ *source\fR, \fIzip_int64_t\ offset\fR, \fIint\ whence\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_seek_write\fR() +sets the current write offset for +\fIsource\fR. +Just like in +fseek(3), +depending on the +\fIwhence\fR +argument, the +\fIoffset\fR +is counted relative from: +.RS 6n +.TP 12n +\fRSEEK_SET\fR +start of file +.TP 12n +\fRSEEK_CUR\fR +current write offset in file +.TP 12n +\fRSEEK_END\fR +end of file +.RE +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_begin_write(3), +zip_source_commit_write(3), +zip_source_rollback_write(3), +zip_source_tell_write(3), +zip_source_write(3) +.SH "HISTORY" +\fBzip_source_seek_write\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_seek_write.mdoc b/deps/libzip/man/zip_source_seek_write.mdoc new file mode 100644 index 00000000000000..583c1cac10cf75 --- /dev/null +++ b/deps/libzip/man/zip_source_seek_write.mdoc @@ -0,0 +1,84 @@ +.\" zip_source_seek_write.mdoc -- set write offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_SEEK_WRITE 3 +.Os +.Sh NAME +.Nm zip_source_seek_write +.Nd set write offset in zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_seek_write "zip_source_t *source" "zip_int64_t offset" "int whence" +.Sh DESCRIPTION +The function +.Fn zip_source_seek_write +sets the current write offset for +.Fa source . +Just like in +.Xr fseek 3 , +depending on the +.Ar whence +argument, the +.Ar offset +is counted relative from: +.Bl -tag -width SEEK_CURXX -offset indent +.It Dv SEEK_SET +start of file +.It Dv SEEK_CUR +current write offset in file +.It Dv SEEK_END +end of file +.El +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_begin_write 3 , +.Xr zip_source_commit_write 3 , +.Xr zip_source_rollback_write 3 , +.Xr zip_source_tell_write 3 , +.Xr zip_source_write 3 +.Sh HISTORY +.Fn zip_source_seek_write +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_stat.html b/deps/libzip/man/zip_source_stat.html new file mode 100644 index 00000000000000..c7b59b32b0d8bb --- /dev/null +++ b/deps/libzip/man/zip_source_stat.html @@ -0,0 +1,154 @@ + + + + + + + ZIP_SOURCE_STAT(3) + + + + + + + + +
ZIP_SOURCE_STAT(3)Library Functions ManualZIP_SOURCE_STAT(3)
+
+
+

+zip_source_stat — +
get information about zip_source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_stat(zip_source_t + *source, zip_stat_t + *sb);

+
+
+

+The zip_source_stat() function obtains information about + the zip source source +

The sb argument is a pointer to a + struct zip_source_stat (shown below), into which + information about the zip source is placed.

+
+
+struct zip_source_stat {
+    zip_uint64_t valid;                 /* which fields have valid values */
+    const char *name;                   /* name of the file */
+    zip_uint64_t index;                 /* index within archive */
+    zip_uint64_t size;                  /* size of file (uncompressed) */
+    zip_uint64_t comp_size;             /* size of file (compressed) */
+    time_t mtime;                       /* modification time */
+    zip_uint32_t crc;                   /* crc of file data */
+    zip_uint16_t comp_method;           /* compression method used */
+    zip_uint16_t encryption_method;     /* encryption method used */
+    zip_uint32_t flags;                 /* reserved for future use */
+};
+
+
+The structure pointed to by sb must be initialized with + zip_stat_init(3) before calling + zip_source_stat(). +

The valid field of the structure specifies + which other fields are valid. Check if the flag defined by the following + defines are in valid before accessing the fields:

+
+
+
+
name
+
+
index
+
+
size
+
+
comp_size
+
+
mtime
+
+
crc
+
+
comp_method
+
+
encryption_method
+
+
flags
+
+
+

NOTE: Some fields may only be filled out after + all data has been read from the source, for example the + crc or size fields.

+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in source is set to indicate the + error. +
+
+

+libzip(3), + zip_source(3) +
+
+

+zip_source_stat() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_stat.man b/deps/libzip/man/zip_source_stat.man new file mode 100644 index 00000000000000..0ba49a062a440b --- /dev/null +++ b/deps/libzip/man/zip_source_stat.man @@ -0,0 +1,144 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_stat.mdoc -- get information about zip source +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_STAT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_stat\fR +\- get information about zip_source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_stat\fR(\fIzip_source_t\ *source\fR, \fIzip_stat_t\ *sb\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_source_stat\fR() +function obtains information about the zip source +\fIsource\fR +.PP +The +\fIsb\fR +argument is a pointer to a +\fIstruct zip_source_stat\fR +(shown below), into which information about the zip source is placed. +.nf +.sp +.RS 0n +struct zip_source_stat { + zip_uint64_t valid; /* which fields have valid values */ + const char *name; /* name of the file */ + zip_uint64_t index; /* index within archive */ + zip_uint64_t size; /* size of file (uncompressed) */ + zip_uint64_t comp_size; /* size of file (compressed) */ + time_t mtime; /* modification time */ + zip_uint32_t crc; /* crc of file data */ + zip_uint16_t comp_method; /* compression method used */ + zip_uint16_t encryption_method; /* encryption method used */ + zip_uint32_t flags; /* reserved for future use */ +}; +.RE +.fi +The structure pointed to by +\fIsb\fR +must be initialized with +\fBzip_stat_init\fR(\fI3\fR) +before calling +\fBzip_source_stat\fR(). +.PP +The +\fIvalid\fR +field of the structure specifies which other fields are valid. +Check if the flag defined by the following defines are in +\fIvalid\fR +before accessing the fields: +.RS 6n +.PD 0 +.TP 30n +\fRZIP_STAT_NAME\fR +\fIname\fR +.TP 30n +\fRZIP_STAT_INDEX\fR +\fIindex\fR +.TP 30n +\fRZIP_STAT_SIZE\fR +\fIsize\fR +.TP 30n +\fRZIP_STAT_COMP_SIZE\fR +\fIcomp_size\fR +.TP 30n +\fRZIP_STAT_MTIME\fR +\fImtime\fR +.TP 30n +\fRZIP_STAT_CRC\fR +\fIcrc\fR +.TP 30n +\fRZIP_STAT_COMP_METHOD\fR +\fIcomp_method\fR +.TP 30n +\fRZIP_STAT_ENCRYPTION_METHOD\fR +\fIencryption_method\fR +.TP 30n +\fRZIP_STAT_FLAGS\fR +\fIflags\fR +.RE +.PD +.PP +\fINOTE\fR: +Some fields may only be filled out after all data has been read from +the source, for example the +\fIcrc\fR +or +\fIsize\fR +fields. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_stat\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_stat.mdoc b/deps/libzip/man/zip_source_stat.mdoc new file mode 100644 index 00000000000000..a7dfe6b1cf9b67 --- /dev/null +++ b/deps/libzip/man/zip_source_stat.mdoc @@ -0,0 +1,125 @@ +.\" zip_source_stat.mdoc -- get information about zip source +.\" Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_STAT 3 +.Os +.Sh NAME +.Nm zip_source_stat +.Nd get information about zip_source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_stat "zip_source_t *source" "zip_stat_t *sb" +.Sh DESCRIPTION +The +.Fn zip_source_stat +function obtains information about the zip source +.Ar source +.Pp +The +.Ar sb +argument is a pointer to a +.Ft struct zip_source_stat +(shown below), into which information about the zip source is placed. +.Bd -literal +struct zip_source_stat { + zip_uint64_t valid; /* which fields have valid values */ + const char *name; /* name of the file */ + zip_uint64_t index; /* index within archive */ + zip_uint64_t size; /* size of file (uncompressed) */ + zip_uint64_t comp_size; /* size of file (compressed) */ + time_t mtime; /* modification time */ + zip_uint32_t crc; /* crc of file data */ + zip_uint16_t comp_method; /* compression method used */ + zip_uint16_t encryption_method; /* encryption method used */ + zip_uint32_t flags; /* reserved for future use */ +}; +.Ed +The structure pointed to by +.Ar sb +must be initialized with +.Fn zip_stat_init 3 +before calling +.Fn zip_source_stat . +.Pp +The +.Ar valid +field of the structure specifies which other fields are valid. +Check if the flag defined by the following defines are in +.Ar valid +before accessing the fields: +.Bl -tag -width ZIP_STAT_ENCRYPTION_METHODXX -compact -offset indent +.It Dv ZIP_STAT_NAME +.Ar name +.It Dv ZIP_STAT_INDEX +.Ar index +.It Dv ZIP_STAT_SIZE +.Ar size +.It Dv ZIP_STAT_COMP_SIZE +.Ar comp_size +.It Dv ZIP_STAT_MTIME +.Ar mtime +.It Dv ZIP_STAT_CRC +.Ar crc +.It Dv ZIP_STAT_COMP_METHOD +.Ar comp_method +.It Dv ZIP_STAT_ENCRYPTION_METHOD +.Ar encryption_method +.It Dv ZIP_STAT_FLAGS +.Ar flags +.El +.Pp +.Em NOTE : +Some fields may only be filled out after all data has been read from +the source, for example the +.Ar crc +or +.Ar size +fields. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_stat +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_tell.html b/deps/libzip/man/zip_source_tell.html new file mode 100644 index 00000000000000..7d70d1ae628317 --- /dev/null +++ b/deps/libzip/man/zip_source_tell.html @@ -0,0 +1,108 @@ + + + + + + + ZIP_SOURCE_TELL(3) + + + + + + + + +
ZIP_SOURCE_TELL(3)Library Functions ManualZIP_SOURCE_TELL(3)
+
+
+

+zip_source_tell — +
report current read offset in zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_source_tell(zip_source_t + *source);

+
+
+

+The function zip_source_tell() returns the current read + offset for source. The return value can be passed to + zip_source_seek(3) with + whence set to SEEK_SET to return + to the same location in the source. +
+
+

+Upon successful completion the current read offset is returned. Otherwise, -1 is + returned and the error information in source is set to + indicate the error. +
+
+

+libzip(3), + zip_source(3), + zip_source_read(3), + zip_source_tell_write(3) +
+
+

+zip_source_tell() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_tell.man b/deps/libzip/man/zip_source_tell.man new file mode 100644 index 00000000000000..7d21e2b03c0852 --- /dev/null +++ b/deps/libzip/man/zip_source_tell.man @@ -0,0 +1,79 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_tell.mdoc -- report current read offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_TELL" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_tell\fR +\- report current read offset in zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_source_tell\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_tell\fR() +returns the current read offset +for +\fIsource\fR. +The return value can be passed to +zip_source_seek(3) +with +\fIwhence\fR +set to +\fRSEEK_SET\fR +to return to the same location in the source. +.SH "RETURN VALUES" +Upon successful completion the current read offset is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_read(3), +zip_source_tell_write(3) +.SH "HISTORY" +\fBzip_source_tell\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_tell.mdoc b/deps/libzip/man/zip_source_tell.mdoc new file mode 100644 index 00000000000000..56135cf8694768 --- /dev/null +++ b/deps/libzip/man/zip_source_tell.mdoc @@ -0,0 +1,74 @@ +.\" zip_source_tell.mdoc -- report current read offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_TELL 3 +.Os +.Sh NAME +.Nm zip_source_tell +.Nd report current read offset in zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_tell "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_tell +returns the current read offset +for +.Fa source . +The return value can be passed to +.Xr zip_source_seek 3 +with +.Ar whence +set to +.Dv SEEK_SET +to return to the same location in the source. +.Sh RETURN VALUES +Upon successful completion the current read offset is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_read 3 , +.Xr zip_source_tell_write 3 +.Sh HISTORY +.Fn zip_source_tell +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_tell_write.html b/deps/libzip/man/zip_source_tell_write.html new file mode 100644 index 00000000000000..0a90eb302276c6 --- /dev/null +++ b/deps/libzip/man/zip_source_tell_write.html @@ -0,0 +1,112 @@ + + + + + + + ZIP_SOURCE_TELL_WRITE(3) + + + + + + + + +
ZIP_SOURCE_TELL_WRITE(3)Library Functions ManualZIP_SOURCE_TELL_WRITE(3)
+
+
+

+zip_source_tell_write — +
report current write offset in zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_source_tell_write(zip_source_t + *source);

+
+
+

+The function zip_source_tell_write() returns the current + write offset for source. The return value can be passed + to + zip_source_seek_write(3) + with whence set to SEEK_SET to + return to the same location in the source. +
+
+

+Upon successful completion the current write offset is returned. Otherwise, -1 + is returned and the error information in source is set + to indicate the error. +
+
+

+libzip(3), + zip_source(3), + zip_source_begin_write(3), + zip_source_commit_write(3), + zip_source_rollback_write(3), + zip_source_tell(3), + zip_source_write(3) +
+
+

+zip_source_tell_write() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_tell_write.man b/deps/libzip/man/zip_source_tell_write.man new file mode 100644 index 00000000000000..326dbe7fa06a4d --- /dev/null +++ b/deps/libzip/man/zip_source_tell_write.man @@ -0,0 +1,82 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_tell_write.mdoc -- report current write offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_TELL_WRITE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_tell_write\fR +\- report current write offset in zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_source_tell_write\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_tell_write\fR() +returns the current write offset +for +\fIsource\fR. +The return value can be passed to +zip_source_seek_write(3) +with +\fIwhence\fR +set to +\fRSEEK_SET\fR +to return to the same location in the source. +.SH "RETURN VALUES" +Upon successful completion the current write offset is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_begin_write(3), +zip_source_commit_write(3), +zip_source_rollback_write(3), +zip_source_tell(3), +zip_source_write(3) +.SH "HISTORY" +\fBzip_source_tell_write\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_tell_write.mdoc b/deps/libzip/man/zip_source_tell_write.mdoc new file mode 100644 index 00000000000000..2497828bc36b88 --- /dev/null +++ b/deps/libzip/man/zip_source_tell_write.mdoc @@ -0,0 +1,77 @@ +.\" zip_source_tell_write.mdoc -- report current write offset in source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_TELL_WRITE 3 +.Os +.Sh NAME +.Nm zip_source_tell_write +.Nd report current write offset in zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_tell_write "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_tell_write +returns the current write offset +for +.Fa source . +The return value can be passed to +.Xr zip_source_seek_write 3 +with +.Ar whence +set to +.Dv SEEK_SET +to return to the same location in the source. +.Sh RETURN VALUES +Upon successful completion the current write offset is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_begin_write 3 , +.Xr zip_source_commit_write 3 , +.Xr zip_source_rollback_write 3 , +.Xr zip_source_tell 3 , +.Xr zip_source_write 3 +.Sh HISTORY +.Fn zip_source_tell_write +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_win32a.html b/deps/libzip/man/zip_source_win32a.html new file mode 100644 index 00000000000000..58fcb529031d90 --- /dev/null +++ b/deps/libzip/man/zip_source_win32a.html @@ -0,0 +1,143 @@ + + + + + + + ZIP_SOURCE_WIN32A(3) + + + + + + + + +
ZIP_SOURCE_WIN32A(3)Library Functions ManualZIP_SOURCE_WIN32A(3)
+
+
+

+zip_source_win32a, + zip_source_win32a_create — +
create data source from a Windows ANSI file name
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_win32a(zip_t + *archive, const char + *fname, zip_uint64_t + start, zip_int64_t + len);

+

zip_source_t * +
+ zip_source_win32a_create(const + char *fname, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The functions zip_source_win32a() and + zip_source_win32a_create() create a zip source on + Windows using a Windows ANSI name. They open fname and + read len bytes from offset start + from it. If len is 0 or -1, the whole file (starting + from start) is used. +

If the file supports seek, the source can be used to open a zip + archive from.

+

The file is opened and read when the data from the source is used, + usually by zip_close() or + zip_open_from_source().

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_win32a() and + zip_source_win32a_create() fail if: +
+
[]
+
fname, start, or + len are invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
Opening fname failed.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3), + zip_source_win32handle(3), + zip_source_win32w(3) +
+
+

+zip_source_win32a() and + zip_source_win32a_create() were added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_win32a.man b/deps/libzip/man/zip_source_win32a.man new file mode 100644 index 00000000000000..e1368b73e5e5e5 --- /dev/null +++ b/deps/libzip/man/zip_source_win32a.man @@ -0,0 +1,127 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_win32a.mdoc -- create data source using a win32 ANSI name +.\" Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_WIN32A" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_win32a\fR, +\fBzip_source_win32a_create\fR +\- create data source from a Windows ANSI file name +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_win32a\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *fname\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_win32a_create\fR(\fIconst\ char\ *fname\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_win32a\fR() +and +\fBzip_source_win32a_create\fR() +create a zip source on Windows using a Windows ANSI name. +They open +\fIfname\fR +and read +\fIlen\fR +bytes from offset +\fIstart\fR +from it. +If +\fIlen\fR +is 0 or \-1, the whole file (starting from +\fIstart\fR) +is used. +.PP +If the file supports seek, the source can be used to open a zip archive from. +.PP +The file is opened and read when the data from the source is used, usually by +\fBzip_close\fR() +or +\fBzip_open_from_source\fR(). +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_win32a\fR() +and +\fBzip_source_win32a_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIfname\fR, +\fIstart\fR, +or +\fIlen\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_OPEN\fR] +Opening +\fIfname\fR +failed. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3), +zip_source_win32handle(3), +zip_source_win32w(3) +.SH "HISTORY" +\fBzip_source_win32a\fR() +and +\fBzip_source_win32a_create\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_win32a.mdoc b/deps/libzip/man/zip_source_win32a.mdoc new file mode 100644 index 00000000000000..fd5867180bb0e2 --- /dev/null +++ b/deps/libzip/man/zip_source_win32a.mdoc @@ -0,0 +1,116 @@ +.\" zip_source_win32a.mdoc -- create data source using a win32 ANSI name +.\" Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_WIN32A 3 +.Os +.Sh NAME +.Nm zip_source_win32a , +.Nm zip_source_win32a_create +.Nd create data source from a Windows ANSI file name +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_win32a "zip_t *archive" "const char *fname" "zip_uint64_t start" "zip_int64_t len" +.Ft zip_source_t * +.Fn zip_source_win32a_create "const char *fname" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_win32a +and +.Fn zip_source_win32a_create +create a zip source on Windows using a Windows ANSI name. +They open +.Ar fname +and read +.Ar len +bytes from offset +.Ar start +from it. +If +.Ar len +is 0 or \-1, the whole file (starting from +.Ar start ) +is used. +.Pp +If the file supports seek, the source can be used to open a zip archive from. +.Pp +The file is opened and read when the data from the source is used, usually by +.Fn zip_close +or +.Fn zip_open_from_source . +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_win32a +and +.Fn zip_source_win32a_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar fname , +.Ar start , +or +.Ar len +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_OPEN +Opening +.Ar fname +failed. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 , +.Xr zip_source_win32handle 3 , +.Xr zip_source_win32w 3 +.Sh HISTORY +.Fn zip_source_win32a +and +.Fn zip_source_win32a_create +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_win32handle.html b/deps/libzip/man/zip_source_win32handle.html new file mode 100644 index 00000000000000..3418bd538b370e --- /dev/null +++ b/deps/libzip/man/zip_source_win32handle.html @@ -0,0 +1,143 @@ + + + + + + + ZIP_SOURCE_WIN32HANDLE(3) + + + + + + + + +
ZIP_SOURCE_WIN32HANDLE(3)Library Functions ManualZIP_SOURCE_WIN32HANDLE(3)
+
+
+

+zip_source_win32handle, + zip_source_win32handle_create — +
create data source from a Windows file handle
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_win32handle(zip_t + *archive, HANDLE h, + zip_uint64_t start, + zip_int64_t len);

+

zip_source_t * +
+ zip_source_win32handle_create(HANDLE + h, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The functions zip_source_win32handle() and + zip_source_win32handle_create() create a zip source + from a Windows file handle. They open fname and read + len bytes from offset start from + it. If len is 0 or -1, the whole file (starting from + start) is used. +

If the file supports seek, the source can be used to open a zip + archive from.

+

The file is opened and read when the data from the source is used, + usually by zip_close() or + zip_open_from_source().

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_w32handle() and + zip_source_w32handle_create() fail if: +
+
[]
+
fname, start, or + len are invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
Opening fname failed.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3), + zip_source_win32a(3), + zip_source_win32w(3) +
+
+

+zip_source_win32handle() and + zip_source_win32handle_create() were added in libzip + 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_win32handle.man b/deps/libzip/man/zip_source_win32handle.man new file mode 100644 index 00000000000000..d94db6735fe4e9 --- /dev/null +++ b/deps/libzip/man/zip_source_win32handle.man @@ -0,0 +1,127 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_handle.mdoc -- create data source from a Windows file handle +.\" Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_WIN32HANDLE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_win32handle\fR, +\fBzip_source_win32handle_create\fR +\- create data source from a Windows file handle +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_win32handle\fR(\fIzip_t\ *archive\fR, \fIHANDLE\ h\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_win32handle_create\fR(\fIHANDLE\ h\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_win32handle\fR() +and +\fBzip_source_win32handle_create\fR() +create a zip source from a Windows file handle. +They open +\fIfname\fR +and read +\fIlen\fR +bytes from offset +\fIstart\fR +from it. +If +\fIlen\fR +is 0 or \-1, the whole file (starting from +\fIstart\fR) +is used. +.PP +If the file supports seek, the source can be used to open a zip archive from. +.PP +The file is opened and read when the data from the source is used, usually by +\fBzip_close\fR() +or +\fBzip_open_from_source\fR(). +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_w32handle\fR() +and +\fBzip_source_w32handle_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIfname\fR, +\fIstart\fR, +or +\fIlen\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_OPEN\fR] +Opening +\fIfname\fR +failed. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3), +zip_source_win32a(3), +zip_source_win32w(3) +.SH "HISTORY" +\fBzip_source_win32handle\fR() +and +\fBzip_source_win32handle_create\fR() +were added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_win32handle.mdoc b/deps/libzip/man/zip_source_win32handle.mdoc new file mode 100644 index 00000000000000..9add1d41782afb --- /dev/null +++ b/deps/libzip/man/zip_source_win32handle.mdoc @@ -0,0 +1,116 @@ +.\" zip_source_handle.mdoc -- create data source from a Windows file handle +.\" Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_WIN32HANDLE 3 +.Os +.Sh NAME +.Nm zip_source_win32handle , +.Nm zip_source_win32handle_create +.Nd create data source from a Windows file handle +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_win32handle "zip_t *archive" "HANDLE h" "zip_uint64_t start" "zip_int64_t len" +.Ft zip_source_t * +.Fn zip_source_win32handle_create "HANDLE h" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_win32handle +and +.Fn zip_source_win32handle_create +create a zip source from a Windows file handle. +They open +.Ar fname +and read +.Ar len +bytes from offset +.Ar start +from it. +If +.Ar len +is 0 or \-1, the whole file (starting from +.Ar start ) +is used. +.Pp +If the file supports seek, the source can be used to open a zip archive from. +.Pp +The file is opened and read when the data from the source is used, usually by +.Fn zip_close +or +.Fn zip_open_from_source . +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_w32handle +and +.Fn zip_source_w32handle_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar fname , +.Ar start , +or +.Ar len +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_OPEN +Opening +.Ar fname +failed. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 , +.Xr zip_source_win32a 3 , +.Xr zip_source_win32w 3 +.Sh HISTORY +.Fn zip_source_win32handle +and +.Fn zip_source_win32handle_create +were added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_win32w.html b/deps/libzip/man/zip_source_win32w.html new file mode 100644 index 00000000000000..0ec617aa7e8cd5 --- /dev/null +++ b/deps/libzip/man/zip_source_win32w.html @@ -0,0 +1,142 @@ + + + + + + + ZIP_SOURCE_WIN32W(3) + + + + + + + + +
ZIP_SOURCE_WIN32W(3)Library Functions ManualZIP_SOURCE_WIN32W(3)
+
+
+

+zip_source_win32w, + zip_source_win32w_create — +
create data source from a Windows Unicode file name
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_win32w(zip_t + *archive, const wchar_t + *fname, zip_uint64_t + start, zip_int64_t + len);

+

zip_source_t * +
+ zip_source_win32w_create(const + wchar_t *fname, + zip_uint64_t start, + zip_int64_t len, + zip_error_t *error);

+
+
+

+The functions zip_source_win32w() and + zip_source_win32w_create() create a zip source on + Windows using a Windows Unicode name. They open fname + and read len bytes from offset + start from it. If len is 0 or -1, + the whole file (starting from start) is used. +

If the file supports seek, the source can be used to open a zip + archive from.

+

The file is opened and read when the data from the source is used, + usually by zip_close() or + zip_open_from_source().

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_win32w() and + zip_source_win32w_create() fail if: +
+
[]
+
fname, start, or + len are invalid.
+
[]
+
Required memory could not be allocated.
+
[]
+
Opening fname failed.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3), + zip_source_win32a(3), + zip_source_win32handle(3) +
+
+

+zip_source_win32w() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
June 22, 2018NiH
+ + diff --git a/deps/libzip/man/zip_source_win32w.man b/deps/libzip/man/zip_source_win32w.man new file mode 100644 index 00000000000000..de1dbfd729ebd7 --- /dev/null +++ b/deps/libzip/man/zip_source_win32w.man @@ -0,0 +1,125 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_win32w.mdoc -- create data source using a win32 Unicode name +.\" Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_WIN32W" "3" "June 22, 2018" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_win32w\fR, +\fBzip_source_win32w_create\fR +\- create data source from a Windows Unicode file name +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_win32w\fR(\fIzip_t\ *archive\fR, \fIconst\ wchar_t\ *fname\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_win32w_create\fR(\fIconst\ wchar_t\ *fname\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_win32w\fR() +and +\fBzip_source_win32w_create\fR() +create a zip source on Windows using a Windows Unicode name. +They open +\fIfname\fR +and read +\fIlen\fR +bytes from offset +\fIstart\fR +from it. +If +\fIlen\fR +is 0 or \-1, the whole file (starting from +\fIstart\fR) +is used. +.PP +If the file supports seek, the source can be used to open a zip archive from. +.PP +The file is opened and read when the data from the source is used, usually by +\fBzip_close\fR() +or +\fBzip_open_from_source\fR(). +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_win32w\fR() +and +\fBzip_source_win32w_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIfname\fR, +\fIstart\fR, +or +\fIlen\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.TP 19n +[\fRZIP_ER_OPEN\fR] +Opening +\fIfname\fR +failed. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3), +zip_source_win32a(3), +zip_source_win32handle(3) +.SH "HISTORY" +\fBzip_source_win32w\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_win32w.mdoc b/deps/libzip/man/zip_source_win32w.mdoc new file mode 100644 index 00000000000000..0f2398950674d3 --- /dev/null +++ b/deps/libzip/man/zip_source_win32w.mdoc @@ -0,0 +1,114 @@ +.\" zip_source_win32w.mdoc -- create data source using a win32 Unicode name +.\" Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd June 22, 2018 +.Dt ZIP_SOURCE_WIN32W 3 +.Os +.Sh NAME +.Nm zip_source_win32w , +.Nm zip_source_win32w_create +.Nd create data source from a Windows Unicode file name +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_win32w "zip_t *archive" "const wchar_t *fname" "zip_uint64_t start" "zip_int64_t len" +.Ft zip_source_t * +.Fn zip_source_win32w_create "const wchar_t *fname" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_win32w +and +.Fn zip_source_win32w_create +create a zip source on Windows using a Windows Unicode name. +They open +.Ar fname +and read +.Ar len +bytes from offset +.Ar start +from it. +If +.Ar len +is 0 or \-1, the whole file (starting from +.Ar start ) +is used. +.Pp +If the file supports seek, the source can be used to open a zip archive from. +.Pp +The file is opened and read when the data from the source is used, usually by +.Fn zip_close +or +.Fn zip_open_from_source . +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_win32w +and +.Fn zip_source_win32w_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar fname , +.Ar start , +or +.Ar len +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.It Bq Er ZIP_ER_OPEN +Opening +.Ar fname +failed. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 , +.Xr zip_source_win32a 3 , +.Xr zip_source_win32handle 3 +.Sh HISTORY +.Fn zip_source_win32w +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_window.html b/deps/libzip/man/zip_source_window.html new file mode 100644 index 00000000000000..63839bda2051e8 --- /dev/null +++ b/deps/libzip/man/zip_source_window.html @@ -0,0 +1,123 @@ + + + + + + + ZIP_SOURCE_WINDOW(3) + + + + + + + + +
ZIP_SOURCE_WINDOW(3)Library Functions ManualZIP_SOURCE_WINDOW(3)
+
+
+

+zip_source_window_create — +
create zip data source overlay
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_window_create(zip_source_t + *source, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The zip_source_window_create() function create a zip + source from an underlying zip source, restricting access to a particular + window starting at byte start and having size + len. If len is -1, the window + spans to the end of the underlying source. +
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + error is set to indicate the error. +
+
+

+zip_source_window_create() fails if: +
+
[]
+
src is NULL; there is an + integer overflow adding start and + len; or len is less than + -1.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_source(3) + zip_source(3) +
+
+

+zip_source_window_create() was added in libzip 1.8.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 29, 2021NiH
+ + diff --git a/deps/libzip/man/zip_source_window.man b/deps/libzip/man/zip_source_window.man new file mode 100644 index 00000000000000..1583bebbaf8fed --- /dev/null +++ b/deps/libzip/man/zip_source_window.man @@ -0,0 +1,96 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_window.mdoc -- create zip data source overlay +.\" Copyright (C) 2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_WINDOW" "3" "April 29, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_window_create\fR +\- create zip data source overlay +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_window_create\fR(\fIzip_source_t\ *source\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_source_window_create\fR() +function create a zip source from an underlying zip source, +restricting access to a particular window starting at byte +\fIstart\fR +and having size +\fIlen\fR. +If +\fIlen\fR +is \-1, the window spans to the end of the underlying source. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_window_create\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIsrc\fR +is +\fRNULL\fR; +there is an integer overflow adding +\fIstart\fR +and +\fIlen\fR; +or +\fIlen\fR +is less than \-1. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_source(3) +zip_source(3) +.SH "HISTORY" +\fBzip_source_window_create\fR() +was added in libzip 1.8.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_window.mdoc b/deps/libzip/man/zip_source_window.mdoc new file mode 100644 index 00000000000000..affe14f9471c0b --- /dev/null +++ b/deps/libzip/man/zip_source_window.mdoc @@ -0,0 +1,91 @@ +.\" zip_source_window.mdoc -- create zip data source overlay +.\" Copyright (C) 2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 29, 2021 +.Dt ZIP_SOURCE_WINDOW 3 +.Os +.Sh NAME +.Nm zip_source_window_create +.Nd create zip data source overlay +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_window_create "zip_source_t *source" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The +.Fn zip_source_window_create +function create a zip source from an underlying zip source, +restricting access to a particular window starting at byte +.Ar start +and having size +.Ar len . +If +.Ar len +is \-1, the window spans to the end of the underlying source. +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_window_create +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar src +is +.Dv NULL ; +there is an integer overflow adding +.Ar start +and +.Ar len ; +or +.Ar len +is less than \-1. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_window_create +was added in libzip 1.8.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_write.html b/deps/libzip/man/zip_source_write.html new file mode 100644 index 00000000000000..94052b8be82bc1 --- /dev/null +++ b/deps/libzip/man/zip_source_write.html @@ -0,0 +1,115 @@ + + + + + + + ZIP_SOURCE_WRITE(3) + + + + + + + + +
ZIP_SOURCE_WRITE(3)Library Functions ManualZIP_SOURCE_WRITE(3)
+
+
+

+zip_source_write — +
write data to zip source
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_int64_t +
+ zip_source_write(zip_source_t + *source, const void + *data, zip_uint64_t + len);

+
+
+

+The function zip_source_write() writes + len bytes from the buffer data to + the zip source source at the current write offset. +

The zip source source has to be prepared for + writing by calling + zip_source_begin_write(3) + first.

+
+
+

+Upon successful completion the number of bytes written is returned. Otherwise, + -1 is returned and the error information in source is + set to indicate the error. +
+
+

+libzip(3), + zip_source(3), + zip_source_begin_write(3), + zip_source_commit_write(3), + zip_source_rollback_write(3), + zip_source_seek_write(3), + zip_source_tell_write(3) +
+
+

+zip_source_write() was added in libzip 1.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_source_write.man b/deps/libzip/man/zip_source_write.man new file mode 100644 index 00000000000000..4fb5cdb5d180ea --- /dev/null +++ b/deps/libzip/man/zip_source_write.man @@ -0,0 +1,85 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_write.mdoc -- write data to zip source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_WRITE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_write\fR +\- write data to zip source +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_int64_t\fR +.br +.PD 0 +.HP 4n +\fBzip_source_write\fR(\fIzip_source_t\ *source\fR, \fIconst\ void\ *data\fR, \fIzip_uint64_t\ len\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_write\fR() +writes +\fIlen\fR +bytes from the buffer +\fIdata\fR +to the zip source +\fIsource\fR +at the current write offset. +.PP +The zip source +\fIsource\fR +has to be prepared for writing by calling +zip_source_begin_write(3) +first. +.SH "RETURN VALUES" +Upon successful completion the number of bytes written is returned. +Otherwise, \-1 is returned and the error information in +\fIsource\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_begin_write(3), +zip_source_commit_write(3), +zip_source_rollback_write(3), +zip_source_seek_write(3), +zip_source_tell_write(3) +.SH "HISTORY" +\fBzip_source_write\fR() +was added in libzip 1.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_write.mdoc b/deps/libzip/man/zip_source_write.mdoc new file mode 100644 index 00000000000000..fd033a85ff7435 --- /dev/null +++ b/deps/libzip/man/zip_source_write.mdoc @@ -0,0 +1,80 @@ +.\" zip_source_write.mdoc -- write data to zip source +.\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_SOURCE_WRITE 3 +.Os +.Sh NAME +.Nm zip_source_write +.Nd write data to zip source +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_write "zip_source_t *source" "const void *data" "zip_uint64_t len" +.Sh DESCRIPTION +The function +.Fn zip_source_write +writes +.Ar len +bytes from the buffer +.Ar data +to the zip source +.Ar source +at the current write offset. +.Pp +The zip source +.Ar source +has to be prepared for writing by calling +.Xr zip_source_begin_write 3 +first. +.Sh RETURN VALUES +Upon successful completion the number of bytes written is returned. +Otherwise, \-1 is returned and the error information in +.Ar source +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_begin_write 3 , +.Xr zip_source_commit_write 3 , +.Xr zip_source_rollback_write 3 , +.Xr zip_source_seek_write 3 , +.Xr zip_source_tell_write 3 +.Sh HISTORY +.Fn zip_source_write +was added in libzip 1.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_source_zip.html b/deps/libzip/man/zip_source_zip.html new file mode 100644 index 00000000000000..9f7e6464b75d55 --- /dev/null +++ b/deps/libzip/man/zip_source_zip.html @@ -0,0 +1,157 @@ + + + + + + + ZIP_SOURCE_ZIP(3) + + + + + + + + +
ZIP_SOURCE_ZIP(3)Library Functions ManualZIP_SOURCE_ZIP(3)
+
+
+

+zip_source_zip, + zip_source_zip_create — +
create data source from zip file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_zip(zip_t + *archive, zip_t + *srcarchive, zip_uint64_t + srcidx, zip_flags_t + flags, zip_uint64_t + start, zip_int64_t + len);

+

zip_source_t * +
+ zip_source_zip_create(zip_t + *srcarchive, zip_uint64_t + srcidx, zip_flags_t + flags, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The functions zip_source_zip() and + zip_source_zip_create() create a zip source from a + file in a zip archive. The srcarchive argument is the + (open) zip archive containing the source zip file at index + srcidx. len bytes from offset + start will be used in the zip_source. If + len is 0 or -1, the rest of the file, starting from + start, is used. If start is zero + and len is -1, the whole file will be copied without + decompressing it. +

Supported flags are:

+
+
+
Try to get the original data without any changes that may have been made + to srcarchive after opening it.
+
+
When adding the data from srcarchive, re-compress it + using the current settings instead of copying the compressed data.
+
+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_zip() and + zip_source_zip_create() fail if: +
+
[]
+
Unchanged data was requested, but it is not available.
+
[]
+
srcarchive, srcidx, + start, or len are + invalid.
+
[]
+
Required memory could not be allocated.
+
+Additionally, it can return all error codes from + zip_stat_index() and + zip_fopen_index(). +
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3) +
+
+

+zip_source_zip() was added in libzip 1.0. + zip_source_zip_create() was added in libzip 1.8.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 4, 2021NiH
+ + diff --git a/deps/libzip/man/zip_source_zip.man b/deps/libzip/man/zip_source_zip.man new file mode 100644 index 00000000000000..7f8b3eb246ceb1 --- /dev/null +++ b/deps/libzip/man/zip_source_zip.man @@ -0,0 +1,145 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_zip.mdoc -- create data source from zip file +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_ZIP" "3" "April 4, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_zip\fR, +\fBzip_source_zip_create\fR +\- create data source from zip file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_zip\fR(\fIzip_t\ *archive\fR, \fIzip_t\ *srcarchive\fR, \fIzip_uint64_t\ srcidx\fR, \fIzip_flags_t\ flags\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_zip_create\fR(\fIzip_t\ *srcarchive\fR, \fIzip_uint64_t\ srcidx\fR, \fIzip_flags_t\ flags\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_zip\fR() +and +\fBzip_source_zip_create\fR() +create a zip source from a file in a zip archive. +The +\fIsrcarchive\fR +argument is the (open) zip archive containing the source zip file +at index +\fIsrcidx\fR. +\fIlen\fR +bytes from offset +\fIstart\fR +will be used in the zip_source. +If +\fIlen\fR +is 0 or \-1, the rest of the file, starting from +\fIstart\fR, +is used. +If +\fIstart\fR +is zero and +\fIlen\fR +is \-1, the whole file will be copied without decompressing it. +.PP +Supported flags are: +.TP 23n +\fRZIP_FL_UNCHANGED\fR +Try to get the original data without any changes that may have been +made to +\fIsrcarchive\fR +after opening it. +.TP 23n +\fRZIP_FL_RECOMPRESS\fR +When adding the data from +\fIsrcarchive\fR, +re-compress it using the current settings instead of copying the +compressed data. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_zip\fR() +and +\fBzip_source_zip_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_CHANGED\fR] +Unchanged data was requested, but it is not available. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIsrcarchive\fR, +\fIsrcidx\fR, +\fIstart\fR, +or +\fIlen\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.PD 0 +.PP +Additionally, it can return all error codes from +\fBzip_stat_index\fR() +and +\fBzip_fopen_index\fR(). +.PD +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_zip\fR() +was added in libzip 1.0. +\fBzip_source_zip_create\fR() +was added in libzip 1.8.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_source_zip.mdoc b/deps/libzip/man/zip_source_zip.mdoc new file mode 100644 index 00000000000000..d8f2489f276751 --- /dev/null +++ b/deps/libzip/man/zip_source_zip.mdoc @@ -0,0 +1,131 @@ +.\" zip_source_zip.mdoc -- create data source from zip file +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 4, 2021 +.Dt ZIP_SOURCE_ZIP 3 +.Os +.Sh NAME +.Nm zip_source_zip , +.Nm zip_source_zip_create +.Nd create data source from zip file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_zip "zip_t *archive" "zip_t *srcarchive" "zip_uint64_t srcidx" "zip_flags_t flags" "zip_uint64_t start" "zip_int64_t len" +.Ft zip_source_t * +.Fn zip_source_zip_create "zip_t *srcarchive" "zip_uint64_t srcidx" "zip_flags_t flags" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_zip +and +.Fn zip_source_zip_create +create a zip source from a file in a zip archive. +The +.Ar srcarchive +argument is the (open) zip archive containing the source zip file +at index +.Ar srcidx . +.Ar len +bytes from offset +.Ar start +will be used in the zip_source. +If +.Ar len +is 0 or \-1, the rest of the file, starting from +.Ar start , +is used. +If +.Ar start +is zero and +.Ar len +is \-1, the whole file will be copied without decompressing it. +.Pp +Supported flags are: +.Bl -tag -width XZIPXFLXRECOMPRESSXXX +.It Dv ZIP_FL_UNCHANGED +Try to get the original data without any changes that may have been +made to +.Ar srcarchive +after opening it. +.It Dv ZIP_FL_RECOMPRESS +When adding the data from +.Ar srcarchive , +re-compress it using the current settings instead of copying the +compressed data. +.El +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_zip +and +.Fn zip_source_zip_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_CHANGED +Unchanged data was requested, but it is not available. +.It Bq Er ZIP_ER_INVAL +.Ar srcarchive , +.Ar srcidx , +.Ar start , +or +.Ar len +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +Additionally, it can return all error codes from +.Fn zip_stat_index +and +.Fn zip_fopen_index . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_zip +was added in libzip 1.0. +.Fn zip_source_zip_create +was added in libzip 1.8.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_stat.html b/deps/libzip/man/zip_stat.html new file mode 100644 index 00000000000000..8cf0086ad651ef --- /dev/null +++ b/deps/libzip/man/zip_stat.html @@ -0,0 +1,190 @@ + + + + + + + ZIP_STAT(3) + + + + + + + + +
ZIP_STAT(3)Library Functions ManualZIP_STAT(3)
+
+
+

+zip_stat, zip_stat_index + — +
get information about file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_stat(zip_t + *archive, const char + *fname, zip_flags_t + flags, zip_stat_t + *sb);

+

int +
+ zip_stat_index(zip_t + *archive, zip_uint64_t + index, zip_flags_t + flags, zip_stat_t + *sb);

+
+
+

+The zip_stat() function obtains information about the + file named fname in archive. The + flags argument specifies how the name lookup should be + done. Its values are described in + zip_name_locate(3). Also, + ZIP_FL_UNCHANGED may be + or'ed to it to request information + about the original file in the archive, ignoring any changes made. +

The zip_stat_index() function obtains + information about the file at position index.

+

The sb argument is a pointer to a + struct zip_stat (shown below), into which information + about the file is placed.

+
+
+struct zip_stat {
+    zip_uint64_t valid;                 /* which fields have valid values */
+    const char *name;                   /* name of the file */
+    zip_uint64_t index;                 /* index within archive */
+    zip_uint64_t size;                  /* size of file (uncompressed) */
+    zip_uint64_t comp_size;             /* size of file (compressed) */
+    time_t mtime;                       /* modification time */
+    zip_uint32_t crc;                   /* crc of file data */
+    zip_uint16_t comp_method;           /* compression method used */
+    zip_uint16_t encryption_method;     /* encryption method used */
+    zip_uint32_t flags;                 /* reserved for future use */
+};
+
+
+The structure pointed to by sb must be allocated before + calling zip_stat() or + zip_stat_index(). +

The valid field of the structure specifies + which other fields are valid. Check if the flag defined by the following + defines are in valid before accessing the fields:

+
+
+
+
name
+
+
index
+
+
size
+
+
comp_size
+
+
mtime
+
+
crc
+
+
comp_method
+
+
encryption_method
+
+
flags
+
+
+
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in archive is set to indicate the + error. +
+
+

+The function zip_stat() can fail for any of the errors + specified for the routine + zip_name_locate(3). +

The function zip_stat_index() fails and + sets the error information to ZIP_ER_INVAL if + index is invalid. If + ZIP_FL_UNCHANGED is not set and no information can + be obtained from the source callback, the error information is set to + ZIP_ER_CHANGED.

+
+
+

+libzip(3), + zip_get_num_entries(3), + zip_name_locate(3), + zip_stat_init(3) +
+
+

+zip_stat() was added in libzip 0.6. In libzip 0.11 the + type of flags was changed from int + to zip_flags_t. +

zip_stat_index() was added in libzip 0.6. + In libzip 0.10 the type of index was changed from + int to zip_uint64_t. In libzip + 0.11 the type of flags was changed from + int to zip_flags_t.

+
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_stat.man b/deps/libzip/man/zip_stat.man new file mode 100644 index 00000000000000..d7d4338f2a953d --- /dev/null +++ b/deps/libzip/man/zip_stat.man @@ -0,0 +1,203 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_stat.mdoc -- get information about file +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_STAT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_stat\fR, +\fBzip_stat_index\fR +\- get information about file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_stat\fR(\fIzip_t\ *archive\fR, \fIconst\ char\ *fname\fR, \fIzip_flags_t\ flags\fR, \fIzip_stat_t\ *sb\fR); +.PD +.PP +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_stat_index\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR, \fIzip_flags_t\ flags\fR, \fIzip_stat_t\ *sb\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_stat\fR() +function obtains information about the file named +\fIfname\fR +in +\fIarchive\fR. +The +\fIflags\fR +argument specifies how the name lookup should be done. +Its values are described in +zip_name_locate(3). +Also, +\fRZIP_FL_UNCHANGED\fR +may be +\fIor\fR'ed +to it to request information about the original file in the archive, +ignoring any changes made. +.PP +The +\fBzip_stat_index\fR() +function obtains information about the file at position +\fIindex\fR. +.PP +The +\fIsb\fR +argument is a pointer to a +\fIstruct zip_stat\fR +(shown below), into which information about the file is placed. +.nf +.sp +.RS 0n +struct zip_stat { + zip_uint64_t valid; /* which fields have valid values */ + const char *name; /* name of the file */ + zip_uint64_t index; /* index within archive */ + zip_uint64_t size; /* size of file (uncompressed) */ + zip_uint64_t comp_size; /* size of file (compressed) */ + time_t mtime; /* modification time */ + zip_uint32_t crc; /* crc of file data */ + zip_uint16_t comp_method; /* compression method used */ + zip_uint16_t encryption_method; /* encryption method used */ + zip_uint32_t flags; /* reserved for future use */ +}; +.RE +.fi +The structure pointed to by +\fIsb\fR +must be allocated before calling +\fBzip_stat\fR() +or +\fBzip_stat_index\fR(). +.PP +The +\fIvalid\fR +field of the structure specifies which other fields are valid. +Check if the flag defined by the following defines are in +\fIvalid\fR +before accessing the fields: +.RS 6n +.PD 0 +.TP 30n +\fRZIP_STAT_NAME\fR +\fIname\fR +.TP 30n +\fRZIP_STAT_INDEX\fR +\fIindex\fR +.TP 30n +\fRZIP_STAT_SIZE\fR +\fIsize\fR +.TP 30n +\fRZIP_STAT_COMP_SIZE\fR +\fIcomp_size\fR +.TP 30n +\fRZIP_STAT_MTIME\fR +\fImtime\fR +.TP 30n +\fRZIP_STAT_CRC\fR +\fIcrc\fR +.TP 30n +\fRZIP_STAT_COMP_METHOD\fR +\fIcomp_method\fR +.TP 30n +\fRZIP_STAT_ENCRYPTION_METHOD\fR +\fIencryption_method\fR +.TP 30n +\fRZIP_STAT_FLAGS\fR +\fIflags\fR +.RE +.PD +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +The function +\fBzip_stat\fR() +can fail for any of the errors specified for the routine +zip_name_locate(3). +.PP +The function +\fBzip_stat_index\fR() +fails and sets the error information to +\fRZIP_ER_INVAL\fR +if +\fIindex\fR +is invalid. +If +\fRZIP_FL_UNCHANGED\fR +is not set and no information can be obtained from the source +callback, the error information is set to +\fRZIP_ER_CHANGED\fR. +.SH "SEE ALSO" +libzip(3), +zip_get_num_entries(3), +zip_name_locate(3), +zip_stat_init(3) +.SH "HISTORY" +\fBzip_stat\fR() +was added in libzip 0.6. +In libzip 0.11 the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.PP +\fBzip_stat_index\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +In libzip 0.11 the type of +\fIflags\fR +was changed from +\fIint\fR +to +\fIzip_flags_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_stat.mdoc b/deps/libzip/man/zip_stat.mdoc new file mode 100644 index 00000000000000..9871770a37465f --- /dev/null +++ b/deps/libzip/man/zip_stat.mdoc @@ -0,0 +1,179 @@ +.\" zip_stat.mdoc -- get information about file +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_STAT 3 +.Os +.Sh NAME +.Nm zip_stat , +.Nm zip_stat_index +.Nd get information about file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_stat "zip_t *archive" "const char *fname" "zip_flags_t flags" "zip_stat_t *sb" +.Ft int +.Fn zip_stat_index "zip_t *archive" "zip_uint64_t index" "zip_flags_t flags" "zip_stat_t *sb" +.Sh DESCRIPTION +The +.Fn zip_stat +function obtains information about the file named +.Ar fname +in +.Ar archive . +The +.Ar flags +argument specifies how the name lookup should be done. +Its values are described in +.Xr zip_name_locate 3 . +Also, +.Dv ZIP_FL_UNCHANGED +may be +.Em or Ns No 'ed +to it to request information about the original file in the archive, +ignoring any changes made. +.Pp +The +.Fn zip_stat_index +function obtains information about the file at position +.Ar index . +.Pp +The +.Ar sb +argument is a pointer to a +.Ft struct zip_stat +(shown below), into which information about the file is placed. +.Bd -literal +struct zip_stat { + zip_uint64_t valid; /* which fields have valid values */ + const char *name; /* name of the file */ + zip_uint64_t index; /* index within archive */ + zip_uint64_t size; /* size of file (uncompressed) */ + zip_uint64_t comp_size; /* size of file (compressed) */ + time_t mtime; /* modification time */ + zip_uint32_t crc; /* crc of file data */ + zip_uint16_t comp_method; /* compression method used */ + zip_uint16_t encryption_method; /* encryption method used */ + zip_uint32_t flags; /* reserved for future use */ +}; +.Ed +The structure pointed to by +.Ar sb +must be allocated before calling +.Fn zip_stat +or +.Fn zip_stat_index . +.Pp +The +.Ar valid +field of the structure specifies which other fields are valid. +Check if the flag defined by the following defines are in +.Ar valid +before accessing the fields: +.Bl -tag -width ZIP_STAT_ENCRYPTION_METHODXX -compact -offset indent +.It Dv ZIP_STAT_NAME +.Ar name +.It Dv ZIP_STAT_INDEX +.Ar index +.It Dv ZIP_STAT_SIZE +.Ar size +.It Dv ZIP_STAT_COMP_SIZE +.Ar comp_size +.It Dv ZIP_STAT_MTIME +.Ar mtime +.It Dv ZIP_STAT_CRC +.Ar crc +.It Dv ZIP_STAT_COMP_METHOD +.Ar comp_method +.It Dv ZIP_STAT_ENCRYPTION_METHOD +.Ar encryption_method +.It Dv ZIP_STAT_FLAGS +.Ar flags +.El +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error information in +.Ar archive +is set to indicate the error. +.Sh ERRORS +The function +.Fn zip_stat +can fail for any of the errors specified for the routine +.Xr zip_name_locate 3 . +.Pp +The function +.Fn zip_stat_index +fails and sets the error information to +.Er ZIP_ER_INVAL +if +.Ar index +is invalid. +If +.Dv ZIP_FL_UNCHANGED +is not set and no information can be obtained from the source +callback, the error information is set to +.Er ZIP_ER_CHANGED . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_get_num_entries 3 , +.Xr zip_name_locate 3 , +.Xr zip_stat_init 3 +.Sh HISTORY +.Fn zip_stat +was added in libzip 0.6. +In libzip 0.11 the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Pp +.Fn zip_stat_index +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +In libzip 0.11 the type of +.Ar flags +was changed from +.Vt int +to +.Vt zip_flags_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_stat_init.html b/deps/libzip/man/zip_stat_init.html new file mode 100644 index 00000000000000..fd9c0f5a51a1f7 --- /dev/null +++ b/deps/libzip/man/zip_stat_init.html @@ -0,0 +1,109 @@ + + + + + + + ZIP_STAT_INIT(3) + + + + + + + + +
ZIP_STAT_INIT(3)Library Functions ManualZIP_STAT_INIT(3)
+
+
+

+zip_stat_init — +
initialize zip_stat structure
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

void +
+ zip_stat_init(zip_stat_t + *sb);

+
+
+

+The zip_stat_init() function initializes the members of + a struct zip_stat. The current members are described in + zip_stat(3), but this function should + be used to initialize it to make sure none are missed. The structure pointed + to by sb must be allocated before calling + zip_stat_init(). +

This function should be used by functions provided to + zip_source_function(3) + when returning ZIP_SOURCE_STAT information to make + sure all fields are initialized.

+
+
+

+If sb is valid, the function is always successful. +
+
+

+libzip(3), + zip_stat(3) +
+
+

+zip_stat_init() was added in libzip 0.8. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_stat_init.man b/deps/libzip/man/zip_stat_init.man new file mode 100644 index 00000000000000..2ba5857f5357be --- /dev/null +++ b/deps/libzip/man/zip_stat_init.man @@ -0,0 +1,81 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_stat_init.mdoc -- init zip_stat structure +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_STAT_INIT" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_stat_init\fR +\- initialize zip_stat structure +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_stat_init\fR(\fIzip_stat_t\ *sb\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_stat_init\fR() +function initializes the members of a struct zip_stat. +The current members are described in +zip_stat(3), +but this function should be used to initialize it to +make sure none are missed. +The structure pointed to by +\fIsb\fR +must be allocated before calling +\fBzip_stat_init\fR(). +.PP +This function should be used by functions provided to +zip_source_function(3) +when returning +\fRZIP_SOURCE_STAT\fR +information to make sure all fields are initialized. +.SH "RETURN VALUES" +If +\fIsb\fR +is valid, the function is always successful. +.SH "SEE ALSO" +libzip(3), +zip_stat(3) +.SH "HISTORY" +\fBzip_stat_init\fR() +was added in libzip 0.8. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_stat_init.mdoc b/deps/libzip/man/zip_stat_init.mdoc new file mode 100644 index 00000000000000..bb5a0ffbed5b78 --- /dev/null +++ b/deps/libzip/man/zip_stat_init.mdoc @@ -0,0 +1,76 @@ +.\" zip_stat_init.mdoc -- init zip_stat structure +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_STAT_INIT 3 +.Os +.Sh NAME +.Nm zip_stat_init +.Nd initialize zip_stat structure +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft void +.Fn zip_stat_init "zip_stat_t *sb" +.Sh DESCRIPTION +The +.Fn zip_stat_init +function initializes the members of a struct zip_stat. +The current members are described in +.Xr zip_stat 3 , +but this function should be used to initialize it to +make sure none are missed. +The structure pointed to by +.Ar sb +must be allocated before calling +.Fn zip_stat_init . +.Pp +This function should be used by functions provided to +.Xr zip_source_function 3 +when returning +.Dv ZIP_SOURCE_STAT +information to make sure all fields are initialized. +.Sh RETURN VALUES +If +.Ar sb +is valid, the function is always successful. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_stat 3 +.Sh HISTORY +.Fn zip_stat_init +was added in libzip 0.8. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_unchange.html b/deps/libzip/man/zip_unchange.html new file mode 100644 index 00000000000000..ebf1113af719a9 --- /dev/null +++ b/deps/libzip/man/zip_unchange.html @@ -0,0 +1,116 @@ + + + + + + + ZIP_UNCHANGE(3) + + + + + + + + +
ZIP_UNCHANGE(3)Library Functions ManualZIP_UNCHANGE(3)
+
+
+

+zip_unchange — +
undo changes to file in zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_unchange(zip_t + *archive, zip_uint64_t + index);

+
+
+

+Changes to the file at position index are reverted. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+zip_unchange() fails if: +
+
[]
+
Unchanging the name would result in a duplicate name in the archive.
+
[]
+
index is not a valid file index in + zip.
+
+
+
+

+libzip(3), + zip_unchange_all(3), + zip_unchange_archive(3) +
+
+

+zip_unchange() was added in libzip 0.6. In libzip 0.10 + the type of index was changed from + int to zip_uint64_t. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_unchange.man b/deps/libzip/man/zip_unchange.man new file mode 100644 index 00000000000000..30db8a9d9d8cb6 --- /dev/null +++ b/deps/libzip/man/zip_unchange.man @@ -0,0 +1,86 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_unchange.mdoc -- undo changes to file in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_UNCHANGE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_unchange\fR +\- undo changes to file in zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_unchange\fR(\fIzip_t\ *archive\fR, \fIzip_uint64_t\ index\fR); +.PD +.SH "DESCRIPTION" +Changes to the file at position +\fIindex\fR +are reverted. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_unchange\fR() +fails if: +.TP 19n +[\fRZIP_ER_EXISTS\fR] +Unchanging the name would result in a duplicate name in the archive. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIindex\fR +is not a valid file index in +\fIzip\fR. +.SH "SEE ALSO" +libzip(3), +zip_unchange_all(3), +zip_unchange_archive(3) +.SH "HISTORY" +\fBzip_unchange\fR() +was added in libzip 0.6. +In libzip 0.10 the type of +\fIindex\fR +was changed from +\fIint\fR +to +\fIzip_uint64_t\fR. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_unchange.mdoc b/deps/libzip/man/zip_unchange.mdoc new file mode 100644 index 00000000000000..3a22155883f9f5 --- /dev/null +++ b/deps/libzip/man/zip_unchange.mdoc @@ -0,0 +1,81 @@ +.\" zip_unchange.mdoc -- undo changes to file in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_UNCHANGE 3 +.Os +.Sh NAME +.Nm zip_unchange +.Nd undo changes to file in zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_unchange "zip_t *archive" "zip_uint64_t index" +.Sh DESCRIPTION +Changes to the file at position +.Ar index +are reverted. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh ERRORS +.Fn zip_unchange +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_EXISTS +Unchanging the name would result in a duplicate name in the archive. +.It Bq Er ZIP_ER_INVAL +.Ar index +is not a valid file index in +.Ar zip . +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_unchange_all 3 , +.Xr zip_unchange_archive 3 +.Sh HISTORY +.Fn zip_unchange +was added in libzip 0.6. +In libzip 0.10 the type of +.Ar index +was changed from +.Vt int +to +.Vt zip_uint64_t . +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_unchange_all.html b/deps/libzip/man/zip_unchange_all.html new file mode 100644 index 00000000000000..1c11f0baf2a579 --- /dev/null +++ b/deps/libzip/man/zip_unchange_all.html @@ -0,0 +1,103 @@ + + + + + + + ZIP_UNCHANGE_ALL(3) + + + + + + + + +
ZIP_UNCHANGE_ALL(3)Library Functions ManualZIP_UNCHANGE_ALL(3)
+
+
+

+zip_unchange_all — +
undo all changes in a zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_unchange_all(zip_t + *archive);

+
+
+

+All changes to files and global information in archive are + reverted. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+libzip(3), + zip_unchange(3), + zip_unchange_archive(3) +
+
+

+zip_unchange_all() was added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_unchange_all.man b/deps/libzip/man/zip_unchange_all.man new file mode 100644 index 00000000000000..f3aecea6f0209c --- /dev/null +++ b/deps/libzip/man/zip_unchange_all.man @@ -0,0 +1,69 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_unchange_all.mdoc -- undo changes to all files in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_UNCHANGE_ALL" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_unchange_all\fR +\- undo all changes in a zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_unchange_all\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +All changes to files and global information in +\fIarchive\fR +are reverted. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_unchange(3), +zip_unchange_archive(3) +.SH "HISTORY" +\fBzip_unchange_all\fR() +was added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_unchange_all.mdoc b/deps/libzip/man/zip_unchange_all.mdoc new file mode 100644 index 00000000000000..01806ecb092202 --- /dev/null +++ b/deps/libzip/man/zip_unchange_all.mdoc @@ -0,0 +1,64 @@ +.\" zip_unchange_all.mdoc -- undo changes to all files in zip archive +.\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_UNCHANGE_ALL 3 +.Os +.Sh NAME +.Nm zip_unchange_all +.Nd undo all changes in a zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_unchange_all "zip_t *archive" +.Sh DESCRIPTION +All changes to files and global information in +.Ar archive +are reverted. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_unchange 3 , +.Xr zip_unchange_archive 3 +.Sh HISTORY +.Fn zip_unchange_all +was added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zip_unchange_archive.html b/deps/libzip/man/zip_unchange_archive.html new file mode 100644 index 00000000000000..35b842c34386b5 --- /dev/null +++ b/deps/libzip/man/zip_unchange_archive.html @@ -0,0 +1,103 @@ + + + + + + + ZIP_UNCHANGE_ARCHIVE(3) + + + + + + + + +
ZIP_UNCHANGE_ARCHIVE(3)Library Functions ManualZIP_UNCHANGE_ARCHIVE(3)
+
+
+

+zip_unchange_archive — +
undo global changes to zip archive
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_unchange_archive(zip_t + *archive);

+
+
+

+Revert all global changes to the archive archive. This + reverts changes to the archive comment and global flags. +
+
+

+Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in archive is set to indicate the error. +
+
+

+libzip(3), + zip_unchange(3), + zip_unchange_all(3) +
+
+

+zip_unchange_archive() was added in libzip 0.7. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
December 18, 2017NiH
+ + diff --git a/deps/libzip/man/zip_unchange_archive.man b/deps/libzip/man/zip_unchange_archive.man new file mode 100644 index 00000000000000..3f42fdc881ec21 --- /dev/null +++ b/deps/libzip/man/zip_unchange_archive.man @@ -0,0 +1,69 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_unchange_archive.mdoc -- undo changes to all files in zip archive +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_UNCHANGE_ARCHIVE" "3" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_unchange_archive\fR +\- undo global changes to zip archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_unchange_archive\fR(\fIzip_t\ *archive\fR); +.PD +.SH "DESCRIPTION" +Revert all global changes to the archive +\fIarchive\fR. +This reverts changes to the archive comment and global flags. +.SH "RETURN VALUES" +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +\fIarchive\fR +is set to indicate the error. +.SH "SEE ALSO" +libzip(3), +zip_unchange(3), +zip_unchange_all(3) +.SH "HISTORY" +\fBzip_unchange_archive\fR() +was added in libzip 0.7. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zip_unchange_archive.mdoc b/deps/libzip/man/zip_unchange_archive.mdoc new file mode 100644 index 00000000000000..4ec3811548fe51 --- /dev/null +++ b/deps/libzip/man/zip_unchange_archive.mdoc @@ -0,0 +1,64 @@ +.\" zip_unchange_archive.mdoc -- undo changes to all files in zip archive +.\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 18, 2017 +.Dt ZIP_UNCHANGE_ARCHIVE 3 +.Os +.Sh NAME +.Nm zip_unchange_archive +.Nd undo global changes to zip archive +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_unchange_archive "zip_t *archive" +.Sh DESCRIPTION +Revert all global changes to the archive +.Ar archive . +This reverts changes to the archive comment and global flags. +.Sh RETURN VALUES +Upon successful completion 0 is returned. +Otherwise, \-1 is returned and the error code in +.Ar archive +is set to indicate the error. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_unchange 3 , +.Xr zip_unchange_all 3 +.Sh HISTORY +.Fn zip_unchange_archive +was added in libzip 0.7. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zipcmp.html b/deps/libzip/man/zipcmp.html new file mode 100644 index 00000000000000..93654497d42329 --- /dev/null +++ b/deps/libzip/man/zipcmp.html @@ -0,0 +1,128 @@ + + + + + + + ZIPCMP(1) + + + + + + + + +
ZIPCMP(1)General Commands ManualZIPCMP(1)
+
+
+

+zipcmp — +
compare contents of zip archives
+
+
+

+ + + + + +
zipcmp[-ChipqstVv] archive1 + archive2
+
+
+

+zipcmp compares the zip archives or directories + archive1 and archive2 and checks + if they contain the same files, comparing their names, uncompressed sizes, and + CRCs. File order and compressed size differences are ignored. +

Supported options:

+
+
+
Check consistency of archives. Results in an error if archive is + inconsistent or not valid according to the zip specification.
+
+
Display a short help message and exit.
+
+
Compare names ignoring case distinctions.
+
+
Enable paranoid checks. Compares extra fields, comments, and other meta + data. (Automatically disabled if one of the archives is a directory.) + These checks are skipped for files where the data differs.
+
+
Quiet mode. Compare -v.
+
+
Print a summary of how many files where added and removed.
+
+
Test zip files by comparing the contents to their checksums.
+
+
Display version information and exit.
+
+
Verbose mode. Print details about differences to stdout. (This is the + default.)
+
+
+
+

+zipcmp exits 0 if the two archives contain the same + files, 1 if they differ, and >1 if an error occurred. +
+
+

+zipmerge(1), + ziptool(1), + libzip(3) +
+
+

+zipcmp was added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
March 19, 2022NiH
+ + diff --git a/deps/libzip/man/zipcmp.man b/deps/libzip/man/zipcmp.man new file mode 100644 index 00000000000000..881427f995a623 --- /dev/null +++ b/deps/libzip/man/zipcmp.man @@ -0,0 +1,105 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zipcmp.mdoc -- compare zip archives +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIPCMP" "1" "March 19, 2022" "NiH" "General Commands Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzipcmp\fR +\- compare contents of zip archives +.SH "SYNOPSIS" +.HP 7n +\fBzipcmp\fR +[\fB\-ChipqstVv\fR] +\fIarchive1\ archive2\fR +.SH "DESCRIPTION" +\fBzipcmp\fR +compares the zip archives or directories +\fIarchive1\fR +and +\fIarchive2\fR +and checks if they contain the same files, comparing their names, +uncompressed sizes, and CRCs. +File order and compressed size differences are ignored. +.PP +Supported options: +.TP 5n +\fB\-C\fR +Check consistency of archives. +Results in an error if archive is inconsistent or not valid +according to the zip specification. +.TP 5n +\fB\-h\fR +Display a short help message and exit. +.TP 5n +\fB\-i\fR +Compare names ignoring case distinctions. +.TP 5n +\fB\-p\fR +Enable paranoid checks. +Compares extra fields, comments, and other meta data. +(Automatically disabled if one of the archives is a directory.) +These checks are skipped for files where the data differs. +.TP 5n +\fB\-q\fR +Quiet mode. +Compare +\fB\-v\fR. +.TP 5n +\fB\-s\fR +Print a summary of how many files where added and removed. +.TP 5n +\fB\-t\fR +Test zip files by comparing the contents to their checksums. +.TP 5n +\fB\-V\fR +Display version information and exit. +.TP 5n +\fB\-v\fR +Verbose mode. +Print details about differences to stdout. +(This is the default.) +.SH "EXIT STATUS" +\fBzipcmp\fR +exits 0 if the two archives contain the same files, 1 if they differ, +and >1 if an error occurred. +.SH "SEE ALSO" +zipmerge(1), +ziptool(1), +libzip(3) +.SH "HISTORY" +\fBzipcmp\fR +was added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/zipcmp.mdoc b/deps/libzip/man/zipcmp.mdoc new file mode 100644 index 00000000000000..d9a811501dd1b2 --- /dev/null +++ b/deps/libzip/man/zipcmp.mdoc @@ -0,0 +1,97 @@ +.\" zipcmp.mdoc -- compare zip archives +.\" Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd March 19, 2022 +.Dt ZIPCMP 1 +.Os +.Sh NAME +.Nm zipcmp +.Nd compare contents of zip archives +.Sh SYNOPSIS +.Nm +.Op Fl ChipqstVv +.Ar archive1 archive2 +.Sh DESCRIPTION +.Nm +compares the zip archives or directories +.Ar archive1 +and +.Ar archive2 +and checks if they contain the same files, comparing their names, +uncompressed sizes, and CRCs. +File order and compressed size differences are ignored. +.Pp +Supported options: +.Bl -tag -width MMM +.It Fl C +Check consistency of archives. +Results in an error if archive is inconsistent or not valid +according to the zip specification. +.It Fl h +Display a short help message and exit. +.It Fl i +Compare names ignoring case distinctions. +.It Fl p +Enable paranoid checks. +Compares extra fields, comments, and other meta data. +(Automatically disabled if one of the archives is a directory.) +These checks are skipped for files where the data differs. +.It Fl q +Quiet mode. +Compare +.Fl v . +.It Fl s +Print a summary of how many files where added and removed. +.It Fl t +Test zip files by comparing the contents to their checksums. +.It Fl V +Display version information and exit. +.It Fl v +Verbose mode. +Print details about differences to stdout. +(This is the default.) +.El +.Sh EXIT STATUS +.Nm +exits 0 if the two archives contain the same files, 1 if they differ, +and >1 if an error occurred. +.Sh SEE ALSO +.Xr zipmerge 1 , +.Xr ziptool 1 , +.Xr libzip 3 +.Sh HISTORY +.Nm +was added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/man/zipmerge.html b/deps/libzip/man/zipmerge.html new file mode 100644 index 00000000000000..a7aa04ec87ed14 --- /dev/null +++ b/deps/libzip/man/zipmerge.html @@ -0,0 +1,136 @@ + + + + + + + ZIPMERGE(1) + + + + + + + + +
ZIPMERGE(1)General Commands ManualZIPMERGE(1)
+
+
+

+zipmerge — +
merge zip archives
+
+
+

+ + + + + +
zipmerge[-DhIiSsV] target-zip + source-zip [source-zip + ...]
+
+
+

+zipmerge merges the source zip archives + source-zip into the target zip archive + target-zip. By default, files in the source zip archives + overwrite existing files of the same name in the target zip archive. +

Supported options:

+
+
+
Ignore directory components in file name comparisons. This option is slow + for archives with many files.
+
+
Display a short help message and exit.
+
+
Ignore case in file name comparisons This option is slow for archives with + many files.
+
+
Ask before overwriting files. See also -s.
+
+
Do not compress files that were uncompressed in + source-zip, otherwise they are compressed with the + default compression method.
+
+
Do not overwrite files that have the same size and CRC32 in both the + source and target archives.
+
+
When -i is given, do not ask before overwriting + files that have the same size and CRC32.
+
+
Display version information and exit.
+
+
+
+

+zipmerge exits 0 on success and >1 if an error + occurred. +
+
+

+zipcmp(1), + ziptool(1), + libzip(3) +
+
+

+zipmerge was added in libzip 0.6. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+

+zipmerge uses one open file descriptor per zip archive. + If you need to merge a lot of zip archives, check your shell's file descriptor + ulimit and either increase it or run zipmerge multiple + times with e.g. 1000 source zip archives each time. +
+
+ + + + + +
December 5, 2022NiH
+ + diff --git a/deps/libzip/man/zipmerge.man b/deps/libzip/man/zipmerge.man new file mode 100644 index 00000000000000..ab5e842430bc21 --- /dev/null +++ b/deps/libzip/man/zipmerge.man @@ -0,0 +1,109 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zipmerge.mdoc -- merge zip archives +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIPMERGE" "1" "December 5, 2022" "NiH" "General Commands Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzipmerge\fR +\- merge zip archives +.SH "SYNOPSIS" +.HP 9n +\fBzipmerge\fR +[\fB\-DhIiSsV\fR] +\fItarget-zip\fR +\fIsource-zip\fR\ [\fIsource-zip\ ...\fR] +.SH "DESCRIPTION" +\fBzipmerge\fR +merges the source zip archives +\fIsource-zip\fR +into the target zip archive +\fItarget-zip\fR. +By default, files in the source zip archives overwrite +existing files of the same name in the target zip archive. +.PP +Supported options: +.TP 5n +\fB\-D\fR +Ignore directory components in file name comparisons. +This option is slow for archives with many files. +.TP 5n +\fB\-h\fR +Display a short help message and exit. +.TP 5n +\fB\-I\fR +Ignore case in file name comparisons +This option is slow for archives with many files. +.TP 5n +\fB\-i\fR +Ask before overwriting files. +See also +\fB\-s\fR. +.TP 5n +\fB\-k\fR +Do not compress files that were uncompressed in +\fIsource-zip\fR, +otherwise they are compressed with the default compression method. +.TP 5n +\fB\-S\fR +Do not overwrite files that have the same size and +CRC32 in both the source and target archives. +.TP 5n +\fB\-s\fR +When +\fB\-i\fR +is given, do not ask before overwriting files that have the same size +and CRC32. +.TP 5n +\fB\-V\fR +Display version information and exit. +.SH "EXIT STATUS" +\fBzipmerge\fR +exits 0 on success and >1 if an error occurred. +.SH "SEE ALSO" +zipcmp(1), +ziptool(1), +libzip(3) +.SH "HISTORY" +\fBzipmerge\fR +was added in libzip 0.6. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> +.SH "CAVEATS" +\fBzipmerge\fR +uses one open file descriptor per zip archive. +If you need to merge a lot of zip archives, check your shell's +file descriptor ulimit and either increase it or run +\fBzipmerge\fR +multiple times with e.g. 1000 source zip archives each time. diff --git a/deps/libzip/man/zipmerge.mdoc b/deps/libzip/man/zipmerge.mdoc new file mode 100644 index 00000000000000..ab13a25b21afd6 --- /dev/null +++ b/deps/libzip/man/zipmerge.mdoc @@ -0,0 +1,102 @@ +.\" zipmerge.mdoc -- merge zip archives +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt ZIPMERGE 1 +.Os +.Sh NAME +.Nm zipmerge +.Nd merge zip archives +.Sh SYNOPSIS +.Nm +.Op Fl DhIiSsV +.Ar target-zip +.Ar source-zip Op Ar source-zip ... +.Sh DESCRIPTION +.Nm +merges the source zip archives +.Ar source-zip +into the target zip archive +.Ar target-zip . +By default, files in the source zip archives overwrite +existing files of the same name in the target zip archive. +.Pp +Supported options: +.Bl -tag -width MMM +.It Fl D +Ignore directory components in file name comparisons. +This option is slow for archives with many files. +.It Fl h +Display a short help message and exit. +.It Fl I +Ignore case in file name comparisons +This option is slow for archives with many files. +.It Fl i +Ask before overwriting files. +See also +.Fl s . +.It Fl k +Do not compress files that were uncompressed in +.Ar source-zip , +otherwise they are compressed with the default compression method. +.It Fl S +Do not overwrite files that have the same size and +CRC32 in both the source and target archives. +.It Fl s +When +.Fl i +is given, do not ask before overwriting files that have the same size +and CRC32. +.It Fl V +Display version information and exit. +.El +.Sh EXIT STATUS +.Nm +exits 0 on success and >1 if an error occurred. +.Sh SEE ALSO +.Xr zipcmp 1 , +.Xr ziptool 1 , +.Xr libzip 3 +.Sh HISTORY +.Nm +was added in libzip 0.6. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at +.Sh CAVEATS +.Nm +uses one open file descriptor per zip archive. +If you need to merge a lot of zip archives, check your shell's +file descriptor ulimit and either increase it or run +.Nm +multiple times with e.g. 1000 source zip archives each time. diff --git a/deps/libzip/man/ziptool.html b/deps/libzip/man/ziptool.html new file mode 100644 index 00000000000000..a81ae2192924a0 --- /dev/null +++ b/deps/libzip/man/ziptool.html @@ -0,0 +1,325 @@ + + + + + + + ZIPTOOL(1) + + + + + + + + +
ZIPTOOL(1)General Commands ManualZIPTOOL(1)
+
+
+

+ziptool — +
modify zip archives
+
+
+

+ + + + + +
ziptool[-ceghnrst] [-l + length] [-o + offset] zip-archive + command [command-args ...] + [command [command-args ...] + ...]
+
+
+

+ziptool modifies the zip archive + zip-archive according to the + commands given. +

Supported options:

+
+
+
Check zip archive consistency when opening it.
+
+
Error if archive already exists (only useful with + -n).
+
+
Guess file name encoding (for stat command).
+
+
Display help.
+
+ length
+
Only read length bytes of archive. See also + -o.
+
+
Create archive if it doesn't exist. See also + -e.
+
+ offset
+
Start reading input archive from offset. See also + -l.
+
+
Print raw file name encoding without translation (for + stat command).
+
+
Follow file name convention strictly (for stat + command).
+
+
Disregard current file contents, if any. Note: use this + with care, it deletes all existing file contents when you modify the + archive.
+
+
+

+For all commands below, the index is zero-based. In other words, the first entry + in the zip archive has index 0. +

Supported commands and arguments are:

+
+
+ name content
+
Add file called name using the string + content from the command line as data.
+
+ name
+
Add directory name.
+
+ name file_to_add offset len
+
Add file name to archive, using + len bytes from the file + file_to_add as input data, starting at + offset.
+
+ name archivename index offset len
+
Add file called name to archive using data from + another zip archive archivename using the entry with + index index and reading len + bytes from offset.
+
+ index
+
Output file contents for entry index to stdout.
+
+ index flags
+
Print the number of extra fields for archive entry + index using flags.
+
+ index extra_id flags
+
Print number of extra fields of type extra_id for + archive entry index using + flags.
+
+ index
+
Remove entry at index from zip archive.
+
+ index extra_idx flags
+
Remove extra field number extra_idx from archive + entry index using flags.
+
+ index extra_id extra_index flags
+
Remove extra field number extra_index of type + extra_id from archive entry + index using flags.
+
+
Print archive comment.
+
+ index extra_index flags
+
Print extra field extra_index for archive entry + index using flags.
+
+ index extra_id extra_index flags
+
Print extra field extra_index of type + extra_id for archive entry + index using flags.
+
+ index
+
Get file comment for archive entry index.
+
+ flags
+
Print number of entries in archive using flags.
+
+ name flags
+
Find entry in archive with the filename name using + flags and print its index.
+
+ index name
+
Rename archive entry index to + name.
+
+ index data
+
Replace file contents for archive entry index with + the string data.
+
+ comment
+
Set archive comment to comment.
+
+ index extra_id extra_index flags value
+
Set extra field number extra_index of type + extra_id for archive entry + index using flags to + value.
+
+ index comment
+
Set file comment for archive entry index to string + comment.
+
+ index method compression_flags
+
Set file compression method for archive entry index + to method using + compression_flags. Note: + Currently, compression_flags are ignored.
+
+ index method password
+
Set file encryption method for archive entry index + to method with password + password.
+
+ index timestamp
+
Set file modification time for archive entry index + to UNIX mtime timestamp.
+
+ timestamp
+
Set file modification time for all archive entries to UNIX mtime + timestamp.
+
+ password
+
Set default password for encryption/decryption to + password.
+
+ index
+
Print information about archive entry index.
+
+
+
+

+Some commands take flag arguments. Each character in the argument sets the + corresponding flag. Use 0 or the empty string for no flags. +

Supported flags are:

+ +
+
+

+Some commands take compression method arguments. Supported methods are: + +
+
+

+Some commands take encryption method arguments. Supported methods are: + +
+
+
+

+The ziptool utility exits 0 on success, + and >0 if an error occurs. +
+
+

+Add a file called teststring.txt to the zip archive + testbuffer.zip with data “This is a + test.\n” where “\n” is replaced with a newline character: +
+
+ziptool testbuffer.zip add teststring.txt \"This is a test.\n\"
+
+
+

Delete the first file from the zip archive + testfile.zip:

+
+
+ziptool testfile.zip delete 0
+
+
+
+
+

+zipcmp(1), + zipmerge(1), + libzip(3) +
+
+

+ziptool was added in libzip 1.1. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
March 15, 2022NiH
+ + diff --git a/deps/libzip/man/ziptool.man b/deps/libzip/man/ziptool.man new file mode 100644 index 00000000000000..ad0313a8c40378 --- /dev/null +++ b/deps/libzip/man/ziptool.man @@ -0,0 +1,402 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" ziptool.mdoc -- modify zip archives in multiple ways +.\" Copyright (C) 2016-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIPTOOL" "1" "March 15, 2022" "NiH" "General Commands Manual" +.nh +.if n .ad l +.SH "NAME" +\fBziptool\fR +\- modify zip archives +.SH "SYNOPSIS" +.HP 8n +\fBziptool\fR +[\fB\-ceghnrst\fR] +[\fB\-l\fR\ \fIlength\fR] +[\fB\-o\fR\ \fIoffset\fR] +\fIzip-archive\fR +\fBcommand\fR\ [\fIcommand-args\ ...\fR] +[\fBcommand\fR\ [\fIcommand-args\ ...\fR]\ ...] +.SH "DESCRIPTION" +\fBziptool\fR +modifies the zip archive +\fIzip-archive\fR +according to the +\fIcommands\fR +given. +.PP +Supported options: +.TP 13n +\fB\-c\fR +Check zip archive consistency when opening it. +.TP 13n +\fB\-e\fR +Error if archive already exists (only useful with +\fB\-n\fR). +.TP 13n +\fB\-g\fR +Guess file name encoding (for +\fBstat\fR +command). +.TP 13n +\fB\-h\fR +Display help. +.TP 13n +\fB\-l\fR \fIlength\fR +Only read +\fIlength\fR +bytes of archive. +See also +\fB\-o\fR. +.TP 13n +\fB\-n\fR +Create archive if it doesn't exist. +See also +\fB\-e\fR. +.TP 13n +\fB\-o\fR \fIoffset\fR +Start reading input archive from +\fIoffset\fR. +See also +\fB\-l\fR. +.TP 13n +\fB\-r\fR +Print raw file name encoding without translation (for +\fBstat\fR +command). +.TP 13n +\fB\-s\fR +Follow file name convention strictly (for +\fBstat\fR +command). +.TP 13n +\fB\-t\fR +Disregard current file contents, if any. +\fINote\fR: +use this with care, it deletes all existing file contents when +you modify the archive. +.SS "Commands" +For all commands below, the index is zero-based. +In other words, the first entry in the zip archive has index 0. +.PP +Supported commands and arguments are: +.TP 12n +\fBadd\fR \fIname content\fR +Add file called +\fIname\fR +using the string +\fIcontent\fR +from the command line as data. +.TP 12n +\fBadd_dir\fR \fIname\fR +Add directory +\fIname\fR. +.TP 12n +\fBadd_file\fR \fIname file_to_add offset len\fR +Add file +\fIname\fR +to archive, using +\fIlen\fR +bytes from the file +\fIfile_to_add\fR +as input data, starting at +\fIoffset\fR. +.TP 12n +\fBadd_from_zip\fR \fIname archivename index offset len\fR +Add file called +\fIname\fR +to archive using data from another zip archive +\fIarchivename\fR +using the entry with index +\fIindex\fR +and reading +\fIlen\fR +bytes from +\fIoffset\fR. +.TP 12n +\fBcat\fR \fIindex\fR +Output file contents for entry +\fIindex\fR +to stdout. +.TP 12n +\fBcount_extra\fR \fIindex flags\fR +Print the number of extra fields for archive entry +\fIindex\fR +using +\fIflags\fR. +.TP 12n +\fBcount_extra_by_id\fR \fIindex extra_id flags\fR +Print number of extra fields of type +\fIextra_id\fR +for archive entry +\fIindex\fR +using +\fIflags\fR. +.TP 12n +\fBdelete\fR \fIindex\fR +Remove entry at +\fIindex\fR +from zip archive. +.TP 12n +\fBdelete_extra\fR \fIindex extra_idx flags\fR +Remove extra field number +\fIextra_idx\fR +from archive entry +\fIindex\fR +using +\fIflags\fR. +.TP 12n +\fBdelete_extra_by_id\fR \fIindex extra_id extra_index flags\fR +Remove extra field number +\fIextra_index\fR +of type +\fIextra_id\fR +from archive entry +\fIindex\fR +using +\fIflags\fR. +.TP 12n +\fBget_archive_comment\fR +Print archive comment. +.TP 12n +\fBget_extra\fR \fIindex extra_index flags\fR +Print extra field +\fIextra_index\fR +for archive entry +\fIindex\fR +using +\fIflags\fR. +.TP 12n +\fBget_extra_by_id\fR \fIindex extra_id extra_index flags\fR +Print extra field +\fIextra_index\fR +of type +\fIextra_id\fR +for archive entry +\fIindex\fR +using +\fIflags\fR. +.TP 12n +\fBget_file_comment\fR \fIindex\fR +Get file comment for archive entry +\fIindex\fR. +.TP 12n +\fBget_num_entries\fR \fIflags\fR +Print number of entries in archive using +\fIflags\fR. +.TP 12n +\fBname_locate\fR \fIname flags\fR +Find entry in archive with the filename +\fIname\fR +using +\fIflags\fR +and print its index. +.TP 12n +\fBrename\fR \fIindex name\fR +Rename archive entry +\fIindex\fR +to +\fIname\fR. +.TP 12n +\fBreplace_file_contents\fR \fIindex data\fR +Replace file contents for archive entry +\fIindex\fR +with the string +\fIdata\fR. +.TP 12n +\fBset_archive_comment\fR \fIcomment\fR +Set archive comment to +\fIcomment\fR. +.TP 12n +\fBset_extra\fR \fIindex extra_id extra_index flags value\fR +Set extra field number +\fIextra_index\fR +of type +\fIextra_id\fR +for archive entry +\fIindex\fR +using +\fIflags\fR +to +\fIvalue\fR. +.TP 12n +\fBset_file_comment\fR \fIindex comment\fR +Set file comment for archive entry +\fIindex\fR +to string +\fIcomment\fR. +.TP 12n +\fBset_file_compression\fR \fIindex method compression_flags\fR +Set file compression method for archive entry +\fIindex\fR +to +\fImethod\fR +using +\fIcompression_flags\fR. +\fINote\fR: +Currently, +\fIcompression_flags\fR +are ignored. +.TP 12n +\fBset_file_encryption\fR \fIindex method password\fR +Set file encryption method for archive entry +\fIindex\fR +to +\fImethod\fR +with password +\fIpassword\fR. +.TP 12n +\fBset_file_mtime\fR \fIindex timestamp\fR +Set file modification time for archive entry +\fIindex\fR +to UNIX mtime +\fItimestamp\fR. +.TP 12n +\fBset_file_mtime_all\fR \fItimestamp\fR +Set file modification time for all archive entries to UNIX mtime +\fItimestamp\fR. +.TP 12n +\fBset_password\fR \fIpassword\fR +Set default password for encryption/decryption to +\fIpassword\fR. +.TP 12n +\fBstat\fR \fIindex\fR +Print information about archive entry +\fIindex\fR. +.SS "Flags" +Some commands take flag arguments. Each character in the argument sets the corresponding flag. Use 0 or the empty string for no flags. +.PP +Supported flags are: +.RS 6n +.PD 0 +.TP 5n +\fI4\fR +\fRZIP_FL_ENC_CP437\fR +.TP 5n +\fI8\fR +\fRZIP_FL_ENC_UTF_8\fR +.TP 5n +\fIC\fR +\fRZIP_FL_NOCASE\fR +.TP 5n +\fIc\fR +\fRZIP_FL_CENTRAL\fR +.TP 5n +\fId\fR +\fRZIP_FL_NODIR\fR +.TP 5n +\fIl\fR +\fRZIP_FL_LOCAL\fR +.TP 5n +\fIr\fR +\fRZIP_FL_ENC_RAW\fR +.TP 5n +\fIs\fR +\fRZIP_FL_ENC_STRICT\fR +.TP 5n +\fIu\fR +\fRZIP_FL_UNCHANGED\fR +.RE +.PD +.SS "Compression Methods" +Some commands take compression method arguments. +Supported methods are: +.RS 6n +.PD 0 +.TP 4n +\fB\(bu\fR +\fRdefault\fR +.TP 4n +\fB\(bu\fR +\fRdeflate\fR +.TP 4n +\fB\(bu\fR +\fRstore\fR +.RE +.PD +.SS "Encryption Methods" +Some commands take encryption method arguments. +Supported methods are: +.RS 6n +.PD 0 +.TP 4n +\fB\(bu\fR +\fRnone\fR +.TP 4n +\fB\(bu\fR +\fRAES-128\fR +.TP 4n +\fB\(bu\fR +\fRAES-192\fR +.TP 4n +\fB\(bu\fR +\fRAES-256\fR +.RE +.PD +.SH "EXIT STATUS" +.br +The \fBziptool\fR utility exits\~0 on success, and\~>0 if an error occurs. +.SH "EXAMPLES" +Add a file called +\fIteststring.txt\fR +to the zip archive +\fItestbuffer.zip\fR +with data +\(lqThis is a test.\en\(rq +where +\(lq\en\(rq +is replaced with a newline character: +.nf +.sp +.RS 6n +ziptool testbuffer.zip add teststring.txt \\"This is a test.\en\\" +.RE +.fi +.PP +Delete the first file from the zip archive +\fItestfile.zip\fR: +.nf +.sp +.RS 6n +ziptool testfile.zip delete 0 +.RE +.fi +.SH "SEE ALSO" +zipcmp(1), +zipmerge(1), +libzip(3) +.SH "HISTORY" +\fBziptool\fR +was added in libzip 1.1. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/deps/libzip/man/ziptool.mdoc b/deps/libzip/man/ziptool.mdoc new file mode 100644 index 00000000000000..07508fb0032a4b --- /dev/null +++ b/deps/libzip/man/ziptool.mdoc @@ -0,0 +1,339 @@ +.\" ziptool.mdoc -- modify zip archives in multiple ways +.\" Copyright (C) 2016-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd March 15, 2022 +.Dt ZIPTOOL 1 +.Os +.Sh NAME +.Nm ziptool +.Nd modify zip archives +.Sh SYNOPSIS +.Nm +.Op Fl ceghnrst +.Op Fl l Ar length +.Op Fl o Ar offset +.Ar zip-archive +.Cm command Op Ar command-args ... +.Op Cm command Oo Ar command-args ... Oc ... +.Sh DESCRIPTION +.Nm +modifies the zip archive +.Ar zip-archive +according to the +.Ar commands +given. +.Pp +Supported options: +.Bl -tag -width MoMoffsetMM +.It Fl c +Check zip archive consistency when opening it. +.It Fl e +Error if archive already exists (only useful with +.Fl n ) . +.It Fl g +Guess file name encoding (for +.Cm stat +command). +.It Fl h +Display help. +.It Fl l Ar length +Only read +.Ar length +bytes of archive. +See also +.Fl o . +.It Fl n +Create archive if it doesn't exist. +See also +.Fl e . +.It Fl o Ar offset +Start reading input archive from +.Ar offset . +See also +.Fl l . +.It Fl r +Print raw file name encoding without translation (for +.Cm stat +command). +.It Fl s +Follow file name convention strictly (for +.Cm stat +command). +.It Fl t +Disregard current file contents, if any. +.Em Note : +use this with care, it deletes all existing file contents when +you modify the archive. +.El +.Ss Commands +For all commands below, the index is zero-based. +In other words, the first entry in the zip archive has index 0. +.Pp +Supported commands and arguments are: +.Bl -tag -width 10n +.It Cm add Ar name content +Add file called +.Ar name +using the string +.Ar content +from the command line as data. +.It Cm add_dir Ar name +Add directory +.Ar name . +.It Cm add_file Ar name file_to_add offset len +Add file +.Ar name +to archive, using +.Ar len +bytes from the file +.Ar file_to_add +as input data, starting at +.Ar offset . +.It Cm add_from_zip Ar name archivename index offset len +Add file called +.Ar name +to archive using data from another zip archive +.Ar archivename +using the entry with index +.Ar index +and reading +.Ar len +bytes from +.Ar offset . +.It Cm cat Ar index +Output file contents for entry +.Ar index +to stdout. +.It Cm count_extra Ar index flags +Print the number of extra fields for archive entry +.Ar index +using +.Ar flags . +.It Cm count_extra_by_id Ar index extra_id flags +Print number of extra fields of type +.Ar extra_id +for archive entry +.Ar index +using +.Ar flags . +.It Cm delete Ar index +Remove entry at +.Ar index +from zip archive. +.It Cm delete_extra Ar index extra_idx flags +Remove extra field number +.Ar extra_idx +from archive entry +.Ar index +using +.Ar flags . +.It Cm delete_extra_by_id Ar index extra_id extra_index flags +Remove extra field number +.Ar extra_index +of type +.Ar extra_id +from archive entry +.Ar index +using +.Ar flags . +.It Cm get_archive_comment +Print archive comment. +.It Cm get_extra Ar index extra_index flags +Print extra field +.Ar extra_index +for archive entry +.Ar index +using +.Ar flags . +.It Cm get_extra_by_id Ar index extra_id extra_index flags +Print extra field +.Ar extra_index +of type +.Ar extra_id +for archive entry +.Ar index +using +.Ar flags . +.It Cm get_file_comment Ar index +Get file comment for archive entry +.Ar index . +.It Cm get_num_entries Ar flags +Print number of entries in archive using +.Ar flags . +.It Cm name_locate Ar name flags +Find entry in archive with the filename +.Ar name +using +.Ar flags +and print its index. +.It Cm rename Ar index name +Rename archive entry +.Ar index +to +.Ar name . +.It Cm replace_file_contents Ar index data +Replace file contents for archive entry +.Ar index +with the string +.Ar data . +.It Cm set_archive_comment Ar comment +Set archive comment to +.Ar comment . +.It Cm set_extra Ar index extra_id extra_index flags value +Set extra field number +.Ar extra_index +of type +.Ar extra_id +for archive entry +.Ar index +using +.Ar flags +to +.Ar value . +.It Cm set_file_comment Ar index comment +Set file comment for archive entry +.Ar index +to string +.Ar comment . +.It Cm set_file_compression Ar index method compression_flags +Set file compression method for archive entry +.Ar index +to +.Ar method +using +.Ar compression_flags . +.Em Note : +Currently, +.Ar compression_flags +are ignored. +.It Cm set_file_encryption Ar index method password +Set file encryption method for archive entry +.Ar index +to +.Ar method +with password +.Ar password . +.It Cm set_file_mtime Ar index timestamp +Set file modification time for archive entry +.Ar index +to UNIX mtime +.Ar timestamp . +.It Cm set_file_mtime_all Ar timestamp +Set file modification time for all archive entries to UNIX mtime +.Ar timestamp . +.It Cm set_password Ar password +Set default password for encryption/decryption to +.Ar password . +.It Cm stat Ar index +Print information about archive entry +.Ar index . +.El +.Ss Flags +Some commands take flag arguments. Each character in the argument sets the corresponding flag. Use 0 or the empty string for no flags. +.Pp +Supported flags are: +.Bl -tag -width MMM -compact -offset indent +.It Ar 4 +.Dv ZIP_FL_ENC_CP437 +.It Ar 8 +.Dv ZIP_FL_ENC_UTF_8 +.It Ar C +.Dv ZIP_FL_NOCASE +.It Ar c +.Dv ZIP_FL_CENTRAL +.It Ar d +.Dv ZIP_FL_NODIR +.It Ar l +.Dv ZIP_FL_LOCAL +.It Ar r +.Dv ZIP_FL_ENC_RAW +.It Ar s +.Dv ZIP_FL_ENC_STRICT +.It Ar u +.Dv ZIP_FL_UNCHANGED +.El +.Ss Compression Methods +Some commands take compression method arguments. +Supported methods are: +.Bl -bullet -compact -offset indent +.It +.Dv default +.It +.Dv deflate +.It +.Dv store +.El +.Ss Encryption Methods +Some commands take encryption method arguments. +Supported methods are: +.Bl -bullet -compact -offset indent +.It +.Dv none +.It +.Dv AES-128 +.It +.Dv AES-192 +.It +.Dv AES-256 +.El +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +Add a file called +.Pa teststring.txt +to the zip archive +.Pa testbuffer.zip +with data +.Dq This is a test.\en +where +.Dq \en +is replaced with a newline character: +.Bd -literal -offset indent +ziptool testbuffer.zip add teststring.txt \\"This is a test.\en\\" +.Ed +.Pp +Delete the first file from the zip archive +.Pa testfile.zip : +.Bd -literal -offset indent +ziptool testfile.zip delete 0 +.Ed +.Sh SEE ALSO +.Xr zipcmp 1 , +.Xr zipmerge 1 , +.Xr libzip 3 +.Sh HISTORY +.Nm +was added in libzip 1.1. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/deps/libzip/regress/CMakeLists.txt b/deps/libzip/regress/CMakeLists.txt new file mode 100644 index 00000000000000..f36cef28498ad5 --- /dev/null +++ b/deps/libzip/regress/CMakeLists.txt @@ -0,0 +1,103 @@ +check_function_exists(getopt HAVE_GETOPT) + +set(TEST_PROGRAMS + add_from_filep + can_clone_file + fopen_unchanged + fseek + fuzz_main + nonrandomopentest + liboverride-test +) + +set(GETOPT_USERS + fread + tryopen +) + +set(HOLE_USERS + hole + ziptool_regress +) + +set(ZIP_PROGRAMS ${TEST_PROGRAMS} ${GETOPT_USERS} ${HOLE_USERS}) + +foreach(PROGRAM IN LISTS ZIP_PROGRAMS) + add_executable(${PROGRAM} ${PROGRAM}.c) + target_include_directories(${PROGRAM} PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) + target_link_libraries(${PROGRAM} zip) +endforeach() + +# both programs using source_hole.c also use getopt +if(NOT HAVE_GETOPT) + foreach(PROGRAM IN LISTS GETOPT_USERS HOLE_USERS) + target_sources(${PROGRAM} PRIVATE ../src/getopt.c) + target_include_directories(${PROGRAM} PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/src) + endforeach() +endif(NOT HAVE_GETOPT) + +foreach(PROGRAM IN LISTS HOLE_USERS) + target_sources(${PROGRAM} PRIVATE source_hole.c) +endforeach() + +# for including ziptool.c +target_include_directories(ziptool_regress PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/src) + +set(DL_USERS + # malloc + nonrandomopen + liboverride +) + +foreach(PROGRAM IN LISTS DL_USERS) + add_library(${PROGRAM} MODULE ${PROGRAM}.c) + target_include_directories(${PROGRAM} PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) +endforeach() + +add_custom_target(cleanup + COMMAND ${CMAKE_COMMAND} -DDIR=${PROJECT_BINARY_DIR}/regress -P ${PROJECT_SOURCE_DIR}/regress/cleanup.cmake + ) + +add_custom_target(testinput + ALL + VERBATIM + COMMAND ${CMAKE_COMMAND} -E tar x ${PROJECT_SOURCE_DIR}/regress/manyfiles-zip.zip + COMMAND ${CMAKE_COMMAND} -E tar x ${PROJECT_SOURCE_DIR}/regress/bigzero-zip.zip + DEPENDS ${PROJECT_SOURCE_DIR}/regress/manyfiles-zip.zip ${PROJECT_SOURCE_DIR}/regress/bigzero-zip.zip +) + +set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + bigzero.zip + manyfiles-133000.zip + manyfiles-65536.zip + manyfiles-fewer.zip + manyfiles-more.zip + manyfiles-zip64-modulo.zip + manyfiles-zip64.zip + manyfiles.zip +) + +set(path "$;$ENV{PATH}") +if (TARGET zlib) + set(path "$;${path}") +endif() +string(REPLACE ";" "\\;" path "${path}") + +set(ENV{srcdir} ${PROJECT_SOURCE_DIR}/regress) + +file(GLOB EXTRA_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/*.test) +foreach(FULL_CASE IN LISTS EXTRA_TESTS) + get_filename_component(CASE ${FULL_CASE} NAME) + add_test(NAME ${CASE} COMMAND ${PERL_EXECUTABLE} ${PROJECT_BINARY_DIR}/regress/runtest -v --bin-sub-directory $ ${PROJECT_SOURCE_DIR}/regress/${CASE}) + set_tests_properties(${CASE} PROPERTIES SKIP_RETURN_CODE 77) + set_tests_properties(${CASE} PROPERTIES ENVIRONMENT "PATH=${path}") +endforeach() + +set(XFAIL_TESTS +) + +foreach(CASE ${XFAIL_TESTS}) + set_tests_properties(${CASE} PROPERTIES WILL_FAIL TRUE) +endforeach() + +add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) diff --git a/deps/libzip/regress/NiHTest.pm b/deps/libzip/regress/NiHTest.pm new file mode 100644 index 00000000000000..cfb51b79a1d8e1 --- /dev/null +++ b/deps/libzip/regress/NiHTest.pm @@ -0,0 +1,1416 @@ +package NiHTest; + +use strict; +use warnings; + +use Cwd; +use File::Copy; +use File::Path qw(mkpath remove_tree); +use Getopt::Long qw(:config posix_default bundling no_ignore_case); +use IPC::Open3; +#use IPC::Cmd qw(run); +use Storable qw(dclone); +use Symbol 'gensym'; +use UNIVERSAL; + +#use Data::Dumper qw(Dumper); + +# NiHTest -- package to run regression tests +# Copyright (C) 2002-2016 Dieter Baron and Thomas Klausner +# +# This file is part of ckmame, a program to check rom sets for MAME. +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# runtest TESTNAME +# +# files: +# TESTNAME.test: test scenario +# +# test scenario: +# Lines beginning with # are comments. +# +# The following commands are recognized; return and args must +# appear exactly once, the others are optional. +# +# args ARGS +# run program with command line arguments ARGS +# +# description TEXT +# description of what test is for +# +# features FEATURE ... +# only run test if all FEATUREs are present, otherwise skip it. +# +# file TEST IN OUT +# copy file IN as TEST, compare against OUT after program run. +# +# file-del TEST IN +# copy file IN as TEST, check that it is removed by program. +# +# file-new TEST OUT +# check that file TEST is created by program and compare +# against OUT. +# +# mkdir MODE NAME +# create directory NAME with permissions MODE. +# +# precheck COMMAND ARGS ... +# if COMMAND exits with non-zero status, skip test. +# +# preload LIBRARY +# pre-load LIBRARY before running program. +# +# program PRG +# run PRG instead of ckmame. +# +# return RET +# RET is the expected exit code +# +# setenv VAR VALUE +# set environment variable VAR to VALUE. +# +# stderr TEXT +# program is expected to produce the error message TEXT. If +# multiple stderr commands are used, the messages are +# expected in the order given. +# +# stderr-replace REGEX REPLACEMENT +# run regex replacement over expected and got stderr output. +# +# stdin TEST +# Provide TEXT to program's stdin. +# +# stdin-file FILE +# pipe FILE to program's stdin. +# +# stdout TEXT +# program is expected to print TEXT to stdout. If multiple +# stdout commands are used, the messages are expected in +# the order given. +# +# touch MTIME FILE +# set last modified timestamp of FILE to MTIME (seconds since epoch). +# If FILE doesn't exist, an empty file is created. +# +# ulimit C VALUE +# set ulimit -C to VALUE while running the program. +# +# exit status +# runtest uses the following exit codes: +# 0: test passed +# 1: test failed +# 2: other error +# 77: test was skipped +# +# environment variables: +# RUN_GDB: if set, run gdb on program in test environment +# KEEP_BROKEN: if set, don't delete test environment if test failed +# NO_CLEANUP: if set, don't delete test environment +# SETUP_ONLY: if set, exit after creating test environment +# VERBOSE: if set, be more verbose (e. g., output diffs) + +my %EXIT_CODES = ( + PASS => 0, + FAIL => 1, + SKIP => 77, + ERROR => 99 + ); + +# MARK: - Public API + +sub new { + my $class = UNIVERSAL::isa ($_[0], __PACKAGE__) ? shift : __PACKAGE__; + my $self = bless {}, $class; + + my ($opts) = @_; + + $self->{default_program} = $opts->{default_program}; + $self->{zipcmp} = $opts->{zipcmp} // 'zipcmp'; + $self->{zipcmp_flags} = $opts->{zipcmp_flags} // '-p'; + + $self->{directives} = { + args => { type => 'string...', once => 1, required => 1 }, + description => { type => 'string', once => 1 }, + features => { type => 'string...', once => 1 }, + file => { type => 'string string string' }, + 'file-del' => { type => 'string string' }, + 'file-new' => { type => 'string string' }, + mkdir => { type => 'string string' }, + precheck => { type => 'string...' }, + preload => { type => 'string', once => 1 }, + program => { type => 'string', once => 1 }, + 'return' => { type => 'int', once => 1, required => 1 }, + setenv => { type => 'string string' }, + stderr => { type => 'string' }, + 'stderr-replace' => { type => 'string string' }, + stdin => { type => 'string' }, + 'stdin-file' => { type => 'string', once => 1 }, + stdout => { type => 'string' }, + touch => { type => 'int string' }, + ulimit => { type => 'char string' } + }; + + $self->{compare_by_type} = {}; + $self->{copy_by_type} = {}; + $self->{hooks} = {}; + + $self->get_variable('srcdir', $opts); + $self->get_variable('top_builddir', $opts); + + $self->{in_sandbox} = 0; + + $self->{verbose} = $ENV{VERBOSE}; + $self->{keep_broken} = $ENV{KEEP_BROKEN}; + $self->{no_cleanup} = $ENV{NO_CLEANUP}; + $self->{setup_only} = $ENV{SETUP_ONLY}; + + return $self; +} + + +sub add_comparator { + my ($self, $ext, $sub) = @_; + + return $self->add_file_proc('compare_by_type', $ext, $sub); +} + + +sub add_copier { + my ($self, $ext, $sub) = @_; + + return $self->add_file_proc('copy_by_type', $ext, $sub); +} + + +sub add_directive { + my ($self, $name, $def) = @_; + + if (exists($self->{directives}->{$name})) { + $self->die("directive $name already defined"); + } + + # TODO: validate $def + + $self->{directives}->{$name} = $def; + + return 1; +} + + +sub add_file_proc { + my ($self, $proc, $ext, $sub) = @_; + + $self->{$proc}->{$ext} = [] unless (defined($self->{$proc}->{$ext})); + unshift @{$self->{$proc}->{$ext}}, $sub; + + return 1; +} + + +sub add_hook { + my ($self, $hook, $sub) = @_; + + $self->{hooks}->{$hook} = [] unless (defined($self->{hooks}->{$hook})); + push @{$self->{hooks}->{$hook}}, $sub; + + return 1; +} + + +sub add_variant { + my ($self, $name, $hooks) = @_; + + if (!defined($self->{variants})) { + $self->{variants} = []; + $self->add_directive('variants' => { type => 'string...', once => 1 }); + } + for my $variant (@{$self->{variants}}) { + if ($variant->{name} eq $name) { + $self->die("variant $name already defined"); + } + } + + push @{$self->{variants}}, { name => $name, hooks => $hooks }; + + return 1; +} + + +sub end { + my ($self, @results) = @_; + + my $result = 'PASS'; + + for my $r (@results) { + if ($r eq 'ERROR' || ($r eq 'FAIL' && $result ne 'ERROR')) { + $result = $r; + } + } + + $self->end_test($result); +} + + +sub run { + my ($self, @argv) = @_; + + $self->setup(@argv); + + $self->end($self->runtest()); +} + + +sub runtest { + my ($self) = @_; + + if (defined($self->{variants})) { + my @results = (); + $self->{original_test} = $self->{test}; + + my %variants; + + if (defined($self->{test}->{variants})) { + %variants = map { $_ => 1; } @{$self->{test}->{variants}}; + } + + for my $variant (@{$self->{variants}}) { + next if (defined($self->{test}->{variants}) && !exists($variants{$variant->{name}})); + + $self->{variant_hooks} = $variant->{hooks}; + $self->{test} = dclone($self->{original_test}); + $self->{variant} = $variant->{name}; + $self->mangle_test_for_variant(); + push @results, $self->runtest_one($variant->{name}); + } + + return @results; + } + else { + return $self->runtest_one(); + } +} + + +sub runtest_one { + my ($self, $tag) = @_; + + $ENV{TZ} = "UTC"; + $ENV{LANG} = "C"; + $ENV{LC_CTYPE} = "C"; + $ENV{POSIXLY_CORRECT} = 1; + $self->sandbox_create($tag); + $self->sandbox_enter(); + + my $ok = 1; + $ok &= $self->copy_files(); + $ok &= $self->run_hook('post_copy_files'); + $ok &= $self->touch_files(); + $ok &= $self->run_hook('prepare_sandbox'); + return 'ERROR' unless ($ok); + + if ($self->{setup_only}) { + $self->sandbox_leave(); + return 'SKIP'; + } + + for my $env (@{$self->{test}->{'setenv'}}) { + $ENV{$env->[0]} = $env->[1]; + } + my $preload_env_var = 'LD_PRELOAD'; + if ($^O eq 'darwin') { + $preload_env_var = 'DYLD_INSERT_LIBRARIES'; + } + if (defined($self->{test}->{'preload'})) { + if (-f cwd() . "/../.libs/$self->{test}->{'preload'}") { + $ENV{$preload_env_var} = cwd() . "/../.libs/$self->{test}->{'preload'}"; + } else { + $ENV{$preload_env_var} = cwd() . "/../lib$self->{test}->{'preload'}"; + } + } + + $self->run_program(); + + for my $env (@{$self->{test}->{'setenv'}}) { + delete ${ENV{$env->[0]}}; + } + if (defined($self->{test}->{'preload'})) { + delete ${ENV{$preload_env_var}}; + } + + if ($self->{test}->{stdin}) { + $self->{stdin} = [ @{$self->{test}->{stdin}} ]; + } + + if ($self->{test}->{stdout}) { + $self->{expected_stdout} = [ @{$self->{test}->{stdout}} ]; + } + else { + $self->{expected_stdout} = []; + } + if ($self->{test}->{stderr}) { + $self->{expected_stderr} = [ @{$self->{test}->{stderr}} ]; + } + else { + $self->{expected_stderr} = []; + } + + $self->run_hook('post_run_program'); + + my @failed = (); + + if ($self->{exit_status} != ($self->{test}->{return} // 0)) { + push @failed, 'exit status'; + if ($self->{verbose}) { + print "Unexpected exit status:\n"; + print "-" . ($self->{test}->{return} // 0) . "\n+$self->{exit_status}\n"; + } + } + + if (!$self->compare_arrays($self->{expected_stdout}, $self->{stdout}, 'output')) { + push @failed, 'output'; + } + if (!$self->compare_arrays($self->{expected_stderr}, $self->{stderr}, 'error output')) { + push @failed, 'error output'; + } + if (!$self->compare_files()) { + push @failed, 'files'; + } + + $self->{failed} = \@failed; + + $self->run_hook('checks'); + + my $result = scalar(@{$self->{failed}}) == 0 ? 'PASS' : 'FAIL'; + + $self->sandbox_leave(); + if (!($self->{no_cleanup} || ($self->{keep_broken} && $result eq 'FAIL'))) { + $self->sandbox_remove(); + } + + $self->print_test_result($tag, $result, join ', ', @{$self->{failed}}); + + return $result; +} + + +sub setup { + my ($self, @argv) = @_; + + my @save_argv = @ARGV; + @ARGV = @argv; + my $ok = GetOptions( + 'help|h' => \my $help, + 'bin-sub-directory=s' => \$self->{bin_sub_directory}, + 'keep-broken|k' => \$self->{keep_broken}, + 'no-cleanup' => \$self->{no_cleanup}, + # 'run-gdb' => \$self->{run_gdb}, + 'setup-only' => \$self->{setup_only}, + 'verbose|v' => \$self->{verbose} + ); + @argv = @ARGV; + @ARGV = @save_argv; + + if (!$ok || scalar(@argv) != 1 || $help) { + print STDERR "Usage: $0 [-hv] [--bin-sub-directory DIR] [--keep-broken] [--no-cleanup] [--setup-only] testcase\n"; + exit(1); + } + + my $testcase = shift @argv; + + $testcase .= '.test' unless ($testcase =~ m/\.test$/); + + my $testcase_file = $self->find_file($testcase); + + $self->die("cannot find test case $testcase") unless ($testcase_file); + + $testcase =~ s,^(?:.*/)?([^/]*)\.test$,$1,; + $self->{testname} = $testcase; + + $self->die("error in test case definition") unless $self->parse_case($testcase_file); + + $self->check_features_requirement() if ($self->{test}->{features}); + $self->run_precheck() if ($self->{test}->{precheck}); + + $self->end_test('SKIP') if ($self->{test}->{preload} && ($^O eq 'darwin' || $^O eq 'MSWin32')); + $self->end_test('SKIP') if (($self->{test}->{stdin} || $self->{test}->{'stdin-file'}) && $^O eq 'MSWin32'); +} + + +# MARK: - Internal Methods + +sub add_file { + my ($self, $file) = @_; + + if (defined($self->{files}->{$file->{destination}})) { + $self->warn("duplicate specification for input file $file->{destination}"); + return undef; + } + + $self->{files}->{$file->{destination}} = $file; + + return 1; +} + + +sub check_features_requirement() { + my ($self) = @_; + + my %features; + + my $fh; + unless (open($fh, '<', "$self->{top_builddir}/config.h")) { + $self->die("cannot open config.h in top builddir $self->{top_builddir}"); + } + while (my $line = <$fh>) { + if ($line =~ m/^#define HAVE_([A-Z0-9_a-z]*)/) { + $features{$1} = 1; + } + } + close($fh); + + my @missing = (); + for my $feature (@{$self->{test}->{features}}) { + if (!$features{$feature}) { + push @missing, $feature; + } + } + + if (scalar @missing > 0) { + my $reason = "missing features"; + if (scalar(@missing) == 1) { + $reason = "missing feature"; + } + $self->print_test_result('SKIP', "$reason: " . (join ' ', @missing)); + $self->end_test('SKIP'); + } + + return 1; +} + + +sub comparator_zip { + my ($self, $got, $expected) = @_; + + my $zipcmp = (-f $self->{zipcmp}) ? $self->{zipcmp} : $self->find_program('zipcmp'); + my @args = ($zipcmp, $self->{verbose} ? '-v' : '-q'); + push @args, $self->{zipcmp_flags} if ($self->{zipcmp_flags}); + push @args, ($expected, $got); + + my $ret = system(@args); + + return $ret == 0; +} + + +sub compare_arrays() { + my ($self, $a, $b, $tag) = @_; + + my $ok = 1; + + if (scalar(@$a) != scalar(@$b)) { + $ok = 0; + } + else { + for (my $i = 0; $i < scalar(@$a); $i++) { + if ($a->[$i] ne $b->[$i]) { + $ok = 0; + last; + } + } + } + + if (!$ok && $self->{verbose}) { + print "Unexpected $tag:\n"; + print "--- expected\n+++ got\n"; + + diff_arrays($a, $b); + } + + return $ok; +} + +sub file_cmp($$) { + my ($a, $b) = @_; + my $result = 0; + open my $fha, "< $a"; + open my $fhb, "< $b"; + binmode $fha; + binmode $fhb; + BYTE: while (!eof $fha && !eof $fhb) { + if (getc $fha ne getc $fhb) { + $result = 1; + last BYTE; + } + } + $result = 1 if eof $fha != eof $fhb; + close $fha; + close $fhb; + return $result; +} + +sub compare_file($$$) { + my ($self, $got, $expected) = @_; + + my $real_expected = $self->find_file($expected); + unless ($real_expected) { + $self->warn("cannot find expected result file $expected"); + return 0; + } + + my $ok = $self->run_comparator($got, $real_expected); + + if (!defined($ok)) { + my $ret; + if ($self->{verbose}) { + $ret = system('diff', '-u', $real_expected, $got); + } + else { + $ret = file_cmp($real_expected, $got); + } + $ok = ($ret == 0); + } + + return $ok; +} + +sub list_files { + my ($root) = @_; + my $ls; + + my @files = (); + my @dirs = ($root); + + while (scalar(@dirs) > 0) { + my $dir = shift @dirs; + + opendir($ls, $dir); + unless ($ls) { + # TODO: handle error + } + while (my $entry = readdir($ls)) { + my $file = "$dir/$entry"; + if ($dir eq '.') { + $file = $entry; + } + + if (-f $file) { + push @files, "$file"; + } + if (-d $file && $entry ne '.' && $entry ne '..') { + push @dirs, "$file"; + } + } + closedir($ls); + } + + return @files; +} + +sub compare_files() { + my ($self) = @_; + + my $ok = 1; + + + my @files_got = sort(list_files(".")); + my @files_should = (); + + for my $file (sort keys %{$self->{files}}) { + push @files_should, $file if ($self->{files}->{$file}->{result} || $self->{files}->{$file}->{ignore}); + } + + $self->{files_got} = \@files_got; + $self->{files_should} = \@files_should; + + unless ($self->run_hook('post_list_files')) { + return 0; + } + + $ok = $self->compare_arrays($self->{files_should}, $self->{files_got}, 'files'); + + for my $file (@{$self->{files_got}}) { + my $file_def = $self->{files}->{$file}; + next unless ($file_def && $file_def->{result}); + + $ok &= $self->compare_file($file, $file_def->{result}); + } + + return $ok; +} + + +sub copy_files { + my ($self) = @_; + + my $ok = 1; + + for my $filename (sort keys %{$self->{files}}) { + my $file = $self->{files}->{$filename}; + next unless ($file->{source}); + + my $src = $self->find_file($file->{source}); + unless ($src) { + $self->warn("cannot find input file $file->{source}"); + $ok = 0; + next; + } + + if ($file->{destination} =~ m,/,) { + my $dir = $file->{destination}; + $dir =~ s,/[^/]*$,,; + if (! -d $dir) { + mkpath($dir); + } + } + + my $this_ok = $self->run_copier($src, $file->{destination}); + if (defined($this_ok)) { + $ok &= $this_ok; + } + else { + unless (copy($src, $file->{destination})) { + $self->warn("cannot copy $src to $file->{destination}: $!"); + $ok = 0; + } + } + } + + if (defined($self->{test}->{mkdir})) { + for my $dir_spec (@{$self->{test}->{mkdir}}) { + my ($mode, $dir) = @$dir_spec; + if (! -d $dir) { + unless (mkdir($dir, oct($mode))) { + $self->warn("cannot create directory $dir: $!"); + $ok = 0; + } + } + } + } + + $self->die("failed to copy input files") unless ($ok); +} + + +sub die() { + my ($self, $msg) = @_; + + print STDERR "$0: $msg\n" if ($msg); + + $self->end_test('ERROR'); +} + + +sub end_test { + my ($self, $status) = @_; + + my $exit_code = $EXIT_CODES{$status} // $EXIT_CODES{ERROR}; + + $self->exit($exit_code); +} + + + +sub exit() { + my ($self, $status) = @_; + ### TODO: cleanup + + exit($status); +} + + +sub find_file() { + my ($self, $fname) = @_; + + for my $dir (('', "$self->{srcdir}/")) { + my $f = "$dir$fname"; + $f = "../$f" if ($self->{in_sandbox} && $dir !~ m,^(\w:)?/,); + + return $f if (-f $f); + } + + return undef; +} + + +sub get_extension { + my ($self, $fname) = @_; + + my $ext = $fname; + if ($ext =~ m/\./) { + $ext =~ s/.*\.//; + } + else { + $ext = ''; + } + + return $ext; +} + + +sub get_variable { + my ($self, $name, $opts) = @_; + + $self->{$name} = $opts->{$name} // $ENV{$name}; + if (!defined($self->{$name}) || $self->{$name} eq '') { + my $fh; + unless (open($fh, '<', 'Makefile')) { + $self->die("cannot open Makefile: $!"); + } + while (my $line = <$fh>) { + chomp $line; + if ($line =~ m/^$name = (.*)/) { + $self->{$name} = $1; + last; + } + } + close ($fh); + } + if (!defined($self->{$name}) || $self->{$name} eq '') { + $self->die("cannot get variable $name"); + } +} + + +sub mangle_test_for_variant { + my ($self) = @_; + + $self->{test}->{stdout} = $self->strip_tags($self->{variant}, $self->{test}->{stdout}); + $self->{test}->{stderr} = $self->strip_tags($self->{variant}, $self->{test}->{stderr}); + $self->run_hook('mangle_test'); + + return 1; +} + +sub parse_args { + my ($self, $type, $str) = @_; + + if ($type eq 'string...') { + my $args = []; + + while ($str ne '') { + if ($str =~ m/^\"/) { + unless ($str =~ m/^\"([^\"]*)\"\s*(.*)/) { + $self->warn_file_line("unclosed quote in [$str]"); + return undef; + } + push @$args, $1; + $str = $2; + } + else { + $str =~ m/^(\S+)\s*(.*)/; + push @$args, $1; + $str = $2; + } + } + + return $args; + } + elsif ($type =~ m/(\s|\.\.\.$)/) { + my $ellipsis = 0; + if ($type =~ m/(.*)\.\.\.$/) { + $ellipsis = 1; + $type = $1; + } + my @types = split /\s+/, $type; + my @strs = split /\s+/, $str; + my $optional = 0; + for (my $i = scalar(@types) - 1; $i >= 0; $i--) { + last unless ($types[$i] =~ m/(.*)\?$/); + $types[$i] = $1; + $optional++; + } + + if ($ellipsis && $optional > 0) { + # TODO: check this when registering a directive + $self->warn_file_line("can't use ellipsis together with optional arguments"); + return undef; + } + if (!$ellipsis && (scalar(@strs) < scalar(@types) - $optional || scalar(@strs) > scalar(@types))) { + my $expected = scalar(@types); + if ($optional > 0) { + $expected = ($expected - $optional) . "-$expected"; + } + $self->warn_file_line("expected $expected arguments, got " . (scalar(@strs))); + return undef; + } + + my $args = []; + + my $n = scalar(@types); + for (my $i=0; $iparse_args(($i >= $n ? $types[$n-1] : $types[$i]), $strs[$i]); + return undef unless (defined($val)); + push @$args, $val; + } + + return $args; + } + else { + if ($type eq 'string') { + return $str; + } + elsif ($type eq 'int') { + if ($str !~ m/^\d+$/) { + $self->warn_file_line("illegal int [$str]"); + return undef; + } + return $str+0; + } + elsif ($type eq 'char') { + if ($str !~ m/^.$/) { + $self->warn_file_line("illegal char [$str]"); + return undef; + } + return $str; + } + else { + $self->warn_file_line("unknown type $type"); + return undef; + } + } +} + + +sub parse_case() { + my ($self, $fname) = @_; + + my $ok = 1; + + open TST, "< $fname" or $self->die("cannot open test case $fname: $!"); + + $self->{testcase_fname} = $fname; + + my %test = (); + + while (my $line = ) { + $line =~ s/(\n|\r)//g; + + next if ($line =~ m/^\#/); + + unless ($line =~ m/(\S*)(?:\s(.*))?/) { + $self->warn_file_line("cannot parse line $line"); + $ok = 0; + next; + } + my ($cmd, $argstring) = ($1, $2//""); + + my $def = $self->{directives}->{$cmd}; + + unless ($def) { + $self->warn_file_line("unknown directive $cmd in test file"); + $ok = 0; + next; + } + + my $args = $self->parse_args($def->{type}, $argstring); + + unless (defined($args)) { + $ok = 0; + next; + } + + if ($def->{once}) { + if (defined($test{$cmd})) { + $self->warn_file_line("directive $cmd appeared twice in test file"); + } + $test{$cmd} = $args; + } + else { + $test{$cmd} = [] unless (defined($test{$cmd})); + push @{$test{$cmd}}, $args; + } + } + + close TST; + + return undef unless ($ok); + + for my $cmd (sort keys %test) { + if ($self->{directives}->{$cmd}->{required} && !defined($test{$cmd})) { + $self->warn_file("required directive $cmd missing in test file"); + $ok = 0; + } + } + + if ($test{'stdin-file'} && $test{stdin}) { + $self->warn_file("both stdin-file and stdin provided, choose one"); + $ok = 0; + } + + if (defined($self->{variants})) { + if (defined($test{variants})) { + for my $name (@{$test{variants}}) { + my $found = 0; + for my $variant (@{$self->{variants}}) { + if ($name eq $variant->{name}) { + $found = 1; + last; + } + } + if ($found == 0) { + $self->warn_file("unknown variant $name"); + $ok = 0; + } + } + } + } + + return undef unless ($ok); + + if (defined($test{'stderr-replace'}) && defined($test{stderr})) { + $test{stderr} = [ map { $self->stderr_rewrite($test{'stderr-replace'}, $_); } @{$test{stderr}} ]; + } + + if (!defined($test{program})) { + $test{program} = $self->{default_program}; + } + + $self->{test} = \%test; + + $self->run_hook('mangle_program'); + + if (!$self->parse_postprocess_files()) { + return 0; + } + + return $self->run_hook('post_parse'); +} + + +sub parse_postprocess_files { + my ($self) = @_; + + $self->{files} = {}; + + my $ok = 1; + + for my $file (@{$self->{test}->{file}}) { + $ok = 0 unless ($self->add_file({ source => $file->[1], destination => $file->[0], result => $file->[2] })); + } + + for my $file (@{$self->{test}->{'file-del'}}) { + $ok = 0 unless ($self->add_file({ source => $file->[1], destination => $file->[0], result => undef })); + } + + for my $file (@{$self->{test}->{'file-new'}}) { + $ok = 0 unless ($self->add_file({ source => undef, destination => $file->[0], result => $file->[1] })); + } + + return $ok; +} + + +sub print_test_result { + my ($self, $tag, $result, $reason) = @_; + + if ($self->{verbose}) { + print "$self->{testname}"; + print " ($tag)" if ($tag); + print " -- $result"; + print ": $reason" if ($reason); + print "\n"; + } +} + + +sub run_comparator { + my ($self, $got, $expected) = @_; + + return $self->run_file_proc('compare_by_type', $got, $expected); +} + + +sub run_copier { + my ($self, $src, $dest) = @_; + + return $self->run_file_proc('copy_by_type', $src, $dest); +} + + +sub run_file_proc { + my ($self, $proc, $got, $expected) = @_; + + my $ext = ($self->get_extension($got)) . '/' . ($self->get_extension($expected)); + + if ($self->{variant}) { + if (defined($self->{$proc}->{"$self->{variant}/$ext"})) { + for my $sub (@{$self->{$proc}->{"$self->{variant}/$ext"}}) { + my $ret = $sub->($self, $got, $expected); + return $ret if (defined($ret)); + } + } + } + if (defined($self->{$proc}->{$ext})) { + for my $sub (@{$self->{$proc}->{$ext}}) { + my $ret = $sub->($self, $got, $expected); + return $ret if (defined($ret)); + } + } + + return undef; +} + + +sub run_hook { + my ($self, $hook) = @_; + + my $ok = 1; + + my @hooks = (); + + if (defined($self->{variant_hooks}) && defined($self->{variant_hooks}->{$hook})) { + push @hooks, $self->{variant_hooks}->{$hook}; + } + if (defined($self->{hooks}->{$hook})) { + push @hooks, @{$self->{hooks}->{$hook}}; + } + + for my $sub (@hooks) { + unless ($sub->($self, $hook, $self->{variant})) { + $self->warn("hook $hook failed"); + $ok = 0; + } + } + + return $ok; +} + + +sub args_decode { + my ($str, $srcdir) = @_; + + if ($str =~ m/\\/) { + $str =~ s/\\a/\a/gi; + $str =~ s/\\b/\b/gi; + $str =~ s/\\f/\f/gi; + $str =~ s/\\n/\n/gi; + $str =~ s/\\r/\r/gi; + $str =~ s/\\t/\t/gi; + $str =~ s/\\v/\cK/gi; + $str =~ s/\\s/ /gi; + # TODO: \xhh, \ooo + $str =~ s/\\(.)/$1/g; + } + + if ($srcdir !~ m,^/,) { + $srcdir = "../$srcdir"; + } + + if ($str =~ m/^\$srcdir(.*)/) { + $str = "$srcdir$1"; + } + + return $str; +} + + +sub run_precheck { + my ($self) = @_; + + for my $precheck (@{$self->{test}->{precheck}}) { + unless (system(@{$precheck}) == 0) { + $self->print_test_result('SKIP', "precheck failed"); + $self->end_test('SKIP'); + } + } + + return 1; +} + + +sub find_program() { + my ($self, $pname) = @_; + + my @directories = ("."); + if ($self->{bin_sub_directory}) { + push @directories, $self->{bin_sub_directory}; + } + + for my $up (('.', '..', '../..', '../../..')) { + for my $sub (('.', 'src')) { + for my $dir (@directories) { + for my $ext (('', '.exe')) { + my $f = "$up/$sub/$dir/$pname$ext"; + return $f if (-f $f); + } + } + } + } + + return undef; +} + + +sub run_program { + my ($self) = @_; + my ($stdin, $stdout, $stderr); + $stderr = gensym; + + my @cmd = ($self->find_program($self->{test}->{program}), map ({ args_decode($_, $self->{srcdir}); } @{$self->{test}->{args}})); + + ### TODO: catch errors? + + my $pid; + if ($self->{test}->{'stdin-file'}) { + open(SPLAT, '<', $self->{test}->{'stdin-file'}); + my $is_marked = eof SPLAT; # mark used + $pid = open3("<&SPLAT", $stdout, $stderr, @cmd); + } + else { + $pid = open3($stdin, $stdout, $stderr, @cmd); + } + $self->{stdout} = []; + $self->{stderr} = []; + + if ($self->{test}->{stdin}) { + foreach my $line (@{$self->{test}->{stdin}}) { + print $stdin $line . "\n"; + } + close($stdin); + } + + while (my $line = <$stdout>) { + $line =~ s/(\n|\r)//g; + push @{$self->{stdout}}, $line; + } + my $prg = $self->{test}->{program}; + $prg =~ s,.*/,,; + while (my $line = <$stderr>) { + $line =~ s/(\n|\r)//g; + $line =~ s/^[^: ]*$prg(\.exe)?: //; + if (defined($self->{test}->{'stderr-replace'})) { + $line = $self->stderr_rewrite($self->{test}->{'stderr-replace'}, $line); + } + push @{$self->{stderr}}, $line; + } + + waitpid($pid, 0); + + $self->{exit_status} = $? >> 8; +} + +sub sandbox_create { + my ($self, $tag) = @_; + + $tag = ($tag ? "-$tag" : ""); + $self->{sandbox_dir} = "sandbox-$self->{testname}$tag.d$$"; + + $self->die("sandbox $self->{sandbox_dir} already exists") if (-e $self->{sandbox_dir}); + + mkdir($self->{sandbox_dir}) or $self->die("cannot create sandbox $self->{sandbox_dir}: $!"); + + return 1; +} + + +sub sandbox_enter { + my ($self) = @_; + + $self->die("internal error: cannot enter sandbox before creating it") unless (defined($self->{sandbox_dir})); + + return if ($self->{in_sandbox}); + + chdir($self->{sandbox_dir}) or $self->die("cannot cd into sandbox $self->{sandbox_dir}: $!"); + + $self->{in_sandbox} = 1; +} + + +sub sandbox_leave { + my ($self) = @_; + + return if (!$self->{in_sandbox}); + + chdir('..') or $self->die("cannot leave sandbox: $!"); + + $self->{in_sandbox} = 0; +} + + +sub sandbox_remove { + my ($self) = @_; + + remove_tree($self->{sandbox_dir}); + + return 1; +} + + +sub strip_tags { + my ($self, $tag, $lines) = @_; + + my @stripped = (); + + for my $line (@$lines) { + if ($line =~ m/^<([a-zA-Z0-9_]*)> (.*)/) { + if ($1 eq $tag) { + push @stripped, $2; + } + } + else { + push @stripped, $line; + } + } + + return \@stripped; +} + + +sub touch_files { + my ($self) = @_; + + my $ok = 1; + + if (defined($self->{test}->{touch})) { + for my $args (@{$self->{test}->{touch}}) { + my ($mtime, $fname) = @$args; + + if (!-f $fname) { + my $fh; + unless (open($fh, "> $fname") and close($fh)) { + # TODO: error message + $ok = 0; + next; + } + } + unless (utime($mtime, $mtime, $fname) == 1) { + # TODO: error message + $ok = 0; + } + } + } + + return $ok; +} + + +sub warn { + my ($self, $msg) = @_; + + print STDERR "$0: $msg\n"; +} + + +sub warn_file { + my ($self, $msg) = @_; + + $self->warn("$self->{testcase_fname}: $msg"); +} + + +sub warn_file_line { + my ($self, $msg) = @_; + + $self->warn("$self->{testcase_fname}:$.: $msg"); +} + +sub stderr_rewrite { + my ($self, $pattern, $line) = @_; + for my $repl (@{$pattern}) { + $line =~ s/$repl->[0]/$repl->[1]/; + } + return $line; +} + + +# MARK: array diff + +sub diff_arrays { + my ($a, $b) = @_; + + my ($i, $j); + for ($i = $j = 0; $i < scalar(@$a) || $j < scalar(@$b);) { + if ($i >= scalar(@$a)) { + print "+$b->[$j]\n"; + $j++; + } + elsif ($j >= scalar(@$b)) { + print "-$a->[$i]\n"; + $i++; + } + elsif ($a->[$i] eq $b->[$j]) { + print " $a->[$i]\n"; + $i++; + $j++; + } + else { + my ($off_a, $off_b) = find_best_offsets($a, $i, $b, $j); + my ($off_b_2, $off_a_2) = find_best_offsets($b, $j, $a, $i); + + if ($off_a + $off_b > $off_a_2 + $off_b_2) { + $off_a = $off_a_2; + $off_b = $off_b_2; + } + + for (my $off = 0; $off < $off_a; $off++) { + print "-$a->[$i]\n"; + $i++; + } + for (my $off = 0; $off < $off_b; $off++) { + print "+$b->[$j]\n"; + $j++; + } + } + } + +} + +sub find_best_offsets { + my ($a, $i, $b, $j) = @_; + + my ($best_a, $best_b); + + for (my $off_a = 0; $off_a < (defined($best_a) ? $best_a + $best_b : scalar(@$a) - $i); $off_a++) { + my $off_b = find_entry($a->[$i+$off_a], $b, $j, defined($best_a) ? $best_a + $best_b - $off_a : scalar(@$b) - $j); + + next unless (defined($off_b)); + + if (!defined($best_a) || $best_a + $best_b > $off_a + $off_b) { + $best_a = $off_a; + $best_b = $off_b; + } + } + + if (!defined($best_a)) { + return (scalar(@$a) - $i, scalar(@$b) - $j); + } + + return ($best_a, $best_b); +} + +sub find_entry { + my ($entry, $array, $start, $max_offset) = @_; + + for (my $offset = 0; $offset < $max_offset; $offset++) { + return $offset if ($array->[$start + $offset] eq $entry); + } + + return undef; +} + +1; diff --git a/deps/libzip/regress/add_dir.test b/deps/libzip/regress/add_dir.test new file mode 100644 index 00000000000000..b6a4d371c0b8fc --- /dev/null +++ b/deps/libzip/regress/add_dir.test @@ -0,0 +1,4 @@ +# add directories to zip +return 0 +args testdir.zip add_dir testdir/ add_dir testdir-noslash +file-new testdir.zip testdir.zip diff --git a/deps/libzip/regress/add_from_buffer.test b/deps/libzip/regress/add_from_buffer.test new file mode 100644 index 00000000000000..6963c58af54796 --- /dev/null +++ b/deps/libzip/regress/add_from_buffer.test @@ -0,0 +1,4 @@ +# add buffer contents as file to zip +return 0 +args testbuffer.zip add teststring.txt "This is a test, and it seems to have been successful.\n" +file-new testbuffer.zip testbuffer.zip diff --git a/deps/libzip/regress/add_from_file.test b/deps/libzip/regress/add_from_file.test new file mode 100644 index 00000000000000..4f97d27814b1ab --- /dev/null +++ b/deps/libzip/regress/add_from_file.test @@ -0,0 +1,5 @@ +# add file to zip +return 0 +args -- testfile.zip add_file testfile.txt testfile.txt 0 -1 +file testfile.txt testfile.txt testfile.txt +file-new testfile.zip testfile.zip diff --git a/deps/libzip/regress/add_from_file_duplicate.test b/deps/libzip/regress/add_from_file_duplicate.test new file mode 100644 index 00000000000000..018b260a71f6cc --- /dev/null +++ b/deps/libzip/regress/add_from_file_duplicate.test @@ -0,0 +1,6 @@ +# add already existing file to zip, making duplicate names +return 1 +args -- testfile.zip add_file testfile.txt testfile.txt 0 -1 +file testfile.txt testfile.txt testfile.txt +file testfile.zip testfile.zip testfile.zip +stderr can't add file 'testfile.txt': File already exists diff --git a/deps/libzip/regress/add_from_file_twice_duplicate.test b/deps/libzip/regress/add_from_file_twice_duplicate.test new file mode 100644 index 00000000000000..511c90b2f13f0a --- /dev/null +++ b/deps/libzip/regress/add_from_file_twice_duplicate.test @@ -0,0 +1,6 @@ +# add file to zip twice, making duplicate names +return 1 +args -- testfile.zip add_file testfile.txt testfile.txt 0 -1 add_file testfile.txt testfile.txt 0 -1 +file testfile.txt testfile.txt testfile.txt +file-new testfile.zip testfile.zip +stderr can't add file 'testfile.txt': File already exists diff --git a/deps/libzip/regress/add_from_file_unchange.test b/deps/libzip/regress/add_from_file_unchange.test new file mode 100644 index 00000000000000..dff1c2f68e1940 --- /dev/null +++ b/deps/libzip/regress/add_from_file_unchange.test @@ -0,0 +1,4 @@ +# add file to zip, but revert before closing +return 0 +args -- testfile.zip add_file testfile.txt testfile.txt 0 -1 unchange 0 +file testfile.txt testfile.txt testfile.txt diff --git a/deps/libzip/regress/add_from_filep.c b/deps/libzip/regress/add_from_filep.c new file mode 100644 index 00000000000000..78c3d849082f36 --- /dev/null +++ b/deps/libzip/regress/add_from_filep.c @@ -0,0 +1,96 @@ +/* + add_from_filep.c -- test case for adding file to archive + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include + +#include "zip.h" + +static const char *prg; + +int +main(int argc, char *argv[]) { + const char *archive; + const char *file; + const char *name; + zip_t *za; + zip_source_t *zs; + int err; + FILE *fp; + + prg = argv[0]; + + if (argc != 3) { + fprintf(stderr, "usage: %s archive file\n", prg); + return 1; + } + + archive = argv[1]; + file = argv[2]; + + if ((za = zip_open(archive, ZIP_CREATE, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: can't open zip archive '%s': %s\n", prg, archive, zip_error_strerror(&error)); + zip_error_fini(&error); + return 1; + } + + if ((fp = fopen(file, "rb")) == NULL) { + fprintf(stderr, "%s: can't open input file '%s': %s\n", prg, file, strerror(errno)); + return 1; + } + + if ((zs = zip_source_filep(za, fp, 0, -1)) == NULL) { + fprintf(stderr, "%s: error creating file source for '%s': %s\n", prg, file, zip_strerror(za)); + return 1; + } + + if ((name = strrchr(file, '/')) == NULL) + name = file; + + if (zip_add(za, name, zs) == -1) { + zip_source_free(zs); + fprintf(stderr, "%s: can't add file '%s': %s\n", prg, file, zip_strerror(za)); + return 1; + } + + if (zip_close(za) == -1) { + fprintf(stderr, "%s: can't close zip archive '%s': %s\n", prg, archive, zip_strerror(za)); + return 1; + } + + return 0; +} diff --git a/deps/libzip/regress/add_from_filep.test b/deps/libzip/regress/add_from_filep.test new file mode 100644 index 00000000000000..3a2a8cfe3e4639 --- /dev/null +++ b/deps/libzip/regress/add_from_filep.test @@ -0,0 +1,6 @@ +# add file to zip +program add_from_filep +return 0 +args testfile.zip testfile.txt +file testfile.txt testfile.txt testfile.txt +file-new testfile.zip testfile.zip diff --git a/deps/libzip/regress/add_from_stdin.test b/deps/libzip/regress/add_from_stdin.test new file mode 100644 index 00000000000000..07f6c4a3cebe83 --- /dev/null +++ b/deps/libzip/regress/add_from_stdin.test @@ -0,0 +1,5 @@ +# add stdin to zip +stdin This is a test, and it seems to have been successful. +args -- teststdin.zip add_file teststring.txt /dev/stdin 0 -1 +return 0 +file-new teststdin.zip teststdin.zip diff --git a/deps/libzip/regress/add_from_zip_closed.test b/deps/libzip/regress/add_from_zip_closed.test new file mode 100644 index 00000000000000..4c52e56c3b4926 --- /dev/null +++ b/deps/libzip/regress/add_from_zip_closed.test @@ -0,0 +1,5 @@ +# add deflated file from zip to zip, but close the source before it can be read +return 1 +args -- testfile.zip add_from_zip abac-repeat.txt testdeflated.zzip 0 0 -1 zin_close 0 +file testdeflated.zzip testdeflated.zip testdeflated.zip +stderr can't close zip archive 'testfile.zip': Containing zip archive was closed diff --git a/deps/libzip/regress/add_from_zip_deflated.test b/deps/libzip/regress/add_from_zip_deflated.test new file mode 100644 index 00000000000000..ecff27dd414d27 --- /dev/null +++ b/deps/libzip/regress/add_from_zip_deflated.test @@ -0,0 +1,5 @@ +# add deflated file from zip to zip +return 0 +args -- testfile.zip add_from_zip abac-repeat.txt testdeflated.zzip 0 0 -1 +file testdeflated.zzip testdeflated.zip testdeflated.zip +file-new testfile.zip testdeflated.zip diff --git a/deps/libzip/regress/add_from_zip_deflated2.test b/deps/libzip/regress/add_from_zip_deflated2.test new file mode 100644 index 00000000000000..ad7b4b60430c4e --- /dev/null +++ b/deps/libzip/regress/add_from_zip_deflated2.test @@ -0,0 +1,5 @@ +# add deflated files from zip to zip +return 0 +args -- testfile.zip add_from_zip abac-repeat.txt testdeflated.zzip 0 0 -1 add_from_zip abac-repeat2.txt testdeflated.zzip 0 0 -1 +file testdeflated.zzip testdeflated.zip testdeflated.zip +file-new testfile.zip testdeflated2.zip diff --git a/deps/libzip/regress/add_from_zip_partial_deflated.test b/deps/libzip/regress/add_from_zip_partial_deflated.test new file mode 100644 index 00000000000000..69e95c6c85fe7d --- /dev/null +++ b/deps/libzip/regress/add_from_zip_partial_deflated.test @@ -0,0 +1,5 @@ +# add parts of a file from zip to zip +return 0 +args -- testfile.zip add_from_zip first firstsecond.zzip 0 0 9 add_from_zip second firstsecond.zzip 0 9 -1 +file firstsecond.zzip firstsecond.zip firstsecond.zip +file-new testfile.zip firstsecond-split-stored.zip diff --git a/deps/libzip/regress/add_from_zip_partial_stored.test b/deps/libzip/regress/add_from_zip_partial_stored.test new file mode 100644 index 00000000000000..41ebf21388dc06 --- /dev/null +++ b/deps/libzip/regress/add_from_zip_partial_stored.test @@ -0,0 +1,5 @@ +# add parts of a file from zip to zip +return 0 +args -- testfile.zip add_from_zip first firstsecond.zzip 1 0 9 add_from_zip second firstsecond.zzip 1 9 -1 +file firstsecond.zzip firstsecond.zip firstsecond.zip +file-new testfile.zip firstsecond-split-stored.zip diff --git a/deps/libzip/regress/add_from_zip_stored.test b/deps/libzip/regress/add_from_zip_stored.test new file mode 100644 index 00000000000000..2fcbe80cc7a244 --- /dev/null +++ b/deps/libzip/regress/add_from_zip_stored.test @@ -0,0 +1,5 @@ +# add stored file from zip to zip +return 0 +args -- testfile.zip add_from_zip abac-repeat.txt teststored.zzip 0 0 -1 +file teststored.zzip teststored.zip teststored.zip +file-new testfile.zip testdeflated.zip diff --git a/deps/libzip/regress/add_stored.test b/deps/libzip/regress/add_stored.test new file mode 100644 index 00000000000000..ea96f2532de7a0 --- /dev/null +++ b/deps/libzip/regress/add_stored.test @@ -0,0 +1,4 @@ +# add file, set compression method to ZIP_CM_STORE +return 0 +args -n test.zip add foo foo set_file_compression 0 store 0 +file-new test.zip foo-stored.zip diff --git a/deps/libzip/regress/add_stored_in_memory.test b/deps/libzip/regress/add_stored_in_memory.test new file mode 100644 index 00000000000000..50467c6e72776a --- /dev/null +++ b/deps/libzip/regress/add_stored_in_memory.test @@ -0,0 +1,4 @@ +# add file, set compression method to ZIP_CM_STORE +return 0 +args -mn test.zip add foo foo set_file_compression 0 store 0 +file-new test.zip foo-stored.zip diff --git a/deps/libzip/regress/bigstored.zh b/deps/libzip/regress/bigstored.zh new file mode 100644 index 0000000000000000000000000000000000000000..2a53bff036b0708978a8767d8b6b52892da91fed GIT binary patch literal 24632 zcmeI)F-ikL6adh_i6$x*79PO#2Gq{V*aZS1g$GbUBoGm_vrA*8C$Y~#at^^G#F=#y zh@glfY2GZmvwwDGc6jyY_lMnsDBE6s77?fY{;+#E=+)QS<#P9)f>R=47DdiD~X6sCJKb@w+Hqft&JNbec}0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBly@XrE^e1KFV;7|DgKRoB4SJY1GUsoWQZ!;O^w{PkZ zeBNj|17UlWAysZj)wmf9}L8;)Cw9_pjw?iS&1Rr(LQW^m1PcwBwd8t90v?4!OV@k(OU(2-Rqw z+{UxE>x_Q2$rw|weX04jE{!#>U>djBKJzyIOOzJqpV;FRr+OR-hj~_o@5+4oSD6D$ zZ_ekbJWXjI3R!=APTX(XJS^gAgHL@+|{?qQASgX-&R1x-B1);p5- zaVm3BJkOfp_S8Fn-z1`3iGmRue=RoKfF(FtvB(cI%=FPmKRFMEdKMc5O{#li)w0K6 zci}_AoK)w{-~7-(Ywi||h@b1cT4pG%|Lf6OUYx?`4qV(_X4qdIen!xwXX>O?`YAqf zwndnet;DfV{y-o{Dj4zp(%5X~z$1Bqlw4k1yN<3?bz}}?XR*SHX(ubUJHQbQQ7;288o-Cg#D14|Vi+ZvM3V@&h2!VnSCoY=E z3mhVgC^&+_gYZv+J4IT!#j1}gbK~%U2@gdud(YxrJI1+aj literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/bogus.zip b/deps/libzip/regress/bogus.zip new file mode 100644 index 00000000000000..7e538b626db328 --- /dev/null +++ b/deps/libzip/regress/bogus.zip @@ -0,0 +1 @@ +bogus data diff --git a/deps/libzip/regress/broken.zip b/deps/libzip/regress/broken.zip new file mode 100644 index 0000000000000000000000000000000000000000..2008c3244d97007f63d7f6be2e9a71d17a123bdb GIT binary patch literal 75091 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 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "config.h" + +#ifdef HAVE_CLONEFILE +#include +#include +#include +#include +#include +#include +#include +#elif defined(HAVE_FICLONERANGE) +#include +#include +#include +#include +#include +#include +#endif + +int +main(int argc, char *argv[]) { +#ifdef HAVE_CLONEFILE + struct statfs fs; + struct attrlist attribute_list; + struct { + uint32_t size; + vol_capabilities_attr_t capabilities; + } volume_attributes; + + if (statfs(".", &fs) < 0) { + fprintf(stderr, "%s: can't get mount point of current directory: %s\n", argv[0], strerror(errno)); + exit(1); + } + + /* Not all volumes support clonefile(). A volume can be tested for + clonefile() support by using getattrlist(2) to get the volume + capabilities attribute ATTR_VOL_CAPABILITIES, and then testing the + VOL_CAP_INT_CLONE flag. */ + + memset(&attribute_list, 0, sizeof(attribute_list)); + attribute_list.bitmapcount = ATTR_BIT_MAP_COUNT; + attribute_list.volattr = ATTR_VOL_INFO | ATTR_VOL_CAPABILITIES; + memset(&volume_attributes, 0, sizeof(volume_attributes)); + + if (getattrlist(fs.f_mntonname, &attribute_list, &volume_attributes, sizeof(volume_attributes), 0) < 0) { + fprintf(stderr, "%s: can't get volume capabilities of '%s': %s\n", argv[0], fs.f_mntonname, strerror(errno)); + exit(1); + } + + if (volume_attributes.capabilities.capabilities[VOL_CAPABILITIES_INTERFACES] & VOL_CAP_INT_CLONE) { + exit(0); + } +#elif defined(HAVE_FICLONERANGE) + char namea[32] = "a.fioclone.XXXXXX"; + char nameb[32] = "b.fioclone.XXXXXX"; + int fda, fdb, ret; + struct file_clone_range range; + + if ((fda = mkstemp(namea)) < 0) { + fprintf(stderr, "can't create temp file a: %s\n", strerror(errno)); + exit(1); + } + if ((fdb = mkstemp(nameb)) < 0) { + fprintf(stderr, "can't create temp file b: %s\n", strerror(errno)); + (void)close(fda); + (void)remove(namea); + exit(1); + } + if (write(fda, "test\n", 5) < 0) { + fprintf(stderr, "can't write temp file a: %s\n", strerror(errno)); + (void)close(fda); + (void)remove(namea); + close(fdb); + (void)remove(nameb); + exit(1); + } + range.src_fd = fda; + range.src_offset = 0; + range.src_length = 0; + range.dest_offset = 0; + ret = ioctl(fdb, FICLONERANGE, &range); + (void)close(fda); + (void)close(fdb); + (void)remove(namea); + (void)remove(nameb); + if (ret >= 0) { + exit(0); + } +#endif + + exit(1); +} diff --git a/deps/libzip/regress/cancel_45.test b/deps/libzip/regress/cancel_45.test new file mode 100644 index 00000000000000..dc125f33f7133a --- /dev/null +++ b/deps/libzip/regress/cancel_45.test @@ -0,0 +1,8 @@ +# test default compression stores if smaller; test cancel after 45% +return 1 +args -n test.zip cancel 45 add compressible aaaaaaaaaaaaaa add uncompressible uncompressible add_nul large-compressible 8200 add_file large-uncompressible large-uncompressible 0 -1 +file large-uncompressible large-uncompressible large-uncompressible +stdout 0.0% done +stdout 25.0% done +stdout 50.0% done +stderr can't close zip archive 'test.zip': Operation cancelled diff --git a/deps/libzip/regress/cancel_90.test b/deps/libzip/regress/cancel_90.test new file mode 100644 index 00000000000000..072380d84aa734 --- /dev/null +++ b/deps/libzip/regress/cancel_90.test @@ -0,0 +1,10 @@ +# test default compression stores if smaller; test cancel after 90% +return 1 +args -n test.zip cancel 90 add compressible aaaaaaaaaaaaaa add uncompressible uncompressible add_nul large-compressible 8200 add_file large-uncompressible large-uncompressible 0 -1 +file large-uncompressible large-uncompressible large-uncompressible +stdout 0.0% done +stdout 25.0% done +stdout 50.0% done +stdout 75.0% done +stdout 100.0% done +stderr can't close zip archive 'test.zip': Operation cancelled diff --git a/deps/libzip/regress/cleanup.cmake b/deps/libzip/regress/cleanup.cmake new file mode 100644 index 00000000000000..94fd13ffbe8d12 --- /dev/null +++ b/deps/libzip/regress/cleanup.cmake @@ -0,0 +1,7 @@ +# expect variable DIR +FILE(GLOB CLEANDIRS "${DIR}/sandbox-*.d[0-9]*") +IF (CLEANDIRS) + MESSAGE(STATUS "Removing ${CLEANDIRS}") + FILE(REMOVE_RECURSE ${CLEANDIRS}) +ENDIF() + diff --git a/deps/libzip/regress/clone-buffer-add.test b/deps/libzip/regress/clone-buffer-add.test new file mode 100644 index 00000000000000..c66791bff07c65 --- /dev/null +++ b/deps/libzip/regress/clone-buffer-add.test @@ -0,0 +1,4 @@ +# test cloning archive from buffer, add new file +return 0 +args -mF 100 test.zzip add new "A new file." set_file_mtime 3 1512998132 +file test.zzip gap.zip gap-add.zip diff --git a/deps/libzip/regress/clone-buffer-delete.test b/deps/libzip/regress/clone-buffer-delete.test new file mode 100644 index 00000000000000..f7c987cb1634e3 --- /dev/null +++ b/deps/libzip/regress/clone-buffer-delete.test @@ -0,0 +1,4 @@ +# test cloning archive from buffer, deleting a file +return 0 +args -mF 100 test.zzip delete 2 +file test.zzip gap.zip gap-delete.zip diff --git a/deps/libzip/regress/clone-buffer-replace.test b/deps/libzip/regress/clone-buffer-replace.test new file mode 100644 index 00000000000000..cb21f339fc75ca --- /dev/null +++ b/deps/libzip/regress/clone-buffer-replace.test @@ -0,0 +1,4 @@ +# test cloning archive from buffer, replacing a file +return 0 +args -mF 100 test.zzip replace_file_contents 2 "A changed file." set_file_mtime 2 1512998082 +file test.zzip gap.zip gap-replace.zip diff --git a/deps/libzip/regress/clone-fs-add.test b/deps/libzip/regress/clone-fs-add.test new file mode 100644 index 00000000000000..f187cb720b5c59 --- /dev/null +++ b/deps/libzip/regress/clone-fs-add.test @@ -0,0 +1,5 @@ +# test cloning archive from filesystem, add new file +precheck ./can_clone_file +return 0 +args test.zzip add new "A new file." set_file_mtime 3 1512998132 +file test.zzip gap.zip gap-add.zip diff --git a/deps/libzip/regress/clone-fs-delete.test b/deps/libzip/regress/clone-fs-delete.test new file mode 100644 index 00000000000000..aea602f994b50e --- /dev/null +++ b/deps/libzip/regress/clone-fs-delete.test @@ -0,0 +1,5 @@ +# test cloning archive from filesystem, deleting a file +precheck ./can_clone_file +return 0 +args test.zzip delete 2 +file test.zzip gap.zip gap-delete.zip diff --git a/deps/libzip/regress/clone-fs-replace.test b/deps/libzip/regress/clone-fs-replace.test new file mode 100644 index 00000000000000..3d3b8f360ab1c9 --- /dev/null +++ b/deps/libzip/regress/clone-fs-replace.test @@ -0,0 +1,5 @@ +# test cloning archive from filesystem, replacing a file +precheck ./can_clone_file +return 0 +args test.zzip replace_file_contents 2 "A changed file." set_file_mtime 2 1512998082 +file test.zzip gap.zip gap-replace.zip diff --git a/deps/libzip/regress/cm-default.test b/deps/libzip/regress/cm-default.test new file mode 100644 index 00000000000000..7be63442ef3b2d --- /dev/null +++ b/deps/libzip/regress/cm-default.test @@ -0,0 +1,5 @@ +# test default compression stores if smaller +return 0 +args -n test.zip add compressible aaaaaaaaaaaaaa add uncompressible uncompressible add_nul large-compressible 8200 add_file large-uncompressible large-uncompressible 0 -1 +file-new test.zip cm-default.zip +file large-uncompressible large-uncompressible large-uncompressible diff --git a/deps/libzip/regress/cm-default.zip b/deps/libzip/regress/cm-default.zip new file mode 100644 index 0000000000000000000000000000000000000000..341edd9bb1b43277a7a8223a55c548e737d9799c GIT binary patch literal 8702 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 Y{V)IDUjPa9R|WCsdHOS66aAh252uxL<^TWy literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/count_entries.test b/deps/libzip/regress/count_entries.test new file mode 100644 index 00000000000000..564acdca510bf0 --- /dev/null +++ b/deps/libzip/regress/count_entries.test @@ -0,0 +1,5 @@ +# zip_open: count entries for archive with >65k entries +args manyfiles.zip get_num_entries 0 +return 0 +file manyfiles.zip manyfiles.zip manyfiles.zip +stdout 70000 entries in archive diff --git a/deps/libzip/regress/decrypt-correct-password-aes128.test b/deps/libzip/regress/decrypt-correct-password-aes128.test new file mode 100644 index 00000000000000..470ba30ffd2451 --- /dev/null +++ b/deps/libzip/regress/decrypt-correct-password-aes128.test @@ -0,0 +1,6 @@ +# test AES decryption support, extract file using correct password +features CRYPTO +return 0 +args encrypt.zzip set_password foofoofoo cat 1 +file encrypt.zzip encrypt-aes128.zip encrypt-aes128.zip +stdout encrypted diff --git a/deps/libzip/regress/decrypt-correct-password-aes192.test b/deps/libzip/regress/decrypt-correct-password-aes192.test new file mode 100644 index 00000000000000..a66dd16f829152 --- /dev/null +++ b/deps/libzip/regress/decrypt-correct-password-aes192.test @@ -0,0 +1,6 @@ +# test AES decryption support, extract file using correct password +features CRYPTO +return 0 +args encrypt.zzip set_password foofoofoo cat 1 +file encrypt.zzip encrypt-aes192.zip encrypt-aes192.zip +stdout encrypted diff --git a/deps/libzip/regress/decrypt-correct-password-aes256.test b/deps/libzip/regress/decrypt-correct-password-aes256.test new file mode 100644 index 00000000000000..4eddea8a1dd6bf --- /dev/null +++ b/deps/libzip/regress/decrypt-correct-password-aes256.test @@ -0,0 +1,6 @@ +# test AES decryption support, extract file using correct password +features CRYPTO +return 0 +args encrypt.zzip set_password foofoofoo cat 1 +file encrypt.zzip encrypt-aes256.zip encrypt-aes256.zip +stdout encrypted diff --git a/deps/libzip/regress/decrypt-correct-password-pkware-2.test b/deps/libzip/regress/decrypt-correct-password-pkware-2.test new file mode 100644 index 00000000000000..24f43b54d48178 --- /dev/null +++ b/deps/libzip/regress/decrypt-correct-password-pkware-2.test @@ -0,0 +1,9 @@ +# test decryption support, extract file using correct password +return 0 +args encrypt.zzip set_password 1234 cat 0 +file encrypt.zzip encrypt-1234.zip encrypt-1234.zip +stdout I would love to try or hear the sample audio your app can produce. I do not want to purchase, because I've purchased so many apps that say they do something and do not deliver. +stdout +stdout Can you please add audio samples with text you've converted? I'd love to see the end results. +stdout +stdout Thanks! diff --git a/deps/libzip/regress/decrypt-correct-password-pkware.test b/deps/libzip/regress/decrypt-correct-password-pkware.test new file mode 100644 index 00000000000000..c12639458213be --- /dev/null +++ b/deps/libzip/regress/decrypt-correct-password-pkware.test @@ -0,0 +1,5 @@ +# test decryption support, extract file using correct password +return 0 +args encrypt.zzip set_password foo cat 0 +file encrypt.zzip encrypt.zip encrypt.zip +stdout foo diff --git a/deps/libzip/regress/decrypt-no-password-aes256.test b/deps/libzip/regress/decrypt-no-password-aes256.test new file mode 100644 index 00000000000000..6140a42f790328 --- /dev/null +++ b/deps/libzip/regress/decrypt-no-password-aes256.test @@ -0,0 +1,6 @@ +# test AES decryption support, no password provided +features CRYPTO +return 1 +args encrypt.zzip cat 1 +file encrypt.zzip encrypt-aes256.zip encrypt-aes256.zip +stderr can't open file at index '1': No password provided diff --git a/deps/libzip/regress/decrypt-wrong-password-aes128.test b/deps/libzip/regress/decrypt-wrong-password-aes128.test new file mode 100644 index 00000000000000..fa4b789e39cacf --- /dev/null +++ b/deps/libzip/regress/decrypt-wrong-password-aes128.test @@ -0,0 +1,6 @@ +# test AES decryption support, extract file using wrong password +features CRYPTO +return 1 +args encrypt.zzip set_password notfoonotfoo cat 1 +file encrypt.zzip encrypt-aes128.zip encrypt-aes128.zip +stderr can't open file at index '1': Wrong password provided diff --git a/deps/libzip/regress/decrypt-wrong-password-aes192.test b/deps/libzip/regress/decrypt-wrong-password-aes192.test new file mode 100644 index 00000000000000..f04d0da04c4f83 --- /dev/null +++ b/deps/libzip/regress/decrypt-wrong-password-aes192.test @@ -0,0 +1,6 @@ +# test AES decryption support, extract file using wrong password +features CRYPTO +return 1 +args encrypt.zzip set_password notfoonotfoo cat 1 +file encrypt.zzip encrypt-aes192.zip encrypt-aes192.zip +stderr can't open file at index '1': Wrong password provided diff --git a/deps/libzip/regress/decrypt-wrong-password-aes256.test b/deps/libzip/regress/decrypt-wrong-password-aes256.test new file mode 100644 index 00000000000000..836b5b1a8ddc48 --- /dev/null +++ b/deps/libzip/regress/decrypt-wrong-password-aes256.test @@ -0,0 +1,6 @@ +# test AES decryption support, extract file using wrong password +features CRYPTO +return 1 +args encrypt.zzip set_password notfoonotfoo cat 1 +file encrypt.zzip encrypt-aes256.zip encrypt-aes256.zip +stderr can't open file at index '1': Wrong password provided diff --git a/deps/libzip/regress/decrypt-wrong-password-pkware-2.test b/deps/libzip/regress/decrypt-wrong-password-pkware-2.test new file mode 100644 index 00000000000000..fb1e66c8b45101 --- /dev/null +++ b/deps/libzip/regress/decrypt-wrong-password-pkware-2.test @@ -0,0 +1,7 @@ +# test decryption support, extract file using wrong password (correct: "1234") +# In some cases, like this one, the password, even if incorrect, passes the +# minimal verification that's possible due to the zip file format specification. +return 1 +args encrypt.zzip set_password sample cat 0 +file encrypt.zzip encrypt-1234.zip encrypt-1234.zip +stderr can't read file at index '0': Zlib error: data error diff --git a/deps/libzip/regress/decrypt-wrong-password-pkware.test b/deps/libzip/regress/decrypt-wrong-password-pkware.test new file mode 100644 index 00000000000000..02749557e46d08 --- /dev/null +++ b/deps/libzip/regress/decrypt-wrong-password-pkware.test @@ -0,0 +1,5 @@ +# test decryption support, extract file using wrong password +return 1 +args encrypt.zzip set_password notfoo cat 0 +file encrypt.zzip encrypt.zip encrypt.zip +stderr can't open file at index '0': Wrong password provided diff --git a/deps/libzip/regress/delete_add_same.test b/deps/libzip/regress/delete_add_same.test new file mode 100644 index 00000000000000..54c0e5a7324bda --- /dev/null +++ b/deps/libzip/regress/delete_add_same.test @@ -0,0 +1,5 @@ +# delete entry in zip archive then add file of same name +# time is now(), so use zipcmp +return 0 +args testfile.zip delete 0 add testfile.txt test +file testfile.zip testfile.zip test2.zip diff --git a/deps/libzip/regress/delete_invalid.test b/deps/libzip/regress/delete_invalid.test new file mode 100644 index 00000000000000..9a06306bf0a795 --- /dev/null +++ b/deps/libzip/regress/delete_invalid.test @@ -0,0 +1,5 @@ +# delete last entry in zip archive +return 1 +args testfile.zzip delete 5 +file testfile.zzip testfile.zip testfile.zip +stderr can't delete file at index '5': Invalid argument diff --git a/deps/libzip/regress/delete_last.test b/deps/libzip/regress/delete_last.test new file mode 100644 index 00000000000000..3b415b50ede837 --- /dev/null +++ b/deps/libzip/regress/delete_last.test @@ -0,0 +1,4 @@ +# delete last entry in zip archive +return 0 +args testfile.zzip delete 0 +file-del testfile.zzip testfile.zip diff --git a/deps/libzip/regress/delete_multiple_last.test b/deps/libzip/regress/delete_multiple_last.test new file mode 100644 index 00000000000000..71ac983543f6a5 --- /dev/null +++ b/deps/libzip/regress/delete_multiple_last.test @@ -0,0 +1,4 @@ +# delete multiple entries in zip archive, emptying it +return 0 +args testfile.zzip delete 0 delete 1 delete 2 delete 3 +file-del testfile.zzip testcomment.zip diff --git a/deps/libzip/regress/delete_multiple_partial.test b/deps/libzip/regress/delete_multiple_partial.test new file mode 100644 index 00000000000000..272fab3cfe0c00 --- /dev/null +++ b/deps/libzip/regress/delete_multiple_partial.test @@ -0,0 +1,4 @@ +# delete some entries in zip archive +return 0 +args testfile.zip delete 1 delete 3 +file testfile.zip testcomment.zip testcomment13.zip diff --git a/deps/libzip/regress/delete_renamed_rename.test b/deps/libzip/regress/delete_renamed_rename.test new file mode 100644 index 00000000000000..e81996c41dc2a5 --- /dev/null +++ b/deps/libzip/regress/delete_renamed_rename.test @@ -0,0 +1,5 @@ +# delete renamed entry in zip archive then rename file to same name +# file date is now(), so use zipcmp +return 0 +args testfile.zip rename 0 something add test test delete 0 rename 1 testfile.txt +file testfile.zip testfile.zip test2.zip diff --git a/deps/libzip/regress/encrypt-1234.zip b/deps/libzip/regress/encrypt-1234.zip new file mode 100644 index 0000000000000000000000000000000000000000..09ef679a9bcffcabdec2bf50e2e19b6b0428eb65 GIT binary patch literal 380 zcmWIWW@Zs#;AG%n(CX?4h~AJabBKX~L5h)qfr~+gp*S(OASYF?q@pA=gp+}}p{h4- z?O(h2(h6<{MwS=M3=Cjme@fM!s3T`y_#1pWx?Spz;;Vmx2l7^5y|J|STI#3gCj-7^ zJx}nv8@w&eZE@C_NmgYc|96+%Rh_%cXWGr&+c);exSsg4@|yX3EIex$a!5XwF_>auu&4O>>YVw1<6iD;{du4- zP;|Yp-WGdrrT#fbUJEV}U({D*&j_n1PWYnIRXb5GcnW2gD$) zoDAFysd>pol?5fKDU37O8JHLxT^T_tAi!r`-(Jg2kNw+^^Z!e}w|~ONJh9i`Uk7+I zGRZOHwi=`tWXP6A5DV-EkQRGp+>QV#1c7ahnm`hplLEY1L0$v8kcpubNLPY53;D*&iagn^MEnIRXb5GcnW2gD$) zoDAFysd>pol?5fKDU37O8JHLxT^Sh|YO5+7g^CYl%AT1ytG9HLZ~D@!ZBw2W$$Woh zxFFFwz?+dtjv2SrARB;&Fl=cAvA}KsX%S(@?Ff)U5ZKnJ2_&&ODZrZ*D*&j_n1PWYnIRXb5Gco>1jHb% zoDAFysd>pol?5fKDU37O8JHLxU70{C5Wt{l&$2HjZLW*_9P~x@q|85lj_;uR`~Yu8 zCOKx@)`Rpj0`Znc5DV-MkQRGp+ztUL1c7ahnm`hpvjV(XLEZzpl8K=dNY{cm3;^5f BE)f6# literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/encrypt-aes192.zip b/deps/libzip/regress/encrypt-aes192.zip new file mode 100644 index 0000000000000000000000000000000000000000..98865ce41e14ece71c9b09122639604473b2abc5 GIT binary patch literal 316 zcmWIWW@h1H0D+v|QZ$-un2 zvnoQMt11GlfGYrKhzJ8CLo!1y&=8;+1|=W{8OzDQ&5)XxTvS<5lA6LelbwNy!O@k8 zfkFLh>&;}BqCa7q?q!_Wuqk5g!Q6Klj~;KiDVxOc`OERRt6>4&j7)OOxSS>dvIJ-& z1H+a^5DV;%&=6LL%g|g5GD?IQw*x^2fWWp!S0IVaxdGm+pdbOdo{6CsNY4au7y#hJ BL%RR~ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/encrypt-aes256-noentropy.zip b/deps/libzip/regress/encrypt-aes256-noentropy.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3a6cad0193db4559ef5cdd96c6718cee6dbb318 GIT binary patch literal 268 zcmWIWW@h1H0D+vD*&j_n1PWYnIRXb5Gco>2E-t( zoDAFysd>pol?5fKDU37O8JHLxU70~DP(j3jUH*FurzTBb&iU!>jT=wCRVEjSbOd-a zGRZOHb^^!@Mj+nO2x5WV0@7m7jN36Fg&?r4Q4>gFb6S8mE69sLmohPw0%@?>3;>eo BFpK~I literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/encrypt-aes256.zip b/deps/libzip/regress/encrypt-aes256.zip new file mode 100644 index 0000000000000000000000000000000000000000..6349cb257fdeabbc3fbbd6051fde6c43dff3f191 GIT binary patch literal 320 zcmWIWW@h1H0D+v|QZ$-un2 zvnm3F!3wwnfQE=LFft@F3*gfhJ{4 z3R>o~FM6+~?h-5635S)!!_4w0mK0nm@aaBx{k*63f#dA```QD%8JXmmaXC){WD(F- z28Jz-AQspyp&_gg*P*!@WRwUqZbyO)0D*0du0Rr-lLNe2LBRs_0TV+nke&D*&!A7pO2auID#M8whg(acW+2 zQDs3%Y6_eI)WFCj$Bf%-pe_bRAl}jlVu39IX|acD!Db6cAqZ@1)C7`ns{*`PK@MhM N0>UgH9R=br005S+CD*&iagn<(%D6*W@H8ig0w-}HO z(h3qw%}Xw-EGS7$nRLm;mhHlfuQygczr5z_sSuB2E+K~w1bDM^AZrQmW@M6M#%(Xq vLcNO literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/encrypt-pkware-noentropy.zip b/deps/libzip/regress/encrypt-pkware-noentropy.zip new file mode 100644 index 0000000000000000000000000000000000000000..e0c39a7ce77b84aba948e8a61153dad50de8fbee GIT binary patch literal 246 zcmWIWW@h1H0D+vD*&iagn<(%mfR;LXS+&Wy`tydXmv7=d_6BZ!6MPF9FJLn{~byrdDt zLUKGS#POjO4A>nFGZ>@|(^!Z5?r^7FX@ycwCqnQ=K!31leP=}Q_xEF{OWLL3`f x!2ouoE4m|L27|O=I*S)13^h0r$bvc&Xeh*i3=9F@tZX1POh7mjNY4dv7ywsIN%Q~! literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/encrypt_plus_extra_modified_l.zip b/deps/libzip/regress/encrypt_plus_extra_modified_l.zip new file mode 100644 index 0000000000000000000000000000000000000000..a546022e0b1f054e59ed0847b6bc76b3772bad41 GIT binary patch literal 332 zcmWIWW@h1HU}RumFl?A%vLe-}P5{Ve0b))DEr!&*!Z5?r^7FX@ycwCqnQ=K!31leP=}Q_xEF{OWLL3`f x!2ot-D!Lm>10#c>kueCH1b8zt$uZ+r2htA$TN*(mNLPS2 RD;tQ-2!uvJS`EZu006>b4pjgE literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_1-ef_00.zip b/deps/libzip/regress/extra_field_align_1-ef_00.zip new file mode 100644 index 0000000000000000000000000000000000000000..c07777b0016ced4ba93730e2a6fa3ac46f3cda10 GIT binary patch literal 123 zcmWIWW@h1H0D<*uOgy%~zthYJWJ54FgW>=GYz&4*#wMm_42A*Tj7)OOxD|s<0TNpp XK`dmg0p6@^ATdTDv;xxFAPxfn&72gG literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_1-ef_ff.zip b/deps/libzip/regress/extra_field_align_1-ef_ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..d62e0ec2ca51785166f561558090759e42a3c2c0 GIT binary patch literal 123 zcmWIWW@h1H0D<*uOgy%~zthYJWJ54FgW>=GYz&4*#wMm_{|y7Y8JXmmaVrL!0wlIH Xf>_8}1H4(;Kw^wQXa%ITK^z7EHbNGU literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_1-ff.zip b/deps/libzip/regress/extra_field_align_1-ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..6b05df2f24ae3e9c29a9f1cae162634e281275de GIT binary patch literal 110 zcmWIWW@h1H00E7aCLW6)Jf6)0WP>m>10#c>k@0^ZHVN=%WRhdXtq!Cg1hzDSNRX}o SZ&o%Cn-K_&fV3Kj!vFv#4G>cR literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_2-0.zip b/deps/libzip/regress/extra_field_align_2-0.zip new file mode 100644 index 0000000000000000000000000000000000000000..c7072d2d2288b9d503c378141a753ef5e846055b GIT binary patch literal 110 zcmWIWW@h1H00E7aCLW6)Jf6)0WP>mh5E>dW0I{)2fHxzP95ZfpApIb)r4dAebOm^` QvVqu)KnUbAsDU^P0Im!T?*IS* literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_2-ef_00.zip b/deps/libzip/regress/extra_field_align_2-ef_00.zip new file mode 100644 index 0000000000000000000000000000000000000000..68e40891573b9b79a4388369824de553efe78eba GIT binary patch literal 123 zcmWIWW@h1H0D<*uOgy%~zthYJWJ54FgW>=GtPF-m#wMl=42A*Tj7)OOxD|s<0TNpp XK`dmg0p6@^ATdTDv;xxFAPxfnwviMg literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_2-ef_ff.zip b/deps/libzip/regress/extra_field_align_2-ef_ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..be9510b6384ab4cd616e3fd9f8150564fc8c36b2 GIT binary patch literal 123 zcmWIWW@h1H0D<*uOgy%~zthYJWJ54FgW>=GtPF-m#wMo!{~HE)Gcw6B<5mnd1xRdZ X1hJ5{26(fwfy5Yr&mh5E>dW{5Lc*HVN=%WRhdXtq!Cg1hzDSNRX}o SZ&o%Cn-K_&fV3Kj!vFvgw-4mx12cmmkTx_jHVN=%WRhdXtq!OR47N0aD3GoI SZ&o%Cn-K_&fV3Kj!vFx8xDAT{ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_3-ef_00.zip b/deps/libzip/regress/extra_field_align_3-ef_00.zip new file mode 100644 index 0000000000000000000000000000000000000000..326f98d528100cc0612a16c25c66b3a0d4cb2a67 GIT binary patch literal 123 zcmWIWW@h1H0D<*uOgy%~zthYJWJ54FgW>=GEDVN5#wI{9!vJqaCOKx@ia~~ez?Mc3 WiL5oio0SbD#t4K~Kw2BbVE_Q1hZDB| literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_3-ef_ff.zip b/deps/libzip/regress/extra_field_align_3-ef_ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..ab9d81f0dbbb7cfb05f10e75856fb10228ce6681 GIT binary patch literal 123 zcmWIWW@h1H0D<*uOgy%~zthYJWJ54FgW>=GEDVN5#wP#&|2GWqW@M6M#;q7^3Xs^+ X2x1{?4e(}V1Bo#Lp%swU25}ew-&Gm0 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_3-ff.zip b/deps/libzip/regress/extra_field_align_3-ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..c6fde73b420e9883bab1992cbd2aed7cd22a4861 GIT binary patch literal 110 zcmWIWW@h1H00E7aCLW6)Jf6)0WP>mx12co+|Ns9Djf_nKycwC~m~pEE=?8%=jUW=F UE5MtT4a8;yLL(rp2I4RP0LqmUg#Z8m literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_field_align_4-ff.zip b/deps/libzip/regress/extra_field_align_4-ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..c23966f4336695b0f9c2697a6cc0da0ce60570ba GIT binary patch literal 113 zcmWIWW@h1H00EX&CLS_YUr)0F*&xiwz`|ho|33qRp^>qPX@EB)lN>W{l^_#9U`r#2 V1nUd%W@Q6$7=h3jNNa#N3;^-*52*kE literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/extra_get.test b/deps/libzip/regress/extra_get.test new file mode 100644 index 00000000000000..4f458877407e6f --- /dev/null +++ b/deps/libzip/regress/extra_get.test @@ -0,0 +1,9 @@ +# get extra fields for index +args encrypt.zip get_extra 0 0 l get_extra 0 0 c get_extra 0 1 l get_extra 0 1 c get_extra 0 2 l +return 1 +file encrypt.zip encrypt.zip encrypt.zip +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 +stdout Extra field 0x7855: len 0 +stderr can't get extra field data for file at index 0, extra field 2, flags 256: No such file diff --git a/deps/libzip/regress/extra_get_by_id.test b/deps/libzip/regress/extra_get_by_id.test new file mode 100644 index 00000000000000..67f49671bdc5a7 --- /dev/null +++ b/deps/libzip/regress/extra_get_by_id.test @@ -0,0 +1,9 @@ +# get extra_by_id fields for index +args encrypt.zip get_extra_by_id 0 21589 0 l get_extra_by_id 0 30805 0 l get_extra_by_id 0 21589 0 c get_extra_by_id 0 30805 0 c get_extra_by_id 0 21544 0 c +return 1 +file encrypt.zip encrypt.zip encrypt.zip +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stderr can't get extra field data for file at index 0, extra field id 21544, ef index 0, flags 512: No such file diff --git a/deps/libzip/regress/extra_set.test b/deps/libzip/regress/extra_set.test new file mode 100644 index 00000000000000..ccdbdc96853d4c --- /dev/null +++ b/deps/libzip/regress/extra_set.test @@ -0,0 +1,14 @@ +# set extra field +args -- encrypt get_extra 0 0 c get_extra 0 1 c get_extra 0 0 l get_extra 0 1 l set_extra 0 2345 -1 l extrafieldcontent set_extra 0 2345 -1 c extrafieldcontent get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l +file encrypt encrypt.zip encrypt_plus_extra.zip +return 0 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 diff --git a/deps/libzip/regress/extra_set_modify_c.test b/deps/libzip/regress/extra_set_modify_c.test new file mode 100644 index 00000000000000..dca49f43628416 --- /dev/null +++ b/deps/libzip/regress/extra_set_modify_c.test @@ -0,0 +1,16 @@ +# change existing central extra field +args encrypt.zip get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l set_extra 0 2345 0 c Extrafieldcontent get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l +file encrypt.zip encrypt_plus_extra.zip encrypt_plus_extra_modified_c.zip +return 0 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stdout Extra field 0x0929: len 17, data 0x45787472616669656c64636f6e74656e74 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 diff --git a/deps/libzip/regress/extra_set_modify_l.test b/deps/libzip/regress/extra_set_modify_l.test new file mode 100644 index 00000000000000..4dda9b7cebadbe --- /dev/null +++ b/deps/libzip/regress/extra_set_modify_l.test @@ -0,0 +1,16 @@ +# change existing local extra field +args encrypt.zip get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l set_extra 0 2345 0 l Extrafieldcontent get_extra 0 0 c get_extra 0 1 c get_extra 0 2 c get_extra 0 0 l get_extra 0 1 l get_extra 0 2 l +file encrypt.zip encrypt_plus_extra.zip encrypt_plus_extra_modified_l.zip +return 0 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 +stdout Extra field 0x5455: len 5, data 0x033dda4c44 +stdout Extra field 0x7855: len 0 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x0929: len 17, data 0x45787472616669656c64636f6e74656e74 +stdout Extra field 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 diff --git a/deps/libzip/regress/fdopen_ok.test b/deps/libzip/regress/fdopen_ok.test new file mode 100644 index 00000000000000..ff478bb2b393b1 --- /dev/null +++ b/deps/libzip/regress/fdopen_ok.test @@ -0,0 +1,15 @@ +# zip_fdopen: stdin opens fine +program ../src/ziptool +args /dev/stdin stat 0 +stdin-file test.zip +return 0 +file test.zip test.zip test.zip +stdout name: 'test' +stdout index: '0' +stdout size: '5' +stdout compressed size: '5' +stdout mtime: 'Mon Oct 06 2003 15:46:42' +stdout crc: '3bb935c6' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/file_comment_encmismatch.test b/deps/libzip/regress/file_comment_encmismatch.test new file mode 100644 index 00000000000000..a2b8209463b057 --- /dev/null +++ b/deps/libzip/regress/file_comment_encmismatch.test @@ -0,0 +1,4 @@ +# set file comment to UTF-8 for CP437 encoded filename (adds InfoZIP extra field) +return 0 +args testfile.zip set_file_comment 0 ÄÖÜßäöü +file testfile.zip test-cp437.zip test-cp437-comment-utf-8.zip diff --git a/deps/libzip/regress/filename_duplicate.zip b/deps/libzip/regress/filename_duplicate.zip new file mode 100644 index 0000000000000000000000000000000000000000..96a11e7dd330e2dbcd006ae5fecf030eb6b7ab72 GIT binary patch literal 206 zcmWIWW@h1H0D--8Z#YPsN7k?b*&xgc#3iZ4C5B*vD*&!=H&Ee?l#+0)3XOmY8JXmm rahnM=mVpt7w={xSV8fBMU^5-05TZpBp@kJ>KLZmGrUB_75QhN(sEs25 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/filename_duplicate_empty.zip b/deps/libzip/regress/filename_duplicate_empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4af0d8455c52a12d7d31e57b70ca203d06cbbc6 GIT binary patch literal 186 zcmWIWW@h1H0D--8Z#YPsN7k?b*&qx8C8@> literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/filename_empty.zip b/deps/libzip/regress/filename_empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..d32e4e72244cc30fef2055efc3491e713c3cc132 GIT binary patch literal 98 ycmWIWW@h1H0D(Vg-$oECz?+o~L^A@R9*~v;aToyfpa_5f literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/fileorder.zip b/deps/libzip/regress/fileorder.zip new file mode 100644 index 0000000000000000000000000000000000000000..3fcd81a66b6ddf4129101cc36f3cfe873c393d46 GIT binary patch literal 204 zcmWIWW@h1H0D*10W;?_izGG(vvSBzaGbhyuOa#EyZ3U`(n(%xcObv(zDKP{S0p5&E sa?B7Dv8e>v#0bP&8Z}`0khNfQ1VRgl1$7N88;HXMglRxJ0K{Pc04%H{%m4rY literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/firstsecond-split-deflated.zip b/deps/libzip/regress/firstsecond-split-deflated.zip new file mode 100644 index 0000000000000000000000000000000000000000..35b9a5c6d8852e1392aa65a5d19f1a249e1111e0 GIT binary patch literal 219 zcmWIWW@Zs#U|`^22#cHJu!5my3OA6)3B;^GoR(QsT;hFNM@vuBLr05|Apk|SzU17$ zJU~@kK+Fcj#i_~pc`4d{zUR(+!_+e}F)-jZAE*flfNcx#M%99D2|~RdkO{Fez?&6h PKLZmGrUU6X5QhN(R-7TM literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/firstsecond-split-stored.zip b/deps/libzip/regress/firstsecond-split-stored.zip new file mode 100644 index 0000000000000000000000000000000000000000..35f0684bf9d8d7d4a8a568110559881c5f769b56 GIT binary patch literal 215 zcmWIWW@h1HU}9ik@Q<70u!5my3MY^a!mL1?mRVF>0wxL)i%J6EYJ-4k^(E*2jwCDg?5UT>bSwXe~ Oy}-nf4y2<%90maOuqH47 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/firstsecond.zip b/deps/libzip/regress/firstsecond.zip new file mode 100644 index 0000000000000000000000000000000000000000..3fbe7ad1ab06fc80bb2cccff1394d36f2c8ff419 GIT binary patch literal 319 zcmWIWW@Zs#U|`^22#cHJuwf!&gb5&2HdK^+TjFP11lSd&j^HuKw1SX F2>^^N4T=B& literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/fopen_multiple.test b/deps/libzip/regress/fopen_multiple.test new file mode 100644 index 00000000000000..af8cc6e7bd6d10 --- /dev/null +++ b/deps/libzip/regress/fopen_multiple.test @@ -0,0 +1,7 @@ +# read contents from multiply opened unchanged file +return 0 +args test_open_multiple.zip fopen stuff fopen stuff fread 0 2 fread 1 4 fread 0 3 fread 1 3 fread 0 3 fread 1 1 unchange_all +file test_open_multiple.zip test_open_multiple.zip test_open_multiple.zip +stdout opened 'stuff' as file 0 +stdout opened 'stuff' as file 1 +stdout ababcdcdeefgfghh diff --git a/deps/libzip/regress/fopen_multiple_reopen.test b/deps/libzip/regress/fopen_multiple_reopen.test new file mode 100644 index 00000000000000..0ecba9274b1bf2 --- /dev/null +++ b/deps/libzip/regress/fopen_multiple_reopen.test @@ -0,0 +1,7 @@ +# read contents from multiply reopened changed file +return 0 +args test_open_multiple.zip replace_file_contents 0 12345678 fopen stuff fopen stuff fread 0 2 fread 1 4 fread 0 3 fread 1 3 fread 0 3 fread 1 1 unchange_all +file test_open_multiple.zip test_open_multiple.zip test_open_multiple.zip +stdout opened 'stuff' as file 0 +stdout opened 'stuff' as file 1 +stdout 1212343455676788 diff --git a/deps/libzip/regress/fopen_unchanged.c b/deps/libzip/regress/fopen_unchanged.c new file mode 100644 index 00000000000000..a9f32e68eeb34f --- /dev/null +++ b/deps/libzip/regress/fopen_unchanged.c @@ -0,0 +1,90 @@ +/* + fopen_unchanged.c -- test case for adding file and reading from unchanged + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include + +#include "zip.h" + +const char *teststr = "This is a test.\n"; +const char *file = "teststring.txt"; + +int +main(int argc, char *argv[]) { + const char *archive; + zip_t *za; + zip_source_t *zs; + int err; + + if (argc != 2) { + fprintf(stderr, "usage: %s archive\n", argv[0]); + return 1; + } + + archive = argv[1]; + + if ((za = zip_open(archive, ZIP_CREATE, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error)); + zip_error_fini(&error); + return 1; + } + + if ((zs = zip_source_buffer(za, teststr, strlen(teststr), 0)) == NULL) { + fprintf(stderr, "can't create zip_source from buffer: %s\n", zip_strerror(za)); + exit(1); + } + + if (zip_add(za, file, zs) == -1) { + fprintf(stderr, "can't add file '%s': %s\n", file, zip_strerror(za)); + (void)zip_source_free(zs); + (void)zip_close(za); + return 1; + } + + if (zip_fopen(za, file, ZIP_FL_UNCHANGED) == NULL) { + fprintf(stderr, "can't zip_fopen file '%s': %s\n", file, zip_strerror(za)); + (void)zip_discard(za); + return 1; + } + + if (zip_close(za) == -1) { + fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za)); + return 1; + } + + return 0; +} diff --git a/deps/libzip/regress/fopen_unchanged.test b/deps/libzip/regress/fopen_unchanged.test new file mode 100644 index 00000000000000..885f8b7ba3cd96 --- /dev/null +++ b/deps/libzip/regress/fopen_unchanged.test @@ -0,0 +1,5 @@ +# add buffer contents as file to zip, then read unchanged from it +program fopen_unchanged +return 1 +args testbuffer.zip +stderr can't zip_fopen file 'teststring.txt': No such file diff --git a/deps/libzip/regress/fread.c b/deps/libzip/regress/fread.c new file mode 100644 index 00000000000000..ea786838d63666 --- /dev/null +++ b/deps/libzip/regress/fread.c @@ -0,0 +1,212 @@ +/* + fread.c -- test cases for reading from zip archives + Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "config.h" + +#include +#include + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif + +#include "zip.h" + +enum when { WHEN_NEVER, WHEN_OPEN, WHEN_READ, WHEN_CLOSE }; + +const char *when_name[] = {"no", "zip_fopen", "zip_fread", "zip_fclose"}; + +static int do_read(zip_t *z, const char *name, zip_flags_t flags, enum when when_ex, int ze_ex, int se_ex); + +int verbose; + +const char *progname; +#define USAGE "usage: %s [-v] archive\n" + +int +main(int argc, char *argv[]) { + int fail, ze; + int c; + zip_t *z; + zip_source_t *zs; + char *archive; + zip_int64_t idx; + + verbose = 0; + fail = 0; + + progname = argv[0]; + + while ((c = getopt(argc, argv, "v")) != -1) { + switch (c) { + case 'v': + verbose = 1; + break; + + default: + fprintf(stderr, USAGE, progname); + return 1; + } + } + + + if (argc - optind != 1) { + fprintf(stderr, USAGE, progname); + return 1; + } + + archive = argv[optind]; + + if ((z = zip_open(archive, 0, &ze)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, ze); + fprintf(stderr, "%s: can't open zip archive '%s': %s\n", progname, archive, zip_error_strerror(&error)); + zip_error_fini(&error); + return 1; + } + + fail += do_read(z, "storedok", 0, WHEN_NEVER, 0, 0); + fail += do_read(z, "deflateok", 0, WHEN_NEVER, 0, 0); + fail += do_read(z, "storedcrcerror", 0, WHEN_READ, ZIP_ER_CRC, 0); + fail += do_read(z, "deflatecrcerror", 0, WHEN_READ, ZIP_ER_CRC, 0); + fail += do_read(z, "deflatezliberror", 0, WHEN_READ, ZIP_ER_ZLIB, -3); +#ifndef __clang_analyzer__ /* This test intentionally violates nullability. */ + fail += do_read(z, NULL, 0, WHEN_OPEN, ZIP_ER_INVAL, 0); +#endif + fail += do_read(z, "nosuchfile", 0, WHEN_OPEN, ZIP_ER_NOENT, 0); + fail += do_read(z, "deflatezliberror", ZIP_FL_COMPRESSED, WHEN_NEVER, 0, 0); + fail += do_read(z, "deflatecrcerror", ZIP_FL_COMPRESSED, WHEN_NEVER, 0, 0); + fail += do_read(z, "storedcrcerror", ZIP_FL_COMPRESSED, WHEN_READ, ZIP_ER_CRC, 0); + fail += do_read(z, "storedok", ZIP_FL_COMPRESSED, WHEN_NEVER, 0, 0); + + fail += do_read(z, "cryptok", 0, WHEN_OPEN, ZIP_ER_NOPASSWD, 0); + zip_set_default_password(z, "crypt"); + fail += do_read(z, "cryptok", 0, WHEN_NEVER, 0, 0); + zip_set_default_password(z, "wrong"); + fail += do_read(z, "cryptok", 0, WHEN_OPEN, ZIP_ER_WRONGPASSWD, 0); + zip_set_default_password(z, NULL); + + zs = zip_source_buffer(z, "asdf", 4, 0); + if ((idx = zip_name_locate(z, "storedok", 0)) < 0) { + fprintf(stderr, "%s: can't locate 'storedok' in zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + fail++; + } + else { + if (zip_replace(z, (zip_uint64_t)idx, zs) < 0) { + fprintf(stderr, "%s: can't replace 'storedok' in zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + fail++; + } + else { + fail += do_read(z, "storedok", 0, WHEN_NEVER, 0, 0); + fail += do_read(z, "storedok", ZIP_FL_UNCHANGED, WHEN_NEVER, 0, 0); + } + } + if ((idx = zip_name_locate(z, "storedok", 0)) < 0) { + fprintf(stderr, "%s: can't locate 'storedok' in zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + fail++; + } + else { + if (zip_delete(z, (zip_uint64_t)idx) < 0) { + fprintf(stderr, "%s: can't replace 'storedok' in zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + fail++; + } + else { + fail += do_read(z, "storedok", 0, WHEN_OPEN, ZIP_ER_NOENT, 0); + fail += do_read(z, "storedok", ZIP_FL_UNCHANGED, WHEN_NEVER, 0, 0); + } + } + zs = zip_source_buffer(z, "asdf", 4, 0); + if (zip_file_add(z, "new_file", zs, 0) < 0) { + fprintf(stderr, "%s: can't add file to zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + fail++; + } + else { + fail += do_read(z, "new_file", 0, WHEN_NEVER, 0, 0); + } + + zip_unchange_all(z); + if (zip_close(z) == -1) { + fprintf(stderr, "%s: can't close zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + return 1; + } + + exit(fail ? 1 : 0); +} + + +static int +do_read(zip_t *z, const char *name, zip_flags_t flags, enum when when_ex, int ze_ex, int se_ex) { + zip_file_t *zf; + enum when when_got; + zip_error_t error_got, error_ex; + zip_error_t *zf_error; + int err; + char b[8192]; + zip_int64_t n; + + when_got = WHEN_NEVER; + zip_error_init(&error_got); + zip_error_init(&error_ex); + zip_error_set(&error_ex, ze_ex, se_ex); + + if ((zf = zip_fopen(z, name, flags)) == NULL) { + when_got = WHEN_OPEN; + zf_error = zip_get_error(z); + zip_error_set(&error_got, zip_error_code_zip(zf_error), zip_error_code_system(zf_error)); + } + else { + while ((n = zip_fread(zf, b, sizeof(b))) > 0) + ; + if (n < 0) { + when_got = WHEN_READ; + zf_error = zip_file_get_error(zf); + zip_error_set(&error_got, zip_error_code_zip(zf_error), zip_error_code_system(zf_error)); + } + err = zip_fclose(zf); + if (when_got == WHEN_NEVER && err != 0) { + when_got = WHEN_CLOSE; + zip_error_init_with_code(&error_got, err); + } + } + + if (when_got != when_ex || zip_error_code_zip(&error_got) != zip_error_code_zip(&error_ex) || zip_error_code_system(&error_got) != zip_error_code_system(&error_ex)) { + printf("%s: %s: got %s error (%s), expected %s error (%s)\n", progname, name, when_name[when_got], zip_error_strerror(&error_got), when_name[when_ex], zip_error_strerror(&error_ex)); + zip_error_fini(&error_got); + zip_error_fini(&error_ex); + return 1; + } + else if (verbose) + printf("%s: %s: passed\n", progname, name); + + return 0; +} diff --git a/deps/libzip/regress/fread.test b/deps/libzip/regress/fread.test new file mode 100644 index 00000000000000..234e1a15057f6f --- /dev/null +++ b/deps/libzip/regress/fread.test @@ -0,0 +1,5 @@ +# various tests for zip_fread +program fread +args broken.zip +return 0 +file broken.zip broken.zip broken.zip diff --git a/deps/libzip/regress/fseek.c b/deps/libzip/regress/fseek.c new file mode 100644 index 00000000000000..894343587eedb2 --- /dev/null +++ b/deps/libzip/regress/fseek.c @@ -0,0 +1,104 @@ +/* + fseek.c -- test tool for seeking in zip archives + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zip.h" + +const char *progname; +#define USAGE "usage: %s archive index offset\n" + +int +main(int argc, char *argv[]) { + int ze; + zip_t *z; + zip_file_t *zf; + char *archive; + zip_int64_t offset, n; + zip_uint64_t index; + char b[1024]; + + progname = argv[0]; + + if (argc != 4) { + fprintf(stderr, USAGE, progname); + return 1; + } + + archive = argv[1]; + index = strtoull(argv[2], NULL, 10); + offset = (zip_int64_t)strtoull(argv[3], NULL, 10); + + if ((z = zip_open(archive, 0, &ze)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, ze); + fprintf(stderr, "%s: can't open zip archive '%s': %s\n", progname, archive, zip_error_strerror(&error)); + zip_error_fini(&error); + return 1; + } + + if ((zf = zip_fopen_index(z, index, 0)) == NULL) { + fprintf(stderr, "%s: can't open file in archive '%s': %s\n", progname, archive, zip_error_strerror(zip_file_get_error(zf))); + zip_close(z); + return 1; + } + + if (zip_fseek(zf, offset, SEEK_SET) < 0) { + fprintf(stderr, "%s: zip_fseek failed: %s\n", progname, zip_error_strerror(zip_file_get_error(zf))); + zip_fclose(zf); + zip_close(z); + return 1; + } + + while ((n = zip_fread(zf, b, sizeof(b))) > 0) { + printf("%.*s", (int)n, b); + } + if (n < 0) { + fprintf(stderr, "%s: zip_fread failed: %s\n", progname, zip_error_strerror(zip_file_get_error(zf))); + zip_fclose(zf); + zip_close(z); + return 1; + } + + if (zip_fclose(zf) == -1) { + fprintf(stderr, "%s: can't close zip archive entry %" PRIu64 " in '%s': %s\n", progname, index, archive, zip_strerror(z)); + return 1; + } + + if (zip_close(z) == -1) { + fprintf(stderr, "%s: can't close zip archive '%s': %s\n", progname, archive, zip_strerror(z)); + return 1; + } + + return 0; +} diff --git a/deps/libzip/regress/fseek_deflated.test b/deps/libzip/regress/fseek_deflated.test new file mode 100644 index 00000000000000..7c560afee2813e --- /dev/null +++ b/deps/libzip/regress/fseek_deflated.test @@ -0,0 +1,6 @@ +# unsuccessful fseek test because data is compressed +program fseek +args test.zip 0 2 +return 1 +file test.zip testdeflated.zip testdeflated.zip +stderr zip_fseek failed: Operation not supported diff --git a/deps/libzip/regress/fseek_fail.test b/deps/libzip/regress/fseek_fail.test new file mode 100644 index 00000000000000..be78a9a9a1d105 --- /dev/null +++ b/deps/libzip/regress/fseek_fail.test @@ -0,0 +1,6 @@ +# successful fseek test +program fseek +args test.zip 0 8 +return 1 +file test.zip test.zip test.zip +stderr zip_fseek failed: Invalid argument diff --git a/deps/libzip/regress/fseek_ok.test b/deps/libzip/regress/fseek_ok.test new file mode 100644 index 00000000000000..29cfe67f293175 --- /dev/null +++ b/deps/libzip/regress/fseek_ok.test @@ -0,0 +1,6 @@ +# successful fseek test +program fseek +args test.zip 0 2 +return 0 +file test.zip test.zip test.zip +stdout st diff --git a/deps/libzip/regress/fuzz_main.c b/deps/libzip/regress/fuzz_main.c new file mode 100644 index 00000000000000..0a99d3318e3770 --- /dev/null +++ b/deps/libzip/regress/fuzz_main.c @@ -0,0 +1,50 @@ +#include "zip_read_fuzzer.cc" +#include +#include + +/* fuzz target entry point, works without libFuzzer */ + +int +main(int argc, char **argv) { + FILE *f; + char *buf = NULL; + long siz_buf; + + if (argc < 2) { + fprintf(stderr, "no input file\n"); + goto err; + } + + f = fopen(argv[1], "rb"); + if (f == NULL) { + fprintf(stderr, "error opening input file %s\n", argv[1]); + goto err; + } + + fseek(f, 0, SEEK_END); + + siz_buf = ftell(f); + rewind(f); + + if (siz_buf < 1) { + goto err; + } + + buf = (char *)malloc(siz_buf); + if (buf == NULL) { + fprintf(stderr, "malloc() failed\n"); + goto err; + } + + if (fread(buf, siz_buf, 1, f) != 1) { + fprintf(stderr, "fread() failed\n"); + goto err; + } + + (void)LLVMFuzzerTestOneInput((uint8_t *)buf, siz_buf); + +err: + free(buf); + + return 0; +} diff --git a/deps/libzip/regress/gap-add.zip b/deps/libzip/regress/gap-add.zip new file mode 100644 index 0000000000000000000000000000000000000000..e1a015927771d04bc0adc99c550297b55fe8a5c4 GIT binary patch literal 451 zcmWIWW@h1H0D+>+Zf|pk3)2LFY!GG!;`GFVkc`Y?1t2QPNL5J7%t_T#Ko$Wi&JbNGRv<3P z$Sg|XK6yeXjA7BFo)Cp|I$nVur_Xp^WoCeA1gc^90MwZBQQ`&`SZ{2o2c$1X0ewu&vP<$b|R@q6fEM5PIr?Ot8;jT0m0R ce1Xui1IPq=C%~H(6r>C+KzI^JKLK$V0D0kF+W-In literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/gap-delete.zip b/deps/libzip/regress/gap-delete.zip new file mode 100644 index 0000000000000000000000000000000000000000..7d73d008c4e579a08db5ee9482c2600d52468983 GIT binary patch literal 250 zcmWIWW@h1H0D+>+Zf|pk3)2LFY!GG!;`GFVkc`Y?1t2QPNL5J7%t_T#Ko$Wi&&YXnh1+mJP2vks!1 cfni&tGmr_fD!`i++Zf|pk3)2LFY!GG!;`GFVkc`Y?1t2QPNL5J7%t_T#Ko$Wi&*wxUCs|=gD@))mt4MkFf!RQ<90Go8yIYB1W`cu1$ZMgU~?cuIRnGCMrR-s;y8#N+zvzN asRuH_&J6Ho1$h@3Y|IQZfb>QXhXDXA^++Zf|pk3)2LFY!GG!;`GFVkc`Y?1t2QPNL5J7%t_T#Ko$Wi&JbNGRv<3P z$Sg|XK6yeXjA7BFo)Cp|I$nVur_Xp^Wo8KQW@NHw#_e*TZZO!^2%><_MAm@Koe<>= o4BHx=flP=SA$oAT522?X$OOAKz?&81YhdUxGt2 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include +#include + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif + +#include "zip.h" + +/* public API */ + +zip_source_t *source_hole_create(const char *, int flags, zip_error_t *); + +const char *progname; + + +static int +copy_source(zip_source_t *from, zip_source_t *to) { + zip_uint8_t buf[8192]; + zip_int64_t n; + + if (zip_source_open(from) < 0) { + fprintf(stderr, "%s: can't open source for reading: %s\n", progname, zip_error_strerror(zip_source_error(from))); + return -1; + } + + if (zip_source_begin_write(to) < 0) { + fprintf(stderr, "%s: can't open source for writing: %s\n", progname, zip_error_strerror(zip_source_error(to))); + zip_source_close(from); + return -1; + } + + while ((n = zip_source_read(from, buf, sizeof(buf))) > 0) { + if (zip_source_write(to, buf, (zip_uint64_t)n) != n) { + fprintf(stderr, "%s: can't write to source: %s\n", progname, zip_error_strerror(zip_source_error(to))); + zip_source_close(from); + zip_source_rollback_write(to); + return -1; + } + } + + if (n < 0) { + fprintf(stderr, "%s: can't read from source: %s\n", progname, zip_error_strerror(zip_source_error(from))); + zip_source_close(from); + zip_source_rollback_write(to); + return -1; + } + + zip_source_close(from); + + if (zip_source_commit_write(to) < 0) { + fprintf(stderr, "%s: can't commit source: %s\n", progname, zip_error_strerror(zip_source_error(to))); + zip_source_rollback_write(to); + return -1; + } + + return 0; +} + + +static zip_source_t * +open_compressed(const char *fname, int flags) { + zip_error_t error; + zip_source_t *src; + + zip_error_init(&error); + + if ((src = source_hole_create(fname, flags, &error)) == NULL) { + fprintf(stderr, "%s: can't open compressed file %s: %s\n", progname, fname, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + return src; +} + + +static zip_source_t * +open_file(const char *fname) { + zip_error_t error; + zip_source_t *src; + + zip_error_init(&error); + + if ((src = zip_source_file_create(fname, 0, 0, &error)) == NULL) { + fprintf(stderr, "%s: can't open file %s: %s\n", progname, fname, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + return src; +} + + +static void +usage(void) { + fprintf(stderr, "usage: %s [-du] in out\n", progname); + fprintf(stderr, "\nOptions:\n -d decompress in\n -u update in\n"); + exit(1); +} + + +int +main(int argc, char **argv) { + zip_source_t *from; + zip_source_t *to; + int c, err; + int compress = 1; + int decompress = 0; + + progname = argv[0]; + + while ((c = getopt(argc, argv, "du")) != -1) { + switch (c) { + case 'd': + compress = 0; + decompress = 1; + break; + + case 'u': + compress = 1; + decompress = 1; + break; + + default: + usage(); + break; + } + } + + if (optind + 2 != argc) { + usage(); + } + + if (decompress) { + from = open_compressed(argv[optind], 0); + } + else { + from = open_file(argv[optind]); + } + + if (compress) { + to = open_compressed(argv[optind + 1], ZIP_CREATE); + } + else { + to = open_file(argv[optind + 1]); + } + + err = copy_source(from, to); + + zip_source_free(from); + zip_source_free(to); + + exit(err < 0 ? 1 : 0); +} diff --git a/deps/libzip/regress/incons-archive-comment-longer.zip b/deps/libzip/regress/incons-archive-comment-longer.zip new file mode 100644 index 0000000000000000000000000000000000000000..28d7ed365f9218f5177adae4bd35004f4d817562 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLtZD|CtfM&5m%tA9Kz?+o~qLh)r9muc&aToxfaT~Y* literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-central-date.zip b/deps/libzip/regress/incons-central-date.zip new file mode 100644 index 0000000000000000000000000000000000000000..6c831ca4867eba78403ec79be491a891026b9fa8 GIT binary patch literal 131 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ54NLt<$KHv=Qf3uXoemK30PVt_XzlN>Wdg8~)} dAcH`fw={xS=-LCkS=m71j6i4yr1e1@1^}fh5_13m literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-central-file-comment-longer.zip b/deps/libzip/regress/incons-central-file-comment-longer.zip new file mode 100644 index 0000000000000000000000000000000000000000..b34c6612435cda05e33e36d95ca455986fd75fcb GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLtHX25x?hvQreciF0fX3 z<|;x3TmH4xk%u})tj`SDnXoiGP=l%tT&jc<(#L6rC`OW^R+OgN(ZLj+!AJJ!oL$jL gQ1)D*lFobuv8AT5F_QhF$VcNeWoG+n8R^mc0Og`bVgLXD literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-central-magic-bad.zip b/deps/libzip/regress/incons-central-magic-bad.zip new file mode 100644 index 0000000000000000000000000000000000000000..954563baa48f6eaaa1220964a02e19237b23bc2a GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLtr-= literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-central-magic-bad2.zip b/deps/libzip/regress/incons-central-magic-bad2.zip new file mode 100644 index 0000000000000000000000000000000000000000..f99d9b7194ef44adab07e3e989fb78a7fbb198f3 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLtZD|CtfM&5m%tA9Kz?+o~qLh)r9muc&aToxcI~%M3 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-central-size-larger.zip b/deps/libzip/regress/incons-central-size-larger.zip new file mode 100644 index 0000000000000000000000000000000000000000..0779ce62ec2c50e2172e50cc78e6fa3ca153cc1f GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLtnH(T#{N`l9rj1s#j7`qV1`x$H)-i&B(;S sfJ=usP!BRd*8ktC+}zN}*u>P#+``fT&I<5m1=+~J2!w$^+5oH{0JLNqHUIzs literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-ef-local-id-size.zip b/deps/libzip/regress/incons-ef-local-id-size.zip new file mode 100644 index 0000000000000000000000000000000000000000..44ce2f77d5d441993821bf954f4899a3b72019f2 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt)do@p!i-SW zAi6;i#L*4#W@FQV3d6L4xKO2yFj^m~#uQ2e^|6DPDNsI0U4S<$8;HvYgdp`0wEzJR B7jggq literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-compression-method.zip b/deps/libzip/regress/incons-local-compression-method.zip new file mode 100644 index 0000000000000000000000000000000000000000..2e70f592de4227371d9b820c6c21cdc6532b0cba GIT binary patch literal 153 zcmWIWW@h1HU|`^2xLh*B!Fk{I7mPq21j{fahK6u5FrS?_%^!qIE4UdLSza(RFtDTm x6(t6EGcw6BgLE@s(JcWM2br{`5yS+V#R@SC&71&lRyL3VMj&(t(l#It0|1{{8?XQX literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-compsize-larger.zip b/deps/libzip/regress/incons-local-compsize-larger.zip new file mode 100644 index 0000000000000000000000000000000000000000..6fc27e05df312e86fe81a725dc93afa80cfa2dc0 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGWKvWHW-X3`1gQ2qy#c*?H6aLAbPnn}Lz#1v3K!OA1gy wVt_XzlN>XuZir5h2@*gh5R=PaSRrPinG@j6$_7!&$lwlS*nl_;0IMn+#{d8T literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-compsize-smaller.zip b/deps/libzip/regress/incons-local-compsize-smaller.zip new file mode 100644 index 0000000000000000000000000000000000000000..75f14635778e11f3cb74feb00dc964e89c635900 GIT binary patch literal 173 zcmWIWW@Zs#U|`^2@GPC-;MUNxpBcZD|CtfM&5m%tA9Kz?+o~qLh)r9muc&aToxjQ5(1b literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-filename-long.zip b/deps/libzip/regress/incons-local-filename-long.zip new file mode 100644 index 0000000000000000000000000000000000000000..42b4a1ff136a9cedd2636d82294be63e353f4edf GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWP|Ws1{sFL&=5`r=Ckvr`Gat21vdjD%L`@(29^|{ vg2VuCMkYCC?7A5lB!EgFCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30dW`r2m~C2 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-filename-missing.zip b/deps/libzip/regress/incons-local-filename-missing.zip new file mode 100644 index 0000000000000000000000000000000000000000..71d3eb287b2072fb85fd14a2d6740233f4b4fb61 GIT binary patch literal 152 zcmWIWW@h1H0D;RTGaQ`vZGXWCWP>mRgA7Ax2qy#c*?H6aLAbPnn}Lz#1v3K!OA1gn wF~FOVNsbx2W<~}Hun{1Gwlsp6iJ>8^5VO$C3GilR11VqxLU$l-4dO5W0A?o}MF0Q* literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-filename-short.zip b/deps/libzip/regress/incons-local-filename-short.zip new file mode 100644 index 0000000000000000000000000000000000000000..c69be1bc0695deb94ea46d4a745bf7180c5f39a2 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWP>mRgA7ArXb2|*^VxaR{6V<1f}4Sn@~ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/incons-local-magic-bad.zip b/deps/libzip/regress/incons-local-magic-bad.zip new file mode 100644 index 0000000000000000000000000000000000000000..9a6a061736b101b8a753f0ad9924c2ed6657f6de GIT binary patch literal 153 zcmZ?pW@h1H0D;RTGaQ`vZGXWCWJ9nFLtVrU2_1M}H=)BHiWw1S&~k>v$50|QG6 zP(fmVHzSiAGp25k35*O9KoUeVFl=cAv4Cc=Ld-%lC%~JP4Wxh(2;G6S4T!@40IIGV A#{d8T literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/junk-at-end.zip b/deps/libzip/regress/junk-at-end.zip new file mode 100644 index 0000000000000000000000000000000000000000..30387b3f61c145f63946d088b765e2695fb6912f GIT binary patch literal 416 zcmWIWW@h1HU}9ikxLWI`f6R2JH7k$}!YmA;3?-?>C7~gl49t#2jrJfMTEW7Q!XN^c z;0gfi1uA8zo}q07qG5mosy8LGNFS`9Q}l`BEFcEyf5Du>0MUxgT3#frAnT1V><8%w z$pGzVWD;k_<$7MQV;F(tmPQa0;ultkUqUMwfNp?j2T5Xj0HU3NL4e_{qYYF$#5+JE nK;A(%0=q|$T~Ll>1k_t7PGMyOIfEGpPXXyYAPz%PVi6Yr?d4B* literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/junk-at-start.zip b/deps/libzip/regress/junk-at-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..8c983255bf84e2bddd16e9964abdcee63132bb59 GIT binary patch literal 416 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 ucard=xP2I2^@uF&Qa2%B7 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include + +#ifdef _WIN32 +int main(int argc, const char *argv[]) { + /* Symbol override is not supported on Windows. */ + if (argc > 1 && strcmp(argv[1], "-v") == 0) { + printf("not supported on Windows\n"); + } + exit(1); +} +#else + +#include +#include + +#include "zip.h" + +/* + Some systems bind functions called and defined within a shared library, so the override doesn't work. This program calls zip_open and checks whether the override worked. + */ + +int +main(int argc, const char *argv[]) { + int verbose = 0; + int error_code; + + if (argc > 1 && strcmp(argv[1], "-v") == 0) { + verbose = 1; + } + + if (getenv("LIBOVERRIDE_SET") == NULL) { + char *cwd = getcwd(NULL, 0); + size_t so_size = strlen(cwd) + 64; + char *so = (char *)malloc(so_size); + if (so == NULL) { + if (verbose) { + printf("malloc failed\n"); + } + exit(2); + } + snprintf(so, so_size, "%s/libliboverride.so", cwd); + setenv("LIBOVERRIDE_SET", "1", 1); + setenv("LD_PRELOAD", so, 1); + execv(argv[0], (void *)argv); + if (verbose) { + printf("exec failed: %s\n", strerror(errno)); + } + exit(2); + } + + if (zip_open("nosuchfile", 0, &error_code) != NULL) { + /* We expect failure. */ + if (verbose) { + printf("open succeeded\n"); + } + exit(1); + } + if (error_code != 32000) { + /* Override didn't take, we didn't get its magic error code. */ + if (verbose) { + printf("got unexpected error %d\n", error_code); + } + exit(1); + } + + if (verbose) { + printf("success\n"); + } + exit(0); +} + +#endif /* not Windows */ diff --git a/deps/libzip/regress/liboverride.c b/deps/libzip/regress/liboverride.c new file mode 100644 index 00000000000000..200f7127a26ce5 --- /dev/null +++ b/deps/libzip/regress/liboverride.c @@ -0,0 +1,48 @@ +/* + liboverride.c -- override function called by zip_open() + + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of ckmame, a program to check rom sets for MAME. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +/* + Some systems bind functions called and defined within a shared library, so the override doesn't work. This overrides a function called by zip_open to return an invalid error code so we can check whether the override works. + */ + +zip_source_t * +zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { + if (error != NULL) { + error->zip_err = 32000; + } + + return NULL; +} diff --git a/deps/libzip/regress/lzma-no-eos.zip b/deps/libzip/regress/lzma-no-eos.zip new file mode 100644 index 0000000000000000000000000000000000000000..883d851b674497fa604e1986876878b162b21d2a GIT binary patch literal 343 zcmWIWW@fQxU|`^5xIX2N*TT3Tawmbjb3iNx#3iZ4C25&Csk-HvB^kP@`NeuEi6w~w zEUXN%3=Av`3@%exk5s9D`~I%8FJMB)=2ce%;xudf>MC3$Tc7vJ*y|Tg=WAIZ^LRe1 zfj@Wt45|3m$45`!^3+z=o;Q6~YVgUfx7s<`zYBU@4H#EB7y2H}(>;{QqPAw=LA`6Q z=6_b3daCqn`J@dB7Y>}eEjW4J$vC-1@8U0hwJN>PV12GI?!w2&e^bvEUbJ5GFDT5q zhxbj;a722Hf5Uh5!&KfJt0|5#Y_r22#KXgf2k(FIY7I + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +/* #include */ +#include +#define __USE_GNU +#include +#undef __USE_GNU + +#include "config.h" + +#if !defined(RTLD_NEXT) +#define RTLD_NEXT RTLD_DEFAULT +#endif + +#if defined(HAVE___PROGNAME) +extern char *__progname; +#endif + +#if defined(HAVE_GETPROGNAME) +/* all fine */ +#else +const char * +getprogname(void) { +#if defined(HAVE___PROGNAME) + return __progname; +#else + return NULL; +#endif +} +#endif + +static int inited = 0; +static size_t count = 0; +static size_t max_count = 0; +static size_t min_size = 0; +static void *(*real_malloc)(size_t size) = NULL; +static void *(*real_calloc)(size_t number, size_t size) = NULL; +static void *(*real_realloc)(void *ptr, size_t size) = NULL; + +static const char *myname = NULL; + +/* TODO: add sentinel -- check if particular size is malloced before doing other stuff */ +/* TODO: catch free for sentinel too */ +/* TODO: optionally, catch malloc of particular size */ + +static void +init(void) { + char *foo; + myname = getprogname(); + if (!myname) + myname = "(unknown)"; + if ((foo = getenv("MALLOC_MAX_COUNT")) != NULL) + max_count = strtoul(foo, NULL, 0); + if ((foo = getenv("MALLOC_MIN_SIZE")) != NULL) + min_size = strtoul(foo, NULL, 0); + real_calloc = dlsym(RTLD_NEXT, "calloc"); + if (!real_calloc) + abort(); + real_malloc = dlsym(RTLD_NEXT, "malloc"); + if (!real_malloc) + abort(); + real_realloc = dlsym(RTLD_NEXT, "realloc"); + if (!real_realloc) + abort(); + inited = 1; +} + +void * +calloc(size_t number, size_t size) { + void *ret; + + if (!inited) { + init(); + } + + if (number >= min_size / size && count >= max_count) { + errno = ENOMEM; + return NULL; + } + + ret = real_calloc(number, size); + if (size >= min_size) { + count++; + } + + return ret; +} + +void * +malloc(size_t size) { + void *ret; + + if (!inited) { + init(); + } + + if (size >= min_size && count >= max_count) { + errno = ENOMEM; + return NULL; + } + + ret = real_malloc(size); + if (size >= min_size) { + count++; + } + + return ret; +} + +void * +realloc(void *ptr, size_t size) { + void *ret; + + if (!inited) { + init(); + } + + if (size >= min_size && count >= max_count) { + errno = ENOMEM; + return NULL; + } + + ret = real_realloc(ptr, size); + if (size >= min_size) { + count++; + } + + return ret; +} diff --git a/deps/libzip/regress/manyfiles-zip.zip b/deps/libzip/regress/manyfiles-zip.zip new file mode 100644 index 0000000000000000000000000000000000000000..19ad57d66f0a9a153e93d8248e7f08a43863b79d GIT binary patch literal 3434201 zcmeF44P2B}_V_i@$wEw%=m9s zmV{HfWvwZiDVoZNR&GBR(agZtLEXeM1w#cyng91ZFyqYd;8xr2#yk@rr(uc3_W#m{jN6+&WLk`WjhZ)}_N!6j#%F8Ps4?g0wz{>3G=6yC_E$gr zGO8@HXU{*LXmWaHx6_GD|Nh~;2iLay%Z$)*e{GWzbZFnlV-v~_>y2e4dTUwP#Vqrc z?^5k0MP_^PZoA!Rvzg0|#^x^D6mV`)X>R%^!@2zEbLPt%vcj9jHJwxYqld=rZTd>> zRT<;neeFG!zmHz4{P+HAmH$@1R{3wmYnA_2y;k{eqw!{c8(PEZ=-v`!^S!oZa8p`D)IEQTvnJzjVw|`8(LL z(%+{!Dt`w*t@JlFN9FI})JlIBa#a4-eLrgdt`Cy>8*EgDaKeDA=A z`quK=FKP4I!*m%@4#Mt z>$dRLFB_(Q^Yy@fecQG0)-ThhezR|2-@Ywcc)y z@Yhd|(<=Y%pH}&A z_q57?ho@Ek+cmB7U-q=he_7Ki|5?t2Wyh~69agmYT-4FL&$6aj&Kw$VS$*lCHb0(T zHFtHBjZfu__tr1tR=vOa&5chT8t<)NMz4Bf_27+99USkiUnZ^Eu=?ALPaPibtzSm1 zTC}?J#zQ&dz4gn4RjXHT+<55FcyIkOW>w1S7dIX{INn>oWDSnpcxe5BWveeu+%RTU zXvEorK8rg_ZoP4bLsgtN6n+A-`TO@ZJq!4|(VNaqIVuH9&a}@SzGlm?=*{O|IQrdZyOn}% z!-`%wx_eqsw)>Y|(+t`1!-}3i>hk5__>95+8=qQxVD{=J6E}=pRV$)hju#ibIdQ|Y zt6E32J2?KU!TmNq^~r(PR(o;L7lYewd}`f+msby-xZ#;qjU!g)jQ8H6ZzpbeZdIp< z)d$CC4xX^_sr3hzuJ+=hd8=Q{8L!EYor9ZgJhb+}ORGCi-0<|Ox)GCd#(Qtk#)%t7 zuWA=D>EQU?gCjN``sBcytG&2r$?6vmj@RTz(&|e&<2CrPcl^co4kRqe?f29B#b3vD zjk`VlK2v+srpZ%|=6;qjE%8k4?7C~34GS(W_-fkXGk0b8Uz0p6c=O~Jj{fsADQJ@2 zZcW6nv`v$rR}89!N`Z$#Rc>LOJO0_cGl6SjH@ScDFsRBcEDwXK!ovFQvn6Lntcl%x z&h1Osn$k_@PJWhj#^uXyEg4l!G-XtMr6r?ku%?Wv%)ucOH|*5rhlY%*&YCi+b`Rb% zaf3!bVkd6cHCTfm^9G;MufDY9M$>CSUo1Jb`}ppH(IqdG?C> zEG&nI%FSiv>8C39Tsb{dZZ0c_hsw=m<>{xY@Lak1smeW9!?ok7!l)Xl9Z!|wjnj&! z3Zv>7?Rcuh8+YjGRV_67p%qURM%B~W@l+|^xY4VIZ#<;Qk5Q{aHy+a9$ESx%_Kvsq zD`;Kv=eTj{&C_o&y&1G5$l;&za9EZ5r#u{1<^CxThn1T-

F?#sF0!fMQ>{nNyCC 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

    XUXjD>f(aEl#Q$1z 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

    FM5tsp5j;l0;z! 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

    VXcM6%C`J?}q- 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

    #Yi7;jnGy#F| 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%0D2!?Z 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�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
    uuPa#jv*!k6D|8?-TjP{ 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

    i+wgA1v&<_(%6V`je)Y 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

    (IWK~-U4c^Om{ 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Ý()arzX(sz?eR3I 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

    nv)GaS}ykl6{a&Tz~V*mVTW z{>1LoZs?1bObd(oXA1&FCT{Xws5A#f)8&tvnTXpvbNQnUB0r?vpkQQDbsSLYS>Mgf z@Qj6;u&CXU`BKCta&Zs7D}DEhkoc5^!QAd>TW)uhYF9Pw(DlgAl{{-xmj>hH8LFhu z?>2Mo8O9W!WyI<}4yvp)CvtK-?n80FmMZI8d=DkOc=Gv$jUq701eGpiLzPwM>s%yN zKqC{mJ1R2m8MedjPyuSYBXu1IS#-d%t=K7;hM=|AyzhMW?SDD*)US@$hU~AUIVy#P z&^6;DuTBTpg_v^&2W zESMo7%_F!24CADFOg%0yavUGWZzQ(wRK{Hc%7v6)cbZiZ-nc+OCpqX4Shp^l$|QoXPq^3 z?Z25@uDE>PZnJvTS%4QAr8Ni*=`xw9r4b4Fh~FuUi(=yUT4O`KUd*H7Qw7zuzk;dsKjg@a%cc3WVu(eot(pd4e z@n2tepcgMU7vSX?c=GVBH+{GLonOAtY@hvUM5({qUUt=Ly!_ws@+iLjGYmHq-)_O@ z@%~%iFxGf=DPA1B_WmQIAAa&!>us3(y8Dk5@5DqHu6%L`gZHk#|H$|y`*wf&#B}_0 z0p44H-xPmy|B;dQ!x-qM-}v;2`FOJPLr)$X#OKz`wg2ftvl3HXSOUt%uVSFf0L1%F z8Z-Zh_dkp$8}RTT@+~P&Qwzc>@JbVccSK;9@JlurOH&?U&EoT2syoi71sT+2F z@5r|PCyx~%L+{ZOc=18Zx*4X49`9XuU>p#)p6&V1``+>0_RARPGQhhU@9qbE z$M7znPhgahquH=t2c&Z`)g-=sycfi1z8g54h9`f4CuicxP0*Yd zF;m|!c4FMC@ox>7(}%Iij&ZnJnOu7c(FK^$;jm7uy=nwE`KmPRr zBTtvZcvv;8J7?Q*~h@V{2h7=TwK+(PU>q0y^3r{MUp>lwHjc5Bn9D+XyWctAH zalkbWB+c1C?A1Xcwy-+2`CicD-!TkmW9DL*d-3^==5zS#)A+X--+U3@oW_Aq1#0JD z=2wO=;5P8Dbqz#%9whC}c=9Pcp*U>aQH7B3qb-<)hztVj1wgR`EWN+jgKvZ`92V+g z{s(?M2S0wc1fLpULU|r$|9$*>0IwgxU?U*z!b6i7asy<207Lfv7sxtLDjR@cCVuu% z0~3q@arF2`=>vYW8ndpz07LkaKi&D-)A;t281`0t`v5*KB+uRo2!;W{3oRn{Yd{QA z(}1LuP$zRfp7a5>?-lRkVNL4NyYL9J7t8QyJ_vXk2&iIG$XG&wZf5@RLnI*n=N$29!NeS@N#|NX9|p*3ogm)q{U% zh%xY0_;L8zwRrIWhUmqQ`rB7xz*YF`HawY%`7gldN!r26$e7s3ECwu43PWkS3P1fj zvk0gy#tai+auZ}MX9Go{OBvGTGB_c(WBhHo=k_$Rwi`NharRiuhvIM1^F^di#wgmqo3o-FgiY;U`Ej|mo<>fG~3?0V_f z96Q7)ymtCpo1@3=JC%39UAu+cd@Fj>d9|ZmT8nlXe_|9J6~8kEhtTp^;@dNm6j$;S3!HP#`%jE{c*UlY{aJ@oNq!3>`%KVRg*6$Sk3d(O}?lp z&hwj*F10MaPJ?}JeamA0SumuB@vw0{`iVeVf&{P5>q9R1wbPej>+c3?CM{vc-4DY3i>Qj&v@3}z(2 z6%$idluNI#tOv?eB5VfDk3=$50%Q#|n-fh9XJ+<;U54c+#p!EyKQ`$Tl|c!>BNE{bKm0oHZ-#K@fv=1uG>0%3{yjFOD zrMOc*k}f_JHLjB7b~3_p=}@LN>8lndj-txc${!09ev~8l4*o~#05*inyh3Q>QV0CH zpyK#>ym1*%1h)w7Bd)x~*>(AKaom2a8JF?cO4(W~1XbD#B|@l1t9o?71f8w&X&8P~ zv4Un>252u78SrD#Y@hhkw9W2x@4`Gf?zJYCPmY3R`$CcSAWtv{2{ow|W*k=( zBz3Jzq;FjJ)E%9LQFbOK>G6nTlpt^Sg#;_O)F8fTzLyvXBHioqc0KV=b&VtDaXBHw ztJq^!a3Fe@n^c6;YSE}Texyo|&oZViXrH!f8w)ek`4pMV%(fqs1}2viDqgW*L{PVP zGHEd<`j*5W@%eO8*Uz4~8I8-)p7-(GTzwMrw1@WY@UijdI;=!+lmn2%#%GcPaZ#JY zu=-{R@%!a0Nc@mTvePh2Vuk{QX{%bGZlBU}fvgCw_44E6aZ9NIb;h;TYf{g*@44R}!-^e$xU|9%Ua@ zU*RGk7XJEC63?dr#xtAOyN2Qw)6%-rzl)=&EaNsMV2-?Cw3(S^62Q$;~e96 zN|z0iE2pn-kmBkVF)+`k5pU%TjKYs<^bI?Jc_D(+t{&}Cu30JnrRA3w&@S*_YBety z7@Ai3FRX775%8w9tolkn@$RMLUx?5#8^YI#^`IT1Oz0W4qq@4}nmR6KPzI`GN~FQ8 zNWcV)*1wiHC^2LelcV@ejJ3cB*=bqT3sdU)u6i9jRkPTQ520cz^B-yoU9E|c>-(uku+b{=!1 z9h~M+MPH1n26glBN`OYjt{%ofSowxek9K?JfsovU*0(*o z*>_&NK`LYXIv&hWY$q)^hC4}!UCo0j6@E~p&IZXH%JEuc;T>m)KjXg`x67>gFNInc z9p!!ttA4l3OEAhNDH(EfG3vZA>F>fX+1i#|_{HbhtIb+qV8%r^JnkI>(;JGbe{5Vp zyS72nSG1EZZae2Yz4%c;7qg!ZLBf48zOyCQ0PnsG$}|8;PU5v?acD% zowmO01oE=gdaCBz(VK3vfi>LF#jXSpX?bXR_Fbg5NWSHlN1gQjY@#C$76EgrAn$qijwxL7c15nV?IKAG_(Z8 zdO#KukLY^i!xN@xh~}a<_VSodCQxagj@sls_Q6iBofht1)(qiLWhfx@tyYsgsv2fUqyK zlOeflCilKW+R`=CT5HzRf+tKv;ZJUJHTPR2UxV)@h=e)#Vn}c=7sFm-wS7@V z(T+!SVCE!Df*pFi>MI?e6vVUO*qSykY(FgGZDFEc*WXGA6hJWl%@bEevOD*!%UDSK z;CdxSU~W&W5O|F@h>(xd#8q|E>&g}iohWL1MZ(mRwkOWC%=c8aQqgn~8?JmR>^GM4 zUoJ}%x5<_VDf6OsF2twb;#1sPr!3`Rj5i@<{FiZe83LhIh%Sizm!5s|Koi93~qcT-+ePHmTAU%(HTMLmJvO7C(-%Ka>TtHx_h43oR-p z(*uDU6Q3cp!s&p2-iIKMYz&f*rzO;K+Nu#4nDIm`6@=|{@T&VSaR;xC|1z$ck;r`J z1n}cJT?@dd7F`@A2*CW35ZVhDshc`aN^`i*zF+fRiueRC@nOwkZ^o{^0|RjxiMRa? zRZLHR%!OZi<2Nnl<`W|~vNJ~7e<@rRpk`otJi69!f{nx6AoVMOw$A`+!Hd)|N^OJG z8!K#QgESHwTuV9gcexGH9rgvc?)m(55SS5gNI3?0U#IM)c2cLI(vlp-fuE{f1%b`q z@7(>Sw1Ej0Ol@EW65&EI*Y>}Ih_qI zD4{I)1$KF2v8GBNyi+vG8&w#JKKoNbyE?QRMpe8JFG5SnNe6NW*XZyqPvG{d+k~w$ zr8z7gIn!L3$$VZu%7Va|`a5@&M32q2mKZhj!VsOeXMmF|qW3aG##N6CMzzT3I6Yl! z>lNgW%Ge)u!hNu*VnHJK=B@T)-MskoS(Y#z^U{-GABoODPL){OEQ4E(Z`ZCaai^g2 zISxh$e5pyuEaMI*l6LAiLoLTajChD(ywxj}pf3G#Nz;6WNb7iF z!$ypDxsy{$TPX@Ikb_ZbrwPj;kX;x`F1nTruAOhZNR%d%J~I9`R*vHLM!B0y?#lEX zFh8?wYAk-SJSR3WvtwCyCdND`IEdMBWaww%?h;|W=yu%NOFX4yYcKF|eLGVR8l*TF zq7@KpwJkJL3owt#`(5LWzg8n1_Uz&NzR=e$lzoT@ZE@{7%k)*&}aOXCT-3#u%mFi^ybzg*BGr ziR}o%;%<_PAKOcv<=`kTxRc3pn5(O@hL9yr1bjLOTnqxdxfI6@|A7=oY%k68;lza2 zov$n6H=SkOpGzS1iBkjFMJ<6pVdwH!%I;MjOkZpaEG$89FMVJ+nc{#KYceSg@Y@`u z>?Tgw8NZh#)5g%oBjS~Pajv+qnMyyS6PWJNn?m%WB7a-_~m)Ju2 ztJP+$M`kij`REDEnc73?X-4e2Os{Ra2sz?{%l2VgSyUCw#?LfrJuH8u|L>Vl8nT{rq1 z5_^GpstWYQKjlo!D*_cMvWab{w)$V6a*LJ%4| zAAv~~f)LtQz9<${ak1&nibEDQ2|GCZ3}qJpVU<_o5tuT=rw;)aTDw{VMqTwz!3-iW zPl-%>PJu2f3t#e~z}jFLLxt2wV7?jS$5HTI>S7b(w+s`LFtPtq`Wj=0kMm!eiNn!= z**rrZlfFj+lMNQB3fl0od20;q)Vl}nx^E}^!}2Ln(okO7b75JjNH<513l*0KMw9N0 z!nSniso0s>B9%I*=R>ADVpy%|;0c%_(?9QQOWa9++popGb9KA@D{x;jIgSZNqf_zS zN!kCAwmovbvASO|q%@7ox+l7-dx-!kQ-DZf1B`A?pD-sYEo_iN`2pFHKyzIx%5Uzzgj zQ#$|q_BwvL^b;%B{`n=Jx_I@x&t3BAkN?pdr%Zk9NB0e0cKP%vzx0OZrcRmihEL+9 zaLC~mr=ItNr5Amx@8iER<-*^)W6E39kYBUnG5^usGY@%JZB`PglPQ%+GMPkZE)VC46ndFK50%E0^oO${7_{5(K@OY6HITM6K{ zf(ma_1AphTw*>=(3h(`$cV9a6$;&=9B;&tvtn2vS29@9Xv%g+FW^-3yA0=yZS + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "zipint.h" + +bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + memset(buffer, 0, length); + + return true; +} diff --git a/deps/libzip/regress/nonrandomopentest.c b/deps/libzip/regress/nonrandomopentest.c new file mode 100644 index 00000000000000..e4585a478825e3 --- /dev/null +++ b/deps/libzip/regress/nonrandomopentest.c @@ -0,0 +1,57 @@ +/* + nonrandomopentest.c -- test nonrandomopen.so + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner + + This file is part of ckmame, a program to check rom sets for MAME. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +#include +#include + +int +main(int argc, const char *argv[]) { + zip_uint8_t buf[1024]; + int i; + +#ifdef HAVE_CRYPTO + if (!zip_secure_random(buf, sizeof(buf))) { + fprintf(stderr, "zip_secure_random returned false\n"); + exit(1); + } + for (i = 0; i < sizeof(buf); i++) { + if (buf[i] != 0) { + fprintf(stderr, "non-zero byte found\n"); + exit(1); + } + } +#endif + exit(0); +} diff --git a/deps/libzip/regress/open_cons_extrabytes.test b/deps/libzip/regress/open_cons_extrabytes.test new file mode 100644 index 00000000000000..ab6b01872c9b9a --- /dev/null +++ b/deps/libzip/regress/open_cons_extrabytes.test @@ -0,0 +1,7 @@ +# zip_open: file has extra bytes at end of archive +program tryopen +file testextrabytes.zzip testextrabytes.zip testextrabytes.zip +args -c testextrabytes.zzip +return 1 +stdout opening 'testextrabytes.zzip' returned error 21/2 +stderr 1 errors diff --git a/deps/libzip/regress/open_empty.test b/deps/libzip/regress/open_empty.test new file mode 100644 index 00000000000000..8f05d2921de9b8 --- /dev/null +++ b/deps/libzip/regress/open_empty.test @@ -0,0 +1,6 @@ +# zip_open: file contains no entry, but is valid +program tryopen +file testempty.zip testempty.zip testempty.zip +args testempty.zip +return 0 +stdout opening 'testempty.zip' succeeded, 0 entries diff --git a/deps/libzip/regress/open_empty_2.test b/deps/libzip/regress/open_empty_2.test new file mode 100644 index 00000000000000..bb35bc62f92a85 --- /dev/null +++ b/deps/libzip/regress/open_empty_2.test @@ -0,0 +1,7 @@ +# zip_open: 0 size file is recognized as empty zip +program tryopen +file testfile.txt testfile.txt testfile.txt +args testfile.txt +return 1 +stdout opening 'testfile.txt' returned error 19 +stderr 1 errors diff --git a/deps/libzip/regress/open_extrabytes.test b/deps/libzip/regress/open_extrabytes.test new file mode 100644 index 00000000000000..1cfce246cdeee3 --- /dev/null +++ b/deps/libzip/regress/open_extrabytes.test @@ -0,0 +1,6 @@ +# zip_open: file has extra bytes at end of archive +program tryopen +file testextrabytes.zzip testextrabytes.zip testextrabytes.zip +args testextrabytes.zzip +return 0 +stdout opening 'testextrabytes.zzip' succeeded, 1 entries diff --git a/deps/libzip/regress/open_file_count.test b/deps/libzip/regress/open_file_count.test new file mode 100644 index 00000000000000..e5106470edfe43 --- /dev/null +++ b/deps/libzip/regress/open_file_count.test @@ -0,0 +1,11 @@ +# zip_open: various inconsistent files +program tryopen +file incons-file-count-high.zzip incons-file-count-high.zip incons-file-count-high.zip +file incons-file-count-low.zzip incons-file-count-low.zip incons-file-count-low.zip +file incons-file-count-overflow.zzip incons-file-count-overflow.zip incons-file-count-overflow.zip +args incons-file-count-high.zzip incons-file-count-low.zzip incons-file-count-overflow.zzip +return 1 +stdout opening 'incons-file-count-high.zzip' returned error 21/5 +stdout opening 'incons-file-count-low.zzip' returned error 21/5 +stdout opening 'incons-file-count-overflow.zzip' returned error 21/11 +stderr 3 errors diff --git a/deps/libzip/regress/open_filename_duplicate.test b/deps/libzip/regress/open_filename_duplicate.test new file mode 100644 index 00000000000000..5204db6e50b7ca --- /dev/null +++ b/deps/libzip/regress/open_filename_duplicate.test @@ -0,0 +1,6 @@ +# zip_open: file opens fine even though same file name appears twice +program tryopen +args filename_duplicate.zzip +return 0 +file filename_duplicate.zzip filename_duplicate.zip filename_duplicate.zip +stdout opening 'filename_duplicate.zzip' succeeded, 2 entries diff --git a/deps/libzip/regress/open_filename_duplicate_consistency.test b/deps/libzip/regress/open_filename_duplicate_consistency.test new file mode 100644 index 00000000000000..e82cf751b29384 --- /dev/null +++ b/deps/libzip/regress/open_filename_duplicate_consistency.test @@ -0,0 +1,7 @@ +# zip_open: file opens fine even though same file name appears twice +program tryopen +args -c filename_duplicate.zzip +return 1 +file filename_duplicate.zzip filename_duplicate.zip filename_duplicate.zip +stdout opening 'filename_duplicate.zzip' returned error 10 +stderr 1 errors diff --git a/deps/libzip/regress/open_filename_duplicate_empty.test b/deps/libzip/regress/open_filename_duplicate_empty.test new file mode 100644 index 00000000000000..ea143b609a7aa6 --- /dev/null +++ b/deps/libzip/regress/open_filename_duplicate_empty.test @@ -0,0 +1,6 @@ +# zip_open: file opens fine even though same file name (empty file name) appears twice +program tryopen +args filename_duplicate_empty.zzip +return 0 +file filename_duplicate_empty.zzip filename_duplicate_empty.zip filename_duplicate_empty.zip +stdout opening 'filename_duplicate_empty.zzip' succeeded, 2 entries diff --git a/deps/libzip/regress/open_filename_duplicate_empty_consistency.test b/deps/libzip/regress/open_filename_duplicate_empty_consistency.test new file mode 100644 index 00000000000000..657019563136df --- /dev/null +++ b/deps/libzip/regress/open_filename_duplicate_empty_consistency.test @@ -0,0 +1,7 @@ +# zip_open: file opens fine even though same file name (empty file name) appears twice +program tryopen +args -c filename_duplicate_empty.zzip +return 1 +file filename_duplicate_empty.zzip filename_duplicate_empty.zip filename_duplicate_empty.zip +stdout opening 'filename_duplicate_empty.zzip' returned error 10 +stderr 1 errors diff --git a/deps/libzip/regress/open_filename_empty.test b/deps/libzip/regress/open_filename_empty.test new file mode 100644 index 00000000000000..96f3efc0d4966f --- /dev/null +++ b/deps/libzip/regress/open_filename_empty.test @@ -0,0 +1,6 @@ +# zip_open: file opens fine even though file name has length 0 +program tryopen +args filename_empty.zip +return 0 +file filename_empty.zip filename_empty.zip filename_empty.zip +stdout opening 'filename_empty.zip' succeeded, 1 entries diff --git a/deps/libzip/regress/open_incons.test b/deps/libzip/regress/open_incons.test new file mode 100644 index 00000000000000..768980ff0275a0 --- /dev/null +++ b/deps/libzip/regress/open_incons.test @@ -0,0 +1,73 @@ +# zip_open: various inconsistent files +program tryopen +file incons-archive-comment-longer.zzip incons-archive-comment-longer.zip incons-archive-comment-longer.zip +file incons-archive-comment-shorter.zzip incons-archive-comment-shorter.zip incons-archive-comment-shorter.zip +file incons-cdoffset.zzip incons-cdoffset.zip incons-cdoffset.zip +file incons-central-compression-method.zzip incons-central-compression-method.zip incons-central-compression-method.zip +file incons-central-compsize-larger.zzip incons-central-compsize-larger.zip incons-central-compsize-larger.zip +file incons-central-compsize-larger-toolarge.zzip incons-central-compsize-larger-toolarge.zip incons-central-compsize-larger-toolarge.zip +file incons-central-compsize-smaller.zzip incons-central-compsize-smaller.zip incons-central-compsize-smaller.zip +file incons-central-crc.zzip incons-central-crc.zip incons-central-crc.zip +file incons-central-date.zzip incons-central-date.zip incons-central-date.zip +file incons-central-file-comment-longer.zzip incons-central-file-comment-longer.zip incons-central-file-comment-longer.zip +file incons-central-file-comment-shorter.zzip incons-central-file-comment-shorter.zip incons-central-file-comment-shorter.zip +file incons-central-magic-bad.zzip incons-central-magic-bad.zip incons-central-magic-bad.zip +file incons-central-magic-bad2.zzip incons-central-magic-bad2.zip incons-central-magic-bad2.zip +file incons-central-size-larger.zzip incons-central-size-larger.zip incons-central-size-larger.zip +file incons-data.zzip incons-data.zip incons-data.zip +file incons-ef-central-size-wrong.zzip incons-ef-central-size-wrong.zip incons-ef-central-size-wrong.zip +file incons-ef-local-id-size.zzip incons-ef-local-id-size.zip incons-ef-local-id-size.zip +file incons-ef-local-id.zzip incons-ef-local-id.zip incons-ef-local-id.zip +file incons-ef-local-size.zzip incons-ef-local-size.zip incons-ef-local-size.zip +file incons-eocd-magic-bad.zzip incons-eocd-magic-bad.zip incons-eocd-magic-bad.zip +file incons-file-count-high.zzip incons-file-count-high.zip incons-file-count-high.zip +file incons-file-count-low.zzip incons-file-count-low.zip incons-file-count-low.zip +file incons-file-count-overflow.zzip incons-file-count-overflow.zip incons-file-count-overflow.zip +file incons-local-compression-method.zzip incons-local-compression-method.zip incons-local-compression-method.zip +file incons-local-compsize-larger.zzip incons-local-compsize-larger.zip incons-local-compsize-larger.zip +file incons-local-compsize-smaller.zzip incons-local-compsize-smaller.zip incons-local-compsize-smaller.zip +file incons-local-crc.zzip incons-local-crc.zip incons-local-crc.zip +file incons-local-filename-long.zzip incons-local-filename-long.zip incons-local-filename-long.zip +file incons-local-filename-missing.zzip incons-local-filename-missing.zip incons-local-filename-missing.zip +file incons-local-filename-short.zzip incons-local-filename-short.zip incons-local-filename-short.zip +file incons-local-filename.zzip incons-local-filename.zip incons-local-filename.zip +file incons-local-magic-bad.zzip incons-local-magic-bad.zip incons-local-magic-bad.zip +file incons-local-size-larger.zzip incons-local-size-larger.zip incons-local-size-larger.zip +args -c incons-archive-comment-longer.zzip incons-archive-comment-shorter.zzip incons-cdoffset.zzip incons-central-compression-method.zzip incons-central-compsize-larger-toolarge.zzip incons-central-compsize-larger.zzip incons-central-compsize-smaller.zzip incons-central-crc.zzip incons-central-date.zzip incons-central-file-comment-longer.zzip incons-central-file-comment-shorter.zzip incons-central-magic-bad.zzip incons-central-magic-bad2.zzip incons-central-size-larger.zzip incons-data.zzip incons-ef-central-size-wrong.zzip incons-ef-local-id-size.zzip incons-ef-local-id.zzip incons-ef-local-size.zzip incons-eocd-magic-bad.zzip incons-file-count-high.zzip incons-file-count-low.zzip incons-file-count-overflow.zzip incons-local-compression-method.zzip incons-local-compsize-larger.zzip incons-local-compsize-smaller.zzip incons-local-crc.zzip incons-local-filename-long.zzip incons-local-filename-missing.zzip incons-local-filename-short.zzip incons-local-filename.zzip incons-local-magic-bad.zzip incons-local-size-larger.zzip +return 1 +stdout opening 'incons-archive-comment-longer.zzip' returned error 21/2 +stdout opening 'incons-archive-comment-shorter.zzip' returned error 21/2 +stdout opening 'incons-cdoffset.zzip' returned error 21/1 +stdout opening 'incons-central-compression-method.zzip' returned error 21/6 +stdout opening 'incons-central-compsize-larger-toolarge.zzip' returned error 19 +stdout opening 'incons-central-compsize-larger.zzip' returned error 21/6 +stdout opening 'incons-central-compsize-smaller.zzip' returned error 21/6 +stdout opening 'incons-central-crc.zzip' returned error 21/6 +stdout opening 'incons-central-date.zzip' returned error 21/6 +stdout opening 'incons-central-file-comment-longer.zzip' returned error 21/12 +stdout opening 'incons-central-file-comment-shorter.zzip' returned error 21/260 +stdout opening 'incons-central-magic-bad.zzip' returned error 19 +stdout opening 'incons-central-magic-bad2.zzip' returned error 19 +stdout opening 'incons-central-size-larger.zzip' returned error 21/6 +# tryopen does not test checksums, so this is fine. +stdout opening 'incons-data.zzip' succeeded, 1 entries +stdout opening 'incons-ef-central-size-wrong.zzip' returned error 21/16 +stdout opening 'incons-ef-local-id-size.zzip' returned error 21/16 +# different extra fields local vs. central is fine +stdout opening 'incons-ef-local-id.zzip' succeeded, 1 entries +stdout opening 'incons-ef-local-size.zzip' returned error 21/16 +stdout opening 'incons-eocd-magic-bad.zzip' returned error 19 +stdout opening 'incons-file-count-high.zzip' returned error 21/5 +stdout opening 'incons-file-count-low.zzip' returned error 21/5 +stdout opening 'incons-file-count-overflow.zzip' returned error 21/11 +stdout opening 'incons-local-compression-method.zzip' returned error 21/6 +stdout opening 'incons-local-compsize-larger.zzip' returned error 21/6 +stdout opening 'incons-local-compsize-smaller.zzip' returned error 21/6 +stdout opening 'incons-local-crc.zzip' returned error 21/6 +stdout opening 'incons-local-filename-long.zzip' returned error 17 +stdout opening 'incons-local-filename-missing.zzip' returned error 21/6 +stdout opening 'incons-local-filename-short.zzip' returned error 21/16 +stdout opening 'incons-local-filename.zzip' returned error 21/6 +stdout opening 'incons-local-magic-bad.zzip' returned error 19 +stdout opening 'incons-local-size-larger.zzip' returned error 21/6 +stderr 31 errors diff --git a/deps/libzip/regress/open_many_fail.test b/deps/libzip/regress/open_many_fail.test new file mode 100644 index 00000000000000..2b57e15443b4bc --- /dev/null +++ b/deps/libzip/regress/open_many_fail.test @@ -0,0 +1,11 @@ +# zip_open: files with >65k that have issues +program tryopen +args manyfiles-zip64-modulo.zzip manyfiles-fewer.zzip manyfiles-more.zzip +return 1 +file manyfiles-zip64-modulo.zzip manyfiles-zip64-modulo.zip manyfiles-zip64-modulo.zip +file manyfiles-fewer.zzip manyfiles-fewer.zip manyfiles-fewer.zip +file manyfiles-more.zzip manyfiles-more.zip manyfiles-more.zip +stdout opening 'manyfiles-zip64-modulo.zzip' returned error 21/5 +stdout opening 'manyfiles-fewer.zzip' returned error 21/5 +stdout opening 'manyfiles-more.zzip' returned error 21/5 +stderr 3 errors diff --git a/deps/libzip/regress/open_many_ok.test b/deps/libzip/regress/open_many_ok.test new file mode 100644 index 00000000000000..248868d909aa4d --- /dev/null +++ b/deps/libzip/regress/open_many_ok.test @@ -0,0 +1,12 @@ +# zip_open: files open fine, have > 65k entries +program tryopen +args manyfiles.zip manyfiles-zip64.zip manyfiles-133000.zip manyfiles-65536.zip +return 0 +file manyfiles.zip manyfiles.zip manyfiles.zip +file manyfiles-zip64.zip manyfiles-zip64.zip manyfiles-zip64.zip +file manyfiles-133000.zip manyfiles-133000.zip manyfiles-133000.zip +file manyfiles-65536.zip manyfiles-65536.zip manyfiles-65536.zip +stdout opening 'manyfiles.zip' succeeded, 70000 entries +stdout opening 'manyfiles-zip64.zip' succeeded, 70000 entries +stdout opening 'manyfiles-133000.zip' succeeded, 133000 entries +stdout opening 'manyfiles-65536.zip' succeeded, 65536 entries diff --git a/deps/libzip/regress/open_multidisk.test b/deps/libzip/regress/open_multidisk.test new file mode 100644 index 00000000000000..1da4a5ca6b5f57 --- /dev/null +++ b/deps/libzip/regress/open_multidisk.test @@ -0,0 +1,7 @@ +# zip_open: file is part of a multi-disk zip archive +program tryopen +args test.piz +return 1 +file test.piz multidisk.zip multidisk.zip +stdout opening 'test.piz' returned error 1 +stderr 1 errors diff --git a/deps/libzip/regress/open_new_but_exists.test b/deps/libzip/regress/open_new_but_exists.test new file mode 100644 index 00000000000000..002ccb4a0a82ee --- /dev/null +++ b/deps/libzip/regress/open_new_but_exists.test @@ -0,0 +1,7 @@ +# zip_open: file shall be created but already exists +program tryopen +args -e test.zip +return 1 +file test.zip test.zip test.zip +stdout opening 'test.zip' returned error 10 +stderr 1 errors diff --git a/deps/libzip/regress/open_new_ok.test b/deps/libzip/regress/open_new_ok.test new file mode 100644 index 00000000000000..b1452c7c54b678 --- /dev/null +++ b/deps/libzip/regress/open_new_ok.test @@ -0,0 +1,5 @@ +# zip_open: create new archive +program tryopen +args -n new.zip +return 0 +stdout opening 'new.zip' succeeded, 0 entries diff --git a/deps/libzip/regress/open_nonarchive.test b/deps/libzip/regress/open_nonarchive.test new file mode 100644 index 00000000000000..44c48367b8c836 --- /dev/null +++ b/deps/libzip/regress/open_nonarchive.test @@ -0,0 +1,7 @@ +# zip_open: file is not a zip archive +program tryopen +file CMakeLists.txt CMakeLists.txt CMakeLists.txt +args CMakeLists.txt +return 1 +stdout opening 'CMakeLists.txt' returned error 19 +stderr 1 errors diff --git a/deps/libzip/regress/open_nosuchfile.test b/deps/libzip/regress/open_nosuchfile.test new file mode 100644 index 00000000000000..69321640745a05 --- /dev/null +++ b/deps/libzip/regress/open_nosuchfile.test @@ -0,0 +1,6 @@ +# zip_open: file doesn't exist +program tryopen +args nosuchfile +return 1 +stdout opening 'nosuchfile' returned error 9 +stderr 1 errors diff --git a/deps/libzip/regress/open_ok.test b/deps/libzip/regress/open_ok.test new file mode 100644 index 00000000000000..dd1f38e0e30446 --- /dev/null +++ b/deps/libzip/regress/open_ok.test @@ -0,0 +1,6 @@ +# zip_open: file opens fine +program tryopen +args test.zip +return 0 +file test.zip test.zip test.zip +stdout opening 'test.zip' succeeded, 3 entries diff --git a/deps/libzip/regress/open_too_short.test b/deps/libzip/regress/open_too_short.test new file mode 100644 index 00000000000000..b7434bacaa7592 --- /dev/null +++ b/deps/libzip/regress/open_too_short.test @@ -0,0 +1,7 @@ +# zip_open: file is too short for even a central directory entry +program tryopen +args test.piz +return 1 +file test.piz bogus.zip bogus.zip +stdout opening 'test.piz' returned error 19 +stderr 1 errors diff --git a/deps/libzip/regress/open_truncate.test b/deps/libzip/regress/open_truncate.test new file mode 100644 index 00000000000000..7ef753729d0075 --- /dev/null +++ b/deps/libzip/regress/open_truncate.test @@ -0,0 +1,6 @@ +# zip_open: file opens fine and gets truncated +program tryopen +args -t test.zip +return 0 +file-del test.zip test.zip +stdout opening 'test.zip' succeeded, 0 entries diff --git a/deps/libzip/regress/open_zip64_3mf.test b/deps/libzip/regress/open_zip64_3mf.test new file mode 100644 index 00000000000000..4a571549e73d82 --- /dev/null +++ b/deps/libzip/regress/open_zip64_3mf.test @@ -0,0 +1,6 @@ +# zip_open: ZIP64 file opens fine even when most eocd entries are 0xff (3MF format) +program tryopen +args test.zip +return 0 +file test.zip zip64-3mf.zip zip64-3mf.zip +stdout opening 'test.zip' succeeded, 1 entries diff --git a/deps/libzip/regress/open_zip64_ok.test b/deps/libzip/regress/open_zip64_ok.test new file mode 100644 index 00000000000000..ac33f9a47b6523 --- /dev/null +++ b/deps/libzip/regress/open_zip64_ok.test @@ -0,0 +1,6 @@ +# zip_open: ZIP64 file opens fine +program tryopen +args test.zip +return 0 +file test.zip zip64.zip zip64.zip +stdout opening 'test.zip' succeeded, 1 entries diff --git a/deps/libzip/regress/ossfuzz.sh b/deps/libzip/regress/ossfuzz.sh new file mode 100755 index 00000000000000..01e41708c6dd23 --- /dev/null +++ b/deps/libzip/regress/ossfuzz.sh @@ -0,0 +1,35 @@ +#!/bin/bash -eu +# Copyright 2019 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +################################################################################ + +# This script is meant to be run by +# https://github.com/google/oss-fuzz/blob/master/projects/libzip/Dockerfile + +mkdir build +cd build +cmake -DBUILD_SHARED_LIBS=OFF -DENABLE_GNUTLS=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DBUILD_TOOLS=OFF -DENABLE_LZMA=OFF .. +make -j$(nproc) + +$CXX $CXXFLAGS -std=c++11 -I. -I../lib \ + $SRC/libzip/regress/zip_read_fuzzer.cc \ + -o $OUT/zip_read_fuzzer \ + $LIB_FUZZING_ENGINE $SRC/libzip/build/lib/libzip.a -lz + +find $SRC/libzip/regress -name "*.zip" | \ + xargs zip $OUT/zip_read_fuzzer_seed_corpus.zip + +cp $SRC/libzip/regress/zip_read_fuzzer.dict $OUT/ + diff --git a/deps/libzip/regress/preload.test b/deps/libzip/regress/preload.test new file mode 100644 index 00000000000000..5a62114c144ef3 --- /dev/null +++ b/deps/libzip/regress/preload.test @@ -0,0 +1,4 @@ +description test if preload works +program nonrandomopentest +return 0 +preload nonrandomopen.so diff --git a/deps/libzip/regress/progress.test b/deps/libzip/regress/progress.test new file mode 100644 index 00000000000000..a7313fa763395b --- /dev/null +++ b/deps/libzip/regress/progress.test @@ -0,0 +1,10 @@ +# test default compression stores if smaller; print progress +return 0 +args -n test.zip print_progress add compressible aaaaaaaaaaaaaa add uncompressible uncompressible add_nul large-compressible 8200 add_file large-uncompressible large-uncompressible 0 -1 +file-new test.zip cm-default.zip +file large-uncompressible large-uncompressible large-uncompressible +stdout 0.0% done +stdout 25.0% done +stdout 50.0% done +stdout 75.0% done +stdout 100.0% done diff --git a/deps/libzip/regress/read_seek_read.test b/deps/libzip/regress/read_seek_read.test new file mode 100644 index 00000000000000..f32a8a304bcdef --- /dev/null +++ b/deps/libzip/regress/read_seek_read.test @@ -0,0 +1,7 @@ +# read past EOF, seek to beginning, read again +return 0 +args test.zip fopen test fread 0 10 fseek 0 0 set fread 0 5 +file test.zip test.zip test.zip +stdout opened 'test' as file 0 +stdout test +stdout test diff --git a/deps/libzip/regress/rename_ascii.test b/deps/libzip/regress/rename_ascii.test new file mode 100644 index 00000000000000..0010ca41f3b813 --- /dev/null +++ b/deps/libzip/regress/rename_ascii.test @@ -0,0 +1,4 @@ +# rename file to ASCII name in zip archive +return 0 +args testfile rename 0 testfile.txt +file testfile testfile-UTF8.zip testfile.zip diff --git a/deps/libzip/regress/rename_cp437.test b/deps/libzip/regress/rename_cp437.test new file mode 100644 index 00000000000000..5a01250406d892 --- /dev/null +++ b/deps/libzip/regress/rename_cp437.test @@ -0,0 +1,4 @@ +# rename file to CP437 name in zip archive (fails) +return 0 +args testfile.zip rename 0 ‚ƒ„…†‡ˆ‰Š‹ŒŽ +file testfile.zip testfile.zip testfile-cp437.zip diff --git a/deps/libzip/regress/rename_deleted.test b/deps/libzip/regress/rename_deleted.test new file mode 100644 index 00000000000000..9dcc7c36c36ba9 --- /dev/null +++ b/deps/libzip/regress/rename_deleted.test @@ -0,0 +1,5 @@ +# rename deleted entry in zip archive (fails) +return 1 +args testfile.zip delete 1 delete 3 rename 1 othername +file testfile.zip testcomment.zip testcomment13.zip +stderr can't rename file at index '1' to 'othername': Entry has been deleted diff --git a/deps/libzip/regress/rename_fail.test b/deps/libzip/regress/rename_fail.test new file mode 100644 index 00000000000000..185f4e2197069d --- /dev/null +++ b/deps/libzip/regress/rename_fail.test @@ -0,0 +1,5 @@ +# rename file inside zip archive, but file name already exists +return 1 +args rename.zip rename 0 file4 +file rename.zip testcomment.zip testcomment.zip +stderr can't rename file at index '0' to 'file4': File already exists diff --git a/deps/libzip/regress/rename_ok.test b/deps/libzip/regress/rename_ok.test new file mode 100644 index 00000000000000..b76df9c6606f70 --- /dev/null +++ b/deps/libzip/regress/rename_ok.test @@ -0,0 +1,4 @@ +# rename file inside zip archive +return 0 +args rename.zip rename 1 notfile2 +file rename.zip testcomment.zip rename_ok.zip diff --git a/deps/libzip/regress/rename_ok.zip b/deps/libzip/regress/rename_ok.zip new file mode 100644 index 0000000000000000000000000000000000000000..ad073060c75447df53e4872d172ce8b8018c7491 GIT binary patch literal 709 zcmZ{iy-ve07)8I529-z|5wLj$q==s`Obq-itx%*k4-lmeiPYLCF{q4;-H=$AkdVro z@BlEfGcv-?wUe|!N}L;6NqqeI*nY=qI;5|&r%8L~?c#bJeI1)tDNcucH|VdBbr&2Q z>jdK_4bYCHP+X{-$(Y4ymMc7m+;jXH&j;`2_4#%KES(m3LMr{+obCZ>V~;4$6m%)YNBmp-V@|d kPm(j-D&Z{5q9ncI)dE;7GxOe@FV}IMt`z59)!`Ys-)p9&X8-^I literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/rename_utf8.test b/deps/libzip/regress/rename_utf8.test new file mode 100644 index 00000000000000..391ebeb26d3afd --- /dev/null +++ b/deps/libzip/regress/rename_utf8.test @@ -0,0 +1,4 @@ +# rename file to UTF-8 name in zip archive +return 0 +args testfile rename 0 ÄÖÜßäöü +file testfile testfile.zip testfile-UTF8.zip diff --git a/deps/libzip/regress/rename_utf8_encmismatch.test b/deps/libzip/regress/rename_utf8_encmismatch.test new file mode 100644 index 00000000000000..075bca1894f588 --- /dev/null +++ b/deps/libzip/regress/rename_utf8_encmismatch.test @@ -0,0 +1,4 @@ +# rename file to UTF-8 name in zip archive with CP437 comment (sets InfoZIP UTF-8 Name Extension) +return 0 +args testfile rename 0 ÄÖÜßäöü +file testfile test-cp437-fc.zip test-cp437-fc-utf-8-filename.zip diff --git a/deps/libzip/regress/reopen.test b/deps/libzip/regress/reopen.test new file mode 100644 index 00000000000000..6f272a1ab3adfd --- /dev/null +++ b/deps/libzip/regress/reopen.test @@ -0,0 +1,7 @@ +description check the reopen functionality +return 0 +args -- testbuffer.zip cat 0 replace_file_contents 0 "Overwritten\n" cat 0 add newfile.txt "A new file\n" cat 1 +file testbuffer.zip testbuffer.zip testbuffer_reopen.zip +stdout This is a test, and it seems to have been successful. +stdout Overwritten +stdout A new file diff --git a/deps/libzip/regress/reopen_partial.test b/deps/libzip/regress/reopen_partial.test new file mode 100644 index 00000000000000..213c14e61ce779 --- /dev/null +++ b/deps/libzip/regress/reopen_partial.test @@ -0,0 +1,6 @@ +description check the reopen functionality (partial reads) +return 0 +args -- testbuffer.zip cat 0 replace_file_contents 0 "Overwritten\n" cat_partial 0 4 5 add newfile.txt "A new file\n" cat_partial 1 2 3 +file testbuffer.zip testbuffer.zip testbuffer_reopen.zip +stdout This is a test, and it seems to have been successful. +stdout writtnew diff --git a/deps/libzip/regress/reopen_partial_rest.test b/deps/libzip/regress/reopen_partial_rest.test new file mode 100644 index 00000000000000..d1db7c1e299386 --- /dev/null +++ b/deps/libzip/regress/reopen_partial_rest.test @@ -0,0 +1,7 @@ +description check the reopen functionality (partial reads with -1 length) +return 0 +args -- testbuffer.zip cat 0 replace_file_contents 0 "Overwritten\n" cat_partial 0 4 -1 add newfile.txt "A new file\n" cat_partial 1 2 -1 +file testbuffer.zip testbuffer.zip testbuffer_reopen.zip +stdout This is a test, and it seems to have been successful. +stdout written +stdout new file diff --git a/deps/libzip/regress/runtest.in b/deps/libzip/regress/runtest.in new file mode 100644 index 00000000000000..a6eb1407a667b3 --- /dev/null +++ b/deps/libzip/regress/runtest.in @@ -0,0 +1,60 @@ +#!/usr/bin/env perl + +# runtest -- run regression tests +# Copyright (C) 2002-2014 Dieter Baron and Thomas Klausner +# +# This file is part of ckmame, a program to check rom sets for MAME. +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +use strict; + +BEGIN { push @INC, '@abs_srcdir@'; } + +use NiHTest; + +my $test = NiHTest::new({ default_program => 'ziptool_regress', srcdir => '@srcdir@', top_builddir => '@top_builddir@', zipcmp => '../../src/zipcmp', zipcmp_flags => '-p' }); + +sub mangle_test { + my ($test, $variant) = @_; + + if (defined($test->{test}->{preload})) { + if (!defined($test->{test}->{features})) { + $test->{test}->{features} = []; + } + push @{$test->{test}->{features}}, 'SHARED'; + } + + return 1; +} + + +$test->add_comparator('zip/zip', \&NiHTest::comparator_zip); +$test->add_hook('post_parse', \&mangle_test); + +$test->run(@ARGV); diff --git a/deps/libzip/regress/set_comment_all.test b/deps/libzip/regress/set_comment_all.test new file mode 100644 index 00000000000000..5902f98b31f430 --- /dev/null +++ b/deps/libzip/regress/set_comment_all.test @@ -0,0 +1,4 @@ +# change local and global comments in a zip archive +return 0 +args testcomment.zip set_archive_comment "This is the new,\r\nmultiline archive comment.\r\nAin't it nice?" set_file_comment 0 "File comment no 0" set_file_comment 1 "File comment no 1" set_file_comment 2 "File comment no 2" set_file_comment 3 "File comment no 3" +file testcomment.zip testcomment.zip testchanged.zip diff --git a/deps/libzip/regress/set_comment_localonly.test b/deps/libzip/regress/set_comment_localonly.test new file mode 100644 index 00000000000000..08f7b8e5db0385 --- /dev/null +++ b/deps/libzip/regress/set_comment_localonly.test @@ -0,0 +1,4 @@ +# change file comments in a zip archive +return 0 +args testcomment.zip set_file_comment 0 "File comment no 0" set_file_comment 1 "File comment no 1" set_file_comment 3 "File comment no 3" set_file_comment 2 "" +file testcomment.zip testcomment.zip testchangedlocal.zip diff --git a/deps/libzip/regress/set_comment_removeglobal.test b/deps/libzip/regress/set_comment_removeglobal.test new file mode 100644 index 00000000000000..b469b37f431942 --- /dev/null +++ b/deps/libzip/regress/set_comment_removeglobal.test @@ -0,0 +1,4 @@ +# remove archive comment +return 0 +args testcomment.zip set_archive_comment "" +file testcomment.zip testcomment.zip testcommentremoved.zip diff --git a/deps/libzip/regress/set_comment_revert.test b/deps/libzip/regress/set_comment_revert.test new file mode 100644 index 00000000000000..da61c37e4dd644 --- /dev/null +++ b/deps/libzip/regress/set_comment_revert.test @@ -0,0 +1,4 @@ +# start changing local and global comments, but revert before closing +return 0 +args testcomment.zip set_archive_comment "some long string, a bit longer than this at least" set_file_comment 0 "File comment no 0" set_file_comment 1 "File comment no 1" set_file_comment 3 "File comment no 3" set_file_comment 2 "" unchange_all +file testcomment.zip testcomment.zip testcomment.zip diff --git a/deps/libzip/regress/set_compression_bzip2_to_deflate.test b/deps/libzip/regress/set_compression_bzip2_to_deflate.test new file mode 100644 index 00000000000000..bdfacb56c0eb75 --- /dev/null +++ b/deps/libzip/regress/set_compression_bzip2_to_deflate.test @@ -0,0 +1,5 @@ +# change method from bzip2 to deflated +features LIBBZ2 +return 0 +args test.zip set_file_compression 0 deflate 0 +file test.zip testbzip2.zip testdeflated.zip diff --git a/deps/libzip/regress/set_compression_deflate_to_bzip2.test b/deps/libzip/regress/set_compression_deflate_to_bzip2.test new file mode 100644 index 00000000000000..197b43547eed25 --- /dev/null +++ b/deps/libzip/regress/set_compression_deflate_to_bzip2.test @@ -0,0 +1,5 @@ +# change method from deflated to bzip2 +features LIBBZ2 +return 0 +args test.zip set_file_compression 0 bzip2 0 +file test.zip testdeflated.zip testbzip2.zip diff --git a/deps/libzip/regress/set_compression_deflate_to_deflate.test b/deps/libzip/regress/set_compression_deflate_to_deflate.test new file mode 100644 index 00000000000000..e0b31218aeafa9 --- /dev/null +++ b/deps/libzip/regress/set_compression_deflate_to_deflate.test @@ -0,0 +1,4 @@ +# change method from deflated to deflated (no change) +return 0 +args test.zip set_file_compression 0 deflate 0 +file test.zip testdeflated.zip testdeflated.zip diff --git a/deps/libzip/regress/set_compression_deflate_to_store.test b/deps/libzip/regress/set_compression_deflate_to_store.test new file mode 100644 index 00000000000000..1678b9c32e4983 --- /dev/null +++ b/deps/libzip/regress/set_compression_deflate_to_store.test @@ -0,0 +1,4 @@ +# change method from deflated to stored +return 0 +args test.zip set_file_compression 0 store 0 +file test.zip testdeflated.zip teststored.zip diff --git a/deps/libzip/regress/set_compression_lzma_no_eos_to_store.test b/deps/libzip/regress/set_compression_lzma_no_eos_to_store.test new file mode 100644 index 00000000000000..793b8438780bd2 --- /dev/null +++ b/deps/libzip/regress/set_compression_lzma_no_eos_to_store.test @@ -0,0 +1,5 @@ +# change method from lzma-compressed (id 14) without EOS/EOPM marker to stored +features LIBLZMA +return 0 +args test.zip set_file_compression 0 store 0 +file test.zip lzma-no-eos.zip stored-no-eos.zip diff --git a/deps/libzip/regress/set_compression_lzma_to_store.test b/deps/libzip/regress/set_compression_lzma_to_store.test new file mode 100644 index 00000000000000..67fc2907fa3991 --- /dev/null +++ b/deps/libzip/regress/set_compression_lzma_to_store.test @@ -0,0 +1,5 @@ +# change method from lzma-compressed (id 14) to stored +features LIBLZMA +return 0 +args test.zip set_file_compression 0 store 0 +file test.zip testfile-lzma.zip testfile-stored-dos.zip diff --git a/deps/libzip/regress/set_compression_store_to_bzip2.test b/deps/libzip/regress/set_compression_store_to_bzip2.test new file mode 100644 index 00000000000000..28bddd7a2531ef --- /dev/null +++ b/deps/libzip/regress/set_compression_store_to_bzip2.test @@ -0,0 +1,5 @@ +# change method from stored to bzip2 +features LIBBZ2 +return 0 +args test.zip set_file_compression 0 bzip2 0 +file test.zip teststored.zip testbzip2.zip diff --git a/deps/libzip/regress/set_compression_store_to_deflate.test b/deps/libzip/regress/set_compression_store_to_deflate.test new file mode 100644 index 00000000000000..1f83492839a47b --- /dev/null +++ b/deps/libzip/regress/set_compression_store_to_deflate.test @@ -0,0 +1,4 @@ +# change method from stored to deflated +return 0 +args test.zip set_file_compression 0 deflate 0 +file test.zip teststored.zip testdeflated.zip diff --git a/deps/libzip/regress/set_compression_store_to_lzma.test b/deps/libzip/regress/set_compression_store_to_lzma.test new file mode 100644 index 00000000000000..f5ff530ca55efa --- /dev/null +++ b/deps/libzip/regress/set_compression_store_to_lzma.test @@ -0,0 +1,5 @@ +# change method from stored to lzma-compressed (Id 14) +features LIBLZMA +return 0 +args test.zip set_file_compression 0 lzma 0 +file test.zip testfile-stored-dos.zip testfile-lzma.zip diff --git a/deps/libzip/regress/set_compression_store_to_store.test b/deps/libzip/regress/set_compression_store_to_store.test new file mode 100644 index 00000000000000..66cf3ddc34852d --- /dev/null +++ b/deps/libzip/regress/set_compression_store_to_store.test @@ -0,0 +1,4 @@ +# change method from stored to stored (no change) +return 0 +args test.zip set_file_compression 0 store 0 +file test.zip teststored.zip teststored.zip diff --git a/deps/libzip/regress/set_compression_store_to_xz.test b/deps/libzip/regress/set_compression_store_to_xz.test new file mode 100644 index 00000000000000..fe6d8db23b38a1 --- /dev/null +++ b/deps/libzip/regress/set_compression_store_to_xz.test @@ -0,0 +1,5 @@ +# change method from stored to xz-compressed +features LIBLZMA +return 0 +args test.zip set_file_compression 0 xz 0 +file test.zip testfile-stored-dos.zip testfile-xz.zip diff --git a/deps/libzip/regress/set_compression_store_to_zstd.test b/deps/libzip/regress/set_compression_store_to_zstd.test new file mode 100644 index 00000000000000..898a3d8546dc6b --- /dev/null +++ b/deps/libzip/regress/set_compression_store_to_zstd.test @@ -0,0 +1,5 @@ +# change method from stored to zstd-compressed +features LIBZSTD +return 0 +args test.zip set_file_compression 0 zstd 0 +file test.zip testfile-stored-dos.zip testfile-zstd.zip diff --git a/deps/libzip/regress/set_compression_unknown.test b/deps/libzip/regress/set_compression_unknown.test new file mode 100644 index 00000000000000..9ebf688b1604c2 --- /dev/null +++ b/deps/libzip/regress/set_compression_unknown.test @@ -0,0 +1,5 @@ +# change method to unknown +return 1 +args test.zip set_file_compression 0 unknown 0 +file test.zip teststored.zip teststored.zip +stderr can't set file compression method at index '0' to 'unknown', flags '0': Compression method not supported diff --git a/deps/libzip/regress/set_compression_xz_to_store.test b/deps/libzip/regress/set_compression_xz_to_store.test new file mode 100644 index 00000000000000..6294ba26adfdf2 --- /dev/null +++ b/deps/libzip/regress/set_compression_xz_to_store.test @@ -0,0 +1,5 @@ +# change method from xz-compressed to stored +features LIBLZMA +return 0 +args test.zip set_file_compression 0 store 0 +file test.zip testfile-xz.zip testfile-stored-dos.zip diff --git a/deps/libzip/regress/set_compression_zstd_to_store.test b/deps/libzip/regress/set_compression_zstd_to_store.test new file mode 100644 index 00000000000000..6f8cd7e221f20b --- /dev/null +++ b/deps/libzip/regress/set_compression_zstd_to_store.test @@ -0,0 +1,5 @@ +# change method from zstd-compressed to stored +features LIBZSTD +return 0 +args test.zip set_file_compression 0 store 0 +file test.zip testfile-zstd.zip testfile-stored-dos.zip diff --git a/deps/libzip/regress/set_file_dostime.test b/deps/libzip/regress/set_file_dostime.test new file mode 100644 index 00000000000000..bd1af879b3b1f0 --- /dev/null +++ b/deps/libzip/regress/set_file_dostime.test @@ -0,0 +1,4 @@ +# change dostime in a zip archive (use torrentzip default time) +return 0 +args testfile set_file_dostime 0 48128 8600 +file testfile testfile.zip testfile0.zip diff --git a/deps/libzip/regress/set_file_mtime.test b/deps/libzip/regress/set_file_mtime.test new file mode 100644 index 00000000000000..477fd06a5f2910 --- /dev/null +++ b/deps/libzip/regress/set_file_mtime.test @@ -0,0 +1,4 @@ +# change mtime in a zip archive +return 0 +args testfile set_file_mtime 0 1407272201 +file testfile testfile.zip testfile2014.zip diff --git a/deps/libzip/regress/set_file_mtime_pkware.test b/deps/libzip/regress/set_file_mtime_pkware.test new file mode 100644 index 00000000000000..4115f3a7151539 --- /dev/null +++ b/deps/libzip/regress/set_file_mtime_pkware.test @@ -0,0 +1,5 @@ +# change mtime in a zip archive, fails because file is PKWare-encrypted +return 1 +args testfile set_file_mtime 0 1407272201 +file testfile encrypt.zip encrypt.zip +stderr can't set file mtime at index '0' to '1407272201': Operation not supported diff --git a/deps/libzip/regress/source_hole.c b/deps/libzip/regress/source_hole.c new file mode 100644 index 00000000000000..bd15d179c6fbc6 --- /dev/null +++ b/deps/libzip/regress/source_hole.c @@ -0,0 +1,577 @@ +/* + source_hole.c -- source for handling huge files that are mostly NULs + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include "zip.h" + +/* public API */ + +zip_source_t *source_hole_create(const char *, int flags, zip_error_t *); + + +#ifndef EFTYPE +#define EFTYPE EINVAL +#endif + + +#define MY_MIN(a, b) ((a) < (b) ? (a) : (b)) + +#define FRAGMENT_SIZE (8 * 1024) + +#define MARK_BEGIN "NiH0" +#define MARK_DATA "NiH1" +#define MARK_NUL "NiH2" + + +typedef struct buffer { + zip_uint64_t fragment_size; + zip_uint8_t **fragment; + zip_uint64_t nfragments; + zip_uint64_t size; + zip_uint64_t offset; +} buffer_t; + +static void buffer_free(buffer_t *buffer); +static buffer_t *buffer_from_file(const char *fname, int flags, zip_error_t *error); +static buffer_t *buffer_new(void); +static zip_int64_t buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length, zip_error_t *error); +static int buffer_read_file(buffer_t *buffer, FILE *f, zip_error_t *error); +static zip_int64_t buffer_seek(buffer_t *buffer, void *data, zip_uint64_t length, zip_error_t *error); +static int buffer_to_file(buffer_t *buffer, const char *fname, zip_error_t *error); +static zip_int64_t buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error); +static zip_uint64_t get_u64(const zip_uint8_t *b); +static int only_nul(const zip_uint8_t *data, zip_uint64_t length); +static int write_nuls(zip_uint64_t n, FILE *f); +static int write_u64(zip_uint64_t u64, FILE *f); + + +typedef struct hole { + zip_error_t error; + char *fname; + buffer_t *in; + buffer_t *out; +} hole_t; + +static hole_t *hole_new(const char *fname, int flags, zip_error_t *error); +static zip_int64_t source_hole_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command); + + +zip_source_t * +source_hole_create(const char *fname, int flags, zip_error_t *error) { + hole_t *ud = hole_new(fname, flags, error); + + if (ud == NULL) { + return NULL; + } + return zip_source_function_create(source_hole_cb, ud, error); +} + + +static void +buffer_free(buffer_t *buffer) { + zip_uint64_t i; + + if (buffer == NULL) { + return; + } + + if (buffer->fragment) { + for (i = 0; i < buffer->nfragments; i++) { + free(buffer->fragment[i]); + } + free(buffer->fragment); + } + free(buffer); +} + + +static buffer_t * +buffer_from_file(const char *fname, int flags, zip_error_t *error) { + buffer_t *buffer; + FILE *f; + + if ((buffer = buffer_new()) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((flags & ZIP_TRUNCATE) == 0) { + if ((f = fopen(fname, "rb")) == NULL) { + if (!(errno == ENOENT && (flags & ZIP_CREATE))) { + buffer_free(buffer); + return NULL; + } + } + else { + if (buffer_read_file(buffer, f, error) < 0) { + buffer_free(buffer); + fclose(f); + return NULL; + } + fclose(f); + } + } + + return buffer; +} + + +static buffer_t * +buffer_new(void) { + buffer_t *buffer; + + if ((buffer = (buffer_t *)malloc(sizeof(*buffer))) == NULL) { + return NULL; + } + + buffer->fragment = NULL; + buffer->nfragments = 0; + buffer->fragment_size = FRAGMENT_SIZE; + buffer->size = 0; + buffer->offset = 0; + + return buffer; +} + + +static zip_int64_t +buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length, zip_error_t *error) { + zip_uint64_t n, i, fragment_offset; + + length = MY_MIN(length, buffer->size - buffer->offset); + + if (length == 0) { + return 0; + } + if (length > ZIP_INT64_MAX) { + return -1; + } + + i = buffer->offset / buffer->fragment_size; + fragment_offset = buffer->offset % buffer->fragment_size; + n = 0; + while (n < length) { + zip_uint64_t left = MY_MIN(length - n, buffer->fragment_size - fragment_offset); + + if (buffer->fragment[i]) { + memcpy(data + n, buffer->fragment[i] + fragment_offset, left); + } + else { + memset(data + n, 0, left); + } + + n += left; + i++; + fragment_offset = 0; + } + + buffer->offset += n; + return (zip_int64_t)n; +} + + +static int +buffer_read_file(buffer_t *buffer, FILE *f, zip_error_t *error) { + zip_uint8_t b[20]; + zip_uint64_t i; + + if (fread(b, 20, 1, f) != 1) { + zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + + if (memcmp(b, MARK_BEGIN, 4) != 0) { + zip_error_set(error, ZIP_ER_READ, EFTYPE); + return -1; + } + + buffer->fragment_size = get_u64(b + 4); + buffer->size = get_u64(b + 12); + + if (buffer->fragment_size == 0) { + zip_error_set(error, ZIP_ER_INCONS, 0); + return -1; + } + + buffer->nfragments = buffer->size / buffer->fragment_size; + if (buffer->size % buffer->fragment_size != 0) { + buffer->nfragments += 1; + } + + if ((buffer->nfragments > SIZE_MAX / sizeof(buffer->fragment[0])) || ((buffer->fragment = (zip_uint8_t **)malloc(sizeof(buffer->fragment[0]) * buffer->nfragments)) == NULL)) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + + for (i = 0; i < buffer->nfragments; i++) { + buffer->fragment[i] = NULL; + } + + i = 0; + while (i < buffer->nfragments) { + if (fread(b, 4, 1, f) != 1) { + zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + + if (memcmp(b, MARK_DATA, 4) == 0) { + if (buffer->fragment_size > SIZE_MAX) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + if ((buffer->fragment[i] = (zip_uint8_t *)malloc(buffer->fragment_size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + if (fread(buffer->fragment[i], buffer->fragment_size, 1, f) != 1) { + zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + i++; + } + else if (memcmp(b, MARK_NUL, 4) == 0) { + if (fread(b, 8, 1, f) != 1) { + zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + i += get_u64(b); + } + else { + zip_error_set(error, ZIP_ER_READ, EFTYPE); + return -1; + } + } + + return 0; +} + +static zip_int64_t +buffer_seek(buffer_t *buffer, void *data, zip_uint64_t length, zip_error_t *error) { + zip_int64_t new_offset = zip_source_seek_compute_offset(buffer->offset, buffer->size, data, length, error); + + if (new_offset < 0) { + return -1; + } + + buffer->offset = (zip_uint64_t)new_offset; + return 0; +} + + +static int +buffer_to_file(buffer_t *buffer, const char *fname, zip_error_t *error) { + FILE *f = fopen(fname, "wb"); + zip_uint64_t i; + zip_uint64_t nul_run; + + if (f == NULL) { + zip_error_set(error, ZIP_ER_OPEN, errno); + return -1; + } + + fwrite(MARK_BEGIN, 4, 1, f); + write_u64(buffer->fragment_size, f); + write_u64(buffer->size, f); + + nul_run = 0; + for (i = 0; i * buffer->fragment_size < buffer->size; i++) { + if (buffer->fragment[i] == NULL || only_nul(buffer->fragment[i], buffer->fragment_size)) { + nul_run++; + } + else { + if (nul_run > 0) { + write_nuls(nul_run, f); + nul_run = 0; + } + fwrite(MARK_DATA, 4, 1, f); + + fwrite(buffer->fragment[i], 1, buffer->fragment_size, f); + } + } + + if (nul_run > 0) { + write_nuls(nul_run, f); + } + + if (fclose(f) != 0) { + zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + +static zip_int64_t +buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error) { + zip_uint8_t **fragment; + if (buffer->offset + length > buffer->nfragments * buffer->fragment_size) { + zip_uint64_t needed_fragments = (buffer->offset + length + buffer->fragment_size - 1) / buffer->fragment_size; + zip_uint64_t new_capacity = buffer->nfragments; + zip_uint64_t i; + + if (new_capacity == 0) { + new_capacity = 4; + } + while (new_capacity < needed_fragments) { + new_capacity *= 2; + } + + fragment = realloc(buffer->fragment, new_capacity * sizeof(*fragment)); + + if (fragment == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + + for (i = buffer->nfragments; i < new_capacity; i++) { + fragment[i] = NULL; + } + + buffer->fragment = fragment; + buffer->nfragments = new_capacity; + } + + if (!only_nul(data, length)) { + zip_uint64_t idx, n, fragment_offset; + + idx = buffer->offset / buffer->fragment_size; + fragment_offset = buffer->offset % buffer->fragment_size; + n = 0; + + while (n < length) { + zip_uint64_t left = MY_MIN(length - n, buffer->fragment_size - fragment_offset); + + if (buffer->fragment[idx] == NULL) { + if ((buffer->fragment[idx] = (zip_uint8_t *)malloc(buffer->fragment_size)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + memset(buffer->fragment[idx], 0, buffer->fragment_size); + } + memcpy(buffer->fragment[idx] + fragment_offset, data + n, left); + + n += left; + idx++; + fragment_offset = 0; + } + } + + buffer->offset += length; + if (buffer->offset > buffer->size) { + buffer->size = buffer->offset; + } + + return (zip_int64_t)length; +} + + +static zip_uint64_t +get_u64(const zip_uint8_t *b) { + zip_uint64_t i; + + i = (zip_uint64_t)b[0] << 56 | (zip_uint64_t)b[1] << 48 | (zip_uint64_t)b[2] << 40 | (zip_uint64_t)b[3] << 32 | (zip_uint64_t)b[4] << 24 | (zip_uint64_t)b[5] << 16 | (zip_uint64_t)b[6] << 8 | (zip_uint64_t)b[7]; + + return i; +} + + +static int +only_nul(const zip_uint8_t *data, zip_uint64_t length) { + zip_uint64_t i; + + for (i = 0; i < length; i++) { + if (data[i] != '\0') { + return 0; + } + } + + return 1; +} + + +static int +write_nuls(zip_uint64_t n, FILE *f) { + if (fwrite(MARK_NUL, 4, 1, f) != 1) { + return -1; + } + return write_u64(n, f); +} + + +static int +write_u64(zip_uint64_t u64, FILE *f) { + zip_uint8_t b[8]; + + b[0] = (zip_uint8_t)((u64 >> 56) & 0xff); + b[1] = (zip_uint8_t)((u64 >> 48) & 0xff); + b[2] = (zip_uint8_t)((u64 >> 40) & 0xff); + b[3] = (zip_uint8_t)((u64 >> 32) & 0xff); + b[4] = (zip_uint8_t)((u64 >> 24) & 0xff); + b[5] = (zip_uint8_t)((u64 >> 16) & 0xff); + b[6] = (zip_uint8_t)((u64 >> 8) & 0xff); + b[7] = (zip_uint8_t)(u64 & 0xff); + + return fwrite(b, 8, 1, f) == 1 ? 0 : -1; +} + + +static void +hole_free(hole_t *hole) { + if (hole == NULL) { + return; + } + zip_error_fini(&hole->error); + buffer_free(hole->in); + buffer_free(hole->out); + free(hole->fname); + free(hole); +} + + +static hole_t * +hole_new(const char *fname, int flags, zip_error_t *error) { + hole_t *ctx = (hole_t *)malloc(sizeof(*ctx)); + + if (ctx == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((ctx->fname = strdup(fname)) == NULL) { + free(ctx); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((ctx->in = buffer_from_file(fname, flags, error)) == NULL) { + free(ctx); + return NULL; + } + + zip_error_init(&ctx->error); + ctx->out = NULL; + + return ctx; +} + + +static zip_int64_t +source_hole_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command) { + hole_t *ctx = (hole_t *)ud; + + switch (command) { + case ZIP_SOURCE_BEGIN_WRITE: + ctx->out = buffer_new(); + return 0; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_COMMIT_WRITE: + if (buffer_to_file(ctx->out, ctx->fname, &ctx->error) < 0) { + return -1; + } + buffer_free(ctx->in); + ctx->in = ctx->out; + ctx->out = NULL; + return 0; + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, length); + + case ZIP_SOURCE_FREE: + hole_free(ctx); + return 0; + + case ZIP_SOURCE_OPEN: + ctx->in->offset = 0; + return 0; + + case ZIP_SOURCE_READ: + return buffer_read(ctx->in, data, length, &ctx->error); + + case ZIP_SOURCE_REMOVE: + buffer_free(ctx->in); + ctx->in = buffer_new(); + buffer_free(ctx->out); + ctx->out = NULL; + (void)remove(ctx->fname); + return 0; + + case ZIP_SOURCE_ROLLBACK_WRITE: + buffer_free(ctx->out); + ctx->out = NULL; + return 0; + + case ZIP_SOURCE_SEEK: + return buffer_seek(ctx->in, data, length, &ctx->error); + + case ZIP_SOURCE_SEEK_WRITE: + return buffer_seek(ctx->out, data, length, &ctx->error); + + case ZIP_SOURCE_STAT: { + zip_stat_t *st = ZIP_SOURCE_GET_ARGS(zip_stat_t, data, length, &ctx->error); + + if (st == NULL) { + return -1; + } + + /* TODO: return ENOENT if fname doesn't exist */ + + st->valid |= ZIP_STAT_SIZE; + st->size = ctx->in->size; + return 0; + } + + case ZIP_SOURCE_TELL: + return (zip_int64_t)ctx->in->offset; + + case ZIP_SOURCE_TELL_WRITE: + return (zip_int64_t)ctx->out->offset; + + case ZIP_SOURCE_WRITE: + return buffer_write(ctx->out, data, length, &ctx->error); + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_CLOSE, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_STAT, ZIP_SOURCE_TELL, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, -1); + + default: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} diff --git a/deps/libzip/regress/stat_index_cp437_guess.test b/deps/libzip/regress/stat_index_cp437_guess.test new file mode 100644 index 00000000000000..a02a70d5d17994 --- /dev/null +++ b/deps/libzip/regress/stat_index_cp437_guess.test @@ -0,0 +1,148 @@ +# guess CP437 file names and autoconvert them +args test-cp437.zip stat 0 stat 1 stat 2 stat 3 stat 4 stat 5 stat 6 stat 7 stat 8 stat 9 stat 10 stat 11 stat 12 stat 13 stat 14 stat 15 +return 0 +file test-cp437.zip test-cp437.zip test-cp437.zip +stdout name: '☺☻♥♦♣♠•◘○◙♂♀♪♫☼►' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:50' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '◄↕‼¶§▬↨↑↓→â†âˆŸâ†”▲▼ ' +stdout index: '1' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:54' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '!"#$%&'()*+,-./0' +stdout index: '2' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:58' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '123456789:;<=>?@' +stdout index: '3' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:04' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ABCDEFGHIJKLMNOP' +stdout index: '4' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'QRSTUVWXYZ[\]^_`' +stdout index: '5' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:12' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'abcdefghijklmnop' +stdout index: '6' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:18' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'qrstuvwxyz{|}~⌂Ç' +stdout index: '7' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:22' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'üéâäàåçêëèïîìÄÅÉ' +stdout index: '8' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:26' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'æÆôöòûùÿÖÜ¢£¥₧ƒá' +stdout index: '9' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:30' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'íóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘' +stdout index: '10' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:36' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '▒▓│┤╡╢╖╕╣║╗â•╜╛â”â””' +stdout index: '11' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:40' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨' +stdout index: '12' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:44' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '╤╥╙╘╒╓╫╪┘┌█▄▌â–▀α' +stdout index: '13' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:50' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ßΓπΣσµτΦΘΩδ∞φε∩≡' +stdout index: '14' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:54' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â Â ' +stdout index: '15' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:53:02' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_cp437_raw.test b/deps/libzip/regress/stat_index_cp437_raw.test new file mode 100644 index 00000000000000..61b65e40b3a3af --- /dev/null +++ b/deps/libzip/regress/stat_index_cp437_raw.test @@ -0,0 +1,149 @@ +# get raw file names them from archive +args -r test-cp437.zip stat 0 stat 1 stat 2 stat 3 stat 4 stat 5 stat 6 stat 7 stat 8 stat 9 stat 10 stat 11 stat 12 stat 13 stat 14 stat 15 +return 0 +file test-cp437.zip test-cp437.zip test-cp437.zip +stdout name: ' +stdout ' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:50' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: ' ' +stdout index: '1' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:54' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '!"#$%&'()*+,-./0' +stdout index: '2' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:58' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '123456789:;<=>?@' +stdout index: '3' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:04' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ABCDEFGHIJKLMNOP' +stdout index: '4' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'QRSTUVWXYZ[\]^_`' +stdout index: '5' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:12' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'abcdefghijklmnop' +stdout index: '6' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:18' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'qrstuvwxyz{|}~€' +stdout index: '7' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:22' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '‚ƒ„…†‡ˆ‰Š‹ŒŽ' +stdout index: '8' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:26' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '‘’“”•–—˜™š›œžŸ ' +stdout index: '9' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:30' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '¡¢£¤¥¦§¨©ª«¬­®¯°' +stdout index: '10' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:36' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '±²³´µ¶·¸¹º»¼½¾¿À' +stdout index: '11' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:40' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐ' +stdout index: '12' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:44' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ÑÒÓÔÕÖרÙÚÛÜÝÞßà' +stdout index: '13' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:50' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'áâãäåæçèéêëìíîïð' +stdout index: '14' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:54' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ñòóôõö÷øùúûüýþÿÿ' +stdout index: '15' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:53:02' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_cp437_strict.test b/deps/libzip/regress/stat_index_cp437_strict.test new file mode 100644 index 00000000000000..6b1458df73c494 --- /dev/null +++ b/deps/libzip/regress/stat_index_cp437_strict.test @@ -0,0 +1,148 @@ +# strictly follow ZIP spec and expect CP437 file names, and autoconvert them +args -s test-cp437.zip stat 0 stat 1 stat 2 stat 3 stat 4 stat 5 stat 6 stat 7 stat 8 stat 9 stat 10 stat 11 stat 12 stat 13 stat 14 stat 15 +return 0 +file test-cp437.zip test-cp437.zip test-cp437.zip +stdout name: '☺☻♥♦♣♠•◘○◙♂♀♪♫☼►' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:50' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '◄↕‼¶§▬↨↑↓→â†âˆŸâ†”▲▼ ' +stdout index: '1' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:54' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '!"#$%&'()*+,-./0' +stdout index: '2' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:51:58' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '123456789:;<=>?@' +stdout index: '3' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:04' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ABCDEFGHIJKLMNOP' +stdout index: '4' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'QRSTUVWXYZ[\]^_`' +stdout index: '5' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:12' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'abcdefghijklmnop' +stdout index: '6' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:18' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'qrstuvwxyz{|}~⌂Ç' +stdout index: '7' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:22' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'üéâäàåçêëèïîìÄÅÉ' +stdout index: '8' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:26' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'æÆôöòûùÿÖÜ¢£¥₧ƒá' +stdout index: '9' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:30' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'íóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘' +stdout index: '10' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:36' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '▒▓│┤╡╢╖╕╣║╗â•╜╛â”â””' +stdout index: '11' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:40' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨' +stdout index: '12' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:44' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '╤╥╙╘╒╓╫╪┘┌█▄▌â–▀α' +stdout index: '13' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:50' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'ßΓπΣσµτΦΘΩδ∞φε∩≡' +stdout index: '14' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:52:54' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: '±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â Â ' +stdout index: '15' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Feb 17 2012 20:53:02' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_fileorder.test b/deps/libzip/regress/stat_index_fileorder.test new file mode 100644 index 00000000000000..24b02b44e2417f --- /dev/null +++ b/deps/libzip/regress/stat_index_fileorder.test @@ -0,0 +1,22 @@ +# zip_open: entries ordered by central directory order +args fileorder.zzip stat 0 stat 1 +return 0 +file fileorder.zzip fileorder.zip fileorder.zip +stdout name: 'file1' +stdout index: '0' +stdout size: '5' +stdout compressed size: '5' +stdout mtime: 'Fri Apr 27 2012 23:21:42' +stdout crc: '9ee760e5' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'file2' +stdout index: '1' +stdout size: '5' +stdout compressed size: '5' +stdout mtime: 'Fri Apr 27 2012 23:21:44' +stdout crc: '7ee315f' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_streamed.test b/deps/libzip/regress/stat_index_streamed.test new file mode 100644 index 00000000000000..a2b3048adbc70d --- /dev/null +++ b/deps/libzip/regress/stat_index_streamed.test @@ -0,0 +1,13 @@ +# stat file in streamed zip file +args streamed stat 0 +file streamed streamed.zip streamed.zip +return 0 +stdout name: '-' +stdout index: '0' +stdout size: '2' +stdout compressed size: '4' +stdout mtime: 'Wed Apr 25 2012 10:20:38' +stdout crc: 'ddeaa107' +stdout compression method: '8' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_streamed_zip64.test b/deps/libzip/regress/stat_index_streamed_zip64.test new file mode 100644 index 00000000000000..18a8694b02978f --- /dev/null +++ b/deps/libzip/regress/stat_index_streamed_zip64.test @@ -0,0 +1,13 @@ +# stat file in streamed zip file +args streamed stat 0 +file streamed streamed-zip64.zip streamed-zip64.zip +return 0 +stdout name: '-' +stdout index: '0' +stdout size: '2' +stdout compressed size: '4' +stdout mtime: 'Wed Apr 25 2012 10:20:38' +stdout crc: 'ddeaa107' +stdout compression method: '8' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_utf8_guess.test b/deps/libzip/regress/stat_index_utf8_guess.test new file mode 100644 index 00000000000000..898db2dcd1482f --- /dev/null +++ b/deps/libzip/regress/stat_index_utf8_guess.test @@ -0,0 +1,13 @@ +# guess UTF-8 file names +args test-utf8.zip stat 0 +return 0 +file test-utf8.zip test-utf8.zip test-utf8.zip +stdout name: 'ÄÖÜäöüßćçĉéèêëē' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Sat Feb 18 2012 00:15:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_utf8_raw.test b/deps/libzip/regress/stat_index_utf8_raw.test new file mode 100644 index 00000000000000..881a18b74085e5 --- /dev/null +++ b/deps/libzip/regress/stat_index_utf8_raw.test @@ -0,0 +1,13 @@ +# print UTF-8 file names +args -r test-utf8.zip stat 0 +return 0 +file test-utf8.zip test-utf8.zip test-utf8.zip +stdout name: 'ÄÖÜäöüßćçĉéèêëē' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Sat Feb 18 2012 00:15:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_utf8_strict.test b/deps/libzip/regress/stat_index_utf8_strict.test new file mode 100644 index 00000000000000..af1bb818b605ab --- /dev/null +++ b/deps/libzip/regress/stat_index_utf8_strict.test @@ -0,0 +1,14 @@ +# follow strict rules and convert UTF-8 as if it was CP437, but not +# if the files are marked as having UTF-8 names +args -s test-utf8.zip stat 0 +return 0 +file test-utf8.zip test-utf8.zip test-utf8.zip +stdout name: 'ÄÖÜäöüßćçĉéèêëē' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Sat Feb 18 2012 00:15:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_utf8_unmarked_strict.test b/deps/libzip/regress/stat_index_utf8_unmarked_strict.test new file mode 100644 index 00000000000000..07954dd24e6ad2 --- /dev/null +++ b/deps/libzip/regress/stat_index_utf8_unmarked_strict.test @@ -0,0 +1,14 @@ +# follow strict rules and convert UTF-8 as if it was CP437, +# if not marked otherwise (in this case: not marked) +args -s test-utf8-unmarked.zip stat 0 +return 0 +file test-utf8-unmarked.zip test-utf8-unmarked.zip test-utf8-unmarked.zip +stdout name: '├ä├û├£├ñ├╢├â•├ƒ─ç├º─ë├âŒâ”œÂ¿â”œÂ¬â”œÂ½â”€Ã´' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Sat Feb 18 2012 00:15:08' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stat_index_zip64.test b/deps/libzip/regress/stat_index_zip64.test new file mode 100644 index 00000000000000..c3f420c9fa8fda --- /dev/null +++ b/deps/libzip/regress/stat_index_zip64.test @@ -0,0 +1,13 @@ +# stat file in zip64 zip file +args bigzero stat 0 +file bigzero bigzero.zip bigzero.zip +return 0 +stdout name: 'bigzero' +stdout index: '0' +stdout size: '4294967296' +stdout compressed size: '4168157' +stdout mtime: 'Thu Mar 15 2012 14:54:06' +stdout crc: 'd202ef8d' +stdout compression method: '8' +stdout encryption method: '0' +stdout diff --git a/deps/libzip/regress/stored-no-eos.zip b/deps/libzip/regress/stored-no-eos.zip new file mode 100644 index 0000000000000000000000000000000000000000..4a7745f73cda20294873712f5664f92d491b03e4 GIT binary patch literal 348 zcmWIWW@Zs#0Da0vp^AT}!tGmz}_N{9wh%*9TgAsieWw;%dH0CG7CJR*x382FBWFymBh zK53w!WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)E`~f~8u0T39H8mwA zB`qxt$f(Eal|A)72v2n0z9ER(o+c$6H}m?to& z7#T^>bP0l+YC5&B$cWfIAF8Y8e<5z$C5^3GilR11Vqx MLKh&-#0cU605}s>4FCWD literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/streamed-zip64.zip b/deps/libzip/regress/streamed-zip64.zip new file mode 100644 index 0000000000000000000000000000000000000000..85886190bef6d6408c2a0f2efbe8418c7f54a61b GIT binary patch literal 148 zcmWIWW@gc4-~htOK{Fi~fZ#tAFfxcR=rS@0fW%OM_Y)?D0B?2<_JyzRvOr~+pmcyY mBa<96!a$fBkUS$)4Tx?K1aWi&yjj^m3`QW-2h#o^4g&yCJ{C>@ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/streamed.zip b/deps/libzip/regress/streamed.zip new file mode 100644 index 0000000000000000000000000000000000000000..737d56f31b3dbf55589c53ce41411c69d2a3cd52 GIT binary patch literal 120 zcmWIWW@gc4-~htOK{Fi~fZ#tAFap`S-cOhq0=(Hd*cZOK%K{W&0^$H~MkYCCgeGJ; dkR}iS(G7wimTrJID;tQx2!#4T+8D%P008cb77YLZ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test-cp437-comment-utf-8.zip b/deps/libzip/regress/test-cp437-comment-utf-8.zip new file mode 100644 index 0000000000000000000000000000000000000000..748a2696743634a8a1f4b5542a1f51d0f01b5942 GIT binary patch literal 2619 zcmaLZX;@5A9LMo9%~V>XBto(iQTAQ3Q)r^HuVvpON)l?bUk@N2FvdPtd-V&?=?|CM|>l1W9=N@kU-m{+Y<-J*tN&00Ju z8!IqL^5aOg>(s4Rzd=K*MvbkTG_|p9#*;Kyfl1O*j?}zG%T}%1v~AbEL&r{??Yh|W zq+G1PBq@L+b?w%@N6%ip`}B2i?AL#QlbR>xV+AHjK^)0>;2;-Qx4}b(4jVpVTjlAvz{DZsVr- z1fEoa6__N2bEL%0TavaWZ`;0O=dRs*_NJurBxS0d6HJmKIMTlT2ht9vA3A*G=&_9B zCr+N?NxE2pNm3L?I-Mz;IeYH>g^QOiU%7hi`VF3Bh!vP5MRTN^w{G9bx_j?__JfBx zk2H^;@FWwgz$7V_BRzeVoA><1%lucb-xR!k_x=MR}{toy|2Tr^LYDV2bs%+j!H3F-2>_ipHCZn>cBUKGn>F|jv zR8B@^vq!2{3WVqgiYgROMr9L7s-9S-gD9#{KN*$HA*p6ym5!sRLJ4J5HjSjJqlFM1 zN>PO>%BXB6NmY$iI+~&ig_Kd*WRhwOR_TC>D%4U&W%Eg@d03@mDymRU8I?^bsoLN_ z8+2Gj6)GyDvRNfnZ>-Xh6;&vzjLIgKR5P(k2Uk>~t}-f{TT(StAw1GN!Kz`sT4Hz`X&M*si- literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test-cp437-fc-utf-8-filename.zip b/deps/libzip/regress/test-cp437-fc-utf-8-filename.zip new file mode 100644 index 0000000000000000000000000000000000000000..7aeb8096b35588c0b4f54d83b7cca8033067704b GIT binary patch literal 236 zcmWIWW@h1H0D6LW?UBNGw?ty``ZX&pqY!^y3i0-i20?c h_A)Xtv#_$Ub8rd>3I%wxvVja_1j2G49S`C#006EKLmL19 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test-cp437-fc.zip b/deps/libzip/regress/test-cp437-fc.zip new file mode 100644 index 0000000000000000000000000000000000000000..0c4f04d53139f06a6fc4eb89eecb755ea37aca46 GIT binary patch literal 186 zcmWIWW@h1H0Dbg^Sq?3PX1vdjD z%L`@(29^|{`T%c6COKwY=14H`K+XKy2x6d`$_g(rzFQ0{~}K9<2ZX literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test-cp437.zip b/deps/libzip/regress/test-cp437.zip new file mode 100644 index 0000000000000000000000000000000000000000..9e6b91d9a888c4bf7341e7eb67424da945eea8e6 GIT binary patch literal 2582 zcmaLZcT|s29LMqd>-YPW1_}|9O;+|M*%bOkWfQV@L`f)#B$1z}j54wnva_=H3>g`P zkP$LM`QFRvx#xWE^*rbEocqu7I?rG4^XQz^8WTb<-*^`XcKG)&C)Pw|pw?&&jfxnX zn3@$WR@~gp)tIPL6YQPoynRfGN|U7~MB@qX=n5r2fn-slWGTziWvt4UD{o!FreY-~ zrGY{xmHY)#Ap*{XG$w)X8D zn3Mquom2`ENbNgx?9{nS*KXY%oqF`_<*Z{;7ASO5DOe!6^zP&8=H9no{{aIB4IVPo zgGt$-&`G5bfi!IR2+xtDMvoagZv2FalO|7LQVu9|QYlm*P4${K-FwDNAKzJiv;F7H zoyVkHQ0Symm_P~$oFB9xc;TXu#i2{WmWD55QXVLDQYl;@Est2CUm3Y-byRfBnzifJ z$1*7&6gsICA&}xWY}~Xte#_Qv+js2TwL2k^N$Ny~HGk|ii~QYlU#<$U`5CHL#M??3W> z{`#F?P{1S`Q0S1PGO$t03T0IotfT;X#J$q~?bUx&Tq|C61QoXnRAIN2Z^h-}RXwP< zW1tEfrl`1LyqXRwZW^e=VgD2r7m!zVpyD2aDr}*m;u`X5G^n_ZpbERFsJM*0nh7fI zB&fnhDk`oduiC+{18yd$!d@yWE+((~fQtJGs<54kitEX%DWKw(f-3B&qT-VBs+oom k+*MG8O;uD}RbF)m6*m@CVPCa|kPTuEw}+OHSa_F^KYY9@7XSbN literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test-utf8-unmarked.zip b/deps/libzip/regress/test-utf8-unmarked.zip new file mode 100644 index 0000000000000000000000000000000000000000..1bcb7035ff928b664d3fe5502a256f45f5f12d75 GIT binary patch literal 210 zcmWIWW@h1H0D&irK@MOBl#pYPVL04!c-rAPhnF1Qc6iU>`A6ChFF(?Gc;(?0hgTh5 zePnWI2qyz`^?f^k5H79YW?*D_!OXzGk^(d#z?+dtjv1H95^#&QG=i9f>|ur2gJB0N P8%Q@J5Q6NC0C5-qK;S&S literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test-utf8.zip b/deps/libzip/regress/test-utf8.zip new file mode 100644 index 0000000000000000000000000000000000000000..3045e20b86ae42e8e5529af7803dc62f38278037 GIT binary patch literal 210 zcmWIWW@h1HVBlb2c)}Ruz<>ng7-Sd@w;Y~!c+TM^hqoQxb9nxd_QT7MbRJ%Lc*WsW zhgTn&92&yOz+8Rb&L4zJE4UdLSza(RFtDTmO$qR3WRhdXWwHd^o-K_aCLw!RA@*R{ R!O8~G%?N}bJ0n0G1^`OHJk9_B literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test.zip b/deps/libzip/regress/test.zip new file mode 100644 index 0000000000000000000000000000000000000000..e4efd716b64801cd7445a7baaa8d460a661534ca GIT binary patch literal 412 zcmWIWW@h1HU}9ikxLWI`f6R2JH7k$}!YmA;3?-?>C7~gl49t#2jrJfMTEW7Q!XN^c z;0gfi1uA8zo}q07qG5mosy8LGNFS`9Q}l`BEFcEyf5Du>0MUxgT3#frAnT1V><8%w z$pGzVWD;k_<$7MQV;F(tmPQa0;ultkUqUMwfNp?j2T5Xj0HU3NL4e_{qYYF$#5+JE jK;A(%0=q|$T~Ll>1k_t7PGMyOIfEGpPXXyYAPxfnv0Y9$ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test2.zip b/deps/libzip/regress/test2.zip new file mode 100644 index 0000000000000000000000000000000000000000..ed2f60f50e320d2968637f673d0ac50355594b21 GIT binary patch literal 126 zcmWIWW@Zs#0D=6}7FV9S`Wq}jHVE?oaY<@%Nm^!3s$NM&35Xrw&B!Fej9WcW3m9x` X1X0Mk1H4(;Kw^wQXa%J8KpX}DC%P7g literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/test_open_multiple.zip b/deps/libzip/regress/test_open_multiple.zip new file mode 100644 index 0000000000000000000000000000000000000000..7dc3091a3f64ab39788b766961ff117bfde2b58a GIT binary patch literal 152 zcmWIWW@h1HW&na0+qQ=UXuV&@0c3+PD-ai#l%}O6CMBn&rln^Dcr!BDGviXM0#ptH z3JpsdK{Qw^7lQ(b&A`YY!O*b#VcPS&8;lLEhGAeD$`9~nWrL_;WC#Z`v_TvO0DTf7 A>i_@% literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testbuffer.zip b/deps/libzip/regress/testbuffer.zip new file mode 100644 index 0000000000000000000000000000000000000000..91e7d8a8b84dbd7faaef9afc2a873216a37b6bb4 GIT binary patch literal 180 zcmWIWW@Zs#00FL)7FXuqca+S4Y!K!H;*!+jlH!u0%)E5Hl8Ta$jLc#MAWBpKiR&mN z=A|fPmM9dbrsftal;kU9B$lNrB&DY2DHN9`C#Mz{rYn521qA?I1B(&O)2OA literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testbuffer_reopen.zip b/deps/libzip/regress/testbuffer_reopen.zip new file mode 100644 index 0000000000000000000000000000000000000000..a46e72bc7841d0f6763e766558aadc9669f1375c GIT binary patch literal 247 zcmWIWW@Zs#0D)Dpr6Cec{GB{NHVE?paY<@%NpVS0W?s5pNkxf&S!z*vQD#X=Y93br zioUI)(m%L?>R~u9wLC2|Cl#d0Q31$N0P%o&7@6#uaoYwo01UP?f+$qG(e+#$ literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testbzip2.zip b/deps/libzip/regress/testbzip2.zip new file mode 100644 index 0000000000000000000000000000000000000000..7c9a9e72b90f5166169f761cf052de78e473b05a GIT binary patch literal 175 zcmWIWW@h1HU|`^32q|&3@o+HRpbzBP05LxhCnhB(>lURJq$ZZ=l~j~CMP*nTI!3Am zM>40JU}0cjcVu7?uwYPNFgR->lvOoVK+W&$eDNYzi+~9r1p(fSOmfV)O$S;427ent W6q;QD-mGjOVMZXd1=2Af4g&znN+PuY literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testchanged.zip b/deps/libzip/regress/testchanged.zip new file mode 100644 index 0000000000000000000000000000000000000000..d5169c96edbda1b0e796e0a466feba7a013c1d36 GIT binary patch literal 728 zcmZ|LJxjwt0LJmFO+^D497Nr26Gckj7C{iTxD+JN<^xE2AqUAtlB?Fyv0K5#Nhs(y z@dN1S?&#v+?sG|up%@MId!m8 z2K9<%@GA$=6kyg<2fOy5v5Gf|fvb;Lr`Qo0`8=WcOP^7}ZVoInoCJ~wTrheWyFR}z S!Zj`Pgo|BCIT~`89sd9>TCF1h literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testchangedlocal.zip b/deps/libzip/regress/testchangedlocal.zip new file mode 100644 index 0000000000000000000000000000000000000000..1c8b301414483864e522f2d440c53027942d63d8 GIT binary patch literal 714 zcmZ{iF-yZh7>2K=5e;N;5Oup%htirZPJ)U{L=M{g07)+<(B|ZFN*x`$2`)~Bg8mbK zfR65tE)MR#m!xgz#a!Ow2z*c8JcRjH(;@o0e4TXLpEvirIP2JCn?%WwcY^*Vv7UmX zGo4`EBm=Bdkt&|5jEaaxiOdxCA#XWs!DHaPf4n{Jfu%F&9p=1euypEp84pD|Fn~P( zzYcoes|CFrI0a0n4yfWpn!EtKjo-=sYQb*Kn}MZM$BV?RRPmxFhz{gm@ii1|XFS;%9)y{=!{#PZ$uK^NUvM-1D81d0g_CnD*ylh literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testcomment.zip b/deps/libzip/regress/testcomment.zip new file mode 100644 index 0000000000000000000000000000000000000000..45dc18d1423248071fd02b8a68e9bed36dd3f623 GIT binary patch literal 703 zcmZ{iKTm@|7>C~q7$spe>UN_#5dU;>GEw8w#*nmp00M`Qw46E6)X}koJZ`34U(Z~~ahB4ClEvdQzoTlpGq&o|iCyeU{Ji+HiPl0`CWu(h;q{O8cY&WT#c z{U`y1SJ=a6c- z1Wzk4Oafe5B{dSBeh7*a2E+@ efee%Mn%5g(v5@+`{<9q0vAZI>aO(+|n0^CjSE923 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testcomment13.zip b/deps/libzip/regress/testcomment13.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd6e1c3277cfc2551406338d2c5f92db0401bb35 GIT binary patch literal 383 zcmWIWW@h1H00FYscEDR|?=$xNd zlA2ditdO6kkd|3gTmmF>QuVk3;N}Gb&3mF1{07}TW3YMifM$U(HuFj{GK*5+<}osf zGvjh0FUa8xj6l4k5yXPJmlfjP&7$w*a5EK1JEEK5~L&d<#ShK)j6ei2w495TFI Ryj(u{dFgsEMrsj|2>{KAS6=`C literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testcommentremoved.zip b/deps/libzip/regress/testcommentremoved.zip new file mode 100644 index 0000000000000000000000000000000000000000..b2e4d05dc5bd3d8b4e6d2a4f16215b5c37dc50ff GIT binary patch literal 640 zcmZ{hKTE?v7{=e4M6{4m)Gebr6#sN_RdK0EpuG=JnhOcEIY}ba(XpH0;v^L8H}M1L z=l}lz0zis~IkMA$TvZ&v)Bkapt^3&3gcgQ^zahKxL5y>;m|{ z*Zo*7c%*@kfN|=8Ws>GLPk^`fHQ8M**w(x$Se!autgiDiSrlxnY&!or^zr9J4dm&T zca>4k7!_lpu=6u-JM*lURJq$ZZ=l~j~?`?#>hcxp6g v3x=9WvKBBh1b8zt$uZ;B4>W>-5s3dbf>>y#1$eWvfrJ@>&=yGBfjA5RzZV&5 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testdeflated2.zip b/deps/libzip/regress/testdeflated2.zip new file mode 100644 index 0000000000000000000000000000000000000000..b5ded7d6d3fc7c8a3b59a03ca7b6c3ec5cbfaa1d GIT binary patch literal 270 zcmWIWW@Zs#U|`^2FfX6$=HXzvK@iBZ0b&6lPE1Nn)-6gcNKGs;(krPb@%C|Hi}BQG z&=w3elVmMmWC(z34=HiALDtTXsvU=JMkYCC+|~n)U|O!)Ul?|kV2?$GobO?yU007bbld*r`MfAD_9s_ yFsCpCcr!AIGvhLV7jE8?Mi3L#I97;pp%n~3V_4Zh3K)UV9Z1`QI1GsyiCh3Uv>w<1 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile-UTF8.zip b/deps/libzip/regress/testfile-UTF8.zip new file mode 100644 index 0000000000000000000000000000000000000000..727961545ca745df1f286593bc818d3fb59b996c GIT binary patch literal 126 zcmWIWW@h1HVBlb2Sl;s9hye-k0ojLJ4o^Eg=kWZ)OAc>4yeGh$kx7mjw`!Q?zl|Uk Tx?WZ`kSHS%+5l-C5QhN(9QGVY literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile-cp437.zip b/deps/libzip/regress/testfile-cp437.zip new file mode 100644 index 0000000000000000000000000000000000000000..169a90311aa235010b5e29c9479bf3dc81477b76 GIT binary patch literal 130 zcmWIWW@h1H0Dlx4h literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile-lzma.zip b/deps/libzip/regress/testfile-lzma.zip new file mode 100644 index 0000000000000000000000000000000000000000..f855b2ac69af8cf6b6094d443cc3ec5779b01f7b GIT binary patch literal 161 zcmWIWW@fQxU}E57=gYC&pZiC#%X38x4vLo5RW z3j>3}o4pGbOJ1Mz>CNQqf6W722He&GZDe3%PykUtfM$7sH!B-Rm=OqVfpjj2!vFwk9WA{8 literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile-xz.zip b/deps/libzip/regress/testfile-xz.zip new file mode 100644 index 0000000000000000000000000000000000000000..6be8f9c137882d2dffa709544f84d6b8c0f3f71b GIT binary patch literal 200 zcmWIWW@Zs#U|@)6=%KIhY$$=UxJH&=nA85kH<9b!~g?qe&O rR|VF<5E&KV&B!FefZJNIHULkH literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile-zstd.zip b/deps/libzip/regress/testfile-zstd.zip new file mode 100755 index 0000000000000000000000000000000000000000..bf42d3e08bce22cd560e0204ab0235b8865d1bf5 GIT binary patch literal 160 zcmWIWW@fQxU|@)4Sd{rGK;zN91qwi(0}%5Aabi+pvTjjoL26=&UP(oX##a5m3J!Z2 z7%~zQdAX8!xqxIcFBgjd!*Ppah88*j-i%E447iO0n#jP&pa7zP0L}0KZ&o&tFe4D! K0%>0mhXDXy?IKwK literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile.txt b/deps/libzip/regress/testfile.txt new file mode 100755 index 00000000000000..e69de29bb2d1d6 diff --git a/deps/libzip/regress/testfile.zip b/deps/libzip/regress/testfile.zip new file mode 100644 index 0000000000000000000000000000000000000000..2fa5ba0859f6d7022ecc42226a48f806a2d6e785 GIT binary patch literal 122 zcmWIWW@h1H0DW^-3yA0=yZSHXUXVxj6}Wdn&Z M0-+U<)&g-D033A?-T(jq literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/testfile2014.zip b/deps/libzip/regress/testfile2014.zip new file mode 100644 index 0000000000000000000000000000000000000000..1d75d46ecc76e534e984b36e723b64e094390ca3 GIT binary patch literal 122 zcmWIWW@h1H00EKZtgc`Nl;8olE literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/teststdin.zip b/deps/libzip/regress/teststdin.zip new file mode 100644 index 0000000000000000000000000000000000000000..e1a40a869fa29ffbe742866eabf0c514ea84545e GIT binary patch literal 200 zcmWIWW@Zs#00Fa<7FXuqca+RPY#`=i5Md}uEiNf8Day=C*DI+gVPp^h%Yapb2p|Z_ z$ShU>qC^FdS{;SNycC7Z5{2T_)ZAi)l6-}X#IjU{q}0?rh2qlW + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "config.h" + +#include +#include + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif + +#include "zip.h" +#define TRYOPEN_USAGE \ + "usage: %s [-cent] file\n\n" \ + "\t-c\tcheck consistency\n" \ + "\t-e\texclusively open archive\n" \ + "\t-n\tcreate new file\n" \ + "\t-t\ttruncate file to size 0\n" + + +int +main(int argc, char *argv[]) { + const char *fname; + zip_t *z; + int c, flags, ze; + zip_int64_t count; + int error; + + flags = 0; + + while ((c = getopt(argc, argv, "cent")) != -1) { + switch (c) { + case 'c': + flags |= ZIP_CHECKCONS; + break; + case 'e': + flags |= ZIP_EXCL; + break; + case 'n': + flags |= ZIP_CREATE; + break; + case 't': + flags |= ZIP_TRUNCATE; + break; + + default: + fprintf(stderr, TRYOPEN_USAGE, argv[0]); + return 1; + } + } + + error = 0; + for (; optind < argc; optind++) { + fname = argv[optind]; + errno = 0; + + if ((z = zip_open(fname, flags, &ze)) != NULL) { + count = zip_get_num_entries(z, 0); + printf("opening '%s' succeeded, %" PRIu64 " entries\n", fname, count); + zip_close(z); + continue; + } + + printf("opening '%s' returned error %d", fname, ze); + switch (zip_error_get_sys_type(ze)) { + case ZIP_ET_SYS: + case ZIP_ET_LIBZIP: + printf("/%d", errno); + break; + + default: + break; + } + printf("\n"); + error++; + } + + if (error > 0) + fprintf(stderr, "%d errors\n", error); + + return error ? 1 : 0; +} diff --git a/deps/libzip/regress/unchange-delete-namelocate.test b/deps/libzip/regress/unchange-delete-namelocate.test new file mode 100644 index 00000000000000..96ce06f3976a00 --- /dev/null +++ b/deps/libzip/regress/unchange-delete-namelocate.test @@ -0,0 +1,5 @@ +# namelocate after a file has been deleted and unchanged should succeed. +args test2.zip delete 0 unchange 0 name_locate testfile.txt 0 +return 0 +file test2.zip test2.zip test2.zip +stdout name 'testfile.txt' using flags '0' found at index 0 diff --git a/deps/libzip/regress/utf-8-standardization-input.zip b/deps/libzip/regress/utf-8-standardization-input.zip new file mode 100644 index 0000000000000000000000000000000000000000..67e3acf3ce999f23c1694ee994f332976b0df32f GIT binary patch literal 285 zcmWIWW@Zs#U|`^2I8glG<oztux3spkcXW2?l~k0J z7N{^V&b||M87g~t&*7Da7ad-5c){VNhnF8-b$IpR6(Dt=wRH6YHO`&)4b?c|>En0y z#CcCo-5?FmwHgWRF*esdyyx)B!;20tIlSQT(!ijv^`+*F0U)N+O7{JfIXyb^`9{33;tj8uiR%$!uc0B=Sndj?#Fs{oA$ v0R=Eg&?+vdLPiD&hV0Dq?T6Q#XN1uS&VBMAetW^-3yA0=yZS)do@p!i-SW zAi6;i#L*4#W@FQV3d6L4xX4ODe0>lB1f~#*0jQ51#7u$mLFxm%S=nGNgwYHP0A;%+ A`Tzg` literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/zip64.zip b/deps/libzip/regress/zip64.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1ba76b7e76183b17d7b058a61ffcea94b3f3e35 GIT binary patch literal 198 zcmWIWW@gc400IA^Xb1L%ukQYb0!9WA23)do@p!i-SW zAi6;i#L*4#W@FQV3d6L4xX4ODe0>lB1f~#*0jQ51#7u$mLFxm%S=m5bMj!;Kho}Vr D!GacW literal 0 HcmV?d00001 diff --git a/deps/libzip/regress/zip64_creation.test b/deps/libzip/regress/zip64_creation.test new file mode 100644 index 00000000000000..f21608867af7fd --- /dev/null +++ b/deps/libzip/regress/zip64_creation.test @@ -0,0 +1,4 @@ +# create big zip64 zip file from scratch +args bigzero.zip add_nul bigzero 4294967296 +file-new bigzero.zip bigzero.zip +return 0 diff --git a/deps/libzip/regress/zip64_stored_creation.test b/deps/libzip/regress/zip64_stored_creation.test new file mode 100644 index 00000000000000..92ee02c142a465 --- /dev/null +++ b/deps/libzip/regress/zip64_stored_creation.test @@ -0,0 +1,4 @@ +# create big zip64 zip file from scratch +args -H bigstored.zh add_nul bigzero 4294967296 set_file_compression 0 0 0 set_file_mtime 0 0 add_nul smallzero 16384 set_file_compression 1 0 0 set_file_mtime 1 0 +file-new bigstored.zh bigstored.zh +return 0 diff --git a/deps/libzip/regress/zip_read_fuzzer.cc b/deps/libzip/regress/zip_read_fuzzer.cc new file mode 100644 index 00000000000000..6813807b4e4255 --- /dev/null +++ b/deps/libzip/regress/zip_read_fuzzer.cc @@ -0,0 +1,48 @@ +#include + +#ifdef __cplusplus +extern "C" +#endif +int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + zip_source_t *src; + zip_t *za; + zip_error_t error; + char buf[32768]; + zip_int64_t i, n; + zip_file_t *f; + + zip_error_init(&error); + + if ((src = zip_source_buffer_create(data, size, 0, &error)) == NULL) { + zip_error_fini(&error); + return 0; + } + + if ((za = zip_open_from_source(src, 0, &error)) == NULL) { + zip_source_free(src); + zip_error_fini(&error); + return 0; + } + + zip_error_fini(&error); + + n = zip_get_num_entries(za, 0); + + for (i = 0; i < n; i++) { + f = zip_fopen_index(za, i, 0); + if (f == NULL) { + continue; + } + + while (zip_fread(f, buf, sizeof(buf)) > 0) { + ; + } + + zip_fclose(f); + } + + zip_close(za); + + return 0; +} diff --git a/deps/libzip/regress/zip_read_fuzzer.dict b/deps/libzip/regress/zip_read_fuzzer.dict new file mode 100644 index 00000000000000..b54ac523593459 --- /dev/null +++ b/deps/libzip/regress/zip_read_fuzzer.dict @@ -0,0 +1,3 @@ +header_lfh="\x50\x4b\x03\x04" +header_cd="\x50\x4b\x01\x02" +header_eocd="\x50\x4b\x05\x06" diff --git a/deps/libzip/regress/zipcmp_zip_dir.test b/deps/libzip/regress/zipcmp_zip_dir.test new file mode 100644 index 00000000000000..c44d83b982be2c --- /dev/null +++ b/deps/libzip/regress/zipcmp_zip_dir.test @@ -0,0 +1,15 @@ +# compare zip with directory +features FTS_H +program zipcmp +mkdir 0777 a +mkdir 0777 a/dir-with-file +mkdir 0777 a/empty-dir-in-dir +args zipcmp_zip_dir.zip a +file zipcmp_zip_dir.zip zipcmp_zip_dir.zip zipcmp_zip_dir.zip +return 1 +stdout --- zipcmp_zip_dir.zip +stdout +++ a +stdout - directory '00-empty-dir/' +stdout - file 'dir-with-file/a', size 1, crc e8b7be43 +stdout + directory 'empty-dir-in-dir/' +stdout - directory 'empty-dir/' diff --git a/deps/libzip/regress/zipcmp_zip_dir.zip b/deps/libzip/regress/zipcmp_zip_dir.zip new file mode 100644 index 0000000000000000000000000000000000000000..8f47f21bdf3b8a59450799502bfb13f1e608f62a GIT binary patch literal 483 zcmWIWW@h1H00E~cy&y0HN^mjAFr?-dlvL`bWESa%hHx@4M@umzfN*IAHv=Qf3uXoe zmK31s0Js@JKr@{8ZGXWC6a`^^pcz2jy5*TA8MH5)x5e z!wWRYz(5zxK}XaW5 + +#define ZIP_MIN(a, b) ((a) < (b) ? (a) : (b)) + +#define FOR_REGRESS + +typedef enum { SOURCE_TYPE_NONE, SOURCE_TYPE_IN_MEMORY, SOURCE_TYPE_HOLE } source_type_t; + +source_type_t source_type = SOURCE_TYPE_NONE; +zip_uint64_t fragment_size = 0; +zip_file_t *z_files[16]; +unsigned int z_files_count; + +static int add_nul(char *argv[]); +static int cancel(char *argv[]); +static int regress_fopen(char *argv[]); +static int regress_fread(char *argv[]); +static int regress_fseek(char *argv[]); +static int is_seekable(char *argv[]); +static int unchange_one(char *argv[]); +static int unchange_all(char *argv[]); +static int zin_close(char *argv[]); + +#define OPTIONS_REGRESS "F:Hm" + +#define USAGE_REGRESS " [-Hm] [-F fragment-size]" + +#define GETOPT_REGRESS \ + case 'H': \ + source_type = SOURCE_TYPE_HOLE; \ + break; \ + case 'm': \ + source_type = SOURCE_TYPE_IN_MEMORY; \ + break; \ + case 'F': \ + fragment_size = strtoull(optarg, NULL, 10); \ + break; + +/* clang-format off */ + +#define DISPATCH_REGRESS \ + {"add_nul", 2, "name length", "add NUL bytes", add_nul}, \ + {"cancel", 1, "limit", "cancel writing archive when limit% have been written (calls print_progress)", cancel}, \ + {"fopen", 1, "name", "open archive entry", regress_fopen}, \ + {"fread", 2, "file_index length", "read from fopened file and print", regress_fread}, \ + {"fseek", 3, "file_index offset whence", "seek in fopened file", regress_fseek}, \ + {"is_seekable", 1, "index", "report if entry is seekable", is_seekable}, \ + {"unchange", 1, "index", "revert changes for entry", unchange_one}, \ + {"unchange_all", 0, "", "revert all changes", unchange_all}, \ + {"zin_close", 1, "index", "close input zip_source (for internal tests)", zin_close} + +#define PRECLOSE_REGRESS \ + do { \ + unsigned int file_idx = 0; \ + for (file_idx = 0; file_idx < z_files_count; ++file_idx) { \ + if (zip_fclose (z_files[file_idx]) != 0) { \ + err = 1; \ + } \ + } \ + } \ + while (0) + +/* clang-format on */ + + +zip_t *ziptool_open(const char *archive, int flags, zip_error_t *error, zip_uint64_t offset, zip_uint64_t len); + + +#include "ziptool.c" + + +zip_source_t *memory_src = NULL; + +static int get_whence(const char *str); +zip_source_t *source_hole_create(const char *, int flags, zip_error_t *); +static zip_t *read_to_memory(const char *archive, int flags, zip_error_t *error, zip_source_t **srcp); +static zip_source_t *source_nul(zip_t *za, zip_uint64_t length); + + +static int +add_nul(char *argv[]) { + zip_source_t *zs; + zip_uint64_t length = strtoull(argv[1], NULL, 10); + + if ((zs = source_nul(za, length)) == NULL) { + fprintf(stderr, "can't create zip_source for length: %s\n", zip_strerror(za)); + return -1; + } + + if (zip_add(za, argv[0], zs) == -1) { + zip_source_free(zs); + fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +cancel_callback(zip_t *archive, void *ud) { + if (progress_userdata.percentage >= progress_userdata.limit) { + return -1; + } + return 0; +} + +static int +cancel(char *argv[]) { + zip_int64_t percent; + percent = strtoll(argv[0], NULL, 10); + if (percent > 100 || percent < 0) { + fprintf(stderr, "invalid percentage '%" PRId64 "' for cancel (valid: 0 <= x <= 100)\n", percent); + return -1; + } + progress_userdata.limit = ((double)percent) / 100; + + zip_register_cancel_callback_with_state(za, cancel_callback, NULL, NULL); + + /* needs the percentage updates from print_progress */ + print_progress(argv); + return 0; +} + +static int +is_seekable(char *argv[]) { + zip_uint64_t idx; + zip_file_t *zf; + + idx = strtoull(argv[0], NULL, 10); + if ((zf = zip_fopen_index(za, idx, 0)) == NULL) { + fprintf(stderr, "can't open file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za)); + return -1; + } + switch (zip_file_is_seekable(zf)) { + case -1: + fprintf(stderr, "can't check if file %" PRIu64 " is seekable: %s\n", idx, zip_strerror(za)); + return -1; + case 0: + printf("%" PRIu64 ": NOT seekable\n", idx); + break; + case 1: + printf("%" PRIu64 ": seekable\n", idx); + break; + } + return 0; +} + +static int +regress_fseek(char *argv[]) { + zip_uint64_t file_idx; + zip_file_t *zf; + zip_int64_t offset; + int whence; + + file_idx = strtoull(argv[0], NULL, 10); + offset = strtoll(argv[1], NULL, 10); + whence = get_whence(argv[2]); + if (file_idx >= z_files_count || z_files[file_idx] == NULL) { + fprintf(stderr, "trying to seek in invalid opened file\n"); + return -1; + } + zf = z_files[file_idx]; + + if (zip_fseek(zf, offset, whence) == -1) { + fprintf(stderr, "can't seek in file %" PRIu64 ": %s\n", file_idx, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +unchange_all(char *argv[]) { + if (zip_unchange_all(za) < 0) { + fprintf(stderr, "can't revert changes to archive: %s\n", zip_strerror(za)); + return -1; + } + return 0; +} + + +static int +unchange_one(char *argv[]) { + zip_uint64_t idx; + + idx = strtoull(argv[0], NULL, 10); + + if (zip_unchange(za, idx) < 0) { + fprintf(stderr, "can't revert changes for entry %" PRIu64 ": %s", idx, zip_strerror(za)); + return -1; + } + + return 0; +} + +static int +zin_close(char *argv[]) { + zip_uint64_t idx; + + idx = strtoull(argv[0], NULL, 10); + if (idx >= z_in_count) { + fprintf(stderr, "invalid argument '%" PRIu64 "', only %u zip sources open\n", idx, z_in_count); + return -1; + } + if (zip_close(z_in[idx]) < 0) { + fprintf(stderr, "can't close source archive: %s\n", zip_strerror(z_in[idx])); + return -1; + } + z_in[idx] = z_in[z_in_count]; + z_in_count--; + + return 0; +} + +static int +regress_fopen(char *argv[]) { + if (z_files_count >= (sizeof(z_files) / sizeof(*z_files))) { + fprintf(stderr, "too many open files\n"); + return -1; + } + if ((z_files[z_files_count] = zip_fopen(za, argv[0], 0)) == NULL) { + fprintf(stderr, "can't open entry '%s' from input archive: %s\n", argv[0], zip_strerror(za)); + return -1; + } + printf("opened '%s' as file %u\n", argv[0], z_files_count); + z_files_count += 1; + return 0; +} + + +static int +regress_fread(char *argv[]) { + zip_uint64_t file_idx; + zip_uint64_t length; + char buf[8192]; + zip_int64_t n; + zip_file_t *f; + + file_idx = strtoull(argv[0], NULL, 10); + length = strtoull(argv[1], NULL, 10); + + if (file_idx >= z_files_count || z_files[file_idx] == NULL) { + fprintf(stderr, "trying to read from invalid opened file\n"); + return -1; + } + f = z_files[file_idx]; + while (length > 0) { + zip_uint64_t to_read; + + if (length > sizeof (buf)) { + to_read = sizeof (buf); + } else { + to_read = length; + } + n = zip_fread(f, buf, to_read); + if (n < 0) { + fprintf(stderr, "can't read opened file %" PRIu64 ": %s\n", file_idx, zip_file_strerror(f)); + return -1; + } + if (n == 0) { +#if 0 + fprintf(stderr, "premature end of opened file %" PRIu64 "\n", file_idx); + return -1; +#else + break; +#endif + } + if (fwrite(buf, (size_t)n, 1, stdout) != 1) { + fprintf(stderr, "can't write file contents to stdout: %s\n", strerror(errno)); + return -1; + } + length -= n; + } + return 0; +} + + +static zip_t * +read_hole(const char *archive, int flags, zip_error_t *error) { + zip_source_t *src = NULL; + zip_t *zs = NULL; + + if (strcmp(archive, "/dev/stdin") == 0) { + zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); + return NULL; + } + + if ((src = source_hole_create(archive, flags, error)) == NULL || (zs = zip_open_from_source(src, flags, error)) == NULL) { + zip_source_free(src); + } + + return zs; +} + + +static int get_whence(const char *str) { + if (strcasecmp(str, "set") == 0) { + return SEEK_SET; + } + else if (strcasecmp(str, "cur") == 0) { + return SEEK_CUR; + } + else if (strcasecmp(str, "end") == 0) { + return SEEK_END; + } + else { + return 100; /* invalid */ + } +} + + +static zip_t * +read_to_memory(const char *archive, int flags, zip_error_t *error, zip_source_t **srcp) { + zip_source_t *src; + zip_t *zb; + FILE *fp; + + if (strcmp(archive, "/dev/stdin") == 0) { + zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); + return NULL; + } + + if ((fp = fopen(archive, "rb")) == NULL) { + if (errno == ENOENT) { + src = zip_source_buffer_create(NULL, 0, 0, error); + } + else { + zip_error_set(error, ZIP_ER_OPEN, errno); + return NULL; + } + } + else { + struct stat st; + + if (fstat(fileno(fp), &st) < 0) { + fclose(fp); + zip_error_set(error, ZIP_ER_OPEN, errno); + return NULL; + } + if (fragment_size == 0) { + char *buf; + if ((buf = malloc((size_t)st.st_size)) == NULL) { + fclose(fp); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + if (fread(buf, (size_t)st.st_size, 1, fp) < 1) { + free(buf); + fclose(fp); + zip_error_set(error, ZIP_ER_READ, errno); + return NULL; + } + src = zip_source_buffer_create(buf, (zip_uint64_t)st.st_size, 1, error); + if (src == NULL) { + free(buf); + } + } + else { + zip_uint64_t nfragments, i, left; + zip_buffer_fragment_t *fragments; + + nfragments = ((size_t)st.st_size + fragment_size - 1) / fragment_size; + if ((fragments = malloc(sizeof(fragments[0]) * nfragments)) == NULL) { + fclose(fp); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + for (i = 0; i < nfragments; i++) { + left = ZIP_MIN(fragment_size, (size_t)st.st_size - i * fragment_size); + if ((fragments[i].data = malloc(left)) == NULL) { +#ifndef __clang_analyzer__ + /* fragments is initialized up to i - 1*/ + while (--i > 0) { + free(fragments[i].data); + } +#endif + free(fragments); + fclose(fp); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + fragments[i].length = left; + if (fread(fragments[i].data, left, 1, fp) < 1) { +#ifndef __clang_analyzer__ + /* fragments is initialized up to i - 1*/ + while (--i > 0) { + free(fragments[i].data); + } +#endif + free(fragments); + fclose(fp); + zip_error_set(error, ZIP_ER_READ, errno); + return NULL; + } + } + src = zip_source_buffer_fragment_create(fragments, nfragments, 1, error); + if (src == NULL) { + for (i = 0; i < nfragments; i++) { + free(fragments[i].data); + } + free(fragments); + fclose(fp); + return NULL; + } + free(fragments); + } + fclose(fp); + } + if (src == NULL) { + return NULL; + } + zb = zip_open_from_source(src, flags, error); + if (zb == NULL) { + zip_source_free(src); + return NULL; + } + zip_source_keep(src); + *srcp = src; + return zb; +} + + +typedef struct source_nul { + zip_error_t error; + zip_uint64_t length; + zip_uint64_t offset; +} source_nul_t; + +static zip_int64_t +source_nul_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command) { + source_nul_t *ctx = (source_nul_t *)ud; + + switch (command) { + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, length); + + case ZIP_SOURCE_FREE: + free(ctx); + return 0; + + case ZIP_SOURCE_OPEN: + ctx->offset = 0; + return 0; + + case ZIP_SOURCE_READ: + if (length > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (length > ctx->length - ctx->offset) { + length = ctx->length - ctx->offset; + } + + memset(data, 0, length); + ctx->offset += length; + return (zip_int64_t)length; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st = ZIP_SOURCE_GET_ARGS(zip_stat_t, data, length, &ctx->error); + + if (st == NULL) { + return -1; + } + + st->valid |= ZIP_STAT_SIZE; + st->size = ctx->length; + + return 0; + } + + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap(ZIP_SOURCE_CLOSE, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_STAT, -1); + + default: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} + +static zip_source_t * +source_nul(zip_t *zs, zip_uint64_t length) { + source_nul_t *ctx; + zip_source_t *src; + + if ((ctx = (source_nul_t *)malloc(sizeof(*ctx))) == NULL) { + zip_error_set(zip_get_error(zs), ZIP_ER_MEMORY, 0); + return NULL; + } + + zip_error_init(&ctx->error); + ctx->length = length; + ctx->offset = 0; + + if ((src = zip_source_function(zs, source_nul_cb, ctx)) == NULL) { + free(ctx); + return NULL; + } + + return src; +} + + +static int +write_memory_src_to_file(const char *archive, zip_source_t *src) { + zip_stat_t zst; + char *buf; + FILE *fp; + + if (zip_source_stat(src, &zst) < 0) { + fprintf(stderr, "zip_source_stat on buffer failed: %s\n", zip_error_strerror(zip_source_error(src))); + return -1; + } + if (zip_source_open(src) < 0) { + if (zip_error_code_zip(zip_source_error(src)) == ZIP_ER_DELETED) { + if (unlink(archive) < 0 && errno != ENOENT) { + fprintf(stderr, "unlink failed: %s\n", strerror(errno)); + return -1; + } + return 0; + } + fprintf(stderr, "zip_source_open on buffer failed: %s\n", zip_error_strerror(zip_source_error(src))); + return -1; + } + if ((buf = malloc(zst.size)) == NULL) { + fprintf(stderr, "malloc failed: %s\n", strerror(errno)); + zip_source_close(src); + return -1; + } + if (zip_source_read(src, buf, zst.size) < (zip_int64_t)zst.size) { + fprintf(stderr, "zip_source_read on buffer failed: %s\n", zip_error_strerror(zip_source_error(src))); + zip_source_close(src); + free(buf); + return -1; + } + zip_source_close(src); + if ((fp = fopen(archive, "wb")) == NULL) { + fprintf(stderr, "fopen failed: %s\n", strerror(errno)); + free(buf); + return -1; + } + if (fwrite(buf, zst.size, 1, fp) < 1) { + fprintf(stderr, "fwrite failed: %s\n", strerror(errno)); + free(buf); + fclose(fp); + return -1; + } + free(buf); + if (fclose(fp) != 0) { + fprintf(stderr, "fclose failed: %s\n", strerror(errno)); + return -1; + } + return 0; +} + + +zip_t * +ziptool_open(const char *archive, int flags, zip_error_t *error, zip_uint64_t offset, zip_uint64_t len) { + switch (source_type) { + case SOURCE_TYPE_NONE: + za = read_from_file(archive, flags, error, offset, len); + break; + + case SOURCE_TYPE_IN_MEMORY: + za = read_to_memory(archive, flags, error, &memory_src); + break; + + case SOURCE_TYPE_HOLE: + za = read_hole(archive, flags, error); + break; + } + + return za; +} + + +int +ziptool_post_close(const char *archive) { + if (source_type == SOURCE_TYPE_IN_MEMORY) { + if (write_memory_src_to_file(archive, memory_src) < 0) { + return -1; + } + zip_source_free(memory_src); + } + + return 0; +} diff --git a/deps/libzip/src/CMakeLists.txt b/deps/libzip/src/CMakeLists.txt new file mode 100644 index 00000000000000..a0f53252c6056a --- /dev/null +++ b/deps/libzip/src/CMakeLists.txt @@ -0,0 +1,14 @@ +check_function_exists(getopt HAVE_GETOPT) +foreach(PROGRAM zipcmp zipmerge ziptool) + add_executable(${PROGRAM} ${PROGRAM}.c) + target_link_libraries(${PROGRAM} zip) + target_include_directories(${PROGRAM} PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) + if(LIBZIP_DO_INSTALL) + install(TARGETS ${PROGRAM} EXPORT ${PROJECT_NAME}-targets DESTINATION bin) + endif() + if(NOT HAVE_GETOPT) + target_sources(${PROGRAM} PRIVATE getopt.c) + endif(NOT HAVE_GETOPT) +endforeach() +target_sources(zipcmp PRIVATE diff_output.c) +target_link_libraries(zipcmp ${FTS_LIB} ZLIB::ZLIB) diff --git a/deps/libzip/src/diff_output.c b/deps/libzip/src/diff_output.c new file mode 100644 index 00000000000000..96b6313b1a9c30 --- /dev/null +++ b/deps/libzip/src/diff_output.c @@ -0,0 +1,106 @@ +#include "diff_output.h" + +#include +#include +#include +#include + +#include "compat.h" + +static void ensure_header(diff_output_t *output) { + if (output->archive_names[0] != NULL) { + printf("--- %s\n", output->archive_names[0]); + printf("+++ %s\n", output->archive_names[1]); + output->archive_names[0] = NULL; + output->archive_names[1] = NULL; + } +} + +void diff_output_init(diff_output_t *output, int verbose, char *const archive_names[]) { + output->archive_names[0] = archive_names[0]; + output->archive_names[1] = archive_names[1]; + output->verbose = verbose; + output->file_name = NULL; + output->file_size = 0; + output->file_crc = 0; +} + +void diff_output_start_file(diff_output_t *output, const char *name, zip_uint64_t size, zip_uint32_t crc) { + output->file_name = name; + output->file_size = size; + output->file_crc = crc; +} + +void diff_output_end_file(diff_output_t *output) { + output->file_name = NULL; +} + +void diff_output(diff_output_t *output, int side, const char *fmt, ...) { + va_list ap; + + if (!output->verbose) { + return; + } + + ensure_header(output); + + if (output->file_name != NULL) { + diff_output_file(output, ' ', output->file_name, output->file_size, output->file_crc); + output->file_name = NULL; + } + + printf("%c ", side); + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf("\n"); +} + +void diff_output_file(diff_output_t *output, char side, const char *name, zip_uint64_t size, zip_uint32_t crc) { + if (!output->verbose) { + return; + } + + ensure_header(output); + + if (size == 0 && crc == 0 && name[0] != '\0' && name[strlen(name) - 1] == '/') { + printf("%c directory '%s'\n", side, name); + } + else { + printf("%c file '%s', size %" PRIu64 ", crc %08x\n", side, name, size, crc); + } +} + +#define MAX_BYTES 64 +void diff_output_data(diff_output_t *output, int side, const zip_uint8_t *data, zip_uint64_t data_length, const char *fmt, ...) { + char prefix[1024]; + char hexdata[MAX_BYTES * 3 + 6]; + size_t i, offset; + va_list ap; + + if (!output->verbose) { + return; + } + + offset = 0; + for (i = 0; i < data_length; i++) { + hexdata[offset++] = (i == 0 ? '<' : ' '); + + if (i >= MAX_BYTES) { + snprintf(hexdata + offset, sizeof(hexdata) - offset, "..."); + break; + } + snprintf(hexdata + offset, sizeof(hexdata) - offset, "%02x", data[i]); + offset += 2; + } + + hexdata[offset++] = '>'; + hexdata[offset] = '\0'; + + va_start(ap, fmt); + vsnprintf(prefix, sizeof(prefix), fmt, ap); + va_end(ap); + prefix[sizeof(prefix) - 1] = '\0'; + + diff_output(output, side, "%s, length %" PRIu64 ", data %s", prefix, data_length, hexdata); +} diff --git a/deps/libzip/src/diff_output.h b/deps/libzip/src/diff_output.h new file mode 100644 index 00000000000000..8ac12b8bba5628 --- /dev/null +++ b/deps/libzip/src/diff_output.h @@ -0,0 +1,28 @@ +#ifndef HAD_DIFF_OUTPUT_H +#define HAD_DIFF_OUTPUT_H + +#include + +typedef struct { + const char *archive_names[2]; + const char *file_name; + zip_uint64_t file_size; + zip_uint32_t file_crc; + int verbose; +} diff_output_t; + +#if defined(__GNUC__) && __GNUC__ >= 4 +#define PRINTF_LIKE(n, m) __attribute__((__format__(__printf__, n, m))) +#else +#define PRINTF_LIKE(n, m) +#endif + +void diff_output_init(diff_output_t *output, int verbose, char *const archive_names[]); +void diff_output_start_file(diff_output_t *output, const char *name, zip_uint64_t size, zip_uint32_t crc); +void diff_output_end_file(diff_output_t *output); + +void diff_output(diff_output_t *output, int side, const char *fmt, ...) PRINTF_LIKE(3, 4); +void diff_output_data(diff_output_t *output, int side, const zip_uint8_t *data, zip_uint64_t data_length, const char *fmt, ...) PRINTF_LIKE(5, 6); +void diff_output_file(diff_output_t *output, char side, const char *name, zip_uint64_t size, zip_uint32_t crc); + +#endif /* HAD_DIFF_OUTPUT_H */ diff --git a/deps/libzip/src/getopt.c b/deps/libzip/src/getopt.c new file mode 100644 index 00000000000000..a9879c4bc3fe36 --- /dev/null +++ b/deps/libzip/src/getopt.c @@ -0,0 +1,110 @@ +/* + * getopt.c -- + * + * Standard UNIX getopt function. Code is from BSD. + * + * Copyright (c) 1987-2002 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * A. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * B. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * C. Neither the names of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS + * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* #if !defined(lint) + * static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94"; + * #endif + */ +#include +#include +#include + +#include "getopt.h" + +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int +getopt(int nargc, char *const *nargv, const char *ostr) { + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc || *(place = nargv[optind]) != '-') { + place = EMSG; + return (EOF); + } + if (place[1] && *++place == '-') { /* found "--" */ + ++optind; + place = EMSG; + return (EOF); + } + } /* option letter okay? */ + if ((optopt = (int)*place++) == (int)':' || !(oli = (char *)strchr(ostr, optopt))) { + /* + * if the user didn't specify '-' as an option, + * assume it means EOF. + */ + if (optopt == (int)'-') + return (EOF); + if (!*place) + ++optind; + if (opterr && *ostr != ':') + (void)fprintf(stderr, "illegal option -- %c\n", optopt); + return (BADCH); + } + if (*++oli != ':') { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } + else { /* need an argument */ + if (*place) /* no white space */ + optarg = place; + else if (nargc <= ++optind) { /* no arg */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) + (void)fprintf(stderr, "option requires an argument -- %c\n", optopt); + return (BADCH); + } + else /* white space */ + optarg = nargv[optind]; + place = EMSG; + ++optind; + } + return (optopt); /* dump back option letter */ +} diff --git a/deps/libzip/src/getopt.h b/deps/libzip/src/getopt.h new file mode 100644 index 00000000000000..cc2ef3661e98d8 --- /dev/null +++ b/deps/libzip/src/getopt.h @@ -0,0 +1,51 @@ +#ifndef _HAD_GETOPT_H +#define _HAD_GETOPT_H + +/* + getopt.h -- header for getopt() replacement function + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +extern char *optarg; +extern int optind; +extern int opterr; + +extern int getopt(int, char *const *, const char *); + +#ifdef __cplusplus +} +#endif + +#endif /* _HAD_GETOPT_H */ diff --git a/deps/libzip/src/zipcmp.c b/deps/libzip/src/zipcmp.c new file mode 100644 index 00000000000000..695c77e4289116 --- /dev/null +++ b/deps/libzip/src/zipcmp.c @@ -0,0 +1,880 @@ +/* + zipcmp.c -- compare zip files + Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_FTS_H +#include +#endif +#include + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif + +#include "zip.h" + +#include "compat.h" + +#include "diff_output.h" + +struct archive { + const char *name; + zip_t *za; + zip_uint64_t nentry; + struct entry *entry; + const char *comment; + size_t comment_length; +}; + +struct ef { + const char *name; + zip_uint16_t flags; + zip_uint16_t id; + zip_uint16_t size; + const zip_uint8_t *data; +}; + +struct entry { + char *name; + zip_uint64_t size; + zip_uint32_t crc; + zip_uint32_t comp_method; + struct ef *extra_fields; + zip_uint16_t n_extra_fields; + const char *comment; + zip_uint32_t comment_length; +}; + + +typedef struct { + uint32_t value; + const char * const name; +} enum_map_t; + +const enum_map_t comp_methods[] = { + { 0, "Stored (no compression)" }, + { 1, "Shrunk" }, + { 2, "Reduced with compression factor 1" }, + { 3, "Reduced with compression factor 2" }, + { 4, "Reduced with compression factor 3" }, + { 5, "Reduced with compression factor 4" }, + { 6, "Imploded" }, + { 7, "Reserved for Tokenizing compression algorithm" }, + { 8, "Deflated" }, + { 9, "Enhanced Deflating using Deflate64(tm)" }, + { 10, "PKWARE Data Compression Library Imploding (old IBM TERSE)" }, + { 11, "11 (Reserved by PKWARE)" }, + { 12, "BZIP2" }, + { 13, "13 (Reserved by PKWARE)" }, + { 14, "LZMA (EFS)" }, + { 15, "15 (Reserved by PKWARE)" }, + { 16, "16 (Reserved by PKWARE)" }, + { 17, "17 (Reserved by PKWARE)" }, + { 18, "IBM TERSE (new)" }, + { 19, "IBM LZ77 z Architecture (PFS)" }, + { 20, "Zstandard compressed data (obsolete)" }, + { 93, "Zstandard compressed data" }, + { 95, "XZ compressed data" }, + { 97, "WavPack compressed data" }, + { 98, "PPMd version I, Rev 1" }, + { 99, "WinZIP AES Encryption" }, + { UINT32_MAX, NULL } +}; + +const enum_map_t extra_fields[] = { + /* PKWARE defined */ + { 0x0001, "Zip64 extended information" }, + { 0x0007, "AV Info" }, + { 0x0008, "Reserved for extended language encoding data (PFS)" }, + { 0x0009, "OS/2" }, + { 0x000a, "NTFS" }, + { 0x000c, "OpenVMS" }, + { 0x000d, "UNIX" }, + { 0x000e, "Reserved for file stream and fork descriptors" }, + { 0x000f, "Patch Descriptor" }, + { 0x0014, "PKCS#7 Store for X.509 Certificates" }, + { 0x0015, "X.509 Certificate ID and Signature for individual file" }, + { 0x0016, "X.509 Certificate ID for Central Directory" }, + { 0x0017, "Strong Encryption Header" }, + { 0x0018, "Record Management Controls" }, + { 0x0019, "PKCS#7 Encryption Recipient Certificate List" }, + { 0x0065, "IBM S/390 (Z390), AS/400 (I400) attributes - uncompressed" }, + { 0x0066, "Reserved for IBM S/390 (Z390), AS/400 (I400) attributes - compressed" }, + { 0x4690, "POSZIP 4690 (reserved)" }, + + /* Third-Party defined; see InfoZIP unzip sources proginfo/extrafld.txt */ + { 0x07c8, "Info-ZIP Macintosh (old)" }, + { 0x2605, "ZipIt Macintosh (first version)" }, + { 0x2705, "ZipIt Macintosh 1.3.5+ (w/o full filename)" }, + { 0x2805, "ZipIt Macintosh 1.3.5+" }, + { 0x334d, "Info-ZIP Macintosh (new)" }, + { 0x4154, "Tandem NSK" }, + { 0x4341, "Acorn/SparkFS" }, + { 0x4453, "Windows NT security descriptor" }, + { 0x4704, "VM/CMS" }, + { 0x470f, "MVS" }, + { 0x4854, "Theos, old unofficial port" }, + { 0x4b46, "FWKCS MD5" }, + { 0x4c41, "OS/2 access control list (text ACL)" }, + { 0x4d49, "Info-ZIP OpenVMS (obsolete)" }, + { 0x4d63, "Macintosh SmartZIP" }, + { 0x4f4c, "Xceed original location extra field" }, + { 0x5356, "AOS/VS (ACL)" }, + { 0x5455, "extended timestamp" }, + { 0x554e, "Xceed unicode extra field" }, + { 0x5855, "Info-ZIP UNIX (original)" }, + { 0x6375, "Info-ZIP UTF-8 comment field" }, + { 0x6542, "BeOS (BeBox, PowerMac, etc.)" }, + { 0x6854, "Theos" }, + { 0x7075, "Info-ZIP UTF-8 name field" }, + { 0x7441, "AtheOS (AtheOS/Syllable attributes)" }, + { 0x756e, "ASi UNIX" }, + { 0x7855, "Info-ZIP UNIX" }, + { 0x7875, "Info-ZIP UNIX 3rd generation" }, + { 0x9901, "WinZIP AES encryption" }, + { 0xa220, "Microsoft Open Packaging Growth Hint" }, + { 0xcafe, "executable Java JAR file" }, + { 0xfb4a, "SMS/QDOS" }, /* per InfoZIP extrafld.txt */ + { 0xfd4a, "SMS/QDOS" }, /* per appnote.txt */ + { UINT32_MAX, NULL } +}; + + +const char *progname; + +#define PROGRAM "zipcmp" + +#define USAGE "usage: %s [-hipqtVv] archive1 archive2\n" + +char help_head[] = PROGRAM " (" PACKAGE ") by Dieter Baron and Thomas Klausner\n\n"; + +char help[] = "\n\ + -h display this help message\n\ + -C check archive consistencies\n\ + -i compare names ignoring case distinctions\n\ + -p compare as many details as possible\n\ + -q be quiet\n\ + -s print a summary\n\ + -t test zip files (compare file contents to checksum)\n\ + -V display version number\n\ + -v be verbose (print differences, default)\n\ +\n\ +Report bugs to .\n"; + +char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\ +Copyright (C) 2003-2022 Dieter Baron and Thomas Klausner\n\ +" PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n"; + +#define OPTIONS "hVCipqstv" + + +#define BOTH_ARE_ZIPS(a) (a[0].za && a[1].za) + +static int comment_compare(const char *c1, size_t l1, const char *c2, size_t l2); +static int compare_list(char *const name[2], const void *list[2], const zip_uint64_t list_length[2], int element_size, int (*cmp)(const void *a, const void *b), int (*ignore)(const void *list, int last, const void *other), int (*check)(char *const name[2], const void *a, const void *b), void (*print)(char side, const void *element), void (*start_file)(const void *element)); +static int compare_zip(char *const zn[]); +static int ef_compare(char *const name[2], const struct entry *e1, const struct entry *e2); +static int ef_order(const void *a, const void *b); +static void ef_print(char side, const void *p); +static int ef_read(zip_t *za, zip_uint64_t idx, struct entry *e); +static int entry_cmp(const void *p1, const void *p2); +static int entry_ignore(const void *p1, int last, const void *o); +static int entry_paranoia_checks(char *const name[2], const void *p1, const void *p2); +static void entry_print(char side, const void *p); +static void entry_start_file(const void *p); +static const char *map_enum(const enum_map_t *map, uint32_t value); + +static int is_directory(const char *name); +#ifdef HAVE_FTS_H +static int list_directory(const char *name, struct archive *a); +#endif +static int list_zip(const char *name, struct archive *a); +static int test_file(zip_t *za, zip_uint64_t idx, const char *zipname, const char *filename, zip_uint64_t size, zip_uint32_t crc); + +int ignore_case, test_files, paranoid, verbose, have_directory, check_consistency, summary; +int plus_count = 0, minus_count = 0; + +diff_output_t output; + + +int +main(int argc, char *const argv[]) { + int c; + + progname = argv[0]; + + ignore_case = 0; + test_files = 0; + check_consistency = 0; + paranoid = 0; + have_directory = 0; + verbose = 1; + summary = 0; + + while ((c = getopt(argc, argv, OPTIONS)) != -1) { + switch (c) { + case 'C': + check_consistency = 1; + break; + case 'i': + ignore_case = 1; + break; + case 'p': + paranoid = 1; + break; + case 'q': + verbose = 0; + break; + case 's': + summary = 1; + break; + case 't': + test_files = 1; + break; + case 'v': + verbose = 1; + break; + + case 'h': + fputs(help_head, stdout); + printf(USAGE, progname); + fputs(help, stdout); + exit(0); + case 'V': + fputs(version_string, stdout); + exit(0); + + default: + fprintf(stderr, USAGE, progname); + exit(2); + } + } + + if (argc != optind + 2) { + fprintf(stderr, USAGE, progname); + exit(2); + } + + exit((compare_zip(argv + optind) == 0) ? 0 : 1); +} + + +static int +compare_zip(char *const zn[]) { + struct archive a[2]; + struct entry *e[2]; + zip_uint64_t n[2]; + int i; + int res; + + for (i = 0; i < 2; i++) { + a[i].name = zn[i]; + a[i].entry = NULL; + a[i].nentry = 0; + a[i].za = NULL; + a[i].comment = NULL; + a[i].comment_length = 0; + + if (is_directory(zn[i])) { +#ifndef HAVE_FTS_H + fprintf(stderr, "%s: reading directories not supported\n", progname); + exit(2); +#else + if (list_directory(zn[i], a + i) < 0) + exit(2); + have_directory = 1; + paranoid = 0; /* paranoid checks make no sense for directories, since they compare zip metadata */ +#endif + } + else { + if (list_zip(zn[i], a + i) < 0) + exit(2); + } + if (a[i].nentry > 0) + qsort(a[i].entry, a[i].nentry, sizeof(a[i].entry[0]), entry_cmp); + } + + diff_output_init(&output, verbose, zn); + + e[0] = a[0].entry; + e[1] = a[1].entry; + n[0] = a[0].nentry; + n[1] = a[1].nentry; + res = compare_list(zn, (const void **)e, n, sizeof(e[i][0]), entry_cmp, have_directory ? entry_ignore : NULL, paranoid ? entry_paranoia_checks : NULL, entry_print, entry_start_file); + + if (paranoid) { + if (comment_compare(a[0].comment, a[0].comment_length, a[1].comment, a[1].comment_length) != 0) { + if (a[0].comment_length > 0) { + diff_output_data(&output, '-', (const zip_uint8_t *)a[0].comment, a[0].comment_length, "archive comment"); + minus_count++; + } + if (a[1].comment_length > 0) { + diff_output_data(&output, '+', (const zip_uint8_t *)a[1].comment, a[1].comment_length, "archive comment"); + plus_count++; + } + res = 1; + } + } + + for (i = 0; i < 2; i++) { + zip_uint64_t j; + + if (a[i].za) { + zip_close(a[i].za); + } + for (j = 0; j < a[i].nentry; j++) { + free(a[i].entry[j].name); + } + free(a[i].entry); + } + + if (summary) { + printf("%d files removed, %d files added\n", minus_count, plus_count); + } + + switch (res) { + case 0: + exit(0); + + case 1: + exit(1); + + default: + exit(2); + } +} + +#ifdef HAVE_FTS_H +static zip_int64_t +compute_crc(const char *fname) { + FILE *f; + uLong crc = crc32(0L, Z_NULL, 0); + size_t n; + Bytef buffer[8192]; + + + if ((f = fopen(fname, "rb")) == NULL) { + fprintf(stderr, "%s: can't open %s: %s\n", progname, fname, strerror(errno)); + return -1; + } + + while ((n = fread(buffer, 1, sizeof(buffer), f)) > 0) { + crc = crc32(crc, buffer, (unsigned int)n); + } + + if (ferror(f)) { + fprintf(stderr, "%s: read error on %s: %s\n", progname, fname, strerror(errno)); + fclose(f); + return -1; + } + + fclose(f); + + return (zip_int64_t)crc; +} +#endif + + +static int +is_directory(const char *name) { + struct stat st; + + if (stat(name, &st) < 0) + return 0; + + return S_ISDIR(st.st_mode); +} + + +#ifdef HAVE_FTS_H +static int +list_directory(const char *name, struct archive *a) { + FTS *fts; + FTSENT *ent; + zip_uint64_t nalloc; + size_t prefix_length; + + char *const names[2] = {(char *)name, NULL}; + + + if ((fts = fts_open(names, FTS_NOCHDIR | FTS_LOGICAL, NULL)) == NULL) { + fprintf(stderr, "%s: can't open directory '%s': %s\n", progname, name, strerror(errno)); + return -1; + } + prefix_length = strlen(name) + 1; + + nalloc = 0; + + while ((ent = fts_read(fts))) { + zip_int64_t crc; + + switch (ent->fts_info) { + case FTS_DOT: + case FTS_DP: + case FTS_DEFAULT: + case FTS_SL: + case FTS_NSOK: + break; + + case FTS_DC: + case FTS_DNR: + case FTS_ERR: + case FTS_NS: + case FTS_SLNONE: + /* TODO: error */ + fts_close(fts); + return -1; + + case FTS_D: + case FTS_F: + if (a->nentry >= nalloc) { + nalloc += 16; + if (nalloc > SIZE_MAX / sizeof(a->entry[0])) { + fprintf(stderr, "%s: malloc failure\n", progname); + exit(1); + } + a->entry = realloc(a->entry, sizeof(a->entry[0]) * nalloc); + if (a->entry == NULL) { + fprintf(stderr, "%s: malloc failure\n", progname); + exit(1); + } + } + + if (ent->fts_info == FTS_D) { + char *dir_name; + + if (ent->fts_path[prefix_length - 1] == '\0') { + break; + } + + size_t dir_name_size = strlen(ent->fts_path + prefix_length) + 2; + dir_name = malloc(dir_name_size); + if (dir_name == NULL) { + fprintf(stderr, "%s: malloc failure\n", progname); + exit(1); + } + snprintf(dir_name, dir_name_size, "%s/", ent->fts_path + prefix_length); + a->entry[a->nentry].name = dir_name; + a->entry[a->nentry].size = 0; + a->entry[a->nentry].crc = 0; + } + else { + a->entry[a->nentry].name = strdup(ent->fts_path + prefix_length); + a->entry[a->nentry].size = (zip_uint64_t)ent->fts_statp->st_size; + if ((crc = compute_crc(ent->fts_accpath)) < 0) { + fts_close(fts); + return -1; + } + + a->entry[a->nentry].crc = (zip_uint32_t)crc; + } + a->nentry++; + break; + } + } + + if (fts_close(fts)) { + fprintf(stderr, "%s: error closing directory '%s': %s\n", progname, a->name, strerror(errno)); + return -1; + } + + return 0; +} +#endif + + +static int +list_zip(const char *name, struct archive *a) { + zip_t *za; + int err; + struct zip_stat st; + unsigned int i; + + if ((za = zip_open(name, check_consistency ? ZIP_CHECKCONS : 0, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", progname, name, zip_error_strerror(&error)); + zip_error_fini(&error); + return -1; + } + + a->za = za; + a->nentry = (zip_uint64_t)zip_get_num_entries(za, 0); + + if (a->nentry == 0) + a->entry = NULL; + else { + if ((a->nentry > SIZE_MAX / sizeof(a->entry[0])) || (a->entry = (struct entry *)malloc(sizeof(a->entry[0]) * a->nentry)) == NULL) { + fprintf(stderr, "%s: malloc failure\n", progname); + exit(1); + } + + for (i = 0; i < a->nentry; i++) { + zip_stat_index(za, i, 0, &st); + a->entry[i].name = strdup(st.name); + a->entry[i].size = st.size; + a->entry[i].crc = st.crc; + if (test_files) + test_file(za, i, name, st.name, st.size, st.crc); + if (paranoid) { + a->entry[i].comp_method = st.comp_method; + ef_read(za, i, a->entry + i); + a->entry[i].comment = zip_file_get_comment(za, i, &a->entry[i].comment_length, 0); + } + else { + a->entry[i].comp_method = 0; + a->entry[i].n_extra_fields = 0; + } + } + + if (paranoid) { + int length; + a->comment = zip_get_archive_comment(za, &length, 0); + a->comment_length = (size_t)length; + } + else { + a->comment = NULL; + a->comment_length = 0; + } + } + + return 0; +} + + +static int +comment_compare(const char *c1, size_t l1, const char *c2, size_t l2) { + if (l1 != l2) + return 1; + + if (l1 == 0) + return 0; + + if (c1 == NULL || c2 == NULL) + return c1 == c2; + + return memcmp(c1, c2, (size_t)l2); +} + + +static int compare_list(char *const name[2], const void *list[2], const zip_uint64_t list_length[2], int element_size, int (*cmp)(const void *a, const void *b), int (*ignore)(const void *list, int last, const void *other), int (*check)(char *const name[2], const void *a, const void *b), void (*print)(char side, const void *element), void (*start_file)(const void *element)) { + unsigned int i[2]; + int j; + int diff; + +#define INC(k) (i[k]++, list[k] = ((const char *)list[k]) + element_size) +#define PRINT(k) \ + do { \ + if (ignore && ignore(list[k], i[k] >= list_length[k] - 1, i[1-k] < list_length[1-k] ? list[1-k] : NULL)) { \ + break; \ + } \ + print((k) ? '+' : '-', list[k]); \ + (k) ? plus_count++ : minus_count++; \ + diff = 1; \ + } while (0) + + i[0] = i[1] = 0; + diff = 0; + while (i[0] < list_length[0] && i[1] < list_length[1]) { + int c = cmp(list[0], list[1]); + + if (c == 0) { + if (check) { + if (start_file) { + start_file(list[0]); + } + diff |= check(name, list[0], list[1]); + if (start_file) { + diff_output_end_file(&output); + } + } + INC(0); + INC(1); + } + else if (c < 0) { + PRINT(0); + INC(0); + } + else { + PRINT(1); + INC(1); + } + } + + for (j = 0; j < 2; j++) { + while (i[j] < list_length[j]) { + PRINT(j); + INC(j); + } + } + + return diff; +} + + +static int +ef_read(zip_t *za, zip_uint64_t idx, struct entry *e) { + zip_int16_t n_local, n_central; + zip_uint16_t i; + + if ((n_local = zip_file_extra_fields_count(za, idx, ZIP_FL_LOCAL)) < 0 || (n_central = zip_file_extra_fields_count(za, idx, ZIP_FL_CENTRAL)) < 0) { + return -1; + } + + e->n_extra_fields = (zip_uint16_t)(n_local + n_central); + + if ((e->extra_fields = (struct ef *)malloc(sizeof(e->extra_fields[0]) * e->n_extra_fields)) == NULL) + return -1; + + for (i = 0; i < n_local; i++) { + e->extra_fields[i].name = e->name; + e->extra_fields[i].data = zip_file_extra_field_get(za, idx, i, &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_LOCAL); + if (e->extra_fields[i].data == NULL) + return -1; + e->extra_fields[i].flags = ZIP_FL_LOCAL; + } + for (; i < e->n_extra_fields; i++) { + e->extra_fields[i].name = e->name; + e->extra_fields[i].data = zip_file_extra_field_get(za, idx, (zip_uint16_t)(i - n_local), &e->extra_fields[i].id, &e->extra_fields[i].size, ZIP_FL_CENTRAL); + if (e->extra_fields[i].data == NULL) + return -1; + e->extra_fields[i].flags = ZIP_FL_CENTRAL; + } + + qsort(e->extra_fields, e->n_extra_fields, sizeof(e->extra_fields[0]), ef_order); + + return 0; +} + + +static int +ef_compare(char *const name[2], const struct entry *e1, const struct entry *e2) { + struct ef *ef[2]; + zip_uint64_t n[2]; + + ef[0] = e1->extra_fields; + ef[1] = e2->extra_fields; + n[0] = e1->n_extra_fields; + n[1] = e2->n_extra_fields; + + return compare_list(name, (const void **)ef, n, sizeof(struct ef), ef_order, NULL, NULL, ef_print, NULL); +} + + +static int +ef_order(const void *ap, const void *bp) { + const struct ef *a, *b; + + a = (struct ef *)ap; + b = (struct ef *)bp; + + if (a->flags != b->flags) + return a->flags - b->flags; + if (a->id != b->id) + return a->id - b->id; + if (a->size != b->size) + return a->size - b->size; + return memcmp(a->data, b->data, a->size); +} + + +static void +ef_print(char side, const void *p) { + const struct ef *ef = (struct ef *)p; + + diff_output_data(&output, side, ef->data, ef->size, " %s extra field %s", ef->flags == ZIP_FL_LOCAL ? "local" : "central", map_enum(extra_fields, ef->id)); +} + + +static int +entry_cmp(const void *p1, const void *p2) { + const struct entry *e1, *e2; + int c; + + e1 = (struct entry *)p1; + e2 = (struct entry *)p2; + + if ((c = (ignore_case ? strcasecmp : strcmp)(e1->name, e2->name)) != 0) + return c; + if (e1->size != e2->size) { + if (e1->size > e2->size) + return 1; + else + return -1; + } + if (e1->crc != e2->crc) + return (int)e1->crc - (int)e2->crc; + + return 0; +} + + +static int +entry_ignore(const void *p, int last, const void *o) { + const struct entry *e = (const struct entry *)p; + const struct entry *other = (const struct entry *)o; + + size_t length = strlen(e[0].name); + + if (length == 0 || e[0].name[length - 1] != '/') { + /* not a directory */ + return 0; + } + + if (other != NULL && strlen(other->name) > length && strncmp(other->name, e[0].name, length) == 0) { + /* not empty in other archive */ + return 1; + } + + if (last || (strlen(e[1].name) < length || strncmp(e[0].name, e[1].name, length) != 0)) { + /* empty in this archive */ + return 0; + } + + /* not empty in this archive */ + return 1; +} + + +static int +entry_paranoia_checks(char *const name[2], const void *p1, const void *p2) { + const struct entry *e1, *e2; + int ret; + + e1 = (struct entry *)p1; + e2 = (struct entry *)p2; + + ret = 0; + + if (e1->comp_method != e2->comp_method) { + diff_output(&output, '-', " compression method %s", map_enum(comp_methods, e1->comp_method)); + diff_output(&output, '+', " compression method %s", map_enum(comp_methods, e2->comp_method)); + ret = 1; + } + + if (ef_compare(name, e1, e2) != 0) { + ret = 1; + } + + if (comment_compare(e1->comment, e1->comment_length, e2->comment, e2->comment_length) != 0) { + diff_output_data(&output, '-', (const zip_uint8_t *)e1->comment, e1->comment_length, " comment"); + diff_output_data(&output, '+', (const zip_uint8_t *)e2->comment, e2->comment_length, " comment"); + ret = 1; + } + + return ret; +} + + +static void entry_print(char side, const void *p) { + const struct entry *e = (struct entry *)p; + + diff_output_file(&output, side, e->name, e->size, e->crc); +} + + +static void entry_start_file(const void *p) { + const struct entry *e = (struct entry *)p; + + diff_output_start_file(&output, e->name, e->size, e->crc); +} + + +static int +test_file(zip_t *za, zip_uint64_t idx, const char *zipname, const char *filename, zip_uint64_t size, zip_uint32_t crc) { + zip_file_t *zf; + char buf[8192]; + zip_uint64_t nsize; + zip_int64_t n; + zip_uint32_t ncrc; + + if ((zf = zip_fopen_index(za, idx, 0)) == NULL) { + fprintf(stderr, "%s: %s: cannot open file %s (index %" PRIu64 "): %s\n", progname, zipname, filename, idx, zip_strerror(za)); + return -1; + } + + ncrc = (zip_uint32_t)crc32(0, NULL, 0); + nsize = 0; + + while ((n = zip_fread(zf, buf, sizeof(buf))) > 0) { + nsize += (zip_uint64_t)n; + ncrc = (zip_uint32_t)crc32(ncrc, (const Bytef *)buf, (unsigned int)n); + } + + if (n < 0) { + fprintf(stderr, "%s: %s: error reading file %s (index %" PRIu64 "): %s\n", progname, zipname, filename, idx, zip_file_strerror(zf)); + zip_fclose(zf); + return -1; + } + + zip_fclose(zf); + + if (nsize != size) { + fprintf(stderr, "%s: %s: file %s (index %" PRIu64 "): unexpected length %" PRId64 " (should be %" PRId64 ")\n", progname, zipname, filename, idx, nsize, size); + return -2; + } + if (ncrc != crc) { + fprintf(stderr, "%s: %s: file %s (index %" PRIu64 "): unexpected length %x (should be %x)\n", progname, zipname, filename, idx, ncrc, crc); + return -2; + } + + return 0; +} + + +static const char *map_enum(const enum_map_t *map, uint32_t value) { + static char unknown[16]; + size_t i = 0; + + while (map[i].value < UINT32_MAX) { + if (map[i].value == value) { + return map[i].name; + } + i++; + } + + snprintf(unknown, sizeof(unknown), "unknown (%u)", value); + unknown[sizeof(unknown) - 1] = '\0'; + + return unknown; +} diff --git a/deps/libzip/src/zipmerge.c b/deps/libzip/src/zipmerge.c new file mode 100644 index 00000000000000..dcf96bd95579eb --- /dev/null +++ b/deps/libzip/src/zipmerge.c @@ -0,0 +1,336 @@ +/* + zipmerge.c -- merge zip archives + Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include +#include +#include +#include +#include + +#include "config.h" + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif + +#include "zip.h" + +char *progname; + +#define PROGRAM "zipmerge" + +#define USAGE "usage: %s [-DhIikSsV] target-zip zip...\n" + +char help_head[] = PROGRAM " (" PACKAGE ") by Dieter Baron and Thomas Klausner\n\n"; + +char help[] = "\n\ + -h display this help message\n\ + -V display version number\n\ + -D ignore directory component in file names\n\ + -I ignore case in file names\n\ + -i ask before overwriting files\n\ + -k don't compress when adding uncompressed files\n\ + -S don't overwrite identical files\n\ + -s overwrite identical files without asking\n\ +\n\ +Report bugs to .\n"; + +char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\ +Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner\n\ +" PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n"; + +#define OPTIONS "hVDiIksS" + +#define CONFIRM_ALL_YES 0x001 +#define CONFIRM_ALL_NO 0x002 +#define CONFIRM_SAME_YES 0x010 +#define CONFIRM_SAME_NO 0x020 + +int confirm; +zip_flags_t name_flags; +int keep_stored; + +static int confirm_replace(zip_t *, const char *, zip_uint64_t, zip_t *, const char *, zip_uint64_t); +static void copy_extra_fields(zip_t *destination_archive, zip_uint64_t destination_index, zip_t *source_archive, zip_uint64_t source_index, zip_flags_t flags); +static int copy_file(zip_t *destination_archive, zip_int64_t destination_index, zip_t *source_archive, zip_uint64_t source_index, const char* name); +static zip_t *merge_zip(zip_t *, const char *, const char *); + + +int +main(int argc, char *argv[]) { + zip_t *za; + zip_t **zs; + int c, err; + unsigned int i, n; + char *tname; + + progname = argv[0]; + + confirm = CONFIRM_ALL_YES; + name_flags = 0; + keep_stored = 0; + + while ((c = getopt(argc, argv, OPTIONS)) != -1) { + switch (c) { + case 'D': + name_flags |= ZIP_FL_NODIR; + break; + case 'I': + name_flags |= ZIP_FL_NOCASE; + break; + case 'i': + confirm &= ~CONFIRM_ALL_YES; + break; + case 'k': + keep_stored = 1; + break; + case 'S': + confirm &= ~CONFIRM_SAME_YES; + confirm |= CONFIRM_SAME_NO; + break; + case 's': + confirm &= ~CONFIRM_SAME_NO; + confirm |= CONFIRM_SAME_YES; + break; + + case 'h': + fputs(help_head, stdout); + printf(USAGE, progname); + fputs(help, stdout); + exit(0); + case 'V': + fputs(version_string, stdout); + exit(0); + + default: + fprintf(stderr, USAGE, progname); + exit(2); + } + } + + if (argc < optind + 2) { + fprintf(stderr, USAGE, progname); + exit(2); + } + + tname = argv[optind++]; + argv += optind; + + n = (unsigned int)(argc - optind); + if ((zs = (zip_t **)malloc(sizeof(zs[0]) * n)) == NULL) { + fprintf(stderr, "%s: out of memory\n", progname); + exit(1); + } + + if ((za = zip_open(tname, ZIP_CREATE, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: can't open zip archive '%s': %s\n", progname, tname, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + for (i = 0; i < n; i++) { + if ((zs[i] = merge_zip(za, tname, argv[i])) == NULL) + exit(1); + } + + if (zip_close(za) < 0) { + fprintf(stderr, "%s: cannot write zip archive '%s': %s\n", progname, tname, zip_strerror(za)); + exit(1); + } + + for (i = 0; i < n; i++) + zip_close(zs[i]); + + exit(0); +} + + +static int +confirm_replace(zip_t *za, const char *tname, zip_uint64_t it, zip_t *zs, const char *sname, zip_uint64_t is) { + char line[1024]; + struct zip_stat st, ss; + + if (confirm & CONFIRM_ALL_YES) + return 1; + else if (confirm & CONFIRM_ALL_NO) + return 0; + + if (zip_stat_index(za, it, ZIP_FL_UNCHANGED, &st) < 0) { + fprintf(stderr, "%s: cannot stat file %" PRIu64 " in '%s': %s\n", progname, it, tname, zip_strerror(za)); + return -1; + } + if (zip_stat_index(zs, is, 0, &ss) < 0) { + fprintf(stderr, "%s: cannot stat file %" PRIu64 " in '%s': %s\n", progname, is, sname, zip_strerror(zs)); + return -1; + } + + if (st.size == ss.size && st.crc == ss.crc) { + if (confirm & CONFIRM_SAME_YES) + return 1; + else if (confirm & CONFIRM_SAME_NO) + return 0; + } + + printf("replace '%s' (%" PRIu64 " / %08x) in `%s'\n" + " with '%s' (%" PRIu64 " / %08x) from `%s'? ", + st.name, st.size, st.crc, tname, ss.name, ss.size, ss.crc, sname); + fflush(stdout); + + if (fgets(line, sizeof(line), stdin) == NULL) { + fprintf(stderr, "%s: read error from stdin: %s\n", progname, strerror(errno)); + return -1; + } + + if (tolower((unsigned char)line[0]) == 'y') + return 1; + + return 0; +} + + +static zip_t * +merge_zip(zip_t *za, const char *tname, const char *sname) { + zip_t *zs; + zip_int64_t ret, idx; + zip_uint64_t i; + int err; + const char *fname; + + if ((zs = zip_open(sname, 0, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: can't open zip archive '%s': %s\n", progname, sname, zip_error_strerror(&error)); + zip_error_fini(&error); + return NULL; + } + + ret = zip_get_num_entries(zs, 0); + if (ret < 0) { + fprintf(stderr, "%s: cannot get number of entries for '%s': %s\n", progname, sname, zip_strerror(za)); + return NULL; + } + for (i = 0; i < (zip_uint64_t)ret; i++) { + fname = zip_get_name(zs, i, 0); + + if ((idx = zip_name_locate(za, fname, name_flags)) >= 0) { + switch (confirm_replace(za, tname, (zip_uint64_t)idx, zs, sname, i)) { + case 0: + break; + + case 1: + if (copy_file(za, idx, zs, i, NULL) < 0) { + fprintf(stderr, "%s: cannot replace '%s' in `%s': %s\n", progname, fname, tname, zip_strerror(za)); + zip_close(zs); + return NULL; + } + break; + + case -1: + zip_close(zs); + return NULL; + + default: + fprintf(stderr, + "%s: internal error: " + "unexpected return code from confirm (%d)\n", + progname, err); + zip_close(zs); + return NULL; + } + } + else { + if (copy_file(za, -1, zs, i, fname) < 0) { + fprintf(stderr, "%s: cannot add '%s' to `%s': %s\n", progname, fname, tname, zip_strerror(za)); + zip_close(zs); + return NULL; + } + } + } + + return zs; +} + + +static int copy_file(zip_t *destination_archive, zip_int64_t destination_index, zip_t *source_archive, zip_uint64_t source_index, const char* name) { + zip_source_t *source = zip_source_zip(destination_archive, source_archive, source_index, 0, 0, 0); + + if (source == NULL) { + return -1; + } + + if (destination_index >= 0) { + if (zip_replace(destination_archive, (zip_uint64_t)destination_index, source) < 0) { + zip_source_free(source); + return -1; + } + } + else { + destination_index = zip_file_add(destination_archive, name, source, 0); + if (destination_index < 0) { + zip_source_free(source); + return -1; + } + } + + copy_extra_fields(destination_archive, (zip_uint64_t)destination_index, source_archive, source_index, ZIP_FL_CENTRAL); + copy_extra_fields(destination_archive, (zip_uint64_t)destination_index, source_archive, source_index, ZIP_FL_LOCAL); + if (keep_stored) { + zip_stat_t st; + if (zip_stat_index(source_archive, source_index, 0, &st) == 0 && (st.valid & ZIP_STAT_COMP_METHOD) && st.comp_method == ZIP_CM_STORE) { + zip_set_file_compression(destination_archive, destination_index, ZIP_CM_STORE, 0); + } + } + + return 0; +} + + +static void copy_extra_fields(zip_t *destination_archive, zip_uint64_t destination_index, zip_t *source_archive, zip_uint64_t source_index, zip_flags_t flags) { + zip_int16_t n; + zip_uint16_t i, id, length; + const zip_uint8_t *data; + + if ((n = zip_file_extra_fields_count(source_archive, source_index, flags)) < 0) { + return; + } + + for (i = 0; i < n; i++) { + if ((data = zip_file_extra_field_get(source_archive, source_index, i, &id, &length, flags)) == NULL) { + continue; + } + zip_file_extra_field_set(destination_archive, destination_index, id, ZIP_EXTRA_FIELD_NEW, data, length, flags); + } +} diff --git a/deps/libzip/src/ziptool.c b/deps/libzip/src/ziptool.c new file mode 100644 index 00000000000000..b9121cb66ffe8a --- /dev/null +++ b/deps/libzip/src/ziptool.c @@ -0,0 +1,1029 @@ +/* + ziptool.c -- tool for modifying zip archive in multiple ways + Copyright (C) 2012-2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "config.h" + +#include "compat.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef _WIN32 +/* WIN32 needs for _O_BINARY */ +#include +#ifndef STDIN_FILENO +#define STDIN_FILENO _fileno(stdin) +#endif +#endif + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif +extern int optopt; + +#include "zip.h" + +typedef struct dispatch_table_s { + const char *cmdline_name; + int argument_count; + const char *arg_names; + const char *description; + int (*function)(char *argv[]); +} dispatch_table_t; + +static zip_flags_t get_flags(const char *arg); +static zip_int32_t get_compression_method(const char *arg); +static zip_uint16_t get_encryption_method(const char *arg); +static void hexdump(const zip_uint8_t *data, zip_uint16_t len); +int ziptool_post_close(const char *archive); + +#ifndef FOR_REGRESS +#define OPTIONS_REGRESS "" +#define USAGE_REGRESS "" +#endif + +zip_t *za, *z_in[16]; +unsigned int z_in_count; +zip_flags_t stat_flags; + +static int +cat_impl(zip_uint64_t idx, zip_uint64_t start, zip_uint64_t len) { + zip_error_t error; + zip_source_t *src; + zip_int64_t n; + char buf[8192]; + +#ifdef _WIN32 + /* Need to set stdout to binary mode for Windows */ + setmode(fileno(stdout), _O_BINARY); +#endif + zip_error_init(&error); + /* we can't pass 0 as a len to zip_source_zip_create because it + will try to give us compressed data */ + if (len == 0) { + struct zip_stat sb; + + if (zip_stat_index(za, idx, stat_flags, &sb) < 0) { + fprintf(stderr, "zip_stat_index failed on '%" PRIu64 "' failed: %s\n", idx, zip_strerror(za)); + return -1; + } + + if (!(sb.valid & ZIP_STAT_SIZE)) { + fprintf(stderr, "can't cat file at index '%" PRIu64 "' with unknown size\n", idx); + return -1; + } + len = sb.size; + } + if ((src = zip_source_zip_create(za, idx, 0, start, len, &error)) == NULL) { + fprintf(stderr, "can't open file at index '%" PRIu64 "': %s\n", idx, zip_error_strerror(&error)); + zip_error_fini(&error); + return -1; + } + zip_error_fini(&error); + + if (zip_source_open(src) < 0) { + fprintf(stderr, "can't open file at index '%" PRIu64 "': %s\n", idx, zip_error_strerror(zip_source_error(src))); + zip_source_free(src); + return -1; + } + while ((n = zip_source_read(src, buf, sizeof(buf))) > 0) { + if (fwrite(buf, (size_t)n, 1, stdout) != 1) { + fprintf(stderr, "can't write file contents to stdout: %s\n", strerror(errno)); + zip_source_free(src); + return -1; + } + } + if (n == -1) { + fprintf(stderr, "can't read file at index '%" PRIu64 "': %s\n", idx, zip_error_strerror(zip_source_error(src))); + zip_source_free(src); + return -1; + } + if (zip_source_close(src) < 0) { + fprintf(stderr, "can't close file at index '%" PRIu64 "': %s\n", idx, zip_error_strerror(zip_source_error(src))); + zip_source_free(src); + return -1; + } + zip_source_free(src); + + return 0; +} + +static int +add(char *argv[]) { + zip_source_t *zs; + + if ((zs = zip_source_buffer(za, argv[1], strlen(argv[1]), 0)) == NULL) { + fprintf(stderr, "can't create zip_source from buffer: %s\n", zip_strerror(za)); + return -1; + } + + if (zip_add(za, argv[0], zs) == -1) { + zip_source_free(zs); + fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +add_dir(char *argv[]) { + /* add directory */ + if (zip_add_dir(za, argv[0]) < 0) { + fprintf(stderr, "can't add directory '%s': %s\n", argv[0], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +add_file(char *argv[]) { + zip_source_t *zs; + zip_uint64_t start = strtoull(argv[2], NULL, 10); + zip_int64_t len = strtoll(argv[3], NULL, 10); + + if (strcmp(argv[1], "/dev/stdin") == 0) { + if ((zs = zip_source_filep(za, stdin, start, len)) == NULL) { + fprintf(stderr, "can't create zip_source from stdin: %s\n", zip_strerror(za)); + return -1; + } + } + else { + if ((zs = zip_source_file(za, argv[1], start, len)) == NULL) { + fprintf(stderr, "can't create zip_source from file: %s\n", zip_strerror(za)); + return -1; + } + } + + if (zip_add(za, argv[0], zs) == -1) { + zip_source_free(zs); + fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +add_from_zip(char *argv[]) { + zip_uint64_t idx, start; + zip_int64_t len; + int err; + zip_source_t *zs; + /* add from another zip file */ + idx = strtoull(argv[2], NULL, 10); + start = strtoull(argv[3], NULL, 10); + len = strtoll(argv[4], NULL, 10); + if ((z_in[z_in_count] = zip_open(argv[1], ZIP_CHECKCONS, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "can't open zip archive '%s': %s\n", argv[1], zip_error_strerror(&error)); + zip_error_fini(&error); + return -1; + } + if ((zs = zip_source_zip(za, z_in[z_in_count], idx, 0, start, len)) == NULL) { + fprintf(stderr, "error creating file source from '%s' index '%" PRIu64 "': %s\n", argv[1], idx, zip_strerror(za)); + zip_close(z_in[z_in_count]); + return -1; + } + if (zip_add(za, argv[0], zs) == -1) { + fprintf(stderr, "can't add file '%s': %s\n", argv[0], zip_strerror(za)); + zip_source_free(zs); + zip_close(z_in[z_in_count]); + return -1; + } + z_in_count++; + return 0; +} + +static int +cat(char *argv[]) { + /* output file contents to stdout */ + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + + return cat_impl(idx, 0, 0); +} + +static int +cat_partial(char *argv[]) { + /* output partial file contents to stdout */ + zip_uint64_t idx; + zip_uint64_t start; + zip_uint64_t len; + + idx = strtoull(argv[0], NULL, 10); + start = strtoull(argv[1], NULL, 10); + len = strtoull(argv[2], NULL, 10); + + return cat_impl(idx, start, len); +} + +static int +count_extra(char *argv[]) { + zip_int16_t count; + zip_uint64_t idx; + zip_flags_t ceflags = 0; + idx = strtoull(argv[0], NULL, 10); + ceflags = get_flags(argv[1]); + if ((count = zip_file_extra_fields_count(za, idx, ceflags)) < 0) { + fprintf(stderr, "can't get extra field count for file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za)); + return -1; + } + else { + printf("Extra field count: %d\n", count); + } + return 0; +} + +static int +count_extra_by_id(char *argv[]) { + zip_int16_t count; + zip_uint16_t eid; + zip_flags_t ceflags = 0; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + eid = (zip_uint16_t)strtoull(argv[1], NULL, 10); + ceflags = get_flags(argv[2]); + if ((count = zip_file_extra_fields_count_by_id(za, idx, eid, ceflags)) < 0) { + fprintf(stderr, "can't get extra field count for file at index '%" PRIu64 "' and for id '%d': %s\n", idx, eid, zip_strerror(za)); + return -1; + } + else { + printf("Extra field count: %d\n", count); + } + return 0; +} + +static int delete (char *argv[]) { + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + if (zip_delete(za, idx) < 0) { + fprintf(stderr, "can't delete file at index '%" PRIu64 "': %s\n", idx, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +delete_extra(char *argv[]) { + zip_flags_t geflags; + zip_uint16_t eid; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + eid = (zip_uint16_t)strtoull(argv[1], NULL, 10); + geflags = get_flags(argv[2]); + if ((zip_file_extra_field_delete(za, idx, eid, geflags)) < 0) { + fprintf(stderr, "can't delete extra field data for file at index '%" PRIu64 "', extra field id '%d': %s\n", idx, eid, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +delete_extra_by_id(char *argv[]) { + zip_flags_t geflags; + zip_uint16_t eid, eidx; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + eid = (zip_uint16_t)strtoull(argv[1], NULL, 10); + eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10); + geflags = get_flags(argv[3]); + if ((zip_file_extra_field_delete_by_id(za, idx, eid, eidx, geflags)) < 0) { + fprintf(stderr, "can't delete extra field data for file at index '%" PRIu64 "', extra field id '%d', extra field idx '%d': %s\n", idx, eid, eidx, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +get_archive_comment(char *argv[]) { + const char *comment; + int len; + /* get archive comment */ + if ((comment = zip_get_archive_comment(za, &len, 0)) == NULL) + printf("No archive comment\n"); + else + printf("Archive comment: %.*s\n", len, comment); + return 0; +} + +static int +get_extra(char *argv[]) { + zip_flags_t geflags; + zip_uint16_t id, eidx, eflen; + const zip_uint8_t *efdata; + zip_uint64_t idx; + /* get extra field data */ + idx = strtoull(argv[0], NULL, 10); + eidx = (zip_uint16_t)strtoull(argv[1], NULL, 10); + geflags = get_flags(argv[2]); + if ((efdata = zip_file_extra_field_get(za, idx, eidx, &id, &eflen, geflags)) == NULL) { + fprintf(stderr, "can't get extra field data for file at index %" PRIu64 ", extra field %d, flags %u: %s\n", idx, eidx, geflags, zip_strerror(za)); + return -1; + } + printf("Extra field 0x%04x: len %d", id, eflen); + if (eflen > 0) { + printf(", data "); + hexdump(efdata, eflen); + } + printf("\n"); + return 0; +} + +static int +get_extra_by_id(char *argv[]) { + zip_flags_t geflags; + zip_uint16_t eid, eidx, eflen; + const zip_uint8_t *efdata; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + eid = (zip_uint16_t)strtoull(argv[1], NULL, 10); + eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10); + geflags = get_flags(argv[3]); + if ((efdata = zip_file_extra_field_get_by_id(za, idx, eid, eidx, &eflen, geflags)) == NULL) { + fprintf(stderr, "can't get extra field data for file at index %" PRIu64 ", extra field id %d, ef index %d, flags %u: %s\n", idx, eid, eidx, geflags, zip_strerror(za)); + return -1; + } + printf("Extra field 0x%04x: len %d", eid, eflen); + if (eflen > 0) { + printf(", data "); + hexdump(efdata, eflen); + } + printf("\n"); + return 0; +} + +static int +get_file_comment(char *argv[]) { + const char *comment; + int len; + zip_uint64_t idx; + /* get file comment */ + idx = strtoull(argv[0], NULL, 10); + if ((comment = zip_get_file_comment(za, idx, &len, 0)) == NULL) { + fprintf(stderr, "can't get comment for '%s': %s\n", zip_get_name(za, idx, 0), zip_strerror(za)); + return -1; + } + else if (len == 0) + printf("No comment for '%s'\n", zip_get_name(za, idx, 0)); + else + printf("File comment for '%s': %.*s\n", zip_get_name(za, idx, 0), len, comment); + return 0; +} + +static int +get_num_entries(char *argv[]) { + zip_int64_t count; + zip_flags_t flags; + /* get number of entries in archive */ + flags = get_flags(argv[0]); + count = zip_get_num_entries(za, flags); + printf("%" PRId64 " entr%s in archive\n", count, count == 1 ? "y" : "ies"); + return 0; +} + +static int +name_locate(char *argv[]) { + zip_flags_t flags; + zip_int64_t idx; + flags = get_flags(argv[1]); + + if ((idx = zip_name_locate(za, argv[0], flags)) < 0) { + fprintf(stderr, "can't find entry with name '%s' using flags '%s'\n", argv[0], argv[1]); + } + else { + printf("name '%s' using flags '%s' found at index %" PRId64 "\n", argv[0], argv[1], idx); + } + + return 0; +} + +struct progress_userdata_s { + double percentage; + double limit; +}; + +struct progress_userdata_s progress_userdata; + +static void +progress_callback(zip_t *archive, double percentage, void *ud) { + printf("%.1f%% done\n", percentage * 100); + progress_userdata.percentage = percentage; +} + +static int +print_progress(char *argv[]) { + zip_register_progress_callback_with_state(za, 0.001, progress_callback, NULL, NULL); + return 0; +} + +static int +zrename(char *argv[]) { + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + if (zip_rename(za, idx, argv[1]) < 0) { + fprintf(stderr, "can't rename file at index '%" PRIu64 "' to '%s': %s\n", idx, argv[1], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +replace_file_contents(char *argv[]) { + /* replace file contents with data from command line */ + const char *content; + zip_source_t *s; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + content = argv[1]; + if ((s = zip_source_buffer(za, content, strlen(content), 0)) == NULL || zip_file_replace(za, idx, s, 0) < 0) { + zip_source_free(s); + fprintf(stderr, "error replacing file data: %s\n", zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_extra(char *argv[]) { + zip_flags_t geflags; + zip_uint16_t eid, eidx; + const zip_uint8_t *efdata; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + eid = (zip_uint16_t)strtoull(argv[1], NULL, 10); + eidx = (zip_uint16_t)strtoull(argv[2], NULL, 10); + geflags = get_flags(argv[3]); + efdata = (zip_uint8_t *)argv[4]; + if ((zip_file_extra_field_set(za, idx, eid, eidx, efdata, (zip_uint16_t)strlen((const char *)efdata), geflags)) < 0) { + fprintf(stderr, "can't set extra field data for file at index '%" PRIu64 "', extra field id '%d', index '%d': %s\n", idx, eid, eidx, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_archive_comment(char *argv[]) { + if (zip_set_archive_comment(za, argv[0], (zip_uint16_t)strlen(argv[0])) < 0) { + fprintf(stderr, "can't set archive comment to '%s': %s\n", argv[0], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_file_comment(char *argv[]) { + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + if (zip_file_set_comment(za, idx, argv[1], (zip_uint16_t)strlen(argv[1]), 0) < 0) { + fprintf(stderr, "can't set file comment at index '%" PRIu64 "' to '%s': %s\n", idx, argv[1], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_file_compression(char *argv[]) { + zip_int32_t method; + zip_uint32_t flags; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + method = get_compression_method(argv[1]); + flags = (zip_uint32_t)strtoull(argv[2], NULL, 10); + if (zip_set_file_compression(za, idx, method, flags) < 0) { + fprintf(stderr, "can't set file compression method at index '%" PRIu64 "' to '%s', flags '%" PRIu32 "': %s\n", idx, argv[1], flags, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_file_encryption(char *argv[]) { + zip_uint16_t method; + zip_uint64_t idx; + char *password; + idx = strtoull(argv[0], NULL, 10); + method = get_encryption_method(argv[1]); + password = argv[2]; + if (strlen(password) == 0) { + password = NULL; + } + if (zip_file_set_encryption(za, idx, method, password) < 0) { + fprintf(stderr, "can't set file encryption method at index '%" PRIu64 "' to '%s': %s\n", idx, argv[1], zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_file_dostime(char *argv[]) { + /* set file last modification time (mtime) directly */ + zip_uint16_t dostime, dosdate; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + dostime = (zip_uint16_t)strtoull(argv[1], NULL, 10); + dosdate = (zip_uint16_t)strtoull(argv[2], NULL, 10); + if (zip_file_set_dostime(za, idx, dostime, dosdate, 0) < 0) { + fprintf(stderr, "can't set file dostime at index '%" PRIu64 "' to '%d'/'%d': %s\n", idx, (int)dostime, (int)dosdate, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_file_mtime(char *argv[]) { + /* set file last modification time (mtime) */ + time_t mtime; + zip_uint64_t idx; + idx = strtoull(argv[0], NULL, 10); + mtime = (time_t)strtoull(argv[1], NULL, 10); + if (zip_file_set_mtime(za, idx, mtime, 0) < 0) { + fprintf(stderr, "can't set file mtime at index '%" PRIu64 "' to '%lld': %s\n", idx, (long long)mtime, zip_strerror(za)); + return -1; + } + return 0; +} + +static int +set_file_mtime_all(char *argv[]) { + /* set last modification time (mtime) for all files */ + time_t mtime; + zip_int64_t num_entries; + zip_uint64_t idx; + mtime = (time_t)strtoull(argv[0], NULL, 10); + + if ((num_entries = zip_get_num_entries(za, 0)) < 0) { + fprintf(stderr, "can't get number of entries: %s\n", zip_strerror(za)); + return -1; + } + for (idx = 0; idx < (zip_uint64_t)num_entries; idx++) { + if (zip_file_set_mtime(za, idx, mtime, 0) < 0) { + fprintf(stderr, "can't set file mtime at index '%" PRIu64 "' to '%lld': %s\n", idx, (long long)mtime, zip_strerror(za)); + return -1; + } + } + return 0; +} + +static int +set_password(char *argv[]) { + /* set default password */ + if (zip_set_default_password(za, argv[0]) < 0) { + fprintf(stderr, "can't set default password to '%s'\n", argv[0]); + return -1; + } + return 0; +} + +static int +zstat(char *argv[]) { + zip_uint64_t idx; + char buf[100]; + struct zip_stat sb; + idx = strtoull(argv[0], NULL, 10); + + if (zip_stat_index(za, idx, stat_flags, &sb) < 0) { + fprintf(stderr, "zip_stat_index failed on '%" PRIu64 "' failed: %s\n", idx, zip_strerror(za)); + return -1; + } + + if (sb.valid & ZIP_STAT_NAME) + printf("name: '%s'\n", sb.name); + if (sb.valid & ZIP_STAT_INDEX) + printf("index: '%" PRIu64 "'\n", sb.index); + if (sb.valid & ZIP_STAT_SIZE) + printf("size: '%" PRIu64 "'\n", sb.size); + if (sb.valid & ZIP_STAT_COMP_SIZE) + printf("compressed size: '%" PRIu64 "'\n", sb.comp_size); + if (sb.valid & ZIP_STAT_MTIME) { + struct tm *tpm; + struct tm tm; + tpm = zip_localtime(&sb.mtime, &tm); + if (tpm == NULL) { + printf("mtime: \n"); + } + else { + strftime(buf, sizeof(buf), "%a %b %d %Y %H:%M:%S", tpm); + printf("mtime: '%s'\n", buf); + } + } + if (sb.valid & ZIP_STAT_CRC) + printf("crc: '%0x'\n", sb.crc); + if (sb.valid & ZIP_STAT_COMP_METHOD) + printf("compression method: '%d'\n", sb.comp_method); + if (sb.valid & ZIP_STAT_ENCRYPTION_METHOD) + printf("encryption method: '%d'\n", sb.encryption_method); + if (sb.valid & ZIP_STAT_FLAGS) + printf("flags: '%ld'\n", (long)sb.flags); + printf("\n"); + + return 0; +} + +static zip_flags_t +get_flags(const char *arg) { + zip_flags_t flags = 0; + if (strchr(arg, 'C') != NULL) + flags |= ZIP_FL_NOCASE; + if (strchr(arg, 'c') != NULL) + flags |= ZIP_FL_CENTRAL; + if (strchr(arg, 'd') != NULL) + flags |= ZIP_FL_NODIR; + if (strchr(arg, 'l') != NULL) + flags |= ZIP_FL_LOCAL; + if (strchr(arg, 'u') != NULL) + flags |= ZIP_FL_UNCHANGED; + if (strchr(arg, '8') != NULL) + flags |= ZIP_FL_ENC_UTF_8; + if (strchr(arg, '4') != NULL) + flags |= ZIP_FL_ENC_CP437; + if (strchr(arg, 'r') != NULL) + flags |= ZIP_FL_ENC_RAW; + if (strchr(arg, 's') != NULL) + flags |= ZIP_FL_ENC_STRICT; + return flags; +} + +static zip_int32_t +get_compression_method(const char *arg) { + if (strcasecmp(arg, "default") == 0) + return ZIP_CM_DEFAULT; + else if (strcasecmp(arg, "store") == 0) + return ZIP_CM_STORE; + else if (strcasecmp(arg, "deflate") == 0) + return ZIP_CM_DEFLATE; +#if defined(HAVE_LIBBZ2) + else if (strcasecmp(arg, "bzip2") == 0) + return ZIP_CM_BZIP2; +#endif +#if defined(HAVE_LIBLZMA) + /* Disabled - because 7z isn't able to unpack ZIP+LZMA ZIP+LZMA2 + archives made this way - and vice versa. + + else if (strcasecmp(arg, "lzma2") == 0) + return ZIP_CM_LZMA2; + */ + else if (strcasecmp(arg, "lzma") == 0) + return ZIP_CM_LZMA; + else if (strcasecmp(arg, "xz") == 0) + return ZIP_CM_XZ; +#endif +#if defined(HAVE_LIBZSTD) + else if (strcasecmp(arg, "zstd") == 0) + return ZIP_CM_ZSTD; + +#endif + else if (strcasecmp(arg, "unknown") == 0) + return 100; + return 0; /* TODO: error handling */ +} + +static zip_uint16_t +get_encryption_method(const char *arg) { + if (strcasecmp(arg, "none") == 0) + return ZIP_EM_NONE; + else if (strcasecmp(arg, "PKWARE") == 0) + return ZIP_EM_TRAD_PKWARE; + else if (strcasecmp(arg, "AES-128") == 0) + return ZIP_EM_AES_128; + else if (strcasecmp(arg, "AES-192") == 0) + return ZIP_EM_AES_192; + else if (strcasecmp(arg, "AES-256") == 0) + return ZIP_EM_AES_256; + else if (strcasecmp(arg, "unknown") == 0) + return 100; + return (zip_uint16_t)-1; /* TODO: error handling */ +} + +static void +hexdump(const zip_uint8_t *data, zip_uint16_t len) { + zip_uint16_t i; + + if (len <= 0) + return; + + printf("0x"); + + for (i = 0; i < len; i++) + printf("%02x", data[i]); +} + + +static zip_t * +read_from_file(const char *archive, int flags, zip_error_t *error, zip_uint64_t offset, zip_uint64_t length) { + zip_t *zaa; + zip_source_t *source; + int err; + + if (offset == 0 && length == 0) { + if (strcmp(archive, "/dev/stdin") == 0) { + zaa = zip_fdopen(STDIN_FILENO, flags & ~ZIP_CREATE, &err); + } + else { + zaa = zip_open(archive, flags, &err); + } + if (zaa == NULL) { + zip_error_set(error, err, errno); + return NULL; + } + } + else { + if (length > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if ((source = zip_source_file_create(archive, offset, (zip_int64_t)length, error)) == NULL || (zaa = zip_open_from_source(source, flags, error)) == NULL) { + zip_source_free(source); + return NULL; + } + } + + return zaa; +} + +dispatch_table_t dispatch_table[] = {{"add", 2, "name content", "add file called name using content", add}, + {"add_dir", 1, "name", "add directory", add_dir}, + {"add_file", 4, "name file_to_add offset len", "add file to archive, len bytes starting from offset", add_file}, + {"add_from_zip", 5, "name archivename index offset len", "add file from another archive, len bytes starting from offset", add_from_zip}, + {"cat", 1, "index", "output file contents to stdout", cat}, + {"cat_partial", 3, "index start length", "output partial file contents to stdout", cat_partial}, + {"count_extra", 2, "index flags", "show number of extra fields for archive entry", count_extra}, + {"count_extra_by_id", 3, "index extra_id flags", "show number of extra fields of type extra_id for archive entry", count_extra_by_id}, + {"delete", 1, "index", "remove entry", delete}, + {"delete_extra", 3, "index extra_idx flags", "remove extra field", delete_extra}, + {"delete_extra_by_id", 4, "index extra_id extra_index flags", "remove extra field of type extra_id", delete_extra_by_id}, + {"get_archive_comment", 0, "", "show archive comment", get_archive_comment}, + {"get_extra", 3, "index extra_index flags", "show extra field", get_extra}, + {"get_extra_by_id", 4, "index extra_id extra_index flags", "show extra field of type extra_id", get_extra_by_id}, + {"get_file_comment", 1, "index", "get file comment", get_file_comment}, + {"get_num_entries", 1, "flags", "get number of entries in archive", get_num_entries}, + {"name_locate", 2, "name flags", "find entry in archive", name_locate}, + {"print_progress", 0, "", "print progress during zip_close()", print_progress}, + {"rename", 2, "index name", "rename entry", zrename}, + {"replace_file_contents", 2, "index data", "replace entry with data", replace_file_contents}, + {"set_archive_comment", 1, "comment", "set archive comment", set_archive_comment}, + {"set_extra", 5, "index extra_id extra_index flags value", "set extra field", set_extra}, + {"set_file_comment", 2, "index comment", "set file comment", set_file_comment}, + {"set_file_compression", 3, "index method compression_flags", "set file compression method", set_file_compression}, + {"set_file_dostime", 3, "index time date", "set file modification time and date (DOS format)", set_file_dostime}, + {"set_file_encryption", 3, "index method password", "set file encryption method", set_file_encryption}, + {"set_file_mtime", 2, "index timestamp", "set file modification time", set_file_mtime}, + {"set_file_mtime_all", 1, "timestamp", "set file modification time for all files", set_file_mtime_all}, + {"set_password", 1, "password", "set default password for encryption", set_password}, + {"stat", 1, "index", "print information about entry", zstat} +#ifdef DISPATCH_REGRESS + , + DISPATCH_REGRESS +#endif +}; + +static int +dispatch(int argc, char *argv[]) { + unsigned int i; + for (i = 0; i < sizeof(dispatch_table) / sizeof(dispatch_table_t); i++) { + if (strcmp(dispatch_table[i].cmdline_name, argv[0]) == 0) { + argc--; + argv++; + /* 1 for the command, argument_count for the arguments */ + if (argc < dispatch_table[i].argument_count) { + fprintf(stderr, "not enough arguments for command '%s': %d available, %d needed\n", dispatch_table[i].cmdline_name, argc, dispatch_table[i].argument_count); + return -1; + } + if (dispatch_table[i].function(argv) == 0) + return 1 + dispatch_table[i].argument_count; + return -1; + } + } + + fprintf(stderr, "unknown command '%s'\n", argv[0]); + return -1; +} + + +static void +usage(const char *progname, const char *reason) { + unsigned int i; + FILE *out; + if (reason == NULL) + out = stdout; + else + out = stderr; + fprintf(out, "usage: %s [-ceghnrst]" USAGE_REGRESS " [-l len] [-o offset] archive command1 [args] [command2 [args] ...]\n", progname); + if (reason != NULL) { + fprintf(out, "%s\n", reason); + exit(1); + } + + fprintf(out, "\nSupported options are:\n" + "\t-c\t\tcheck consistency\n" + "\t-e\t\terror if archive already exists (only useful with -n)\n" +#ifdef FOR_REGRESS + "\t-F size\t\tfragment size for in memory archive\n" +#endif + "\t-g\t\tguess file name encoding (for stat)\n" +#ifdef FOR_REGRESS + "\t-H\t\twrite files with holes compactly\n" +#endif + "\t-h\t\tdisplay this usage\n" + "\t-l len\t\tonly use len bytes of file\n" +#ifdef FOR_REGRESS + "\t-m\t\tread archive into memory, and modify there; write out at end\n" +#endif + "\t-n\t\tcreate archive if it doesn't exist\n" + "\t-o offset\tstart reading file at offset\n" + "\t-r\t\tprint raw file name encoding without translation (for stat)\n" + "\t-s\t\tfollow file name convention strictly (for stat)\n" + "\t-t\t\tdisregard current archive contents, if any\n"); + fprintf(out, "\nSupported commands and arguments are:\n"); + for (i = 0; i < sizeof(dispatch_table) / sizeof(dispatch_table_t); i++) { + fprintf(out, "\t%s %s\n\t %s\n\n", dispatch_table[i].cmdline_name, dispatch_table[i].arg_names, dispatch_table[i].description); + } + fprintf(out, "\nSupported flags are:\n" + "\t0\t(no flags)\n" + "\t4\tZIP_FL_ENC_CP437\n" + "\t8\tZIP_FL_ENC_UTF_8\n" + "\tC\tZIP_FL_NOCASE\n" + "\tc\tZIP_FL_CENTRAL\n" + "\td\tZIP_FL_NODIR\n" + "\tl\tZIP_FL_LOCAL\n" + "\tr\tZIP_FL_ENC_RAW\n" + "\ts\tZIP_FL_ENC_STRICT\n" + "\tu\tZIP_FL_UNCHANGED\n"); + fprintf(out, "\nSupported compression methods are:\n" + "\tdefault\n"); + if (zip_compression_method_supported(ZIP_CM_BZIP2, 1)) { + fprintf(out, "\tbzip2\n"); + } + fprintf(out, "\tdeflate\n" + "\tstore\n"); + if (zip_compression_method_supported(ZIP_CM_XZ, 1)) { + fprintf(out, "\txz\n"); + } + if (zip_compression_method_supported(ZIP_CM_ZSTD, 1)) { + fprintf(out, "\tzstd\n"); + } + fprintf(out, "\nSupported encryption methods are:\n" + "\tnone\n"); + if (zip_encryption_method_supported(ZIP_EM_AES_128, 1)) { + fprintf(out, "\tAES-128\n"); + } + if (zip_encryption_method_supported(ZIP_EM_AES_192, 1)) { + fprintf(out, "\tAES-192\n"); + } + if (zip_encryption_method_supported(ZIP_EM_AES_256, 1)) { + fprintf(out, "\tAES-256\n"); + } + fprintf(out, "\tPKWARE\n"); + fprintf(out, "\nThe index is zero-based.\n"); + exit(0); +} + +#ifndef FOR_REGRESS +#define ziptool_open read_from_file +int +ziptool_post_close(const char *archive) { + return 0; +} +#endif + +int +main(int argc, char *argv[]) { + const char *archive; + unsigned int i; + int c, arg, err, flags; + const char *prg; + zip_uint64_t len = 0, offset = 0; + zip_error_t error; + + flags = 0; + prg = argv[0]; + + while ((c = getopt(argc, argv, "ceghl:no:rst" OPTIONS_REGRESS)) != -1) { + switch (c) { + case 'c': + flags |= ZIP_CHECKCONS; + break; + case 'e': + flags |= ZIP_EXCL; + break; + case 'g': + stat_flags = ZIP_FL_ENC_GUESS; + break; + case 'h': + usage(prg, NULL); + break; + case 'l': + len = strtoull(optarg, NULL, 10); + break; + case 'n': + flags |= ZIP_CREATE; + break; + case 'o': + offset = strtoull(optarg, NULL, 10); + break; + case 'r': + stat_flags = ZIP_FL_ENC_RAW; + break; + case 's': + stat_flags = ZIP_FL_ENC_STRICT; + break; + case 't': + flags |= ZIP_TRUNCATE; + break; +#ifdef GETOPT_REGRESS + GETOPT_REGRESS +#endif + + default: { + char reason[128]; + snprintf(reason, sizeof(reason), "invalid option -%c", optopt); + usage(prg, reason); + } + } + } + + if (optind >= argc - 1) + usage(prg, "too few arguments"); + + arg = optind; + + archive = argv[arg++]; + + if (flags == 0) + flags = ZIP_CREATE; + + zip_error_init(&error); + za = ziptool_open(archive, flags, &error, offset, len); + if (za == NULL) { + fprintf(stderr, "can't open zip archive '%s': %s\n", archive, zip_error_strerror(&error)); + zip_error_fini(&error); + return 1; + } + zip_error_fini(&error); + + err = 0; + while (arg < argc) { + int ret; + ret = dispatch(argc - arg, argv + arg); + if (ret > 0) { + arg += ret; + } + else { + err = 1; + break; + } + } + +#ifdef PRECLOSE_REGRESS + PRECLOSE_REGRESS; +#endif + + if (zip_close(za) == -1) { + fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za)); + return 1; + } + if (ziptool_post_close(archive) < 0) { + err = 1; + } + + for (i = 0; i < z_in_count; i++) { + if (zip_close(z_in[i]) < 0) { + err = 1; + } + } + + return err; +} diff --git a/deps/libzip/vstudio/readme.txt b/deps/libzip/vstudio/readme.txt new file mode 100644 index 00000000000000..72b7546a527e36 --- /dev/null +++ b/deps/libzip/vstudio/readme.txt @@ -0,0 +1,77 @@ +Building libzip with Microsoft Visual C++ +========================================= +The script vsbuild.cmd can be used to build (and optionally test) libzip using +Microsoft Visual C++. + +Prerequisites +------------- +Windows Server 2003 or Windows Vista or later (tested with Windows 7 x64) +Microsoft Visual Studio (tested with VS2013 Premium) +CMake (tested with version 3.3.1) +Source code for zlib (tested with version 1.2.8) + +To run tests, you will also need: +Perl interpreter (tested with ActiveState ActivePerl 5.20.2 64-bit) +CPAN module IPC::Cmd (comes with ActivePerl) + +You'll also need to make sure all of the above (specifically: msbuild.exe, +cmake.exe and perl.exe) are in your PATH at the time of running the script. + +Unpacking zlib +-------------- +Because libzip depends on zlib, the vsbuild.cmd script takes care of building +zlib for you as well. Download the source code from http://zlib.org/ and extract +all the files and subdirectories from the "zlib-x.y.z" directory into +vstudio/zlib. + +Building libzip with Visual Studio 2013 for the impatient +--------------------------------------------------------- +1. Make sure all the prerequisites (see above) are installed and in your PATH. +2. Don't forget to unpack zlib (see "Unpacking zlib" above). +3. Open a Visual Studio Command Prompt in the "vstudio" directory (the directory + containing this file). +4. Enter the following command for a 32-bit x86 build: + vsbuild build "Visual Studio 12" v120 + or for a 64-bit x64 build: + vsbuild build "Visual Studio 12 Win64" v120 + +If you'd like to run the tests as well, use one of the following commands: +vsbuild build+test "Visual Studio 12" v120 +vsbuild build+test "Visual Studio 12 Win64" v120 + +Building libzip +--------------- +The script vsbuild.cmd has three modes of operation, with the following syntax: +vsbuild clean +vsbuild build +vsbuild build+test + +"vsbuild clean" deletes all output and intermediate files and directories +generated by the build process. + +"vsbuild build" just builds zlib and libzip and leaves the DLL files in the +following locations: +vstudio/zlib/installed/bin/zlib.dll +vstudio/zlib/installed/bin/zlibd.dll +build/lib/Debug/zip.dll +build/lib/Release/zip.dll + +"vsbuild build+test" builds zlib and libzip as above, then runs the libzip +regression test suite. + +The "build" and "build+test" commands require the following parameters: + +: The CMake generator to use for project files. This identifies the +version of Visual Studio you're using, and also allows you to specify whether +the 32-bit or 64-bit of the libraries should be built. +I've tested "Visual Studio 12" (VS2013 x86) and "Visual Studio 12 Win64" +(VS2013 x64) but other versions should work as well. Run "cmake --help" for a +list of generators. + +: Specifies the platform toolset to use. Normally, this will match the +version of Visual Studio (e.g. "v120" for Visual Studio 2013 aka Visual Studio +12). See the Visual Studio documentation for more information about platform +toolsets. + +Andrew Molyneux +andrew@molyneuxfamily.co.uk \ No newline at end of file diff --git a/deps/libzip/vstudio/vsbuild.cmd b/deps/libzip/vstudio/vsbuild.cmd new file mode 100644 index 00000000000000..4e2fe5a8cebcd1 --- /dev/null +++ b/deps/libzip/vstudio/vsbuild.cmd @@ -0,0 +1,185 @@ +@echo off +setlocal enableextensions enabledelayedexpansion + +rem --------------------------------------------------------------------------- +rem Check that required commands are in the PATH. +rem --------------------------------------------------------------------------- +set CHECK_CMD=cmake.exe +set CHECK_DESC=CMake +call :check_installed +set CHECK_CMD=msbuild.exe +set CHECK_DESC=MSBuild +call :check_installed + +rem --------------------------------------------------------------------------- +rem Parse command-line arguments. +rem %1: Command ("build" or "clean") +rem %2: Generator (e.g. "Visual Studio 12" for VS2013) +rem %3: Platform toolset (e.g. "v120_xp" for VS2013 toolset for Windows XP) +rem --------------------------------------------------------------------------- +if "%1"=="clean" ( + echo Cleaning + if exist zlib\installed rmdir /s /q zlib\installed + if errorlevel 1 goto exit_failure + if exist zlib\build rmdir /s /q zlib\build + if errorlevel 1 goto exit_failure + if exist ..\build rmdir /s /q ..\build + if errorlevel 1 goto exit_failure + if exist ..\regress\bigzero.zip del ..\regress\bigzero.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles.zip del ..\regress\manyfiles.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles-133000.zip del ..\regress\manyfiles-133000.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles-65536.zip del ..\regress\manyfiles-65536.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles-zip64-modulo.zip del ..\regress\manyfiles-zip64-modulo.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles-zip64.zip del ..\regress\manyfiles-zip64.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles-fewer.zip del ..\regress\manyfiles-fewer.zip + if errorlevel 1 goto exit_failure + if exist ..\regress\manyfiles-more.zip del ..\regress\manyfiles-more.zip + if errorlevel 1 goto exit_failure + echo Done + exit /b 0 +) else if "%1"=="build" ( + set CMAKE_GENERATOR=%2 + set CMAKE_TOOLSET=%3 + set LIBZIP_RUN_TESTS=false +) else if "%1"=="build+test" ( + set CMAKE_GENERATOR=%2 + set CMAKE_TOOLSET=%3 + set LIBZIP_RUN_TESTS=true +) else ( + echo Invalid command "%1" + exit /b 1 +) + +rem --------------------------------------------------------------------------- +rem If we're running tests, we'll also need a Perl interpreter. +rem --------------------------------------------------------------------------- +if "%LIBZIP_RUN_TESTS%"=="true" ( + set CHECK_CMD=perl.exe + set CHECK_DESC=a Perl interpreter (to run tests) + call :check_installed +) + +rem --------------------------------------------------------------------------- +rem Configure and build zlib. +rem --------------------------------------------------------------------------- +pushd zlib +for /f %%p in (".\installed") do set ZLIB_INSTALL_PATH=%%~fp +echo zlib will be "installed" to %ZLIB_INSTALL_PATH% +if not exist build ( + mkdir build + if errorlevel 1 popd & goto exit_failure +) +cd build +if errorlevel 1 popd & goto exit_failure +echo Configuring zlib +cmake .. -G %CMAKE_GENERATOR% -T %CMAKE_TOOLSET% -DCMAKE_INSTALL_PREFIX="%ZLIB_INSTALL_PATH%" +if errorlevel 1 popd & goto exit_failure +echo Building zlib +msbuild /P:Configuration=Debug INSTALL.vcxproj +if errorlevel 1 popd & goto exit_failure +msbuild /P:Configuration=Release INSTALL.vcxproj +if errorlevel 1 popd & goto exit_failure +popd + +rem --------------------------------------------------------------------------- +rem Prepare the build directory and run CMake to configure the project. +rem --------------------------------------------------------------------------- +pushd .. +if not exist build ( + echo Creating build directory + mkdir build + if errorlevel 1 popd & goto exit_failure +) +cd build +if errorlevel 1 popd & goto exit_failure +cmake .. -G %CMAKE_GENERATOR% -T %CMAKE_TOOLSET% -DCMAKE_PREFIX_PATH="%ZLIB_INSTALL_PATH%" +if errorlevel 1 popd & goto exit_failure + +rem --------------------------------------------------------------------------- +rem Build libzip. +rem --------------------------------------------------------------------------- +msbuild /P:Configuration=Debug ALL_BUILD.vcxproj +if errorlevel 1 popd & goto exit_failure +msbuild /P:Configuration=Release ALL_BUILD.vcxproj +if errorlevel 1 popd & goto exit_failure +popd + +rem --------------------------------------------------------------------------- +rem Copy DLLs so zipcmp/zipmerge can run. +rem --------------------------------------------------------------------------- +echo Copying DLLs +copy zlib\installed\bin\zlibd.dll ..\build\src\Debug +if errorlevel 1 goto exit_failure +copy zlib\installed\bin\zlib.dll ..\build\src\Release +if errorlevel 1 goto exit_failure +copy ..\build\lib\Release\zip.dll ..\build\src\Release +if errorlevel 1 goto exit_failure +copy ..\build\lib\Debug\zip.dll ..\build\src\Debug +if errorlevel 1 goto exit_failure + +rem --------------------------------------------------------------------------- +rem Run the tests, if required. +rem --------------------------------------------------------------------------- +if "%LIBZIP_RUN_TESTS%"=="true" ( + echo Copying libraries for tests + pushd ..\build\regress + copy ..\..\vstudio\zlib\installed\bin\zlib.dll . + if errorlevel 1 popd & goto exit_failure + copy ..\lib\Release\zip.dll . + if errorlevel 1 popd & goto exit_failure + copy Release\*.exe . + if errorlevel 1 popd & goto exit_failure + copy ..\src\Release\*.exe . + if errorlevel 1 popd & goto exit_failure + echo Extracting test files + if not exist ..\..\regress\bigzero.zip ziptool ..\..\regress\bigzero-zip.zip cat 0 > ..\..\regress\bigzero.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles.zip ziptool ..\..\regress\manyfiles-zip.zip cat 0 > ..\..\regress\manyfiles.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles-133000.zip ziptool ..\..\regress\manyfiles-zip.zip cat 1 > ..\..\regress\manyfiles-133000.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles-65536.zip ziptool ..\..\regress\manyfiles-zip.zip cat 2 > ..\..\regress\manyfiles-65536.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles-zip64-modulo.zip ziptool ..\..\regress\manyfiles-zip.zip cat 3 > ..\..\regress\manyfiles-zip64-modulo.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles-zip64.zip ziptool ..\..\regress\manyfiles-zip.zip cat 4 > ..\..\regress\manyfiles-zip64.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles-fewer.zip ziptool ..\..\regress\manyfiles-zip.zip cat 5 > ..\..\regress\manyfiles-fewer.zip + if errorlevel 1 popd & goto exit_failure + if not exist ..\..\regress\manyfiles-more.zip ziptool ..\..\regress\manyfiles-zip.zip cat 6 > ..\..\regress\manyfiles-more.zip + if errorlevel 1 popd & goto exit_failure + echo Generating runtest script + for /f %%p in ("..\..\regress") do set ABS_SRCDIR=%%~fp + set ABS_SRCDIR=!ABS_SRCDIR:\=\\! + perl -p -e "s/@[s]rcdir@/..\\..\\regress/g;s/@[a]bs_srcdir@/!ABS_SRCDIR!/g;s|../../src/zipcmp|..\\..\\src\\Release\\zipcmp|g;" ..\..\regress\runtest.in > runtest + if errorlevel 1 popd & goto exit_failure + echo Running tests + ctest + popd + if errorlevel 1 goto exit_failure +) + +goto :EOF + +:check_installed +where %CHECK_CMD% > nul 2>&1 +if "%errorlevel%"=="9009" ( + echo This build script requires where.exe. If running on Windows XP or + echo earlier, this can be found in the Windows Resource Kit. + exit /b 1 +) +if errorlevel 1 ( + echo Please make sure that %CHECK_DESC% is installed and in your PATH. + exit /b 1 +) +goto :EOF + +:exit_failure +echo Build failed. +exit /b 1 diff --git a/deps/libzip/vstudio/zlib/unpack_zlib_here.txt b/deps/libzip/vstudio/zlib/unpack_zlib_here.txt new file mode 100644 index 00000000000000..f4e51a6e2ea753 --- /dev/null +++ b/deps/libzip/vstudio/zlib/unpack_zlib_here.txt @@ -0,0 +1 @@ +Unpack zlib source archive into this directory. \ No newline at end of file diff --git a/doc/api/errors.md b/doc/api/errors.md index 3271c818c14a5f..a8109e05678cdb 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -3521,6 +3521,18 @@ removed: v16.9.0 The pathname used for the main script of a worker has an unknown file extension. + + +### `ERR_ZIP_UNSUPPORTED_COMPRESSION` + + + +Used when the specified compression algorithm isn't directly integrated within +the Node.js zip interface. You may then have to compress / decompress the data +buffers yourself. + ### `ERR_ZLIB_BINDING_CLOSED` diff --git a/doc/api/zlib.md b/doc/api/zlib.md index a33de3833cbe9f..a57783ab6a35e8 100644 --- a/doc/api/zlib.md +++ b/doc/api/zlib.md @@ -487,6 +487,72 @@ These advanced options are available for controlling decompression: * Boolean flag enabling “Large Window Brotli†mode (not compatible with the Brotli format as standardized in [RFC 7932][]). +### Zip constants + + + +There are several options and other constants available when working with zip +archives: + +#### Opsys constants + +These values may be used when using the `restatEntry` function. In general you +should only need `ZIP_OPSYS_UNIX`, which allows you to describe both file +permissions and symlinks. + +* `ZIP_OPSYS_DOS` +* `ZIP_OPSYS_AMIGA` +* `ZIP_OPSYS_OPENVMS` +* `ZIP_OPSYS_UNIX` +* `ZIP_OPSYS_VM_CMS` +* `ZIP_OPSYS_ATARI_ST` +* `ZIP_OPSYS_OS_2` +* `ZIP_OPSYS_MACINTOSH` +* `ZIP_OPSYS_Z_SYSTEM` +* `ZIP_OPSYS_CPM` +* `ZIP_OPSYS_WINDOWS_NTFS` +* `ZIP_OPSYS_MVS` +* `ZIP_OPSYS_VSE` +* `ZIP_OPSYS_ACORN_RISC` +* `ZIP_OPSYS_VFAT` +* `ZIP_OPSYS_ALTERNATE_MVS` +* `ZIP_OPSYS_BEOS` +* `ZIP_OPSYS_TANDEM` +* `ZIP_OPSYS_OS_400` +* `ZIP_OPSYS_OS_X` + +#### Compression constants + +These values may be used with the `addFile` function. Brotli isn't officially +supported by the Zip format - you can still use it as an underlying data format +if you compress the data yourself, but because it doesn't have a standardized +compression constant, third-party tools will see the content as corrupted. + +* `ZIP_CM_DEFAULT` +* `ZIP_CM_STORE` +* `ZIP_CM_SHRINK` +* `ZIP_CM_REDUCE_1` +* `ZIP_CM_REDUCE_2` +* `ZIP_CM_REDUCE_3` +* `ZIP_CM_REDUCE_4` +* `ZIP_CM_IMPLODE` +* `ZIP_CM_DEFLATE` +* `ZIP_CM_DEFLATE64` +* `ZIP_CM_PKWARE_IMPLODE` +* `ZIP_CM_BZIP2` +* `ZIP_CM_TERSE` +* `ZIP_CM_LZMA` +* `ZIP_CM_LZ77` +* `ZIP_CM_LZMA2` +* `ZIP_CM_ZSTD` +* `ZIP_CM_XZ` +* `ZIP_CM_JPEG` +* `ZIP_CM_WAVPACK` +* `ZIP_CM_PPMD` + ## Class: `Options` + +> Stability: 1 - Experimental. + +### `zip.getEntries([options])` + +* `options` {Object} + * `withFileTypes` {boolean|null} **Default:** `false` +* Returns: {Map} Returns a map where keys are paths and values are numbers + suitable for use in other functions accepting entry numbers. + +Returns a map of all the entries within the zip archive. Because of how zip +works, not all entries are files: some may be directories too. To know their +types for sure, set the `withFileTypes` option to true. + +### `zip.addFile(path, data[, options])` + + + +* `path` {string} +* `data` {string|Buffer|TypedArray|DataView} +* `options` {Object|string} + * `algorithm` {number|null} **Default:** `zlib.ZIP_CM_DEFLATE` + * `compress` {boolean|null} **Default:** `true` + * `encoding` {string|null} **Default:** `'utf8'` + * `tolerateStore` {boolean|null} **Default:** `true` + * `crc` {string|null} **Default:** `null` + * `size` {number|null} **Default:** `'utf8'` +* Returns: {number} Returns an entry number upon success. + +Adds or updates a file inside the given zip archive. If `compress` is `true`, +the data will first be compressed according to `algorithm`. If the resulting +buffer is smaller than the original one, or if `tolerateStore` is set to +`false`, it'll be stored inside the archive. Otherwise, the original data +will be stored as-is. + +If `compress` is set to `false`, the data is assumed to be pre-compressed. In +that case, both `crc` and `size` have to be provided, as they each refer to the +original content. In the case of `crc`, it can be obtained by calling +`crc32Sync` on the original content. + +### `zip.addSymlink(path, target)` + +* `path` {string} +* `target` {string} +* Returns: {number} Returns an entry number upon success. + +Adds or updates a file inside the given zip archive. The file metadata will be +set those of a symlink, using `ZIP_OPSYS_UNIX`. + +### `zip.deleteEntry(entry)` + +* `entry` {number} + +Removes an entry from a given zip archive. + +### `zip.readEntry(entry[, options])` + +* `entry` {number} +* `options` {Object|string} + * `decompress` {boolean|null} **Default:** `true` + * `encoding` {string|null} **Default:** `'utf8'` + +Reads the content associated with an entry. If the `decompress` option is set +to `true` (the default), the function will decompress the data before returning +it. Otherwise, an `[algorithm, data]` tuple will be returned that you'll then +have to uncompress yourself. + +### `zip.statEntry(entry)` + +* `entry` {number} + +Retrieves the metadata associated with the given entry. + [Brotli parameters]: #brotli-constants [Memory usage tuning]: #memory-usage-tuning [RFC 7932]: https://www.rfc-editor.org/rfc/rfc7932.txt diff --git a/doc/contributing/maintaining-libzip.md b/doc/contributing/maintaining-libzip.md new file mode 100644 index 00000000000000..390bfdc0451fce --- /dev/null +++ b/doc/contributing/maintaining-libzip.md @@ -0,0 +1,40 @@ +# Maintaining libzip + +## Updating libzip + +Update libzip: + +```bash +mkdir -p temp temp/lib +cp deps/libzip/lib/{zip_err_str.c,zip_node_ext.c,config.h,zipconf.h} temp/lib/ +cp deps/libzip/libzip.gyp temp/ + +git clone https://github.com/nih-at/libzip +rm -rf deps/libzip libzip/.git +mv libzip deps/ + +rsync -a temp/ deps/libzip +rm -rf temp +``` + +Check that Node.js still builds and tests. A couple of files may need to be +tweaked, depending on the changes upstream: + +* the file list in `deps/libzip/libzip.gyp` may need to see entries added or + removed + +* the `deps/libzip/lib/{zip_err_str.c,config.h,zipconf.h}` files may need to be + regenerated; in that case use CMake to rebuild them, then move the newly + generated files in place of the checked-in ones. + +## Committing libzip + +Add libzip: `git add --all deps/libzip` + +Commit the changes with a message like + +```text +deps: update libzip to upstream d7f3ca9 + +Updated as described in doc/contributing/maintaining-libzip.md. +``` diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 381fa9f15d92f6..2fa05ce51da07e 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -1733,4 +1733,5 @@ E('ERR_WORKER_UNSERIALIZABLE_ERROR', 'Serializing an uncaught exception failed', Error); E('ERR_WORKER_UNSUPPORTED_OPERATION', '%s is not supported in workers', TypeError); +E('ERR_ZIP_UNSUPPORTED_COMPRESSION', 'Unsupported compression algorithm', Error); E('ERR_ZLIB_INITIALIZATION_FAILED', 'Initialization failed', Error); diff --git a/lib/zlib.js b/lib/zlib.js index 9bde1997d95720..f9ef623a487a08 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -27,6 +27,8 @@ const { ArrayPrototypeMap, ArrayPrototypePush, FunctionPrototypeBind, + MapPrototypeSet, + MathAbs, MathMaxApply, NumberIsFinite, NumberIsNaN, @@ -34,7 +36,9 @@ const { ObjectDefineProperty, ObjectFreeze, ObjectKeys, + ObjectPrototypeHasOwnProperty, ObjectSetPrototypeOf, + PromiseResolve, ReflectApply, StringPrototypeStartsWith, Symbol, @@ -42,12 +46,14 @@ const { Uint32Array, } = primordials; +const { validateStringAfterArrayBufferView } = require('internal/fs/utils'); const { codes: { ERR_BROTLI_INVALID_PARAM, ERR_BUFFER_TOO_LARGE, ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE, + ERR_ZIP_UNSUPPORTED_COMPRESSION, ERR_ZLIB_INITIALIZATION_FAILED, }, genericNodeError, @@ -55,13 +61,16 @@ const { } = require('internal/errors'); const { Transform, finished } = require('stream'); const { - deprecate + deprecate, + kEmptyObject, + promisify, } = require('internal/util'); const { isArrayBufferView, isAnyArrayBuffer, isUint8Array, } = require('internal/util/types'); +const archiveBinding = internalBinding('archive'); const binding = internalBinding('zlib'); const assert = require('internal/assert'); const { @@ -77,7 +86,9 @@ const { const kFlushFlag = Symbol('kFlushFlag'); const kError = Symbol('kError'); -const constants = internalBinding('constants').zlib; +const allConstants = internalBinding('constants'); +const constants = allConstants.zlib; + const { // Zlib flush levels Z_NO_FLUSH, Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH, @@ -91,8 +102,23 @@ const { // Brotli operations (~flush levels) BROTLI_OPERATION_PROCESS, BROTLI_OPERATION_FLUSH, BROTLI_OPERATION_FINISH, BROTLI_OPERATION_EMIT_METADATA, + // Libzip integrated compression algorithms + ZIP_CM_STORE, ZIP_CM_DEFLATE, + // Libzip integration file metadata + ZIP_OPSYS_UNIX, } = constants; +const { + S_IFMT, + S_IFBLK, + S_IFCHR, + S_IFDIR, + S_IFIFO, + S_IFLNK, + S_IFREG, + S_IFSOCK, +} = allConstants.fs; + // Translation table for return codes. const codes = { Z_OK: constants.Z_OK, @@ -110,6 +136,375 @@ for (const ckey of ObjectKeys(codes)) { codes[codes[ckey]] = ckey; } +const identitySync = (buffer) => buffer; +const identity = (buffer, cb) => PromiseResolve(buffer); + +const deflateRawSync = createConvenienceMethod(DeflateRaw, true); +const deflateRaw = createConvenienceMethod(DeflateRaw, false); + +const inflateRawSync = createConvenienceMethod(InflateRaw, true); +const inflateRaw = createConvenienceMethod(InflateRaw, false); + +const ZIP_INTEGRATED_COMPRESSION_ALGORITHMS = { + [ZIP_CM_STORE]: { + sync: { + compress: identitySync, + decompress: identitySync, + }, + async: { + compress: identity, + decompress: identity, + } + }, + [ZIP_CM_DEFLATE]: { + sync: { + compress: deflateRawSync, + decompress: inflateRawSync, + }, + async: { + compress: promisify(deflateRaw), + decompress: promisify(inflateRaw), + } + }, +}; + +function crc32Sync(buf) { + let crc = ~0; + + for (let t = 0, T = buf.length; t < T; ++t) + crc = (crc >>> 8) ^ CRC_32_TAB[(crc ^ buf[t]) & 0xff]; + + return MathAbs(crc ^ -1); +} + +const CRC_32_TAB = [ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, +]; + +class ZipStats { + constructor(size, compressionSize, compressionAlgorithm, mtime, crc, opsys, attributes) { + this.mode = opsys === ZIP_OPSYS_UNIX ? attributes >>> 16 : 0; + this.size = size; + + this.compressionSize = compressionSize; + this.compressionAlgorithm = compressionAlgorithm; + + this.mtime = new primordials.Date(mtime); + this.mtimeMs = this.mtime.getTime() * 1000; + + this.opsys = opsys; + this.attributes = attributes; + + this.crc = crc; + } + + isDirectory() { + return (this.mode & S_IFMT) === S_IFDIR; + } + + isFile() { + return (this.mode & S_IFMT) === S_IFREG; + } + + isBlockDevice() { + return (this.mode & S_IFMT) === S_IFBLK; + } + + isCharacterDevice() { + return (this.mode & S_IFMT) === S_IFCHR; + } + + isSymbolicLink() { + return (this.mode & S_IFMT) === S_IFLNK; + } + + isFIFO() { + return (this.mode & S_IFMT) === S_IFIFO; + } + + isSocket() { + return (this.mode & S_IFMT) === S_IFSOCK; + } +} + +class ZipEnt { + #type; + + constructor(name, entry, type) { + this.name = name; + this.entry = entry; + this.#type = type; + } + + isDirectory() { + return this.#type === S_IFDIR; + } + + isFile() { + return this.#type === S_IFREG; + } + + isBlockDevice() { + return this.#type === S_IFBLK; + } + + isCharacterDevice() { + return this.#type === S_IFCHR; + } + + isSymbolicLink() { + return this.#type === S_IFLNK; + } + + isFIFO() { + return this.#type === S_IFIFO; + } + + isSocket() { + return this.#type === S_IFSOCK; + } +} + +function generateSimpleToc(entry, index) { + return [entry[0], index]; +} + +function generateZipentToc(entry, index) { + return [entry[0], new ZipEnt(entry[0], index, entry[1])]; +} + +class ZipArchive { + #zip; + + constructor(data = null) { + this.#zip = new archiveBinding.ZipArchive(data); + } + + getEntries({ withFileTypes = false } = kEmptyObject) { + const toc = this.#zip.getEntries(withFileTypes); + + const mapFn = withFileTypes ? + generateZipentToc : + generateSimpleToc; + + const res = new primordials.Map(); + for (let t = 0; t < toc.length; ++t) { + const { 0: key, 1: val } = mapFn(toc[t], t); + MapPrototypeSet(res, key, val); + } + + return res; + } + + addDirectory(p) { + return this.#zip.addDirectory(p); + } + + addSymlink(p, target) { + const entry = this.addFile(p, target); + + this.restatEntry(entry, { + opsys: ZIP_OPSYS_UNIX, + attributes: (constants.S_IFLNK | 0o777) << 16, + }); + + return entry; + } + + addFile(p, data, { + algorithm = ZIP_CM_DEFLATE, + compress = true, + encoding = 'utf8', + tolerateStore = true, + crc, size + } = kEmptyObject) { + if (!isArrayBufferView(data)) { + validateStringAfterArrayBufferView(data, 'data'); + data = Buffer.from(data, encoding); + } + + if (compress) { + if (!ObjectPrototypeHasOwnProperty(ZIP_INTEGRATED_COMPRESSION_ALGORITHMS, algorithm)) + throw new ERR_ZIP_UNSUPPORTED_COMPRESSION(); + + const { compress: compressFn } = ZIP_INTEGRATED_COMPRESSION_ALGORITHMS[algorithm].sync; + const compressed = compressFn(data); + + crc = crc32Sync(data); + size = data.length; + + if (tolerateStore && compressed.length >= data.length) { + algorithm = ZIP_CM_STORE; + } else { + data = compressed; + } + } + + return this.#zip.addEntry(p, algorithm, data, crc, size); + } + + async addFilePromise(p, data, { + algorithm = ZIP_CM_DEFLATE, + compress = true, + encoding = 'utf8', + tolerateStore = true, + crc, size + } = kEmptyObject) { + if (!isArrayBufferView(data)) { + validateStringAfterArrayBufferView(data, 'data'); + data = Buffer.from(data, encoding); + } + + if (compress) { + if (!ObjectPrototypeHasOwnProperty(ZIP_INTEGRATED_COMPRESSION_ALGORITHMS, algorithm)) + throw new ERR_ZIP_UNSUPPORTED_COMPRESSION(); + + const { compress: compressFn } = ZIP_INTEGRATED_COMPRESSION_ALGORITHMS[algorithm].async; + const compressed = await compressFn(data); + + crc = crc32Sync(data); + size = data.length; + + if (tolerateStore && compressed.length >= data.length) { + algorithm = ZIP_CM_STORE; + } else { + data = compressed; + } + } + + return this.#zip.addEntry(p, data, algorithm, crc, size); + } + + deleteEntry(entry) { + this.#zip.deleteEntry(entry); + } + + readEntry(entry, options = kEmptyObject) { + if (typeof options === 'string') + options = { encoding: options }; + + const { decompress = true, encoding } = options; + const { 0: algorithm, 1: compressed } = this.#zip.readEntry(entry); + if (!decompress) + return [algorithm, compressed]; + + if (!ObjectPrototypeHasOwnProperty(ZIP_INTEGRATED_COMPRESSION_ALGORITHMS, algorithm)) + throw new ERR_ZIP_UNSUPPORTED_COMPRESSION(); + + const { decompress: decompressFn } = ZIP_INTEGRATED_COMPRESSION_ALGORITHMS[algorithm].sync; + const decompressed = decompressFn(compressed); + + return typeof encoding !== 'undefined' ? decompressed.toString(encoding) : decompressed; + } + + async readEntryPromise(entry, options = kEmptyObject) { + if (typeof options === 'string') + options = { encoding: options }; + + const { decompress = true, encoding } = options; + const { 0: algorithm, 1: compressed } = this.#zip.readEntry(entry); + if (!decompress) + return [algorithm, compressed]; + + if (!ObjectPrototypeHasOwnProperty(ZIP_INTEGRATED_COMPRESSION_ALGORITHMS, algorithm)) + throw new ERR_ZIP_UNSUPPORTED_COMPRESSION(); + + const { decompress: decompressFn } = ZIP_INTEGRATED_COMPRESSION_ALGORITHMS[algorithm].async; + const decompressed = await decompressFn(compressed); + + return typeof encoding !== 'undefined' ? decompressed.toString(encoding) : decompressed; + } + + statEntry(entry) { + const { + 0: size, + 1: compressionSize, + 2: compressionMethod, + 3: mtime, + 4: crc, + 5: opsys, + 6: attributes + } = this.#zip.statEntry(entry); + + return new ZipStats(size, compressionSize, compressionMethod, mtime, crc, opsys, attributes); + } + + restatEntry(entry, stats) { + this.#zip.restatEntry(entry, stats); + } + + digest(encoding) { + const res = this.#zip.digest(); + + return typeof encoding !== 'undefined' ? + res.toString(encoding) : + res; + } +} + function zlibBuffer(engine, buffer, callback) { validateFunction(callback, 'callback'); // Streams do not support non-Uint8Array ArrayBufferViews yet. Convert it to a @@ -900,6 +1295,8 @@ module.exports = { Unzip, BrotliCompress, BrotliDecompress, + ZipArchive, + crc32Sync, // Convenience methods. // compress/decompress a string or buffer in one step. @@ -907,16 +1304,16 @@ module.exports = { deflateSync: createConvenienceMethod(Deflate, true), gzip: createConvenienceMethod(Gzip, false), gzipSync: createConvenienceMethod(Gzip, true), - deflateRaw: createConvenienceMethod(DeflateRaw, false), - deflateRawSync: createConvenienceMethod(DeflateRaw, true), + deflateRaw: deflateRaw, + deflateRawSync: deflateRawSync, unzip: createConvenienceMethod(Unzip, false), unzipSync: createConvenienceMethod(Unzip, true), inflate: createConvenienceMethod(Inflate, false), inflateSync: createConvenienceMethod(Inflate, true), gunzip: createConvenienceMethod(Gunzip, false), gunzipSync: createConvenienceMethod(Gunzip, true), - inflateRaw: createConvenienceMethod(InflateRaw, false), - inflateRawSync: createConvenienceMethod(InflateRaw, true), + inflateRaw: inflateRaw, + inflateRawSync: inflateRawSync, brotliCompress: createConvenienceMethod(BrotliCompress, false), brotliCompressSync: createConvenienceMethod(BrotliCompress, true), brotliDecompress: createConvenienceMethod(BrotliDecompress, false), @@ -933,6 +1330,7 @@ ObjectDefineProperties(module.exports, { createUnzip: createProperty(Unzip), createBrotliCompress: createProperty(BrotliCompress), createBrotliDecompress: createProperty(BrotliDecompress), + createZipArchive: createProperty(ZipArchive), constants: { __proto__: null, configurable: false, diff --git a/node.gyp b/node.gyp index 043b46d6d56ee5..63fcc8d4bec656 100644 --- a/node.gyp +++ b/node.gyp @@ -490,6 +490,7 @@ 'src/module_wrap.cc', 'src/node.cc', 'src/node_api.cc', + 'src/node_archive.cc', 'src/node_binding.cc', 'src/node_blob.cc', 'src/node_buffer.cc', diff --git a/node.gypi b/node.gypi index ecd2ea6ea87deb..ea7b2541a1cbd6 100644 --- a/node.gypi +++ b/node.gypi @@ -139,6 +139,9 @@ [ 'node_no_browser_globals=="true"', { 'defines': [ 'NODE_NO_BROWSER_GLOBALS' ], } ], + [ 'node_shared_libzip=="false"', { + 'dependencies': [ 'deps/libzip/libzip.gyp:libzip' ], + } ], [ 'node_shared_zlib=="false"', { 'dependencies': [ 'deps/zlib/zlib.gyp:zlib' ], 'conditions': [ @@ -215,6 +218,10 @@ 'dependencies': [ 'deps/brotli/brotli.gyp:brotli' ], }], + [ 'node_shared_libzip=="false"', { + 'dependencies': [ 'deps/libzip/libzip.gyp:libzip' ], + }], + [ 'OS=="mac"', { # linking Corefoundation is needed since certain OSX debugging tools # like Instruments require it for some features diff --git a/src/node_archive.cc b/src/node_archive.cc new file mode 100644 index 00000000000000..adfed73e33a6f0 --- /dev/null +++ b/src/node_archive.cc @@ -0,0 +1,480 @@ +#include +#include + +#include "async_wrap.h" +#include "env.h" +#include "env-inl.h" +#include "node_binding.h" +#include "node_buffer.h" +#include "node_errors.h" +#include "node_external_reference.h" +#include "node.h" +#include "util.h" +#include "zip.h" +#include "v8.h" + +#define CHECK_ZIP_ARCHIVE_ERR(zip, action, expr) \ + do { \ + if (UNLIKELY(!(expr))) { \ + THROW_ERR_LIBZIP_ERROR(env, "Zip " action " failed: %s", zip_error_strerror(zip_get_error(zip))); \ + return; \ + } \ + } while (0) + +#define CHECK_ZIP_FILE_ERR(file, action, expr) \ + do { \ + if (UNLIKELY(!(expr))) { \ + THROW_ERR_LIBZIP_ERROR(env, "Zip " action " failed: %s", zip_error_strerror(zip_file_get_error(file))); \ + return; \ + } \ + } while (0) + +namespace node { + +namespace { + +static char const emptyZipArchive[] = { + 0x50, 0x4B, 0x05, 0x06, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +struct ZipCompContext { + zip_uint64_t uncompressed_size; + zip_uint32_t crc; + zip_uint32_t compression_method; + + static zip_int64_t layer_callback(zip_source_t* src, void *ud, void* data, zip_uint64_t length, zip_source_cmd_t command) { + ZipCompContext* ctx = static_cast(ud); + + switch (command) { + case ZIP_SOURCE_FREE: + delete ctx; + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st = static_cast(data); + if (st->valid & ZIP_STAT_SIZE) { + st->comp_size = st->size; + st->valid |= ZIP_STAT_COMP_SIZE; + } + + st->size = ctx->uncompressed_size; + st->crc = ctx->crc; + st->comp_method = ctx->compression_method; + + st->valid |= ZIP_STAT_COMP_METHOD | ZIP_STAT_SIZE | ZIP_STAT_CRC; + + return 0; + } + + default: + return zip_source_pass_to_lower_layer(src, data, length, command); + } + } +}; + +class ZipArchive final : public BaseObject { + public: + enum InternalFields { + kInternalFieldCount = BaseObject::kInternalFieldCount, + }; + + ZipArchive(Environment* env, v8::Local obj, std::vector&& buf); + ~ZipArchive(); + + void MemoryInfo(MemoryTracker* tracker) const override; + + static ZipArchive* CheckZip(const v8::FunctionCallbackInfo& args); + static std::pair CheckZipEntry(const v8::FunctionCallbackInfo& args); + + static void GetEntries(const v8::FunctionCallbackInfo& args); + static void AddDirectory(const v8::FunctionCallbackInfo& args); + static void AddEntry(const v8::FunctionCallbackInfo& args); + static void DeleteEntry(const v8::FunctionCallbackInfo& args); + static void ReadEntry(const v8::FunctionCallbackInfo& args); + static void StatEntry(const v8::FunctionCallbackInfo& args); + static void RestatEntry(const v8::FunctionCallbackInfo& args); + static void Digest(const v8::FunctionCallbackInfo& args); + + int GetFileType(zip_uint64_t index) const; + + std::vector buf_; + zip_error_t error_; + zip_source_t* source_ = nullptr; + zip_t* zip_ = nullptr; + uint64_t mem_usage_ = 0; + + SET_MEMORY_INFO_NAME(ZipArchive) + SET_SELF_SIZE(ZipArchive) +}; + +ZipArchive::ZipArchive(Environment* env, v8::Local obj, std::vector&& buf) + : BaseObject(env, obj) + , buf_(std::move(buf)) { + MakeWeak(); + + mem_usage_ += buf.size(); + + zip_error_init(&error_); + + source_ = zip_source_buffer_create(buf_.data(), buf_.size(), 0, &error_); + CHECK_NOT_NULL(source_); + zip_source_keep(source_); + + zip_ = zip_open_from_source(source_, 0, &error_); + if (!zip_) { + char const* err = zip_error_strerror(&error_); + THROW_ERR_ZIP_OPENING_FAILED(env, "Zip opening failed: %s", err); + } +} + +ZipArchive::~ZipArchive() { + if (zip_) { + zip_discard(zip_); + zip_ = nullptr; + } + + if (source_) { + zip_source_free(source_); + source_ = nullptr; + } + + zip_error_fini(&error_); +} + +void ZipArchive::MemoryInfo(MemoryTracker* tracker) const { + tracker->TrackFieldWithSize("libzip_memory", mem_usage_); +} + +void ZipArchive::GetEntries(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + + ZipArchive* zip = ZipArchive::CheckZip(args); + + const int argc = args.Length(); + CHECK_EQ(argc, 1); + + CHECK(args[0]->IsBoolean()); + bool with_file_types = args[0]->IsTrue(); + + zip_int64_t num_entries = zip_get_num_entries(zip->zip_, 0); + + std::vector> entries; + entries.resize(num_entries); + + for (zip_int64_t t = 0; t < num_entries; ++t) { + char const* entry_name = zip_get_name(zip->zip_, t, 0); + CHECK_NOT_NULL(entry_name); + + v8::Local entry_items[] = { + v8::String::NewFromUtf8(isolate, entry_name).ToLocalChecked(), + v8::Integer::New(isolate, with_file_types ? zip->GetFileType(t) : 0) + }; + + entries[t] = v8::Array::New(isolate, &entry_items[0], arraysize(entry_items)); + } + + args.GetReturnValue().Set(v8::Array::New(isolate, &entries[0], entries.size())); +} + +void ZipArchive::AddDirectory(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + + ZipArchive* zip = ZipArchive::CheckZip(args); + + const int argc = args.Length(); + CHECK_EQ(argc, 1); + + CHECK(args[0]->IsString()); + node::Utf8Value path(isolate, args[0]); + + zip_int64_t dir_index = zip_dir_add(zip->zip_, *path, 0); + CHECK_GE(dir_index, 0); + CHECK_LE(dir_index, std::numeric_limits::max()); + + args.GetReturnValue().Set(static_cast(dir_index)); +} + +void ZipArchive::AddEntry(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + + ZipArchive* zip = ZipArchive::CheckZip(args); + + const int argc = args.Length(); + CHECK_EQ(argc, 5); + + CHECK(args[0]->IsString()); + node::Utf8Value path(isolate, args[0]); + + CHECK(IsSafeJsInt(args[1])); + zip_int32_t comp_method = args[1].As()->Value(); + + ArrayBufferViewContents buffer_view(args[2]); + char const* buffer_data = buffer_view.data(); + size_t buffer_length = buffer_view.length(); + + char* buffer_copy = Malloc(buffer_length); + memcpy(buffer_copy, buffer_data, buffer_length); + + zip_source_t* file_source = zip_source_buffer(zip->zip_, buffer_copy, buffer_length, 1); + CHECK_NOT_NULL(file_source); + + CHECK(IsSafeJsInt(args[3])); + zip_uint32_t crc = args[3].As()->Value(); + + CHECK(IsSafeJsInt(args[4])); + zip_uint32_t size = args[4].As()->Value(); + + ZipCompContext* zip_comp_ctx = new ZipCompContext(); + zip_comp_ctx->compression_method = comp_method; + zip_comp_ctx->uncompressed_size = size; + zip_comp_ctx->crc = crc; + + zip_source_t* file_comp_source = zip_source_layered_create(file_source, &ZipCompContext::layer_callback, zip_comp_ctx, &zip->error_); + CHECK_NOT_NULL(file_comp_source); + + zip_int64_t file_index = zip_file_add(zip->zip_, *path, file_comp_source, ZIP_FL_OVERWRITE | ZIP_FL_ENC_UTF_8); + CHECK_GE(file_index, 0); + CHECK_LE(file_index, std::numeric_limits::max()); + + zip->mem_usage_ += buffer_length; + + args.GetReturnValue().Set(static_cast(file_index)); +} + +ZipArchive* ZipArchive::CheckZip(const v8::FunctionCallbackInfo& args) { + ZipArchive* zip; + + CHECK_NOT_NULL(zip = Unwrap(args.Holder())); + CHECK_NOT_NULL(zip->zip_); + CHECK_NOT_NULL(zip->source_); + + return zip; +} + +std::pair ZipArchive::CheckZipEntry(const v8::FunctionCallbackInfo& args) { + ZipArchive* zip = ZipArchive::CheckZip(args); + + const int argc = args.Length(); + CHECK_GE(argc, 1); + + CHECK(IsSafeJsInt(args[0])); + zip_uint32_t index = args[0].As()->Value(); + + return std::make_pair(zip, index); +} + +void ZipArchive::DeleteEntry(const v8::FunctionCallbackInfo& args) { + auto [zip, index] = ZipArchive::CheckZipEntry(args); + + CHECK_EQ(zip_delete(zip->zip_, index), 0); +} + +void ZipArchive::ReadEntry(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + Environment* env = Environment::GetCurrent(isolate); + + auto [zip, index] = ZipArchive::CheckZipEntry(args); + + zip_stat_t file_stat; + CHECK_EQ(zip_stat_index(zip->zip_, index, 0, &file_stat), 0); + CHECK_LE(file_stat.comp_size, ZIP_INT64_MAX); + CHECK_LE(file_stat.comp_size, std::numeric_limits::max()); + + char* data = Malloc(file_stat.comp_size); + + zip_file_t* file; + CHECK_NOT_NULL(file = zip_fopen_index(zip->zip_, index, ZIP_FL_COMPRESSED)); + + zip_int64_t read_length = zip_fread(file, data, file_stat.comp_size); + CHECK_ZIP_FILE_ERR(file, "fread", read_length >= 0); + CHECK_EQ(read_length, static_cast(file_stat.comp_size)); + + CHECK_EQ(zip_fclose(file), 0); + + v8::Local result[] = { + v8::Integer::NewFromUnsigned(isolate, file_stat.comp_method), + Buffer::New(isolate, data, read_length).ToLocalChecked(), + }; + + args.GetReturnValue().Set(v8::Array::New(isolate, &result[0], arraysize(result))); +} + +void ZipArchive::StatEntry(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + + auto [zip, index] = ZipArchive::CheckZipEntry(args); + + zip_stat_t file_stat; + CHECK_EQ(zip_stat_index(zip->zip_, index, 0, &file_stat), 0); + CHECK_LE(file_stat.comp_size, ZIP_INT64_MAX); + CHECK_LE(file_stat.comp_size, std::numeric_limits::max()); + + zip_uint8_t opsys; + zip_uint32_t attributes; + CHECK_EQ(zip_file_get_external_attributes(zip->zip_, index, 0, &opsys, &attributes), 0); + + v8::Local result[] = { + v8::Integer::NewFromUnsigned(isolate, file_stat.size), + v8::Integer::NewFromUnsigned(isolate, file_stat.comp_size), + v8::Integer::NewFromUnsigned(isolate, file_stat.comp_method), + v8::Integer::NewFromUnsigned(isolate, file_stat.mtime), + v8::Integer::NewFromUnsigned(isolate, file_stat.crc), + v8::Integer::NewFromUnsigned(isolate, opsys), + v8::Integer::NewFromUnsigned(isolate, attributes), + }; + + args.GetReturnValue().Set(v8::Array::New(isolate, &result[0], arraysize(result))); +} + +void ZipArchive::RestatEntry(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + v8::Local ctx = isolate->GetCurrentContext(); + + auto [zip, index] = ZipArchive::CheckZipEntry(args); + + const int argc = args.Length(); + CHECK_GE(argc, 2); + + CHECK(args[1]->IsObject()); + v8::Local stats = args[1]->ToObject(ctx).ToLocalChecked(); + + v8::Local mtime = stats->Get(ctx, v8::String::NewFromUtf8Literal(isolate, "mtime")) + .ToLocalChecked(); + v8::Local opsys = stats->Get(ctx, v8::String::NewFromUtf8Literal(isolate, "opsys")) + .ToLocalChecked(); + + if (!mtime->IsUndefined()) { + CHECK(IsSafeJsInt(mtime)); + time_t mtime_val = mtime.As()->Value(); + + CHECK_EQ(zip_file_set_mtime(zip->zip_, index, mtime_val, 0), 0); + } + + if (!opsys->IsUndefined()) { + v8::Local attributes = stats->Get(ctx, v8::String::NewFromUtf8Literal(isolate, "attributes")) + .ToLocalChecked(); + + CHECK(IsSafeJsInt(opsys)); + zip_uint8_t opsys_val = opsys.As()->Value(); + + zip_uint32_t attributes_val = 0; + if (!attributes->IsUndefined()) { + CHECK(IsSafeJsInt(attributes)); + attributes_val = attributes.As()->Value(); + } + + CHECK_EQ(zip_file_set_external_attributes(zip->zip_, index, 0, opsys_val, attributes_val), 0); + } +} + +void ZipArchive::Digest(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + + ZipArchive* zip = ZipArchive::CheckZip(args); + + zip_close(zip->zip_); + zip->zip_ = nullptr; + + v8::MaybeLocal buf; + + int open_res = zip_source_open(zip->source_); + if (open_res != 0) { + // Libzip purges the source when the file would be empty. We don't want this + // behaviour (users can just check themselves before saving, if that's what + // they want to do), so we check and return a predefined buffer if needed. + zip_error_t* error = zip_source_error(zip->source_); + CHECK_EQ(error->zip_err, ZIP_ER_DELETED); + + buf = Buffer::Copy(isolate, &emptyZipArchive[0], sizeof(emptyZipArchive)); + } else { + CHECK_EQ(zip_source_seek(zip->source_, 0, SEEK_END), 0); + zip_uint64_t size = zip_source_tell(zip->source_); + CHECK_EQ(zip_source_seek(zip->source_, 0, SEEK_SET), 0); + + CHECK_LE(size, std::numeric_limits::max()); + + char* data = Malloc(size); + CHECK_GE(zip_source_read(zip->source_, data, size), 0); + + buf = Buffer::New(isolate, data, size); + + CHECK_EQ(zip_source_close(zip->source_), 0); + } + + args.GetReturnValue().Set(buf.ToLocalChecked()); +} + +int ZipArchive::GetFileType(zip_uint64_t index) const { + zip_uint8_t opsys; + zip_uint32_t attributes; + CHECK_EQ(zip_file_get_external_attributes(zip_, index, 0, &opsys, &attributes), 0); + + return opsys == ZIP_OPSYS_UNIX ? (attributes >> 16) & 0xf000 : 0; +} + +void NewZipArchive(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + Environment* env = Environment::GetCurrent(isolate); + + CHECK(args.IsConstructCall()); + + const int argc = args.Length(); + CHECK_EQ(argc, 1); + + char const* buffer_data = &emptyZipArchive[0]; + size_t buffer_length = sizeof(emptyZipArchive); + + ArrayBufferViewContents buffer_view; + if (!args[0]->IsNull()) { + buffer_view.ReadValue(args[0]); + buffer_data = buffer_view.data(); + buffer_length = buffer_view.length(); + } + + std::vector buffer_copy(buffer_data, buffer_data + buffer_length); + new ZipArchive(env, args.This(), std::move(buffer_copy)); +} + +void Initialize(v8::Local target, + v8::Local unused, + v8::Local context, + void* priv) { + Environment* env = Environment::GetCurrent(context); + v8::Isolate* isolate = env->isolate(); + + v8::Local zip = NewFunctionTemplate(isolate, NewZipArchive); + SetProtoMethod(isolate, zip, "getEntries", ZipArchive::GetEntries); + SetProtoMethod(isolate, zip, "addDirectory", ZipArchive::AddDirectory); + SetProtoMethod(isolate, zip, "addEntry", ZipArchive::AddEntry); + SetProtoMethod(isolate, zip, "deleteEntry", ZipArchive::DeleteEntry); + SetProtoMethod(isolate, zip, "readEntry", ZipArchive::ReadEntry); + SetProtoMethod(isolate, zip, "statEntry", ZipArchive::StatEntry); + SetProtoMethod(isolate, zip, "restatEntry", ZipArchive::RestatEntry); + SetProtoMethod(isolate, zip, "digest", ZipArchive::Digest); + zip->InstanceTemplate()->SetInternalFieldCount(ZipArchive::kInternalFieldCount); + SetConstructorFunction(env->context(), target, "ZipArchive", zip); +} + +void RegisterExternalReferences(ExternalReferenceRegistry* registry) { + registry->Register(NewZipArchive); + registry->Register(ZipArchive::GetEntries); + registry->Register(ZipArchive::AddDirectory); + registry->Register(ZipArchive::AddEntry); + registry->Register(ZipArchive::DeleteEntry); + registry->Register(ZipArchive::ReadEntry); + registry->Register(ZipArchive::StatEntry); + registry->Register(ZipArchive::RestatEntry); + registry->Register(ZipArchive::Digest); +} + +} // namespace archive + +} // end namespace node + +NODE_BINDING_CONTEXT_AWARE_INTERNAL(archive, node::Initialize) +NODE_BINDING_EXTERNAL_REFERENCE(archive, node::RegisterExternalReferences) diff --git a/src/node_binding.cc b/src/node_binding.cc index dc5ddb7b33f221..8ae27fee10ce69 100644 --- a/src/node_binding.cc +++ b/src/node_binding.cc @@ -33,6 +33,7 @@ // node is built as static library. No need to depend on the // __attribute__((constructor)) like mechanism in GCC. #define NODE_BUILTIN_STANDARD_BINDINGS(V) \ + V(archive) \ V(async_wrap) \ V(blob) \ V(block_list) \ diff --git a/src/node_errors.h b/src/node_errors.h index 3f17a80a6278cc..6e123aee2b9886 100644 --- a/src/node_errors.h +++ b/src/node_errors.h @@ -88,6 +88,9 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details); V(ERR_VM_MODULE_LINK_FAILURE, Error) \ V(ERR_WASI_NOT_STARTED, Error) \ V(ERR_WORKER_INIT_FAILED, Error) \ + V(ERR_LIBZIP_ERROR, Error) \ + V(ERR_ZIP_OPENING_FAILED, Error) \ + V(ERR_ZIP_UNSUPPORTED_COMPRESSION, Error) \ V(ERR_PROTO_ACCESS, Error) #define V(code, type) \ diff --git a/src/node_zlib.cc b/src/node_zlib.cc index cda6437034927e..9b15ec81552123 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -33,6 +33,7 @@ #include "brotli/encode.h" #include "brotli/decode.h" +#include "zip.h" #include "zlib.h" #include @@ -1426,6 +1427,50 @@ void DefineZlibConstants(Local target) { NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2); NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES); NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_UNREACHABLE); + + // zip constants + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_DOS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_AMIGA); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_OPENVMS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_UNIX); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_VM_CMS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_ATARI_ST); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_OS_2); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_MACINTOSH); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_Z_SYSTEM); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_CPM); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_WINDOWS_NTFS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_MVS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_VSE); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_ACORN_RISC); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_VFAT); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_ALTERNATE_MVS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_BEOS); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_TANDEM); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_OS_400); + NODE_DEFINE_CONSTANT(target, ZIP_OPSYS_OS_X); + + NODE_DEFINE_CONSTANT(target, ZIP_CM_DEFAULT); + NODE_DEFINE_CONSTANT(target, ZIP_CM_STORE); + NODE_DEFINE_CONSTANT(target, ZIP_CM_SHRINK); + NODE_DEFINE_CONSTANT(target, ZIP_CM_REDUCE_1); + NODE_DEFINE_CONSTANT(target, ZIP_CM_REDUCE_2); + NODE_DEFINE_CONSTANT(target, ZIP_CM_REDUCE_3); + NODE_DEFINE_CONSTANT(target, ZIP_CM_REDUCE_4); + NODE_DEFINE_CONSTANT(target, ZIP_CM_IMPLODE); + NODE_DEFINE_CONSTANT(target, ZIP_CM_DEFLATE); + NODE_DEFINE_CONSTANT(target, ZIP_CM_DEFLATE64); + NODE_DEFINE_CONSTANT(target, ZIP_CM_PKWARE_IMPLODE); + NODE_DEFINE_CONSTANT(target, ZIP_CM_BZIP2); + NODE_DEFINE_CONSTANT(target, ZIP_CM_TERSE); + NODE_DEFINE_CONSTANT(target, ZIP_CM_LZMA); + NODE_DEFINE_CONSTANT(target, ZIP_CM_LZ77); + NODE_DEFINE_CONSTANT(target, ZIP_CM_LZMA2); + NODE_DEFINE_CONSTANT(target, ZIP_CM_ZSTD); + NODE_DEFINE_CONSTANT(target, ZIP_CM_XZ); + NODE_DEFINE_CONSTANT(target, ZIP_CM_JPEG); + NODE_DEFINE_CONSTANT(target, ZIP_CM_WAVPACK); + NODE_DEFINE_CONSTANT(target, ZIP_CM_PPMD); } } // namespace node diff --git a/test/fixtures/corepack.zip b/test/fixtures/corepack.zip new file mode 100644 index 0000000000000000000000000000000000000000..b7eb474b3550e4fe1f7ed8525eb1a414cbed2dab GIT binary patch literal 625393 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

    ozx$9FHJ^kT^a@wzlw#G8dEh5Xpl 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�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

    xy{wNgxyZH6J*v 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%0A1cuDaiT~7S-QsRHmrNn2` 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 literal 0 HcmV?d00001 diff --git a/test/parallel/test-zip-add-precompressed-file.js b/test/parallel/test-zip-add-precompressed-file.js new file mode 100644 index 00000000000000..58ae717753b190 --- /dev/null +++ b/test/parallel/test-zip-add-precompressed-file.js @@ -0,0 +1,21 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { ZipArchive, crc32Sync, deflateRawSync } = require('zlib'); + +const fooFile = Buffer.from('Hello'.repeat(100)); +const compressedFooFile = deflateRawSync(fooFile); +const crc = crc32Sync(fooFile); + +const zip = new ZipArchive(); +zip.addFile('foo.txt', compressedFooFile, { compress: false, size: fooFile.length, crc }); +const buf = zip.digest(); + +const zip2 = new ZipArchive(buf); +const toc = zip2.getEntries(); + +assert.deepStrictEqual(toc, new Map([ + [ 'foo.txt', 0 ], +])); + +assert.deepStrictEqual(zip2.readEntry(0), fooFile); diff --git a/test/parallel/test-zip-add-uncompressed-file.js b/test/parallel/test-zip-add-uncompressed-file.js new file mode 100644 index 00000000000000..bf1eb53040ab98 --- /dev/null +++ b/test/parallel/test-zip-add-uncompressed-file.js @@ -0,0 +1,19 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { ZipArchive } = require('zlib'); + +const fooFile = Buffer.from('Hello'.repeat(100)); + +const zip = new ZipArchive(); +zip.addFile('foo.txt', fooFile); +const buf = zip.digest(); + +const zip2 = new ZipArchive(buf); +const toc = zip2.getEntries(); + +assert.deepStrictEqual(toc, new Map([ + [ 'foo.txt', 0 ], +])); + +assert.deepStrictEqual(zip2.readEntry(0), fooFile); diff --git a/test/parallel/test-zip-err-zip-opening-failed.js b/test/parallel/test-zip-err-zip-opening-failed.js new file mode 100644 index 00000000000000..d69f15705c996d --- /dev/null +++ b/test/parallel/test-zip-err-zip-opening-failed.js @@ -0,0 +1,15 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { ZipArchive } = require('zlib'); +const fixtures = require('../common/fixtures'); + +const archive = fixtures.readSync('elipses.txt'); + +assert.throws(() => { + new ZipArchive(archive); +}, { + message: 'Zip opening failed: Not a zip archive', + code: 'ERR_ZIP_OPENING_FAILED', + name: 'Error', +}); diff --git a/test/parallel/test-zip-list-archive.js b/test/parallel/test-zip-list-archive.js new file mode 100644 index 00000000000000..fdff1c7c46e872 --- /dev/null +++ b/test/parallel/test-zip-list-archive.js @@ -0,0 +1,69 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { ZipArchive } = require('zlib'); +const fixtures = require('../common/fixtures'); + +const archive = fixtures.readSync('corepack.zip'); + +const zip = new ZipArchive(archive); +const toc = zip.getEntries(); + +assert.deepStrictEqual(toc, new Map([ + [ 'package/CHANGELOG.md', 0 ], + [ 'package/LICENSE.md', 1 ], + [ 'package/README.md', 2 ], + [ 'package/dist/corepack.js', 3 ], + [ 'package/dist/npm.js', 4 ], + [ 'package/dist/npx.js', 5 ], + [ 'package/dist/pnpm.js', 6 ], + [ 'package/dist/pnpx.js', 7 ], + [ 'package/dist/vcc.js', 8 ], + // eslint-disable-next-line max-len + [ 'package/dist/vendors-_yarn_berry_cache_proxy-agent-npm-5_0_0-41772f4b01-9_zip_node_modules_proxy-agent_index_js.js', 9 ], + [ 'package/dist/yarn.js', 10 ], + [ 'package/dist/yarnpkg.js', 11 ], + [ 'package/package.json', 12 ], + [ 'package/shims/corepack', 13 ], + [ 'package/shims/corepack.cmd', 14 ], + [ 'package/shims/corepack.ps1', 15 ], + [ 'package/shims/nodewin/corepack', 16 ], + [ 'package/shims/nodewin/corepack.cmd', 17 ], + [ 'package/shims/nodewin/corepack.ps1', 18 ], + [ 'package/shims/nodewin/npm', 19 ], + [ 'package/shims/nodewin/npm.cmd', 20 ], + [ 'package/shims/nodewin/npm.ps1', 21 ], + [ 'package/shims/nodewin/npx', 22 ], + [ 'package/shims/nodewin/npx.cmd', 23 ], + [ 'package/shims/nodewin/npx.ps1', 24 ], + [ 'package/shims/nodewin/pnpm', 25 ], + [ 'package/shims/nodewin/pnpm.cmd', 26 ], + [ 'package/shims/nodewin/pnpm.ps1', 27 ], + [ 'package/shims/nodewin/pnpx', 28 ], + [ 'package/shims/nodewin/pnpx.cmd', 29 ], + [ 'package/shims/nodewin/pnpx.ps1', 30 ], + [ 'package/shims/nodewin/yarn', 31 ], + [ 'package/shims/nodewin/yarn.cmd', 32 ], + [ 'package/shims/nodewin/yarn.ps1', 33 ], + [ 'package/shims/nodewin/yarnpkg', 34 ], + [ 'package/shims/nodewin/yarnpkg.cmd', 35 ], + [ 'package/shims/nodewin/yarnpkg.ps1', 36 ], + [ 'package/shims/npm', 37 ], + [ 'package/shims/npm.cmd', 38 ], + [ 'package/shims/npm.ps1', 39 ], + [ 'package/shims/npx', 40 ], + [ 'package/shims/npx.cmd', 41 ], + [ 'package/shims/npx.ps1', 42 ], + [ 'package/shims/pnpm', 43 ], + [ 'package/shims/pnpm.cmd', 44 ], + [ 'package/shims/pnpm.ps1', 45 ], + [ 'package/shims/pnpx', 46 ], + [ 'package/shims/pnpx.cmd', 47 ], + [ 'package/shims/pnpx.ps1', 48 ], + [ 'package/shims/yarn', 49 ], + [ 'package/shims/yarn.cmd', 50 ], + [ 'package/shims/yarn.ps1', 51 ], + [ 'package/shims/yarnpkg', 52 ], + [ 'package/shims/yarnpkg.cmd', 53 ], + [ 'package/shims/yarnpkg.ps1', 54 ], +])); diff --git a/test/parallel/test-zip-memory-leaks.js b/test/parallel/test-zip-memory-leaks.js new file mode 100644 index 00000000000000..b8e6040b25090e --- /dev/null +++ b/test/parallel/test-zip-memory-leaks.js @@ -0,0 +1,48 @@ +'use strict'; +// Flags: --expose-gc + +require('../common'); +const assert = require('assert'); +const { ZipArchive } = require('zlib'); +const fixtures = require('../common/fixtures'); + +const archive = fixtures.readSync('corepack.zip'); +const payload = 'Hello'.repeat(1000); + +function checkMemory(cb, iter) { + const before = process.memoryUsage().rss; + const tolerance = 8 * 1024 * 1024; + + for (let t = 0; t < iter; ++t) { + cb(); + global.gc(); + } + + const after = process.memoryUsage().rss; + + assert.strictEqual( + Math.max(after - before, tolerance), + tolerance, + new Error('Memory usage exceeded the specified allowance'), + ); +} + +checkMemory(() => { + new ZipArchive(); +}, 100); + +checkMemory(() => { + new ZipArchive(archive); +}, 100); + +checkMemory(() => { + new ZipArchive(archive).digest(); +}, 100); + +{ + const zip = new ZipArchive(); + checkMemory(() => { + zip.addFile('foo.txt', payload); + }, 100); + zip.digest(); +} diff --git a/test/parallel/test-zip-new-archive.js b/test/parallel/test-zip-new-archive.js new file mode 100644 index 00000000000000..6904b67d3b4a2a --- /dev/null +++ b/test/parallel/test-zip-new-archive.js @@ -0,0 +1,21 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { ZipArchive } = require('zlib'); + +const emptyArchive = new Uint8Array([ + 0x50, 0x4B, 0x05, 0x06, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, +]); + +const zip = new ZipArchive(); + +const toc = zip.getEntries(); +assert.deepStrictEqual(toc, new Map()); + +const buf = zip.digest(); +assert.deepStrictEqual(buf.buffer, emptyArchive.buffer); From 5cb254d1d5134d15735774fc415e122009672be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Fri, 6 Jan 2023 22:15:32 +0100 Subject: [PATCH 2/2] Adds a section to the documentation --- doc/api/zlib.md | 58 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/doc/api/zlib.md b/doc/api/zlib.md index a57783ab6a35e8..b321186344b300 100644 --- a/doc/api/zlib.md +++ b/doc/api/zlib.md @@ -254,6 +254,42 @@ possible to determine whether the input ended prematurely or lacks the integrity checks, making it necessary to manually check that the decompressed result is valid. +## Compressing multiple files together + + + +The `zlib` library provides ways to compress individual objects, but not to +aggregate multiple ones into a single file suitable for redistribution (what +is often called archival). + +To this end, `node:zip` provides the `ZipArchive` class which allows to create, +read, and modify zip archives: + +```js +const fs = require('node:fs'); +const { ZipArchive } = require('node:zlib'); + +const zip = new ZipArchive(); +zip.addFile('README.md', fs.readFileSync('README.md')); +const data = zip.digest(); + +fs.writeFileSync('archive.zip', data); +``` + +The constructor accepts a buffer instance as parameter, which can be useful to +inspect the content of existing archives: + +```js +const fs = require('node:fs'); +const { ZipArchive } = require('node:zlib'); + +const zip = new ZipArchive(fs.readFileSync('archive.zip')); +const entries = zip.getEntries(); +const file = zip.readEntry(entries.get('README.md')); +``` + ## Memory usage tuning @@ -1294,17 +1330,6 @@ added: REPLACEME > Stability: 1 - Experimental. -### `zip.getEntries([options])` - -* `options` {Object} - * `withFileTypes` {boolean|null} **Default:** `false` -* Returns: {Map} Returns a map where keys are paths and values are numbers - suitable for use in other functions accepting entry numbers. - -Returns a map of all the entries within the zip archive. Because of how zip -works, not all entries are files: some may be directories too. To know their -types for sure, set the `withFileTypes` option to true. - ### `zip.addFile(path, data[, options])`

    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