From 8bd57adaea862c161ef22745a7c45bec31f85a90 Mon Sep 17 00:00:00 2001 From: Dmitry Gerasimov <dmitriy.gerasimov@demlabs.net> Date: Wed, 27 Apr 2022 18:21:29 +0700 Subject: [PATCH] [+] libzip --- 3rdparty/libzip/.clang-format | 12 + .../.github/ISSUE_TEMPLATE/bug-report.md | 32 + .../.github/ISSUE_TEMPLATE/compile-error.md | 25 + .../.github/ISSUE_TEMPLATE/feature-request.md | 22 + 3rdparty/libzip/.github/workflows/build.yml | 46 + .../.github/workflows/codeql-analysis.yml | 66 + 3rdparty/libzip/.github/workflows/main.yml | 23 + 3rdparty/libzip/API-CHANGES.md | 162 ++ 3rdparty/libzip/AUTHORS | 2 + 3rdparty/libzip/CMakeLists.txt | 446 ++++++ 3rdparty/libzip/INSTALL.md | 69 + 3rdparty/libzip/LICENSE | 31 + 3rdparty/libzip/NEWS.md | 289 ++++ 3rdparty/libzip/README.md | 39 + 3rdparty/libzip/THANKS | 120 ++ 3rdparty/libzip/TODO.md | 179 +++ 3rdparty/libzip/android/do.sh | 63 + 3rdparty/libzip/android/docker/Dockerfile | 122 ++ 3rdparty/libzip/android/readme.txt | 10 + 3rdparty/libzip/appveyor.yml | 81 + .../cmake-compat/CMakePushCheckState.cmake | 91 ++ .../cmake-compat/CheckLibraryExists.cmake | 102 ++ .../cmake-compat/CheckSymbolExists.cmake | 169 ++ 3rdparty/libzip/cmake-compat/FindBZip2.cmake | 104 ++ 3rdparty/libzip/cmake-compat/FindGnuTLS.cmake | 82 + .../libzip/cmake-compat/FindLibLZMA.cmake | 124 ++ .../FindPackageHandleStandardArgs.cmake | 453 ++++++ .../cmake-compat/FindPackageMessage.cmake | 48 + .../SelectLibraryConfigurations.cmake | 80 + 3rdparty/libzip/cmake-config.h.in | 63 + 3rdparty/libzip/cmake-zipconf.h.in | 47 + 3rdparty/libzip/cmake/Dist.cmake | 83 + 3rdparty/libzip/cmake/FindMbedTLS.cmake | 132 ++ 3rdparty/libzip/cmake/FindNettle.cmake | 141 ++ 3rdparty/libzip/cmake/FindZstd.cmake | 135 ++ 3rdparty/libzip/examples/CMakeLists.txt | 3 + 3rdparty/libzip/examples/in-memory.c | 217 +++ 3rdparty/libzip/examples/windows-open.c | 60 + 3rdparty/libzip/lib/CMakeLists.txt | 242 +++ 3rdparty/libzip/lib/compat.h | 194 +++ 3rdparty/libzip/lib/zip.h | 484 ++++++ 3rdparty/libzip/lib/zip_add.c | 49 + 3rdparty/libzip/lib/zip_add_dir.c | 44 + 3rdparty/libzip/lib/zip_add_entry.c | 80 + 3rdparty/libzip/lib/zip_algorithm_bzip2.c | 285 ++++ 3rdparty/libzip/lib/zip_algorithm_deflate.c | 265 +++ 3rdparty/libzip/lib/zip_algorithm_xz.c | 406 +++++ 3rdparty/libzip/lib/zip_algorithm_zstd.c | 294 ++++ 3rdparty/libzip/lib/zip_buffer.c | 324 ++++ 3rdparty/libzip/lib/zip_close.c | 698 ++++++++ 3rdparty/libzip/lib/zip_crypto.h | 54 + 3rdparty/libzip/lib/zip_crypto_commoncrypto.c | 110 ++ 3rdparty/libzip/lib/zip_crypto_commoncrypto.h | 53 + 3rdparty/libzip/lib/zip_crypto_gnutls.c | 134 ++ 3rdparty/libzip/lib/zip_crypto_gnutls.h | 68 + 3rdparty/libzip/lib/zip_crypto_mbedtls.c | 162 ++ 3rdparty/libzip/lib/zip_crypto_mbedtls.h | 56 + 3rdparty/libzip/lib/zip_crypto_openssl.c | 137 ++ 3rdparty/libzip/lib/zip_crypto_openssl.h | 56 + 3rdparty/libzip/lib/zip_crypto_win.c | 495 ++++++ 3rdparty/libzip/lib/zip_crypto_win.h | 53 + 3rdparty/libzip/lib/zip_delete.c | 68 + 3rdparty/libzip/lib/zip_dir_add.c | 92 ++ 3rdparty/libzip/lib/zip_dirent.c | 1163 ++++++++++++++ 3rdparty/libzip/lib/zip_discard.c | 80 + 3rdparty/libzip/lib/zip_entry.c | 51 + 3rdparty/libzip/lib/zip_error.c | 151 ++ 3rdparty/libzip/lib/zip_error_clear.c | 44 + 3rdparty/libzip/lib/zip_error_get.c | 54 + 3rdparty/libzip/lib/zip_error_get_sys_type.c | 45 + 3rdparty/libzip/lib/zip_error_strerror.c | 108 ++ 3rdparty/libzip/lib/zip_error_to_str.c | 67 + 3rdparty/libzip/lib/zip_extra_field.c | 426 +++++ 3rdparty/libzip/lib/zip_extra_field_api.c | 355 +++++ 3rdparty/libzip/lib/zip_fclose.c | 54 + 3rdparty/libzip/lib/zip_fdopen.c | 86 + 3rdparty/libzip/lib/zip_file_add.c | 52 + 3rdparty/libzip/lib/zip_file_error_clear.c | 44 + 3rdparty/libzip/lib/zip_file_error_get.c | 41 + 3rdparty/libzip/lib/zip_file_get_comment.c | 55 + .../lib/zip_file_get_external_attributes.c | 50 + 3rdparty/libzip/lib/zip_file_get_offset.c | 117 ++ 3rdparty/libzip/lib/zip_file_rename.c | 67 + 3rdparty/libzip/lib/zip_file_replace.c | 105 ++ 3rdparty/libzip/lib/zip_file_set_comment.c | 101 ++ 3rdparty/libzip/lib/zip_file_set_encryption.c | 116 ++ .../lib/zip_file_set_external_attributes.c | 82 + 3rdparty/libzip/lib/zip_file_set_mtime.c | 68 + 3rdparty/libzip/lib/zip_file_strerror.c | 41 + 3rdparty/libzip/lib/zip_fopen.c | 46 + 3rdparty/libzip/lib/zip_fopen_encrypted.c | 46 + 3rdparty/libzip/lib/zip_fopen_index.c | 41 + .../libzip/lib/zip_fopen_index_encrypted.c | 87 + 3rdparty/libzip/lib/zip_fread.c | 62 + 3rdparty/libzip/lib/zip_fseek.c | 51 + 3rdparty/libzip/lib/zip_ftell.c | 54 + 3rdparty/libzip/lib/zip_get_archive_comment.c | 58 + 3rdparty/libzip/lib/zip_get_archive_flag.c | 45 + .../lib/zip_get_encryption_implementation.c | 62 + 3rdparty/libzip/lib/zip_get_file_comment.c | 50 + 3rdparty/libzip/lib/zip_get_name.c | 58 + 3rdparty/libzip/lib/zip_get_num_entries.c | 52 + 3rdparty/libzip/lib/zip_get_num_files.c | 51 + 3rdparty/libzip/lib/zip_hash.c | 410 +++++ 3rdparty/libzip/lib/zip_io_util.c | 134 ++ 3rdparty/libzip/lib/zip_libzip_version.c | 41 + 3rdparty/libzip/lib/zip_memdup.c | 56 + 3rdparty/libzip/lib/zip_mkstempm.c | 93 ++ 3rdparty/libzip/lib/zip_name_locate.c | 92 ++ 3rdparty/libzip/lib/zip_new.c | 73 + 3rdparty/libzip/lib/zip_open.c | 861 ++++++++++ 3rdparty/libzip/lib/zip_pkware.c | 112 ++ 3rdparty/libzip/lib/zip_progress.c | 293 ++++ 3rdparty/libzip/lib/zip_random_unix.c | 104 ++ 3rdparty/libzip/lib/zip_random_uwp.c | 82 + 3rdparty/libzip/lib/zip_random_win32.c | 81 + 3rdparty/libzip/lib/zip_rename.c | 42 + 3rdparty/libzip/lib/zip_replace.c | 42 + 3rdparty/libzip/lib/zip_set_archive_comment.c | 80 + 3rdparty/libzip/lib/zip_set_archive_flag.c | 65 + .../libzip/lib/zip_set_default_password.c | 58 + 3rdparty/libzip/lib/zip_set_file_comment.c | 46 + .../libzip/lib/zip_set_file_compression.c | 91 ++ 3rdparty/libzip/lib/zip_set_name.c | 157 ++ 3rdparty/libzip/lib/zip_source_accept_empty.c | 52 + 3rdparty/libzip/lib/zip_source_begin_write.c | 52 + .../lib/zip_source_begin_write_cloning.c | 52 + 3rdparty/libzip/lib/zip_source_buffer.c | 620 ++++++++ 3rdparty/libzip/lib/zip_source_call.c | 68 + 3rdparty/libzip/lib/zip_source_close.c | 57 + 3rdparty/libzip/lib/zip_source_commit_write.c | 63 + 3rdparty/libzip/lib/zip_source_compress.c | 398 +++++ 3rdparty/libzip/lib/zip_source_crc.c | 198 +++ 3rdparty/libzip/lib/zip_source_error.c | 46 + 3rdparty/libzip/lib/zip_source_file.h | 90 ++ 3rdparty/libzip/lib/zip_source_file_common.c | 378 +++++ 3rdparty/libzip/lib/zip_source_file_stdio.c | 208 +++ 3rdparty/libzip/lib/zip_source_file_stdio.h | 47 + .../libzip/lib/zip_source_file_stdio_named.c | 313 ++++ 3rdparty/libzip/lib/zip_source_file_win32.c | 234 +++ 3rdparty/libzip/lib/zip_source_file_win32.h | 76 + .../libzip/lib/zip_source_file_win32_ansi.c | 85 + .../libzip/lib/zip_source_file_win32_named.c | 275 ++++ .../libzip/lib/zip_source_file_win32_utf16.c | 111 ++ .../libzip/lib/zip_source_file_win32_utf8.c | 73 + 3rdparty/libzip/lib/zip_source_free.c | 71 + 3rdparty/libzip/lib/zip_source_function.c | 98 ++ .../lib/zip_source_get_file_attributes.c | 106 ++ 3rdparty/libzip/lib/zip_source_is_deleted.c | 41 + 3rdparty/libzip/lib/zip_source_layered.c | 67 + 3rdparty/libzip/lib/zip_source_open.c | 76 + .../libzip/lib/zip_source_pkware_decode.c | 220 +++ .../libzip/lib/zip_source_pkware_encode.c | 249 +++ 3rdparty/libzip/lib/zip_source_read.c | 96 ++ 3rdparty/libzip/lib/zip_source_remove.c | 60 + .../libzip/lib/zip_source_rollback_write.c | 46 + 3rdparty/libzip/lib/zip_source_seek.c | 95 ++ 3rdparty/libzip/lib/zip_source_seek_write.c | 51 + 3rdparty/libzip/lib/zip_source_stat.c | 62 + 3rdparty/libzip/lib/zip_source_supports.c | 65 + 3rdparty/libzip/lib/zip_source_tell.c | 57 + 3rdparty/libzip/lib/zip_source_tell_write.c | 46 + 3rdparty/libzip/lib/zip_source_window.c | 338 ++++ .../libzip/lib/zip_source_winzip_aes_decode.c | 265 +++ .../libzip/lib/zip_source_winzip_aes_encode.c | 254 +++ 3rdparty/libzip/lib/zip_source_write.c | 46 + 3rdparty/libzip/lib/zip_source_zip.c | 59 + 3rdparty/libzip/lib/zip_source_zip_new.c | 190 +++ 3rdparty/libzip/lib/zip_stat.c | 46 + 3rdparty/libzip/lib/zip_stat_index.c | 80 + 3rdparty/libzip/lib/zip_stat_init.c | 83 + 3rdparty/libzip/lib/zip_strerror.c | 41 + 3rdparty/libzip/lib/zip_string.c | 178 +++ 3rdparty/libzip/lib/zip_unchange.c | 93 ++ 3rdparty/libzip/lib/zip_unchange_all.c | 54 + 3rdparty/libzip/lib/zip_unchange_archive.c | 51 + 3rdparty/libzip/lib/zip_unchange_data.c | 53 + 3rdparty/libzip/lib/zip_utf-8.c | 226 +++ 3rdparty/libzip/lib/zip_winzip_aes.c | 162 ++ 3rdparty/libzip/lib/zipint.h | 647 ++++++++ 3rdparty/libzip/libzip-config.cmake.in | 11 + 3rdparty/libzip/libzip.pc.in | 15 + 3rdparty/libzip/man/CMakeLists.txt | 165 ++ 3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.html | 114 ++ 3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.man | 83 + 3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc | 79 + 3rdparty/libzip/man/handle_links | 74 + 3rdparty/libzip/man/libzip.html | 266 ++++ 3rdparty/libzip/man/libzip.man | 322 ++++ 3rdparty/libzip/man/libzip.mdoc | 262 +++ 3rdparty/libzip/man/links | 23 + 3rdparty/libzip/man/update-html.cmake | 12 + 3rdparty/libzip/man/update-man.cmake | 7 + 3rdparty/libzip/man/zip_add.html | 121 ++ 3rdparty/libzip/man/zip_add.man | 106 ++ 3rdparty/libzip/man/zip_add.mdoc | 96 ++ 3rdparty/libzip/man/zip_add_dir.html | 102 ++ 3rdparty/libzip/man/zip_add_dir.man | 74 + 3rdparty/libzip/man/zip_add_dir.mdoc | 69 + 3rdparty/libzip/man/zip_close.html | 151 ++ 3rdparty/libzip/man/zip_close.man | 142 ++ 3rdparty/libzip/man/zip_close.mdoc | 125 ++ .../man/zip_compression_method_supported.html | 105 ++ .../man/zip_compression_method_supported.man | 70 + .../man/zip_compression_method_supported.mdoc | 65 + 3rdparty/libzip/man/zip_delete.html | 114 ++ 3rdparty/libzip/man/zip_delete.man | 84 + 3rdparty/libzip/man/zip_delete.mdoc | 80 + 3rdparty/libzip/man/zip_dir_add.html | 134 ++ 3rdparty/libzip/man/zip_dir_add.man | 116 ++ 3rdparty/libzip/man/zip_dir_add.mdoc | 109 ++ 3rdparty/libzip/man/zip_discard.html | 97 ++ 3rdparty/libzip/man/zip_discard.man | 66 + 3rdparty/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 + 3rdparty/libzip/man/zip_error_clear.html | 104 ++ 3rdparty/libzip/man/zip_error_clear.man | 79 + 3rdparty/libzip/man/zip_error_clear.mdoc | 69 + .../libzip/man/zip_error_code_system.html | 99 ++ 3rdparty/libzip/man/zip_error_code_system.man | 68 + .../libzip/man/zip_error_code_system.mdoc | 63 + 3rdparty/libzip/man/zip_error_code_zip.html | 96 ++ 3rdparty/libzip/man/zip_error_code_zip.man | 65 + 3rdparty/libzip/man/zip_error_code_zip.mdoc | 60 + 3rdparty/libzip/man/zip_error_fini.html | 97 ++ 3rdparty/libzip/man/zip_error_fini.man | 65 + 3rdparty/libzip/man/zip_error_fini.mdoc | 60 + 3rdparty/libzip/man/zip_error_get.html | 150 ++ 3rdparty/libzip/man/zip_error_get.man | 139 ++ 3rdparty/libzip/man/zip_error_get.mdoc | 117 ++ .../libzip/man/zip_error_get_sys_type.html | 116 ++ .../libzip/man/zip_error_get_sys_type.man | 88 + .../libzip/man/zip_error_get_sys_type.mdoc | 77 + 3rdparty/libzip/man/zip_error_init.html | 108 ++ 3rdparty/libzip/man/zip_error_init.man | 85 + 3rdparty/libzip/man/zip_error_init.mdoc | 76 + 3rdparty/libzip/man/zip_error_set.html | 101 ++ 3rdparty/libzip/man/zip_error_set.man | 74 + 3rdparty/libzip/man/zip_error_set.mdoc | 69 + 3rdparty/libzip/man/zip_error_strerror.html | 101 ++ 3rdparty/libzip/man/zip_error_strerror.man | 72 + 3rdparty/libzip/man/zip_error_strerror.mdoc | 67 + .../libzip/man/zip_error_system_type.html | 107 ++ 3rdparty/libzip/man/zip_error_system_type.man | 83 + .../libzip/man/zip_error_system_type.mdoc | 77 + 3rdparty/libzip/man/zip_error_to_data.html | 108 ++ 3rdparty/libzip/man/zip_error_to_data.man | 74 + 3rdparty/libzip/man/zip_error_to_data.mdoc | 69 + 3rdparty/libzip/man/zip_error_to_str.html | 124 ++ 3rdparty/libzip/man/zip_error_to_str.man | 99 ++ 3rdparty/libzip/man/zip_error_to_str.mdoc | 88 + 3rdparty/libzip/man/zip_errors.html | 150 ++ 3rdparty/libzip/man/zip_errors.man | 147 ++ 3rdparty/libzip/man/zip_errors.mdoc | 117 ++ 3rdparty/libzip/man/zip_fclose.html | 103 ++ 3rdparty/libzip/man/zip_fclose.man | 70 + 3rdparty/libzip/man/zip_fclose.mdoc | 65 + 3rdparty/libzip/man/zip_fdopen.html | 154 ++ 3rdparty/libzip/man/zip_fdopen.man | 158 ++ 3rdparty/libzip/man/zip_fdopen.mdoc | 147 ++ 3rdparty/libzip/man/zip_file_add.html | 178 +++ 3rdparty/libzip/man/zip_file_add.man | 183 +++ 3rdparty/libzip/man/zip_file_add.mdoc | 164 ++ .../libzip/man/zip_file_attributes_init.html | 97 ++ .../libzip/man/zip_file_attributes_init.man | 66 + .../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 ++ .../libzip/man/zip_file_extra_field_get.html | 176 ++ .../libzip/man/zip_file_extra_field_get.man | 169 ++ .../libzip/man/zip_file_extra_field_get.mdoc | 157 ++ .../libzip/man/zip_file_extra_field_set.html | 148 ++ .../libzip/man/zip_file_extra_field_set.man | 123 ++ .../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 ++ 3rdparty/libzip/man/zip_file_get_comment.html | 143 ++ 3rdparty/libzip/man/zip_file_get_comment.man | 126 ++ 3rdparty/libzip/man/zip_file_get_comment.mdoc | 119 ++ 3rdparty/libzip/man/zip_file_get_error.html | 95 ++ 3rdparty/libzip/man/zip_file_get_error.man | 62 + 3rdparty/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 ++ 3rdparty/libzip/man/zip_file_rename.html | 132 ++ 3rdparty/libzip/man/zip_file_rename.man | 111 ++ 3rdparty/libzip/man/zip_file_rename.mdoc | 104 ++ 3rdparty/libzip/man/zip_file_set_comment.html | 137 ++ 3rdparty/libzip/man/zip_file_set_comment.man | 123 ++ 3rdparty/libzip/man/zip_file_set_comment.mdoc | 116 ++ .../libzip/man/zip_file_set_encryption.html | 150 ++ .../libzip/man/zip_file_set_encryption.man | 132 ++ .../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 ++ 3rdparty/libzip/man/zip_file_set_mtime.html | 164 ++ 3rdparty/libzip/man/zip_file_set_mtime.man | 141 ++ 3rdparty/libzip/man/zip_file_set_mtime.mdoc | 124 ++ 3rdparty/libzip/man/zip_file_strerror.html | 115 ++ 3rdparty/libzip/man/zip_file_strerror.man | 95 ++ 3rdparty/libzip/man/zip_file_strerror.mdoc | 85 + 3rdparty/libzip/man/zip_fopen.html | 171 ++ 3rdparty/libzip/man/zip_fopen.man | 166 ++ 3rdparty/libzip/man/zip_fopen.mdoc | 147 ++ 3rdparty/libzip/man/zip_fopen_encrypted.html | 158 ++ 3rdparty/libzip/man/zip_fopen_encrypted.man | 144 ++ 3rdparty/libzip/man/zip_fopen_encrypted.mdoc | 135 ++ 3rdparty/libzip/man/zip_fread.html | 110 ++ 3rdparty/libzip/man/zip_fread.man | 83 + 3rdparty/libzip/man/zip_fread.mdoc | 78 + 3rdparty/libzip/man/zip_fseek.html | 110 ++ 3rdparty/libzip/man/zip_fseek.man | 80 + 3rdparty/libzip/man/zip_fseek.mdoc | 75 + 3rdparty/libzip/man/zip_ftell.html | 105 ++ 3rdparty/libzip/man/zip_ftell.man | 71 + 3rdparty/libzip/man/zip_ftell.mdoc | 66 + .../libzip/man/zip_get_archive_comment.html | 131 ++ .../libzip/man/zip_get_archive_comment.man | 115 ++ .../libzip/man/zip_get_archive_comment.mdoc | 112 ++ 3rdparty/libzip/man/zip_get_archive_flag.html | 118 ++ 3rdparty/libzip/man/zip_get_archive_flag.man | 98 ++ 3rdparty/libzip/man/zip_get_archive_flag.mdoc | 94 ++ 3rdparty/libzip/man/zip_get_error.html | 97 ++ 3rdparty/libzip/man/zip_get_error.man | 65 + 3rdparty/libzip/man/zip_get_error.mdoc | 60 + 3rdparty/libzip/man/zip_get_file_comment.html | 105 ++ 3rdparty/libzip/man/zip_get_file_comment.man | 78 + 3rdparty/libzip/man/zip_get_file_comment.mdoc | 73 + 3rdparty/libzip/man/zip_get_name.html | 146 ++ 3rdparty/libzip/man/zip_get_name.man | 141 ++ 3rdparty/libzip/man/zip_get_name.mdoc | 132 ++ 3rdparty/libzip/man/zip_get_num_entries.html | 111 ++ 3rdparty/libzip/man/zip_get_num_entries.man | 87 + 3rdparty/libzip/man/zip_get_num_entries.mdoc | 82 + 3rdparty/libzip/man/zip_get_num_files.html | 110 ++ 3rdparty/libzip/man/zip_get_num_files.man | 80 + 3rdparty/libzip/man/zip_get_num_files.mdoc | 75 + 3rdparty/libzip/man/zip_libzip_version.html | 98 ++ 3rdparty/libzip/man/zip_libzip_version.man | 71 + 3rdparty/libzip/man/zip_libzip_version.mdoc | 66 + 3rdparty/libzip/man/zip_name_locate.html | 149 ++ 3rdparty/libzip/man/zip_name_locate.man | 137 ++ 3rdparty/libzip/man/zip_name_locate.mdoc | 125 ++ 3rdparty/libzip/man/zip_open.html | 176 ++ 3rdparty/libzip/man/zip_open.man | 192 +++ 3rdparty/libzip/man/zip_open.mdoc | 170 ++ ...p_register_cancel_callback_with_state.html | 121 ++ ...ip_register_cancel_callback_with_state.man | 94 ++ ...p_register_cancel_callback_with_state.mdoc | 88 + .../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 + 3rdparty/libzip/man/zip_rename.html | 104 ++ 3rdparty/libzip/man/zip_rename.man | 75 + 3rdparty/libzip/man/zip_rename.mdoc | 70 + .../libzip/man/zip_set_archive_comment.html | 124 ++ .../libzip/man/zip_set_archive_comment.man | 98 ++ .../libzip/man/zip_set_archive_comment.mdoc | 93 ++ 3rdparty/libzip/man/zip_set_archive_flag.html | 107 ++ 3rdparty/libzip/man/zip_set_archive_flag.man | 79 + 3rdparty/libzip/man/zip_set_archive_flag.mdoc | 74 + .../libzip/man/zip_set_default_password.html | 123 ++ .../libzip/man/zip_set_default_password.man | 94 ++ .../libzip/man/zip_set_default_password.mdoc | 90 ++ 3rdparty/libzip/man/zip_set_file_comment.html | 109 ++ 3rdparty/libzip/man/zip_set_file_comment.man | 84 + 3rdparty/libzip/man/zip_set_file_comment.mdoc | 79 + .../libzip/man/zip_set_file_compression.html | 162 ++ .../libzip/man/zip_set_file_compression.man | 155 ++ .../libzip/man/zip_set_file_compression.mdoc | 145 ++ 3rdparty/libzip/man/zip_source.html | 119 ++ 3rdparty/libzip/man/zip_source.man | 91 ++ 3rdparty/libzip/man/zip_source.mdoc | 90 ++ .../libzip/man/zip_source_begin_write.html | 123 ++ .../libzip/man/zip_source_begin_write.man | 99 ++ .../libzip/man/zip_source_begin_write.mdoc | 89 ++ 3rdparty/libzip/man/zip_source_buffer.html | 135 ++ 3rdparty/libzip/man/zip_source_buffer.man | 112 ++ 3rdparty/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 ++ 3rdparty/libzip/man/zip_source_close.html | 105 ++ 3rdparty/libzip/man/zip_source_close.man | 72 + 3rdparty/libzip/man/zip_source_close.mdoc | 67 + .../libzip/man/zip_source_commit_write.html | 109 ++ .../libzip/man/zip_source_commit_write.man | 75 + .../libzip/man/zip_source_commit_write.mdoc | 70 + 3rdparty/libzip/man/zip_source_error.html | 97 ++ 3rdparty/libzip/man/zip_source_error.man | 65 + 3rdparty/libzip/man/zip_source_error.mdoc | 60 + 3rdparty/libzip/man/zip_source_file.html | 141 ++ 3rdparty/libzip/man/zip_source_file.man | 125 ++ 3rdparty/libzip/man/zip_source_file.mdoc | 114 ++ 3rdparty/libzip/man/zip_source_filep.html | 137 ++ 3rdparty/libzip/man/zip_source_filep.man | 117 ++ 3rdparty/libzip/man/zip_source_filep.mdoc | 107 ++ 3rdparty/libzip/man/zip_source_free.html | 104 ++ 3rdparty/libzip/man/zip_source_free.man | 81 + 3rdparty/libzip/man/zip_source_free.mdoc | 76 + 3rdparty/libzip/man/zip_source_function.html | 380 +++++ 3rdparty/libzip/man/zip_source_function.man | 413 +++++ 3rdparty/libzip/man/zip_source_function.mdoc | 399 +++++ .../libzip/man/zip_source_is_deleted.html | 103 ++ 3rdparty/libzip/man/zip_source_is_deleted.man | 67 + .../libzip/man/zip_source_is_deleted.mdoc | 62 + 3rdparty/libzip/man/zip_source_keep.html | 97 ++ 3rdparty/libzip/man/zip_source_keep.man | 65 + 3rdparty/libzip/man/zip_source_keep.mdoc | 60 + .../man/zip_source_make_command_bitmap.html | 99 ++ .../man/zip_source_make_command_bitmap.man | 67 + .../man/zip_source_make_command_bitmap.mdoc | 62 + 3rdparty/libzip/man/zip_source_open.html | 108 ++ 3rdparty/libzip/man/zip_source_open.man | 75 + 3rdparty/libzip/man/zip_source_open.mdoc | 70 + 3rdparty/libzip/man/zip_source_read.html | 112 ++ 3rdparty/libzip/man/zip_source_read.man | 83 + 3rdparty/libzip/man/zip_source_read.mdoc | 78 + .../libzip/man/zip_source_rollback_write.html | 110 ++ .../libzip/man/zip_source_rollback_write.man | 78 + .../libzip/man/zip_source_rollback_write.mdoc | 73 + 3rdparty/libzip/man/zip_source_seek.html | 120 ++ 3rdparty/libzip/man/zip_source_seek.man | 89 ++ 3rdparty/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 + .../libzip/man/zip_source_seek_write.html | 123 ++ 3rdparty/libzip/man/zip_source_seek_write.man | 92 ++ .../libzip/man/zip_source_seek_write.mdoc | 84 + 3rdparty/libzip/man/zip_source_stat.html | 154 ++ 3rdparty/libzip/man/zip_source_stat.man | 144 ++ 3rdparty/libzip/man/zip_source_stat.mdoc | 125 ++ 3rdparty/libzip/man/zip_source_tell.html | 108 ++ 3rdparty/libzip/man/zip_source_tell.man | 79 + 3rdparty/libzip/man/zip_source_tell.mdoc | 74 + .../libzip/man/zip_source_tell_write.html | 112 ++ 3rdparty/libzip/man/zip_source_tell_write.man | 82 + .../libzip/man/zip_source_tell_write.mdoc | 77 + 3rdparty/libzip/man/zip_source_win32a.html | 143 ++ 3rdparty/libzip/man/zip_source_win32a.man | 127 ++ 3rdparty/libzip/man/zip_source_win32a.mdoc | 116 ++ .../libzip/man/zip_source_win32handle.html | 143 ++ .../libzip/man/zip_source_win32handle.man | 127 ++ .../libzip/man/zip_source_win32handle.mdoc | 116 ++ 3rdparty/libzip/man/zip_source_win32w.html | 142 ++ 3rdparty/libzip/man/zip_source_win32w.man | 125 ++ 3rdparty/libzip/man/zip_source_win32w.mdoc | 114 ++ 3rdparty/libzip/man/zip_source_window.html | 123 ++ 3rdparty/libzip/man/zip_source_window.man | 96 ++ 3rdparty/libzip/man/zip_source_window.mdoc | 91 ++ 3rdparty/libzip/man/zip_source_write.html | 115 ++ 3rdparty/libzip/man/zip_source_write.man | 85 + 3rdparty/libzip/man/zip_source_write.mdoc | 80 + 3rdparty/libzip/man/zip_source_zip.html | 157 ++ 3rdparty/libzip/man/zip_source_zip.man | 145 ++ 3rdparty/libzip/man/zip_source_zip.mdoc | 131 ++ 3rdparty/libzip/man/zip_stat.html | 190 +++ 3rdparty/libzip/man/zip_stat.man | 203 +++ 3rdparty/libzip/man/zip_stat.mdoc | 179 +++ 3rdparty/libzip/man/zip_stat_init.html | 109 ++ 3rdparty/libzip/man/zip_stat_init.man | 81 + 3rdparty/libzip/man/zip_stat_init.mdoc | 76 + 3rdparty/libzip/man/zip_unchange.html | 116 ++ 3rdparty/libzip/man/zip_unchange.man | 86 + 3rdparty/libzip/man/zip_unchange.mdoc | 81 + 3rdparty/libzip/man/zip_unchange_all.html | 103 ++ 3rdparty/libzip/man/zip_unchange_all.man | 69 + 3rdparty/libzip/man/zip_unchange_all.mdoc | 64 + 3rdparty/libzip/man/zip_unchange_archive.html | 103 ++ 3rdparty/libzip/man/zip_unchange_archive.man | 69 + 3rdparty/libzip/man/zip_unchange_archive.mdoc | 64 + 3rdparty/libzip/man/zipcmp.html | 126 ++ 3rdparty/libzip/man/zipcmp.man | 102 ++ 3rdparty/libzip/man/zipcmp.mdoc | 95 ++ 3rdparty/libzip/man/zipmerge.html | 132 ++ 3rdparty/libzip/man/zipmerge.man | 104 ++ 3rdparty/libzip/man/zipmerge.mdoc | 98 ++ 3rdparty/libzip/man/ziptool.html | 315 ++++ 3rdparty/libzip/man/ziptool.man | 389 +++++ 3rdparty/libzip/man/ziptool.mdoc | 330 ++++ 3rdparty/libzip/regress/CMakeLists.txt | 96 ++ 3rdparty/libzip/regress/NiHTest.pm | 1415 +++++++++++++++++ 3rdparty/libzip/regress/add_dir.test | 4 + 3rdparty/libzip/regress/add_from_buffer.test | 4 + 3rdparty/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 + 3rdparty/libzip/regress/add_from_filep.c | 96 ++ 3rdparty/libzip/regress/add_from_filep.test | 6 + 3rdparty/libzip/regress/add_from_stdin.test | 5 + .../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 + .../libzip/regress/add_from_zip_stored.test | 5 + 3rdparty/libzip/regress/add_stored.test | 4 + .../libzip/regress/add_stored_in_memory.test | 4 + 3rdparty/libzip/regress/bigstored.zh | Bin 0 -> 24632 bytes 3rdparty/libzip/regress/bigzero-zip.zip | Bin 0 -> 10490 bytes 3rdparty/libzip/regress/bogus.zip | 1 + 3rdparty/libzip/regress/broken.zip | Bin 0 -> 75091 bytes .../libzip/regress/buffer-fragment-read.test | 5 + .../libzip/regress/buffer-fragment-write.test | 4 + 3rdparty/libzip/regress/can_clone_file.c | 127 ++ 3rdparty/libzip/regress/cancel_45.test | 8 + 3rdparty/libzip/regress/cancel_90.test | 10 + 3rdparty/libzip/regress/cleanup.cmake | 7 + 3rdparty/libzip/regress/clone-buffer-add.test | 4 + .../libzip/regress/clone-buffer-delete.test | 4 + .../libzip/regress/clone-buffer-replace.test | 4 + 3rdparty/libzip/regress/clone-fs-add.test | 5 + 3rdparty/libzip/regress/clone-fs-delete.test | 5 + 3rdparty/libzip/regress/clone-fs-replace.test | 5 + 3rdparty/libzip/regress/cm-default.test | 5 + 3rdparty/libzip/regress/cm-default.zip | Bin 0 -> 8702 bytes 3rdparty/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 + 3rdparty/libzip/regress/delete_add_same.test | 5 + 3rdparty/libzip/regress/delete_invalid.test | 5 + 3rdparty/libzip/regress/delete_last.test | 4 + .../libzip/regress/delete_multiple_last.test | 4 + .../regress/delete_multiple_partial.test | 4 + .../libzip/regress/delete_renamed_rename.test | 5 + 3rdparty/libzip/regress/encrypt-1234.zip | Bin 0 -> 380 bytes .../regress/encrypt-aes128-noentropy.zip | Bin 0 -> 260 bytes 3rdparty/libzip/regress/encrypt-aes128.zip | Bin 0 -> 260 bytes .../regress/encrypt-aes192-noentropy.zip | Bin 0 -> 264 bytes 3rdparty/libzip/regress/encrypt-aes192.zip | Bin 0 -> 316 bytes .../regress/encrypt-aes256-noentropy.zip | Bin 0 -> 268 bytes 3rdparty/libzip/regress/encrypt-aes256.zip | Bin 0 -> 320 bytes 3rdparty/libzip/regress/encrypt-none.zip | Bin 0 -> 218 bytes .../regress/encrypt-pkware-noentropy.zip | Bin 0 -> 246 bytes 3rdparty/libzip/regress/encrypt.test | 23 + 3rdparty/libzip/regress/encrypt.zip | Bin 0 -> 306 bytes .../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 + .../regress/encryption-nonrandom-pkware.test | 7 + .../libzip/regress/encryption-remove.test | 5 + 3rdparty/libzip/regress/encryption-stat.test | 23 + 3rdparty/libzip/regress/extra_add.test | 7 + .../libzip/regress/extra_add_multiple.test | 8 + 3rdparty/libzip/regress/extra_count.test | 10 + .../libzip/regress/extra_count_by_id.test | 22 + .../regress/extra_count_ignore_zip64.test | 7 + 3rdparty/libzip/regress/extra_delete.test | 14 + .../libzip/regress/extra_delete_by_id.test | 6 + .../libzip/regress/extra_field_align.test | 32 + .../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 .../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 .../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 3rdparty/libzip/regress/extra_get.test | 9 + 3rdparty/libzip/regress/extra_get_by_id.test | 9 + 3rdparty/libzip/regress/extra_set.test | 14 + .../libzip/regress/extra_set_modify_c.test | 16 + .../libzip/regress/extra_set_modify_l.test | 16 + 3rdparty/libzip/regress/fdopen_ok.test | 15 + .../regress/file_comment_encmismatch.test | 4 + .../libzip/regress/filename_duplicate.zip | Bin 0 -> 206 bytes .../regress/filename_duplicate_empty.zip | Bin 0 -> 186 bytes 3rdparty/libzip/regress/filename_empty.zip | Bin 0 -> 98 bytes 3rdparty/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 3rdparty/libzip/regress/firstsecond.zip | Bin 0 -> 318 bytes 3rdparty/libzip/regress/foo-stored.zip | Bin 0 -> 107 bytes 3rdparty/libzip/regress/fopen_unchanged.c | 90 ++ 3rdparty/libzip/regress/fopen_unchanged.test | 5 + 3rdparty/libzip/regress/fread.c | 212 +++ 3rdparty/libzip/regress/fread.test | 5 + 3rdparty/libzip/regress/fseek.c | 104 ++ 3rdparty/libzip/regress/fseek_deflated.test | 6 + 3rdparty/libzip/regress/fseek_fail.test | 6 + 3rdparty/libzip/regress/fseek_ok.test | 6 + 3rdparty/libzip/regress/fuzz_main.c | 50 + 3rdparty/libzip/regress/gap-add.zip | Bin 0 -> 451 bytes 3rdparty/libzip/regress/gap-delete.zip | Bin 0 -> 250 bytes 3rdparty/libzip/regress/gap-replace.zip | Bin 0 -> 351 bytes 3rdparty/libzip/regress/gap.zip | Bin 0 -> 358 bytes 3rdparty/libzip/regress/get_comment.test | 14 + 3rdparty/libzip/regress/hole.c | 190 +++ .../regress/incons-archive-comment-longer.zip | Bin 0 -> 153 bytes .../incons-archive-comment-shorter.zip | Bin 0 -> 203 bytes 3rdparty/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 .../libzip/regress/incons-central-crc.zip | Bin 0 -> 153 bytes .../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 3rdparty/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 .../libzip/regress/incons-ef-local-id.zip | Bin 0 -> 153 bytes .../libzip/regress/incons-ef-local-size.zip | Bin 0 -> 153 bytes .../libzip/regress/incons-eocd-magic-bad.zip | Bin 0 -> 153 bytes .../libzip/regress/incons-file-count-high.zip | Bin 0 -> 153 bytes .../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 3rdparty/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 .../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 3rdparty/libzip/regress/junk-at-end.zip | Bin 0 -> 416 bytes 3rdparty/libzip/regress/junk-at-start.zip | Bin 0 -> 416 bytes 3rdparty/libzip/regress/junk_at_end.test | 5 + 3rdparty/libzip/regress/junk_at_start.test | 5 + 3rdparty/libzip/regress/large-uncompressable | Bin 0 -> 8200 bytes 3rdparty/libzip/regress/liboverride-test.c | 101 ++ 3rdparty/libzip/regress/liboverride.c | 48 + 3rdparty/libzip/regress/lzma-no-eos.zip | Bin 0 -> 343 bytes 3rdparty/libzip/regress/malloc.c | 162 ++ 3rdparty/libzip/regress/manyfiles-zip.zip | Bin 0 -> 3434201 bytes 3rdparty/libzip/regress/multidisk.zip | Bin 0 -> 122 bytes 3rdparty/libzip/regress/name_locate.test | 27 + 3rdparty/libzip/regress/nihtest.conf.in | 4 + 3rdparty/libzip/regress/nonrandomopen.c | 44 + 3rdparty/libzip/regress/nonrandomopentest.c | 57 + .../libzip/regress/open_cons_extrabytes.test | 7 + 3rdparty/libzip/regress/open_empty.test | 6 + 3rdparty/libzip/regress/open_empty_2.test | 7 + 3rdparty/libzip/regress/open_extrabytes.test | 6 + 3rdparty/libzip/regress/open_file_count.test | 12 + .../regress/open_filename_duplicate.test | 6 + .../open_filename_duplicate_consistency.test | 7 + .../open_filename_duplicate_empty.test | 6 + ..._filename_duplicate_empty_consistency.test | 7 + .../libzip/regress/open_filename_empty.test | 6 + 3rdparty/libzip/regress/open_incons.test | 74 + 3rdparty/libzip/regress/open_many_fail.test | 11 + 3rdparty/libzip/regress/open_many_ok.test | 12 + 3rdparty/libzip/regress/open_multidisk.test | 7 + .../libzip/regress/open_new_but_exists.test | 7 + 3rdparty/libzip/regress/open_new_ok.test | 5 + 3rdparty/libzip/regress/open_nonarchive.test | 7 + 3rdparty/libzip/regress/open_nosuchfile.test | 6 + 3rdparty/libzip/regress/open_ok.test | 6 + 3rdparty/libzip/regress/open_too_short.test | 7 + 3rdparty/libzip/regress/open_truncate.test | 6 + 3rdparty/libzip/regress/open_zip64_3mf.test | 6 + 3rdparty/libzip/regress/open_zip64_ok.test | 6 + 3rdparty/libzip/regress/ossfuzz.sh | 35 + 3rdparty/libzip/regress/preload.test | 4 + 3rdparty/libzip/regress/progress.test | 10 + 3rdparty/libzip/regress/rename_ascii.test | 4 + 3rdparty/libzip/regress/rename_cp437.test | 4 + 3rdparty/libzip/regress/rename_deleted.test | 5 + 3rdparty/libzip/regress/rename_fail.test | 5 + 3rdparty/libzip/regress/rename_ok.test | 4 + 3rdparty/libzip/regress/rename_ok.zip | Bin 0 -> 709 bytes 3rdparty/libzip/regress/rename_utf8.test | 4 + .../regress/rename_utf8_encmismatch.test | 4 + 3rdparty/libzip/regress/runtest.in | 60 + 3rdparty/libzip/regress/set_comment_all.test | 4 + .../libzip/regress/set_comment_localonly.test | 4 + .../regress/set_comment_removeglobal.test | 4 + .../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 + 3rdparty/libzip/regress/set_file_dostime.test | 4 + 3rdparty/libzip/regress/set_file_mtime.test | 4 + 3rdparty/libzip/regress/source_hole.c | 577 +++++++ .../regress/stat_index_cp437_guess.test | 148 ++ .../libzip/regress/stat_index_cp437_raw.test | 149 ++ .../regress/stat_index_cp437_strict.test | 148 ++ .../libzip/regress/stat_index_fileorder.test | 22 + .../libzip/regress/stat_index_streamed.test | 13 + .../regress/stat_index_streamed_zip64.test | 13 + .../libzip/regress/stat_index_utf8_guess.test | 13 + .../libzip/regress/stat_index_utf8_raw.test | 13 + .../regress/stat_index_utf8_strict.test | 14 + .../stat_index_utf8_unmarked_strict.test | 14 + 3rdparty/libzip/regress/stat_index_zip64.test | 13 + 3rdparty/libzip/regress/stored-no-eos.zip | Bin 0 -> 348 bytes 3rdparty/libzip/regress/streamed-zip64.zip | Bin 0 -> 148 bytes 3rdparty/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 3rdparty/libzip/regress/test-cp437-fc.zip | Bin 0 -> 186 bytes 3rdparty/libzip/regress/test-cp437.zip | Bin 0 -> 2582 bytes .../libzip/regress/test-utf8-unmarked.zip | Bin 0 -> 210 bytes 3rdparty/libzip/regress/test-utf8.zip | Bin 0 -> 210 bytes 3rdparty/libzip/regress/test.zip | Bin 0 -> 412 bytes 3rdparty/libzip/regress/test2.zip | Bin 0 -> 126 bytes 3rdparty/libzip/regress/testbuffer.zip | Bin 0 -> 180 bytes 3rdparty/libzip/regress/testbzip2.zip | Bin 0 -> 175 bytes 3rdparty/libzip/regress/testchanged.zip | Bin 0 -> 728 bytes 3rdparty/libzip/regress/testchangedlocal.zip | Bin 0 -> 714 bytes 3rdparty/libzip/regress/testcomment.zip | Bin 0 -> 703 bytes 3rdparty/libzip/regress/testcomment13.zip | Bin 0 -> 383 bytes .../libzip/regress/testcommentremoved.zip | Bin 0 -> 640 bytes 3rdparty/libzip/regress/testdeflated.zip | Bin 0 -> 145 bytes 3rdparty/libzip/regress/testdeflated2.zip | Bin 0 -> 270 bytes 3rdparty/libzip/regress/testdir.zip | Bin 0 -> 222 bytes 3rdparty/libzip/regress/testempty.zip | Bin 0 -> 22 bytes 3rdparty/libzip/regress/testextrabytes.zip | Bin 0 -> 160 bytes 3rdparty/libzip/regress/testfile-UTF8.zip | Bin 0 -> 126 bytes 3rdparty/libzip/regress/testfile-cp437.zip | Bin 0 -> 130 bytes 3rdparty/libzip/regress/testfile-lzma.zip | Bin 0 -> 161 bytes .../libzip/regress/testfile-plus-extra.zip | Bin 0 -> 164 bytes .../libzip/regress/testfile-stored-dos.zip | Bin 0 -> 192 bytes 3rdparty/libzip/regress/testfile-xz.zip | Bin 0 -> 200 bytes 3rdparty/libzip/regress/testfile-zstd.zip | Bin 0 -> 160 bytes 3rdparty/libzip/regress/testfile.txt | 0 3rdparty/libzip/regress/testfile.zip | Bin 0 -> 122 bytes 3rdparty/libzip/regress/testfile0.zip | Bin 0 -> 122 bytes 3rdparty/libzip/regress/testfile2014.zip | Bin 0 -> 122 bytes 3rdparty/libzip/regress/teststdin.zip | Bin 0 -> 200 bytes 3rdparty/libzip/regress/teststored.zip | Bin 0 -> 188 bytes 3rdparty/libzip/regress/tryopen.c | 113 ++ .../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 3rdparty/libzip/regress/zip64-3mf.zip | Bin 0 -> 198 bytes 3rdparty/libzip/regress/zip64.zip | Bin 0 -> 198 bytes 3rdparty/libzip/regress/zip64_creation.test | 4 + .../libzip/regress/zip64_stored_creation.test | 4 + 3rdparty/libzip/regress/zip_read_fuzzer.cc | 48 + 3rdparty/libzip/regress/zip_read_fuzzer.dict | 3 + 3rdparty/libzip/regress/zipcmp_zip_dir.test | 15 + 3rdparty/libzip/regress/zipcmp_zip_dir.zip | Bin 0 -> 483 bytes 3rdparty/libzip/regress/ziptool_regress.c | 445 ++++++ 3rdparty/libzip/src/CMakeLists.txt | 14 + 3rdparty/libzip/src/diff_output.c | 106 ++ 3rdparty/libzip/src/diff_output.h | 28 + 3rdparty/libzip/src/getopt.c | 110 ++ 3rdparty/libzip/src/getopt.h | 51 + 3rdparty/libzip/src/zipcmp.c | 866 ++++++++++ 3rdparty/libzip/src/zipmerge.c | 279 ++++ 3rdparty/libzip/src/ziptool.c | 974 ++++++++++++ CMakeLists.txt | 5 + 792 files changed, 66758 insertions(+) create mode 100644 3rdparty/libzip/.clang-format create mode 100644 3rdparty/libzip/.github/ISSUE_TEMPLATE/bug-report.md create mode 100644 3rdparty/libzip/.github/ISSUE_TEMPLATE/compile-error.md create mode 100644 3rdparty/libzip/.github/ISSUE_TEMPLATE/feature-request.md create mode 100644 3rdparty/libzip/.github/workflows/build.yml create mode 100644 3rdparty/libzip/.github/workflows/codeql-analysis.yml create mode 100644 3rdparty/libzip/.github/workflows/main.yml create mode 100644 3rdparty/libzip/API-CHANGES.md create mode 100644 3rdparty/libzip/AUTHORS create mode 100644 3rdparty/libzip/CMakeLists.txt create mode 100644 3rdparty/libzip/INSTALL.md create mode 100644 3rdparty/libzip/LICENSE create mode 100644 3rdparty/libzip/NEWS.md create mode 100644 3rdparty/libzip/README.md create mode 100644 3rdparty/libzip/THANKS create mode 100644 3rdparty/libzip/TODO.md create mode 100755 3rdparty/libzip/android/do.sh create mode 100644 3rdparty/libzip/android/docker/Dockerfile create mode 100644 3rdparty/libzip/android/readme.txt create mode 100644 3rdparty/libzip/appveyor.yml create mode 100644 3rdparty/libzip/cmake-compat/CMakePushCheckState.cmake create mode 100644 3rdparty/libzip/cmake-compat/CheckLibraryExists.cmake create mode 100644 3rdparty/libzip/cmake-compat/CheckSymbolExists.cmake create mode 100644 3rdparty/libzip/cmake-compat/FindBZip2.cmake create mode 100644 3rdparty/libzip/cmake-compat/FindGnuTLS.cmake create mode 100644 3rdparty/libzip/cmake-compat/FindLibLZMA.cmake create mode 100644 3rdparty/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake create mode 100644 3rdparty/libzip/cmake-compat/FindPackageMessage.cmake create mode 100644 3rdparty/libzip/cmake-compat/SelectLibraryConfigurations.cmake create mode 100644 3rdparty/libzip/cmake-config.h.in create mode 100644 3rdparty/libzip/cmake-zipconf.h.in create mode 100644 3rdparty/libzip/cmake/Dist.cmake create mode 100644 3rdparty/libzip/cmake/FindMbedTLS.cmake create mode 100644 3rdparty/libzip/cmake/FindNettle.cmake create mode 100644 3rdparty/libzip/cmake/FindZstd.cmake create mode 100644 3rdparty/libzip/examples/CMakeLists.txt create mode 100644 3rdparty/libzip/examples/in-memory.c create mode 100644 3rdparty/libzip/examples/windows-open.c create mode 100644 3rdparty/libzip/lib/CMakeLists.txt create mode 100644 3rdparty/libzip/lib/compat.h create mode 100644 3rdparty/libzip/lib/zip.h create mode 100644 3rdparty/libzip/lib/zip_add.c create mode 100644 3rdparty/libzip/lib/zip_add_dir.c create mode 100644 3rdparty/libzip/lib/zip_add_entry.c create mode 100644 3rdparty/libzip/lib/zip_algorithm_bzip2.c create mode 100644 3rdparty/libzip/lib/zip_algorithm_deflate.c create mode 100644 3rdparty/libzip/lib/zip_algorithm_xz.c create mode 100644 3rdparty/libzip/lib/zip_algorithm_zstd.c create mode 100644 3rdparty/libzip/lib/zip_buffer.c create mode 100644 3rdparty/libzip/lib/zip_close.c create mode 100644 3rdparty/libzip/lib/zip_crypto.h create mode 100644 3rdparty/libzip/lib/zip_crypto_commoncrypto.c create mode 100644 3rdparty/libzip/lib/zip_crypto_commoncrypto.h create mode 100644 3rdparty/libzip/lib/zip_crypto_gnutls.c create mode 100644 3rdparty/libzip/lib/zip_crypto_gnutls.h create mode 100644 3rdparty/libzip/lib/zip_crypto_mbedtls.c create mode 100644 3rdparty/libzip/lib/zip_crypto_mbedtls.h create mode 100644 3rdparty/libzip/lib/zip_crypto_openssl.c create mode 100644 3rdparty/libzip/lib/zip_crypto_openssl.h create mode 100644 3rdparty/libzip/lib/zip_crypto_win.c create mode 100644 3rdparty/libzip/lib/zip_crypto_win.h create mode 100644 3rdparty/libzip/lib/zip_delete.c create mode 100644 3rdparty/libzip/lib/zip_dir_add.c create mode 100644 3rdparty/libzip/lib/zip_dirent.c create mode 100644 3rdparty/libzip/lib/zip_discard.c create mode 100644 3rdparty/libzip/lib/zip_entry.c create mode 100644 3rdparty/libzip/lib/zip_error.c create mode 100644 3rdparty/libzip/lib/zip_error_clear.c create mode 100644 3rdparty/libzip/lib/zip_error_get.c create mode 100644 3rdparty/libzip/lib/zip_error_get_sys_type.c create mode 100644 3rdparty/libzip/lib/zip_error_strerror.c create mode 100644 3rdparty/libzip/lib/zip_error_to_str.c create mode 100644 3rdparty/libzip/lib/zip_extra_field.c create mode 100644 3rdparty/libzip/lib/zip_extra_field_api.c create mode 100644 3rdparty/libzip/lib/zip_fclose.c create mode 100644 3rdparty/libzip/lib/zip_fdopen.c create mode 100644 3rdparty/libzip/lib/zip_file_add.c create mode 100644 3rdparty/libzip/lib/zip_file_error_clear.c create mode 100644 3rdparty/libzip/lib/zip_file_error_get.c create mode 100644 3rdparty/libzip/lib/zip_file_get_comment.c create mode 100644 3rdparty/libzip/lib/zip_file_get_external_attributes.c create mode 100644 3rdparty/libzip/lib/zip_file_get_offset.c create mode 100644 3rdparty/libzip/lib/zip_file_rename.c create mode 100644 3rdparty/libzip/lib/zip_file_replace.c create mode 100644 3rdparty/libzip/lib/zip_file_set_comment.c create mode 100644 3rdparty/libzip/lib/zip_file_set_encryption.c create mode 100644 3rdparty/libzip/lib/zip_file_set_external_attributes.c create mode 100644 3rdparty/libzip/lib/zip_file_set_mtime.c create mode 100644 3rdparty/libzip/lib/zip_file_strerror.c create mode 100644 3rdparty/libzip/lib/zip_fopen.c create mode 100644 3rdparty/libzip/lib/zip_fopen_encrypted.c create mode 100644 3rdparty/libzip/lib/zip_fopen_index.c create mode 100644 3rdparty/libzip/lib/zip_fopen_index_encrypted.c create mode 100644 3rdparty/libzip/lib/zip_fread.c create mode 100644 3rdparty/libzip/lib/zip_fseek.c create mode 100644 3rdparty/libzip/lib/zip_ftell.c create mode 100644 3rdparty/libzip/lib/zip_get_archive_comment.c create mode 100644 3rdparty/libzip/lib/zip_get_archive_flag.c create mode 100644 3rdparty/libzip/lib/zip_get_encryption_implementation.c create mode 100644 3rdparty/libzip/lib/zip_get_file_comment.c create mode 100644 3rdparty/libzip/lib/zip_get_name.c create mode 100644 3rdparty/libzip/lib/zip_get_num_entries.c create mode 100644 3rdparty/libzip/lib/zip_get_num_files.c create mode 100644 3rdparty/libzip/lib/zip_hash.c create mode 100644 3rdparty/libzip/lib/zip_io_util.c create mode 100644 3rdparty/libzip/lib/zip_libzip_version.c create mode 100644 3rdparty/libzip/lib/zip_memdup.c create mode 100644 3rdparty/libzip/lib/zip_mkstempm.c create mode 100644 3rdparty/libzip/lib/zip_name_locate.c create mode 100644 3rdparty/libzip/lib/zip_new.c create mode 100644 3rdparty/libzip/lib/zip_open.c create mode 100644 3rdparty/libzip/lib/zip_pkware.c create mode 100644 3rdparty/libzip/lib/zip_progress.c create mode 100644 3rdparty/libzip/lib/zip_random_unix.c create mode 100644 3rdparty/libzip/lib/zip_random_uwp.c create mode 100644 3rdparty/libzip/lib/zip_random_win32.c create mode 100644 3rdparty/libzip/lib/zip_rename.c create mode 100644 3rdparty/libzip/lib/zip_replace.c create mode 100644 3rdparty/libzip/lib/zip_set_archive_comment.c create mode 100644 3rdparty/libzip/lib/zip_set_archive_flag.c create mode 100644 3rdparty/libzip/lib/zip_set_default_password.c create mode 100644 3rdparty/libzip/lib/zip_set_file_comment.c create mode 100644 3rdparty/libzip/lib/zip_set_file_compression.c create mode 100644 3rdparty/libzip/lib/zip_set_name.c create mode 100644 3rdparty/libzip/lib/zip_source_accept_empty.c create mode 100644 3rdparty/libzip/lib/zip_source_begin_write.c create mode 100644 3rdparty/libzip/lib/zip_source_begin_write_cloning.c create mode 100644 3rdparty/libzip/lib/zip_source_buffer.c create mode 100644 3rdparty/libzip/lib/zip_source_call.c create mode 100644 3rdparty/libzip/lib/zip_source_close.c create mode 100644 3rdparty/libzip/lib/zip_source_commit_write.c create mode 100644 3rdparty/libzip/lib/zip_source_compress.c create mode 100644 3rdparty/libzip/lib/zip_source_crc.c create mode 100644 3rdparty/libzip/lib/zip_source_error.c create mode 100644 3rdparty/libzip/lib/zip_source_file.h create mode 100644 3rdparty/libzip/lib/zip_source_file_common.c create mode 100644 3rdparty/libzip/lib/zip_source_file_stdio.c create mode 100644 3rdparty/libzip/lib/zip_source_file_stdio.h create mode 100644 3rdparty/libzip/lib/zip_source_file_stdio_named.c create mode 100644 3rdparty/libzip/lib/zip_source_file_win32.c create mode 100644 3rdparty/libzip/lib/zip_source_file_win32.h create mode 100644 3rdparty/libzip/lib/zip_source_file_win32_ansi.c create mode 100644 3rdparty/libzip/lib/zip_source_file_win32_named.c create mode 100644 3rdparty/libzip/lib/zip_source_file_win32_utf16.c create mode 100644 3rdparty/libzip/lib/zip_source_file_win32_utf8.c create mode 100644 3rdparty/libzip/lib/zip_source_free.c create mode 100644 3rdparty/libzip/lib/zip_source_function.c create mode 100644 3rdparty/libzip/lib/zip_source_get_file_attributes.c create mode 100644 3rdparty/libzip/lib/zip_source_is_deleted.c create mode 100644 3rdparty/libzip/lib/zip_source_layered.c create mode 100644 3rdparty/libzip/lib/zip_source_open.c create mode 100644 3rdparty/libzip/lib/zip_source_pkware_decode.c create mode 100644 3rdparty/libzip/lib/zip_source_pkware_encode.c create mode 100644 3rdparty/libzip/lib/zip_source_read.c create mode 100644 3rdparty/libzip/lib/zip_source_remove.c create mode 100644 3rdparty/libzip/lib/zip_source_rollback_write.c create mode 100644 3rdparty/libzip/lib/zip_source_seek.c create mode 100644 3rdparty/libzip/lib/zip_source_seek_write.c create mode 100644 3rdparty/libzip/lib/zip_source_stat.c create mode 100644 3rdparty/libzip/lib/zip_source_supports.c create mode 100644 3rdparty/libzip/lib/zip_source_tell.c create mode 100644 3rdparty/libzip/lib/zip_source_tell_write.c create mode 100644 3rdparty/libzip/lib/zip_source_window.c create mode 100644 3rdparty/libzip/lib/zip_source_winzip_aes_decode.c create mode 100644 3rdparty/libzip/lib/zip_source_winzip_aes_encode.c create mode 100644 3rdparty/libzip/lib/zip_source_write.c create mode 100644 3rdparty/libzip/lib/zip_source_zip.c create mode 100644 3rdparty/libzip/lib/zip_source_zip_new.c create mode 100644 3rdparty/libzip/lib/zip_stat.c create mode 100644 3rdparty/libzip/lib/zip_stat_index.c create mode 100644 3rdparty/libzip/lib/zip_stat_init.c create mode 100644 3rdparty/libzip/lib/zip_strerror.c create mode 100644 3rdparty/libzip/lib/zip_string.c create mode 100644 3rdparty/libzip/lib/zip_unchange.c create mode 100644 3rdparty/libzip/lib/zip_unchange_all.c create mode 100644 3rdparty/libzip/lib/zip_unchange_archive.c create mode 100644 3rdparty/libzip/lib/zip_unchange_data.c create mode 100644 3rdparty/libzip/lib/zip_utf-8.c create mode 100644 3rdparty/libzip/lib/zip_winzip_aes.c create mode 100644 3rdparty/libzip/lib/zipint.h create mode 100644 3rdparty/libzip/libzip-config.cmake.in create mode 100644 3rdparty/libzip/libzip.pc.in create mode 100644 3rdparty/libzip/man/CMakeLists.txt create mode 100644 3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.html create mode 100644 3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.man create mode 100644 3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc create mode 100755 3rdparty/libzip/man/handle_links create mode 100644 3rdparty/libzip/man/libzip.html create mode 100644 3rdparty/libzip/man/libzip.man create mode 100644 3rdparty/libzip/man/libzip.mdoc create mode 100644 3rdparty/libzip/man/links create mode 100644 3rdparty/libzip/man/update-html.cmake create mode 100644 3rdparty/libzip/man/update-man.cmake create mode 100644 3rdparty/libzip/man/zip_add.html create mode 100644 3rdparty/libzip/man/zip_add.man create mode 100644 3rdparty/libzip/man/zip_add.mdoc create mode 100644 3rdparty/libzip/man/zip_add_dir.html create mode 100644 3rdparty/libzip/man/zip_add_dir.man create mode 100644 3rdparty/libzip/man/zip_add_dir.mdoc create mode 100644 3rdparty/libzip/man/zip_close.html create mode 100644 3rdparty/libzip/man/zip_close.man create mode 100644 3rdparty/libzip/man/zip_close.mdoc create mode 100644 3rdparty/libzip/man/zip_compression_method_supported.html create mode 100644 3rdparty/libzip/man/zip_compression_method_supported.man create mode 100644 3rdparty/libzip/man/zip_compression_method_supported.mdoc create mode 100644 3rdparty/libzip/man/zip_delete.html create mode 100644 3rdparty/libzip/man/zip_delete.man create mode 100644 3rdparty/libzip/man/zip_delete.mdoc create mode 100644 3rdparty/libzip/man/zip_dir_add.html create mode 100644 3rdparty/libzip/man/zip_dir_add.man create mode 100644 3rdparty/libzip/man/zip_dir_add.mdoc create mode 100644 3rdparty/libzip/man/zip_discard.html create mode 100644 3rdparty/libzip/man/zip_discard.man create mode 100644 3rdparty/libzip/man/zip_discard.mdoc create mode 100644 3rdparty/libzip/man/zip_encryption_method_supported.html create mode 100644 3rdparty/libzip/man/zip_encryption_method_supported.man create mode 100644 3rdparty/libzip/man/zip_encryption_method_supported.mdoc create mode 100644 3rdparty/libzip/man/zip_error_clear.html create mode 100644 3rdparty/libzip/man/zip_error_clear.man create mode 100644 3rdparty/libzip/man/zip_error_clear.mdoc create mode 100644 3rdparty/libzip/man/zip_error_code_system.html create mode 100644 3rdparty/libzip/man/zip_error_code_system.man create mode 100644 3rdparty/libzip/man/zip_error_code_system.mdoc create mode 100644 3rdparty/libzip/man/zip_error_code_zip.html create mode 100644 3rdparty/libzip/man/zip_error_code_zip.man create mode 100644 3rdparty/libzip/man/zip_error_code_zip.mdoc create mode 100644 3rdparty/libzip/man/zip_error_fini.html create mode 100644 3rdparty/libzip/man/zip_error_fini.man create mode 100644 3rdparty/libzip/man/zip_error_fini.mdoc create mode 100644 3rdparty/libzip/man/zip_error_get.html create mode 100644 3rdparty/libzip/man/zip_error_get.man create mode 100644 3rdparty/libzip/man/zip_error_get.mdoc create mode 100644 3rdparty/libzip/man/zip_error_get_sys_type.html create mode 100644 3rdparty/libzip/man/zip_error_get_sys_type.man create mode 100644 3rdparty/libzip/man/zip_error_get_sys_type.mdoc create mode 100644 3rdparty/libzip/man/zip_error_init.html create mode 100644 3rdparty/libzip/man/zip_error_init.man create mode 100644 3rdparty/libzip/man/zip_error_init.mdoc create mode 100644 3rdparty/libzip/man/zip_error_set.html create mode 100644 3rdparty/libzip/man/zip_error_set.man create mode 100644 3rdparty/libzip/man/zip_error_set.mdoc create mode 100644 3rdparty/libzip/man/zip_error_strerror.html create mode 100644 3rdparty/libzip/man/zip_error_strerror.man create mode 100644 3rdparty/libzip/man/zip_error_strerror.mdoc create mode 100644 3rdparty/libzip/man/zip_error_system_type.html create mode 100644 3rdparty/libzip/man/zip_error_system_type.man create mode 100644 3rdparty/libzip/man/zip_error_system_type.mdoc create mode 100644 3rdparty/libzip/man/zip_error_to_data.html create mode 100644 3rdparty/libzip/man/zip_error_to_data.man create mode 100644 3rdparty/libzip/man/zip_error_to_data.mdoc create mode 100644 3rdparty/libzip/man/zip_error_to_str.html create mode 100644 3rdparty/libzip/man/zip_error_to_str.man create mode 100644 3rdparty/libzip/man/zip_error_to_str.mdoc create mode 100644 3rdparty/libzip/man/zip_errors.html create mode 100644 3rdparty/libzip/man/zip_errors.man create mode 100644 3rdparty/libzip/man/zip_errors.mdoc create mode 100644 3rdparty/libzip/man/zip_fclose.html create mode 100644 3rdparty/libzip/man/zip_fclose.man create mode 100644 3rdparty/libzip/man/zip_fclose.mdoc create mode 100644 3rdparty/libzip/man/zip_fdopen.html create mode 100644 3rdparty/libzip/man/zip_fdopen.man create mode 100644 3rdparty/libzip/man/zip_fdopen.mdoc create mode 100644 3rdparty/libzip/man/zip_file_add.html create mode 100644 3rdparty/libzip/man/zip_file_add.man create mode 100644 3rdparty/libzip/man/zip_file_add.mdoc create mode 100644 3rdparty/libzip/man/zip_file_attributes_init.html create mode 100644 3rdparty/libzip/man/zip_file_attributes_init.man create mode 100644 3rdparty/libzip/man/zip_file_attributes_init.mdoc create mode 100644 3rdparty/libzip/man/zip_file_extra_field_delete.html create mode 100644 3rdparty/libzip/man/zip_file_extra_field_delete.man create mode 100644 3rdparty/libzip/man/zip_file_extra_field_delete.mdoc create mode 100644 3rdparty/libzip/man/zip_file_extra_field_get.html create mode 100644 3rdparty/libzip/man/zip_file_extra_field_get.man create mode 100644 3rdparty/libzip/man/zip_file_extra_field_get.mdoc create mode 100644 3rdparty/libzip/man/zip_file_extra_field_set.html create mode 100644 3rdparty/libzip/man/zip_file_extra_field_set.man create mode 100644 3rdparty/libzip/man/zip_file_extra_field_set.mdoc create mode 100644 3rdparty/libzip/man/zip_file_extra_fields_count.html create mode 100644 3rdparty/libzip/man/zip_file_extra_fields_count.man create mode 100644 3rdparty/libzip/man/zip_file_extra_fields_count.mdoc create mode 100644 3rdparty/libzip/man/zip_file_get_comment.html create mode 100644 3rdparty/libzip/man/zip_file_get_comment.man create mode 100644 3rdparty/libzip/man/zip_file_get_comment.mdoc create mode 100644 3rdparty/libzip/man/zip_file_get_error.html create mode 100644 3rdparty/libzip/man/zip_file_get_error.man create mode 100644 3rdparty/libzip/man/zip_file_get_error.mdoc create mode 100644 3rdparty/libzip/man/zip_file_get_external_attributes.html create mode 100644 3rdparty/libzip/man/zip_file_get_external_attributes.man create mode 100644 3rdparty/libzip/man/zip_file_get_external_attributes.mdoc create mode 100644 3rdparty/libzip/man/zip_file_rename.html create mode 100644 3rdparty/libzip/man/zip_file_rename.man create mode 100644 3rdparty/libzip/man/zip_file_rename.mdoc create mode 100644 3rdparty/libzip/man/zip_file_set_comment.html create mode 100644 3rdparty/libzip/man/zip_file_set_comment.man create mode 100644 3rdparty/libzip/man/zip_file_set_comment.mdoc create mode 100644 3rdparty/libzip/man/zip_file_set_encryption.html create mode 100644 3rdparty/libzip/man/zip_file_set_encryption.man create mode 100644 3rdparty/libzip/man/zip_file_set_encryption.mdoc create mode 100644 3rdparty/libzip/man/zip_file_set_external_attributes.html create mode 100644 3rdparty/libzip/man/zip_file_set_external_attributes.man create mode 100644 3rdparty/libzip/man/zip_file_set_external_attributes.mdoc create mode 100644 3rdparty/libzip/man/zip_file_set_mtime.html create mode 100644 3rdparty/libzip/man/zip_file_set_mtime.man create mode 100644 3rdparty/libzip/man/zip_file_set_mtime.mdoc create mode 100644 3rdparty/libzip/man/zip_file_strerror.html create mode 100644 3rdparty/libzip/man/zip_file_strerror.man create mode 100644 3rdparty/libzip/man/zip_file_strerror.mdoc create mode 100644 3rdparty/libzip/man/zip_fopen.html create mode 100644 3rdparty/libzip/man/zip_fopen.man create mode 100644 3rdparty/libzip/man/zip_fopen.mdoc create mode 100644 3rdparty/libzip/man/zip_fopen_encrypted.html create mode 100644 3rdparty/libzip/man/zip_fopen_encrypted.man create mode 100644 3rdparty/libzip/man/zip_fopen_encrypted.mdoc create mode 100644 3rdparty/libzip/man/zip_fread.html create mode 100644 3rdparty/libzip/man/zip_fread.man create mode 100644 3rdparty/libzip/man/zip_fread.mdoc create mode 100644 3rdparty/libzip/man/zip_fseek.html create mode 100644 3rdparty/libzip/man/zip_fseek.man create mode 100644 3rdparty/libzip/man/zip_fseek.mdoc create mode 100644 3rdparty/libzip/man/zip_ftell.html create mode 100644 3rdparty/libzip/man/zip_ftell.man create mode 100644 3rdparty/libzip/man/zip_ftell.mdoc create mode 100644 3rdparty/libzip/man/zip_get_archive_comment.html create mode 100644 3rdparty/libzip/man/zip_get_archive_comment.man create mode 100644 3rdparty/libzip/man/zip_get_archive_comment.mdoc create mode 100644 3rdparty/libzip/man/zip_get_archive_flag.html create mode 100644 3rdparty/libzip/man/zip_get_archive_flag.man create mode 100644 3rdparty/libzip/man/zip_get_archive_flag.mdoc create mode 100644 3rdparty/libzip/man/zip_get_error.html create mode 100644 3rdparty/libzip/man/zip_get_error.man create mode 100644 3rdparty/libzip/man/zip_get_error.mdoc create mode 100644 3rdparty/libzip/man/zip_get_file_comment.html create mode 100644 3rdparty/libzip/man/zip_get_file_comment.man create mode 100644 3rdparty/libzip/man/zip_get_file_comment.mdoc create mode 100644 3rdparty/libzip/man/zip_get_name.html create mode 100644 3rdparty/libzip/man/zip_get_name.man create mode 100644 3rdparty/libzip/man/zip_get_name.mdoc create mode 100644 3rdparty/libzip/man/zip_get_num_entries.html create mode 100644 3rdparty/libzip/man/zip_get_num_entries.man create mode 100644 3rdparty/libzip/man/zip_get_num_entries.mdoc create mode 100644 3rdparty/libzip/man/zip_get_num_files.html create mode 100644 3rdparty/libzip/man/zip_get_num_files.man create mode 100644 3rdparty/libzip/man/zip_get_num_files.mdoc create mode 100644 3rdparty/libzip/man/zip_libzip_version.html create mode 100644 3rdparty/libzip/man/zip_libzip_version.man create mode 100644 3rdparty/libzip/man/zip_libzip_version.mdoc create mode 100644 3rdparty/libzip/man/zip_name_locate.html create mode 100644 3rdparty/libzip/man/zip_name_locate.man create mode 100644 3rdparty/libzip/man/zip_name_locate.mdoc create mode 100644 3rdparty/libzip/man/zip_open.html create mode 100644 3rdparty/libzip/man/zip_open.man create mode 100644 3rdparty/libzip/man/zip_open.mdoc create mode 100644 3rdparty/libzip/man/zip_register_cancel_callback_with_state.html create mode 100644 3rdparty/libzip/man/zip_register_cancel_callback_with_state.man create mode 100644 3rdparty/libzip/man/zip_register_cancel_callback_with_state.mdoc create mode 100644 3rdparty/libzip/man/zip_register_progress_callback.html create mode 100644 3rdparty/libzip/man/zip_register_progress_callback.man create mode 100644 3rdparty/libzip/man/zip_register_progress_callback.mdoc create mode 100644 3rdparty/libzip/man/zip_register_progress_callback_with_state.html create mode 100644 3rdparty/libzip/man/zip_register_progress_callback_with_state.man create mode 100644 3rdparty/libzip/man/zip_register_progress_callback_with_state.mdoc create mode 100644 3rdparty/libzip/man/zip_rename.html create mode 100644 3rdparty/libzip/man/zip_rename.man create mode 100644 3rdparty/libzip/man/zip_rename.mdoc create mode 100644 3rdparty/libzip/man/zip_set_archive_comment.html create mode 100644 3rdparty/libzip/man/zip_set_archive_comment.man create mode 100644 3rdparty/libzip/man/zip_set_archive_comment.mdoc create mode 100644 3rdparty/libzip/man/zip_set_archive_flag.html create mode 100644 3rdparty/libzip/man/zip_set_archive_flag.man create mode 100644 3rdparty/libzip/man/zip_set_archive_flag.mdoc create mode 100644 3rdparty/libzip/man/zip_set_default_password.html create mode 100644 3rdparty/libzip/man/zip_set_default_password.man create mode 100644 3rdparty/libzip/man/zip_set_default_password.mdoc create mode 100644 3rdparty/libzip/man/zip_set_file_comment.html create mode 100644 3rdparty/libzip/man/zip_set_file_comment.man create mode 100644 3rdparty/libzip/man/zip_set_file_comment.mdoc create mode 100644 3rdparty/libzip/man/zip_set_file_compression.html create mode 100644 3rdparty/libzip/man/zip_set_file_compression.man create mode 100644 3rdparty/libzip/man/zip_set_file_compression.mdoc create mode 100644 3rdparty/libzip/man/zip_source.html create mode 100644 3rdparty/libzip/man/zip_source.man create mode 100644 3rdparty/libzip/man/zip_source.mdoc create mode 100644 3rdparty/libzip/man/zip_source_begin_write.html create mode 100644 3rdparty/libzip/man/zip_source_begin_write.man create mode 100644 3rdparty/libzip/man/zip_source_begin_write.mdoc create mode 100644 3rdparty/libzip/man/zip_source_buffer.html create mode 100644 3rdparty/libzip/man/zip_source_buffer.man create mode 100644 3rdparty/libzip/man/zip_source_buffer.mdoc create mode 100644 3rdparty/libzip/man/zip_source_buffer_fragment.html create mode 100644 3rdparty/libzip/man/zip_source_buffer_fragment.man create mode 100644 3rdparty/libzip/man/zip_source_buffer_fragment.mdoc create mode 100644 3rdparty/libzip/man/zip_source_close.html create mode 100644 3rdparty/libzip/man/zip_source_close.man create mode 100644 3rdparty/libzip/man/zip_source_close.mdoc create mode 100644 3rdparty/libzip/man/zip_source_commit_write.html create mode 100644 3rdparty/libzip/man/zip_source_commit_write.man create mode 100644 3rdparty/libzip/man/zip_source_commit_write.mdoc create mode 100644 3rdparty/libzip/man/zip_source_error.html create mode 100644 3rdparty/libzip/man/zip_source_error.man create mode 100644 3rdparty/libzip/man/zip_source_error.mdoc create mode 100644 3rdparty/libzip/man/zip_source_file.html create mode 100644 3rdparty/libzip/man/zip_source_file.man create mode 100644 3rdparty/libzip/man/zip_source_file.mdoc create mode 100644 3rdparty/libzip/man/zip_source_filep.html create mode 100644 3rdparty/libzip/man/zip_source_filep.man create mode 100644 3rdparty/libzip/man/zip_source_filep.mdoc create mode 100644 3rdparty/libzip/man/zip_source_free.html create mode 100644 3rdparty/libzip/man/zip_source_free.man create mode 100644 3rdparty/libzip/man/zip_source_free.mdoc create mode 100644 3rdparty/libzip/man/zip_source_function.html create mode 100644 3rdparty/libzip/man/zip_source_function.man create mode 100644 3rdparty/libzip/man/zip_source_function.mdoc create mode 100644 3rdparty/libzip/man/zip_source_is_deleted.html create mode 100644 3rdparty/libzip/man/zip_source_is_deleted.man create mode 100644 3rdparty/libzip/man/zip_source_is_deleted.mdoc create mode 100644 3rdparty/libzip/man/zip_source_keep.html create mode 100644 3rdparty/libzip/man/zip_source_keep.man create mode 100644 3rdparty/libzip/man/zip_source_keep.mdoc create mode 100644 3rdparty/libzip/man/zip_source_make_command_bitmap.html create mode 100644 3rdparty/libzip/man/zip_source_make_command_bitmap.man create mode 100644 3rdparty/libzip/man/zip_source_make_command_bitmap.mdoc create mode 100644 3rdparty/libzip/man/zip_source_open.html create mode 100644 3rdparty/libzip/man/zip_source_open.man create mode 100644 3rdparty/libzip/man/zip_source_open.mdoc create mode 100644 3rdparty/libzip/man/zip_source_read.html create mode 100644 3rdparty/libzip/man/zip_source_read.man create mode 100644 3rdparty/libzip/man/zip_source_read.mdoc create mode 100644 3rdparty/libzip/man/zip_source_rollback_write.html create mode 100644 3rdparty/libzip/man/zip_source_rollback_write.man create mode 100644 3rdparty/libzip/man/zip_source_rollback_write.mdoc create mode 100644 3rdparty/libzip/man/zip_source_seek.html create mode 100644 3rdparty/libzip/man/zip_source_seek.man create mode 100644 3rdparty/libzip/man/zip_source_seek.mdoc create mode 100644 3rdparty/libzip/man/zip_source_seek_compute_offset.html create mode 100644 3rdparty/libzip/man/zip_source_seek_compute_offset.man create mode 100644 3rdparty/libzip/man/zip_source_seek_compute_offset.mdoc create mode 100644 3rdparty/libzip/man/zip_source_seek_write.html create mode 100644 3rdparty/libzip/man/zip_source_seek_write.man create mode 100644 3rdparty/libzip/man/zip_source_seek_write.mdoc create mode 100644 3rdparty/libzip/man/zip_source_stat.html create mode 100644 3rdparty/libzip/man/zip_source_stat.man create mode 100644 3rdparty/libzip/man/zip_source_stat.mdoc create mode 100644 3rdparty/libzip/man/zip_source_tell.html create mode 100644 3rdparty/libzip/man/zip_source_tell.man create mode 100644 3rdparty/libzip/man/zip_source_tell.mdoc create mode 100644 3rdparty/libzip/man/zip_source_tell_write.html create mode 100644 3rdparty/libzip/man/zip_source_tell_write.man create mode 100644 3rdparty/libzip/man/zip_source_tell_write.mdoc create mode 100644 3rdparty/libzip/man/zip_source_win32a.html create mode 100644 3rdparty/libzip/man/zip_source_win32a.man create mode 100644 3rdparty/libzip/man/zip_source_win32a.mdoc create mode 100644 3rdparty/libzip/man/zip_source_win32handle.html create mode 100644 3rdparty/libzip/man/zip_source_win32handle.man create mode 100644 3rdparty/libzip/man/zip_source_win32handle.mdoc create mode 100644 3rdparty/libzip/man/zip_source_win32w.html create mode 100644 3rdparty/libzip/man/zip_source_win32w.man create mode 100644 3rdparty/libzip/man/zip_source_win32w.mdoc create mode 100644 3rdparty/libzip/man/zip_source_window.html create mode 100644 3rdparty/libzip/man/zip_source_window.man create mode 100644 3rdparty/libzip/man/zip_source_window.mdoc create mode 100644 3rdparty/libzip/man/zip_source_write.html create mode 100644 3rdparty/libzip/man/zip_source_write.man create mode 100644 3rdparty/libzip/man/zip_source_write.mdoc create mode 100644 3rdparty/libzip/man/zip_source_zip.html create mode 100644 3rdparty/libzip/man/zip_source_zip.man create mode 100644 3rdparty/libzip/man/zip_source_zip.mdoc create mode 100644 3rdparty/libzip/man/zip_stat.html create mode 100644 3rdparty/libzip/man/zip_stat.man create mode 100644 3rdparty/libzip/man/zip_stat.mdoc create mode 100644 3rdparty/libzip/man/zip_stat_init.html create mode 100644 3rdparty/libzip/man/zip_stat_init.man create mode 100644 3rdparty/libzip/man/zip_stat_init.mdoc create mode 100644 3rdparty/libzip/man/zip_unchange.html create mode 100644 3rdparty/libzip/man/zip_unchange.man create mode 100644 3rdparty/libzip/man/zip_unchange.mdoc create mode 100644 3rdparty/libzip/man/zip_unchange_all.html create mode 100644 3rdparty/libzip/man/zip_unchange_all.man create mode 100644 3rdparty/libzip/man/zip_unchange_all.mdoc create mode 100644 3rdparty/libzip/man/zip_unchange_archive.html create mode 100644 3rdparty/libzip/man/zip_unchange_archive.man create mode 100644 3rdparty/libzip/man/zip_unchange_archive.mdoc create mode 100644 3rdparty/libzip/man/zipcmp.html create mode 100644 3rdparty/libzip/man/zipcmp.man create mode 100644 3rdparty/libzip/man/zipcmp.mdoc create mode 100644 3rdparty/libzip/man/zipmerge.html create mode 100644 3rdparty/libzip/man/zipmerge.man create mode 100644 3rdparty/libzip/man/zipmerge.mdoc create mode 100644 3rdparty/libzip/man/ziptool.html create mode 100644 3rdparty/libzip/man/ziptool.man create mode 100644 3rdparty/libzip/man/ziptool.mdoc create mode 100644 3rdparty/libzip/regress/CMakeLists.txt create mode 100644 3rdparty/libzip/regress/NiHTest.pm create mode 100644 3rdparty/libzip/regress/add_dir.test create mode 100644 3rdparty/libzip/regress/add_from_buffer.test create mode 100644 3rdparty/libzip/regress/add_from_file.test create mode 100644 3rdparty/libzip/regress/add_from_file_duplicate.test create mode 100644 3rdparty/libzip/regress/add_from_file_twice_duplicate.test create mode 100644 3rdparty/libzip/regress/add_from_file_unchange.test create mode 100644 3rdparty/libzip/regress/add_from_filep.c create mode 100644 3rdparty/libzip/regress/add_from_filep.test create mode 100644 3rdparty/libzip/regress/add_from_stdin.test create mode 100644 3rdparty/libzip/regress/add_from_zip_closed.test create mode 100644 3rdparty/libzip/regress/add_from_zip_deflated.test create mode 100644 3rdparty/libzip/regress/add_from_zip_deflated2.test create mode 100644 3rdparty/libzip/regress/add_from_zip_partial_deflated.test create mode 100644 3rdparty/libzip/regress/add_from_zip_partial_stored.test create mode 100644 3rdparty/libzip/regress/add_from_zip_stored.test create mode 100644 3rdparty/libzip/regress/add_stored.test create mode 100644 3rdparty/libzip/regress/add_stored_in_memory.test create mode 100644 3rdparty/libzip/regress/bigstored.zh create mode 100644 3rdparty/libzip/regress/bigzero-zip.zip create mode 100644 3rdparty/libzip/regress/bogus.zip create mode 100644 3rdparty/libzip/regress/broken.zip create mode 100644 3rdparty/libzip/regress/buffer-fragment-read.test create mode 100644 3rdparty/libzip/regress/buffer-fragment-write.test create mode 100644 3rdparty/libzip/regress/can_clone_file.c create mode 100644 3rdparty/libzip/regress/cancel_45.test create mode 100644 3rdparty/libzip/regress/cancel_90.test create mode 100644 3rdparty/libzip/regress/cleanup.cmake create mode 100644 3rdparty/libzip/regress/clone-buffer-add.test create mode 100644 3rdparty/libzip/regress/clone-buffer-delete.test create mode 100644 3rdparty/libzip/regress/clone-buffer-replace.test create mode 100644 3rdparty/libzip/regress/clone-fs-add.test create mode 100644 3rdparty/libzip/regress/clone-fs-delete.test create mode 100644 3rdparty/libzip/regress/clone-fs-replace.test create mode 100644 3rdparty/libzip/regress/cm-default.test create mode 100644 3rdparty/libzip/regress/cm-default.zip create mode 100644 3rdparty/libzip/regress/count_entries.test create mode 100644 3rdparty/libzip/regress/decrypt-correct-password-aes128.test create mode 100644 3rdparty/libzip/regress/decrypt-correct-password-aes192.test create mode 100644 3rdparty/libzip/regress/decrypt-correct-password-aes256.test create mode 100644 3rdparty/libzip/regress/decrypt-correct-password-pkware-2.test create mode 100644 3rdparty/libzip/regress/decrypt-correct-password-pkware.test create mode 100644 3rdparty/libzip/regress/decrypt-no-password-aes256.test create mode 100644 3rdparty/libzip/regress/decrypt-wrong-password-aes128.test create mode 100644 3rdparty/libzip/regress/decrypt-wrong-password-aes192.test create mode 100644 3rdparty/libzip/regress/decrypt-wrong-password-aes256.test create mode 100644 3rdparty/libzip/regress/decrypt-wrong-password-pkware-2.test create mode 100644 3rdparty/libzip/regress/decrypt-wrong-password-pkware.test create mode 100644 3rdparty/libzip/regress/delete_add_same.test create mode 100644 3rdparty/libzip/regress/delete_invalid.test create mode 100644 3rdparty/libzip/regress/delete_last.test create mode 100644 3rdparty/libzip/regress/delete_multiple_last.test create mode 100644 3rdparty/libzip/regress/delete_multiple_partial.test create mode 100644 3rdparty/libzip/regress/delete_renamed_rename.test create mode 100644 3rdparty/libzip/regress/encrypt-1234.zip create mode 100644 3rdparty/libzip/regress/encrypt-aes128-noentropy.zip create mode 100644 3rdparty/libzip/regress/encrypt-aes128.zip create mode 100644 3rdparty/libzip/regress/encrypt-aes192-noentropy.zip create mode 100644 3rdparty/libzip/regress/encrypt-aes192.zip create mode 100644 3rdparty/libzip/regress/encrypt-aes256-noentropy.zip create mode 100644 3rdparty/libzip/regress/encrypt-aes256.zip create mode 100644 3rdparty/libzip/regress/encrypt-none.zip create mode 100644 3rdparty/libzip/regress/encrypt-pkware-noentropy.zip create mode 100644 3rdparty/libzip/regress/encrypt.test create mode 100644 3rdparty/libzip/regress/encrypt.zip create mode 100644 3rdparty/libzip/regress/encrypt_plus_extra.zip create mode 100644 3rdparty/libzip/regress/encrypt_plus_extra_modified_c.zip create mode 100644 3rdparty/libzip/regress/encrypt_plus_extra_modified_l.zip create mode 100644 3rdparty/libzip/regress/encryption-nonrandom-aes128.test create mode 100644 3rdparty/libzip/regress/encryption-nonrandom-aes192.test create mode 100644 3rdparty/libzip/regress/encryption-nonrandom-aes256.test create mode 100644 3rdparty/libzip/regress/encryption-nonrandom-pkware.test create mode 100644 3rdparty/libzip/regress/encryption-remove.test create mode 100644 3rdparty/libzip/regress/encryption-stat.test create mode 100644 3rdparty/libzip/regress/extra_add.test create mode 100644 3rdparty/libzip/regress/extra_add_multiple.test create mode 100644 3rdparty/libzip/regress/extra_count.test create mode 100644 3rdparty/libzip/regress/extra_count_by_id.test create mode 100644 3rdparty/libzip/regress/extra_count_ignore_zip64.test create mode 100644 3rdparty/libzip/regress/extra_delete.test create mode 100644 3rdparty/libzip/regress/extra_delete_by_id.test create mode 100644 3rdparty/libzip/regress/extra_field_align.test create mode 100644 3rdparty/libzip/regress/extra_field_align_1-0.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_1-ef_00.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_1-ef_ff.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_1-ff.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_2-0.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_2-ef_00.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_2-ef_ff.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_2-ff.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_3-0.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_3-ef_00.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_3-ef_ff.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_3-ff.zip create mode 100644 3rdparty/libzip/regress/extra_field_align_4-ff.zip create mode 100644 3rdparty/libzip/regress/extra_get.test create mode 100644 3rdparty/libzip/regress/extra_get_by_id.test create mode 100644 3rdparty/libzip/regress/extra_set.test create mode 100644 3rdparty/libzip/regress/extra_set_modify_c.test create mode 100644 3rdparty/libzip/regress/extra_set_modify_l.test create mode 100644 3rdparty/libzip/regress/fdopen_ok.test create mode 100644 3rdparty/libzip/regress/file_comment_encmismatch.test create mode 100644 3rdparty/libzip/regress/filename_duplicate.zip create mode 100644 3rdparty/libzip/regress/filename_duplicate_empty.zip create mode 100644 3rdparty/libzip/regress/filename_empty.zip create mode 100644 3rdparty/libzip/regress/fileorder.zip create mode 100644 3rdparty/libzip/regress/firstsecond-split-deflated.zip create mode 100644 3rdparty/libzip/regress/firstsecond-split-stored.zip create mode 100644 3rdparty/libzip/regress/firstsecond.zip create mode 100644 3rdparty/libzip/regress/foo-stored.zip create mode 100644 3rdparty/libzip/regress/fopen_unchanged.c create mode 100644 3rdparty/libzip/regress/fopen_unchanged.test create mode 100644 3rdparty/libzip/regress/fread.c create mode 100644 3rdparty/libzip/regress/fread.test create mode 100644 3rdparty/libzip/regress/fseek.c create mode 100644 3rdparty/libzip/regress/fseek_deflated.test create mode 100644 3rdparty/libzip/regress/fseek_fail.test create mode 100644 3rdparty/libzip/regress/fseek_ok.test create mode 100644 3rdparty/libzip/regress/fuzz_main.c create mode 100644 3rdparty/libzip/regress/gap-add.zip create mode 100644 3rdparty/libzip/regress/gap-delete.zip create mode 100644 3rdparty/libzip/regress/gap-replace.zip create mode 100644 3rdparty/libzip/regress/gap.zip create mode 100644 3rdparty/libzip/regress/get_comment.test create mode 100644 3rdparty/libzip/regress/hole.c create mode 100644 3rdparty/libzip/regress/incons-archive-comment-longer.zip create mode 100644 3rdparty/libzip/regress/incons-archive-comment-shorter.zip create mode 100644 3rdparty/libzip/regress/incons-cdoffset.zip create mode 100644 3rdparty/libzip/regress/incons-central-compression-method.zip create mode 100644 3rdparty/libzip/regress/incons-central-compsize-larger-toolarge.zip create mode 100644 3rdparty/libzip/regress/incons-central-compsize-larger.zip create mode 100644 3rdparty/libzip/regress/incons-central-compsize-smaller.zip create mode 100644 3rdparty/libzip/regress/incons-central-crc.zip create mode 100644 3rdparty/libzip/regress/incons-central-date.zip create mode 100644 3rdparty/libzip/regress/incons-central-file-comment-longer.zip create mode 100644 3rdparty/libzip/regress/incons-central-file-comment-shorter.zip create mode 100644 3rdparty/libzip/regress/incons-central-magic-bad.zip create mode 100644 3rdparty/libzip/regress/incons-central-magic-bad2.zip create mode 100644 3rdparty/libzip/regress/incons-central-size-larger.zip create mode 100644 3rdparty/libzip/regress/incons-data.zip create mode 100644 3rdparty/libzip/regress/incons-ef-central-size-wrong.zip create mode 100644 3rdparty/libzip/regress/incons-ef-local-id-size.zip create mode 100644 3rdparty/libzip/regress/incons-ef-local-id.zip create mode 100644 3rdparty/libzip/regress/incons-ef-local-size.zip create mode 100644 3rdparty/libzip/regress/incons-eocd-magic-bad.zip create mode 100644 3rdparty/libzip/regress/incons-file-count-high.zip create mode 100644 3rdparty/libzip/regress/incons-file-count-low.zip create mode 100644 3rdparty/libzip/regress/incons-file-count-overflow.zip create mode 100644 3rdparty/libzip/regress/incons-local-compression-method.zip create mode 100644 3rdparty/libzip/regress/incons-local-compsize-larger.zip create mode 100644 3rdparty/libzip/regress/incons-local-compsize-smaller.zip create mode 100644 3rdparty/libzip/regress/incons-local-crc.zip create mode 100644 3rdparty/libzip/regress/incons-local-filename-long.zip create mode 100644 3rdparty/libzip/regress/incons-local-filename-missing.zip create mode 100644 3rdparty/libzip/regress/incons-local-filename-short.zip create mode 100644 3rdparty/libzip/regress/incons-local-filename.zip create mode 100644 3rdparty/libzip/regress/incons-local-magic-bad.zip create mode 100644 3rdparty/libzip/regress/incons-local-size-larger.zip create mode 100644 3rdparty/libzip/regress/junk-at-end.zip create mode 100644 3rdparty/libzip/regress/junk-at-start.zip create mode 100644 3rdparty/libzip/regress/junk_at_end.test create mode 100644 3rdparty/libzip/regress/junk_at_start.test create mode 100644 3rdparty/libzip/regress/large-uncompressable create mode 100644 3rdparty/libzip/regress/liboverride-test.c create mode 100644 3rdparty/libzip/regress/liboverride.c create mode 100644 3rdparty/libzip/regress/lzma-no-eos.zip create mode 100644 3rdparty/libzip/regress/malloc.c create mode 100644 3rdparty/libzip/regress/manyfiles-zip.zip create mode 100644 3rdparty/libzip/regress/multidisk.zip create mode 100644 3rdparty/libzip/regress/name_locate.test create mode 100644 3rdparty/libzip/regress/nihtest.conf.in create mode 100644 3rdparty/libzip/regress/nonrandomopen.c create mode 100644 3rdparty/libzip/regress/nonrandomopentest.c create mode 100644 3rdparty/libzip/regress/open_cons_extrabytes.test create mode 100644 3rdparty/libzip/regress/open_empty.test create mode 100644 3rdparty/libzip/regress/open_empty_2.test create mode 100644 3rdparty/libzip/regress/open_extrabytes.test create mode 100644 3rdparty/libzip/regress/open_file_count.test create mode 100644 3rdparty/libzip/regress/open_filename_duplicate.test create mode 100644 3rdparty/libzip/regress/open_filename_duplicate_consistency.test create mode 100644 3rdparty/libzip/regress/open_filename_duplicate_empty.test create mode 100644 3rdparty/libzip/regress/open_filename_duplicate_empty_consistency.test create mode 100644 3rdparty/libzip/regress/open_filename_empty.test create mode 100644 3rdparty/libzip/regress/open_incons.test create mode 100644 3rdparty/libzip/regress/open_many_fail.test create mode 100644 3rdparty/libzip/regress/open_many_ok.test create mode 100644 3rdparty/libzip/regress/open_multidisk.test create mode 100644 3rdparty/libzip/regress/open_new_but_exists.test create mode 100644 3rdparty/libzip/regress/open_new_ok.test create mode 100644 3rdparty/libzip/regress/open_nonarchive.test create mode 100644 3rdparty/libzip/regress/open_nosuchfile.test create mode 100644 3rdparty/libzip/regress/open_ok.test create mode 100644 3rdparty/libzip/regress/open_too_short.test create mode 100644 3rdparty/libzip/regress/open_truncate.test create mode 100644 3rdparty/libzip/regress/open_zip64_3mf.test create mode 100644 3rdparty/libzip/regress/open_zip64_ok.test create mode 100755 3rdparty/libzip/regress/ossfuzz.sh create mode 100644 3rdparty/libzip/regress/preload.test create mode 100644 3rdparty/libzip/regress/progress.test create mode 100644 3rdparty/libzip/regress/rename_ascii.test create mode 100644 3rdparty/libzip/regress/rename_cp437.test create mode 100644 3rdparty/libzip/regress/rename_deleted.test create mode 100644 3rdparty/libzip/regress/rename_fail.test create mode 100644 3rdparty/libzip/regress/rename_ok.test create mode 100644 3rdparty/libzip/regress/rename_ok.zip create mode 100644 3rdparty/libzip/regress/rename_utf8.test create mode 100644 3rdparty/libzip/regress/rename_utf8_encmismatch.test create mode 100644 3rdparty/libzip/regress/runtest.in create mode 100644 3rdparty/libzip/regress/set_comment_all.test create mode 100644 3rdparty/libzip/regress/set_comment_localonly.test create mode 100644 3rdparty/libzip/regress/set_comment_removeglobal.test create mode 100644 3rdparty/libzip/regress/set_comment_revert.test create mode 100644 3rdparty/libzip/regress/set_compression_bzip2_to_deflate.test create mode 100644 3rdparty/libzip/regress/set_compression_deflate_to_bzip2.test create mode 100644 3rdparty/libzip/regress/set_compression_deflate_to_deflate.test create mode 100644 3rdparty/libzip/regress/set_compression_deflate_to_store.test create mode 100644 3rdparty/libzip/regress/set_compression_lzma_no_eos_to_store.test create mode 100644 3rdparty/libzip/regress/set_compression_lzma_to_store.test create mode 100644 3rdparty/libzip/regress/set_compression_store_to_bzip2.test create mode 100644 3rdparty/libzip/regress/set_compression_store_to_deflate.test create mode 100644 3rdparty/libzip/regress/set_compression_store_to_lzma.test create mode 100644 3rdparty/libzip/regress/set_compression_store_to_store.test create mode 100644 3rdparty/libzip/regress/set_compression_store_to_xz.test create mode 100644 3rdparty/libzip/regress/set_compression_store_to_zstd.test create mode 100644 3rdparty/libzip/regress/set_compression_unknown.test create mode 100644 3rdparty/libzip/regress/set_compression_xz_to_store.test create mode 100644 3rdparty/libzip/regress/set_compression_zstd_to_store.test create mode 100644 3rdparty/libzip/regress/set_file_dostime.test create mode 100644 3rdparty/libzip/regress/set_file_mtime.test create mode 100644 3rdparty/libzip/regress/source_hole.c create mode 100644 3rdparty/libzip/regress/stat_index_cp437_guess.test create mode 100644 3rdparty/libzip/regress/stat_index_cp437_raw.test create mode 100644 3rdparty/libzip/regress/stat_index_cp437_strict.test create mode 100644 3rdparty/libzip/regress/stat_index_fileorder.test create mode 100644 3rdparty/libzip/regress/stat_index_streamed.test create mode 100644 3rdparty/libzip/regress/stat_index_streamed_zip64.test create mode 100644 3rdparty/libzip/regress/stat_index_utf8_guess.test create mode 100644 3rdparty/libzip/regress/stat_index_utf8_raw.test create mode 100644 3rdparty/libzip/regress/stat_index_utf8_strict.test create mode 100644 3rdparty/libzip/regress/stat_index_utf8_unmarked_strict.test create mode 100644 3rdparty/libzip/regress/stat_index_zip64.test create mode 100644 3rdparty/libzip/regress/stored-no-eos.zip create mode 100644 3rdparty/libzip/regress/streamed-zip64.zip create mode 100644 3rdparty/libzip/regress/streamed.zip create mode 100644 3rdparty/libzip/regress/test-cp437-comment-utf-8.zip create mode 100644 3rdparty/libzip/regress/test-cp437-fc-utf-8-filename.zip create mode 100644 3rdparty/libzip/regress/test-cp437-fc.zip create mode 100644 3rdparty/libzip/regress/test-cp437.zip create mode 100644 3rdparty/libzip/regress/test-utf8-unmarked.zip create mode 100644 3rdparty/libzip/regress/test-utf8.zip create mode 100644 3rdparty/libzip/regress/test.zip create mode 100644 3rdparty/libzip/regress/test2.zip create mode 100644 3rdparty/libzip/regress/testbuffer.zip create mode 100644 3rdparty/libzip/regress/testbzip2.zip create mode 100644 3rdparty/libzip/regress/testchanged.zip create mode 100644 3rdparty/libzip/regress/testchangedlocal.zip create mode 100644 3rdparty/libzip/regress/testcomment.zip create mode 100644 3rdparty/libzip/regress/testcomment13.zip create mode 100644 3rdparty/libzip/regress/testcommentremoved.zip create mode 100644 3rdparty/libzip/regress/testdeflated.zip create mode 100644 3rdparty/libzip/regress/testdeflated2.zip create mode 100644 3rdparty/libzip/regress/testdir.zip create mode 100644 3rdparty/libzip/regress/testempty.zip create mode 100644 3rdparty/libzip/regress/testextrabytes.zip create mode 100644 3rdparty/libzip/regress/testfile-UTF8.zip create mode 100644 3rdparty/libzip/regress/testfile-cp437.zip create mode 100644 3rdparty/libzip/regress/testfile-lzma.zip create mode 100644 3rdparty/libzip/regress/testfile-plus-extra.zip create mode 100644 3rdparty/libzip/regress/testfile-stored-dos.zip create mode 100644 3rdparty/libzip/regress/testfile-xz.zip create mode 100755 3rdparty/libzip/regress/testfile-zstd.zip create mode 100755 3rdparty/libzip/regress/testfile.txt create mode 100644 3rdparty/libzip/regress/testfile.zip create mode 100644 3rdparty/libzip/regress/testfile0.zip create mode 100644 3rdparty/libzip/regress/testfile2014.zip create mode 100644 3rdparty/libzip/regress/teststdin.zip create mode 100644 3rdparty/libzip/regress/teststored.zip create mode 100644 3rdparty/libzip/regress/tryopen.c create mode 100644 3rdparty/libzip/regress/utf-8-standardization-input.zip create mode 100644 3rdparty/libzip/regress/utf-8-standardization-output.zip create mode 100644 3rdparty/libzip/regress/utf-8-standardization.test create mode 100644 3rdparty/libzip/regress/zip-in-archive-comment.test create mode 100644 3rdparty/libzip/regress/zip-in-archive-comment.zip create mode 100644 3rdparty/libzip/regress/zip64-3mf.zip create mode 100644 3rdparty/libzip/regress/zip64.zip create mode 100644 3rdparty/libzip/regress/zip64_creation.test create mode 100644 3rdparty/libzip/regress/zip64_stored_creation.test create mode 100644 3rdparty/libzip/regress/zip_read_fuzzer.cc create mode 100644 3rdparty/libzip/regress/zip_read_fuzzer.dict create mode 100644 3rdparty/libzip/regress/zipcmp_zip_dir.test create mode 100644 3rdparty/libzip/regress/zipcmp_zip_dir.zip create mode 100644 3rdparty/libzip/regress/ziptool_regress.c create mode 100644 3rdparty/libzip/src/CMakeLists.txt create mode 100644 3rdparty/libzip/src/diff_output.c create mode 100644 3rdparty/libzip/src/diff_output.h create mode 100644 3rdparty/libzip/src/getopt.c create mode 100644 3rdparty/libzip/src/getopt.h create mode 100644 3rdparty/libzip/src/zipcmp.c create mode 100644 3rdparty/libzip/src/zipmerge.c create mode 100644 3rdparty/libzip/src/ziptool.c diff --git a/3rdparty/libzip/.clang-format b/3rdparty/libzip/.clang-format new file mode 100644 index 0000000000..8bb62b8c2c --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/.github/ISSUE_TEMPLATE/bug-report.md b/3rdparty/libzip/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000000..86c107807e --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/.github/ISSUE_TEMPLATE/compile-error.md b/3rdparty/libzip/.github/ISSUE_TEMPLATE/compile-error.md new file mode 100644 index 0000000000..45c8a7a72d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/.github/ISSUE_TEMPLATE/feature-request.md b/3rdparty/libzip/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000000..c23381e022 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/.github/workflows/build.yml b/3rdparty/libzip/.github/workflows/build.yml new file mode 100644 index 0000000000..d01b75d0cd --- /dev/null +++ b/3rdparty/libzip/.github/workflows/build.yml @@ -0,0 +1,46 @@ +name: build +on: [push] + +jobs: + all: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] +# os: [macos-latest, ubuntu-latest] + 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@v6 + id: runvcpkg + with: + vcpkgGitCommitId: 0bf3923f9fab4001c00f0f429682a0853b5749e0 + 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 ${{github.workspace}} + - name: configure (Windows) + if: ${{ runner.os == 'Windows' }} + working-directory: ${{runner.workspace}}/build + run: | + cmake -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/3rdparty/libzip/.github/workflows/codeql-analysis.yml b/3rdparty/libzip/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..696b1fa48c --- /dev/null +++ b/3rdparty/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@v2 + 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@v1 + 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@v1 + + # â„¹ï¸ 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@v1 diff --git a/3rdparty/libzip/.github/workflows/main.yml b/3rdparty/libzip/.github/workflows/main.yml new file mode 100644 index 0000000000..c68160a9d0 --- /dev/null +++ b/3rdparty/libzip/.github/workflows/main.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/3rdparty/libzip/API-CHANGES.md b/3rdparty/libzip/API-CHANGES.md new file mode 100644 index 0000000000..24e3d8e1ab --- /dev/null +++ b/3rdparty/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 `<zip.h>` 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/3rdparty/libzip/AUTHORS b/3rdparty/libzip/AUTHORS new file mode 100644 index 0000000000..a33707b01d --- /dev/null +++ b/3rdparty/libzip/AUTHORS @@ -0,0 +1,2 @@ +Dieter Baron <dillo@nih.at> +Thomas Klausner <tk@giga.or.at> diff --git a/3rdparty/libzip/CMakeLists.txt b/3rdparty/libzip/CMakeLists.txt new file mode 100644 index 0000000000..93b46a61e7 --- /dev/null +++ b/3rdparty/libzip/CMakeLists.txt @@ -0,0 +1,446 @@ +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.8.0 + 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(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 + +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_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(fileno HAVE_FILENO) +check_function_exists(fseeko HAVE_FSEEKO) +check_function_exists(ftello HAVE_FTELLO) +check_function_exists(getprogname HAVE_GETPROGNAME) +check_function_exists(localtime_r HAVE_LOCALTIME_R) +check_function_exists(setmode HAVE_SETMODE) +check_symbol_exists(snprintf stdio.h HAVE_SNPRINTF) +check_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP) +check_function_exists(strdup HAVE_STRDUP) +check_function_exists(stricmp HAVE_STRICMP) +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 <sys/ioctl.h> +#include <linux/fs.h> +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) + +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) + 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 (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(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 +set(prefix ${CMAKE_INSTALL_PREFIX}) +set(exec_prefix \${prefix}) +SET(bindir ${CMAKE_INSTALL_FULL_BINDIR}) +SET(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) +SET(includedir ${CMAKE_INSTALL_FULL_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(REGEX REPLACE "-lBZip2::BZip2" "-lbz2" LIBS ${LIBS}) +string(REGEX REPLACE "-lLibLZMA::LibLZMA" "-llzma" LIBS ${LIBS}) +string(REGEX REPLACE "-lOpenSSL::Crypto" "-lssl -lcrypto" LIBS ${LIBS}) +string(REGEX REPLACE "-lZLIB::ZLIB" "-lz" 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 <inttypes.h>") +elseif(HAVE_STDINT_H_LIBZIP) + set(LIBZIP_TYPES_INCLUDE "#include <stdint.h>") +elseif(HAVE_SYS_TYPES_H_LIBZIP) + set(LIBZIP_TYPES_INCLUDE "#include <sys/types.h>") +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/3rdparty/libzip/INSTALL.md b/3rdparty/libzip/INSTALL.md new file mode 100644 index 0000000000..5112182ece --- /dev/null +++ b/3rdparty/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_<LIBRARY>=OFF` to cmake, where `<LIBRARY>` 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/3rdparty/libzip/LICENSE b/3rdparty/libzip/LICENSE new file mode 100644 index 0000000000..573d5d94d7 --- /dev/null +++ b/3rdparty/libzip/LICENSE @@ -0,0 +1,31 @@ +Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + +The authors can be contacted at <libzip@nih.at> + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/NEWS.md b/3rdparty/libzip/NEWS.md new file mode 100644 index 0000000000..c6a41818af --- /dev/null +++ b/3rdparty/libzip/NEWS.md @@ -0,0 +1,289 @@ +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/3rdparty/libzip/README.md b/3rdparty/libzip/README.md new file mode 100644 index 0000000000..c8cffd5a0b --- /dev/null +++ b/3rdparty/libzip/README.md @@ -0,0 +1,39 @@ +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. The API is documented by man pages. + +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. + +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). + +See the [INSTALL.md](INSTALL.md) file for installation instructions and +dependencies. + +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/). + +There is a mailing list for developers using libzip. You can +subscribe to it by sending a mail with the subject "subscribe +libzip-discuss" to minimalist at nih.at. List mail should be sent +to libzip-discuss at nih.at. Use this for bug reports or questions. + +If you want to reach the authors in private, use <libzip@nih.at>. + +[](https://github.com/nih-at/libzip/actions?query=workflow%3Abuild) +[](https://ci.appveyor.com/project/nih-at/libzip) +[](https://scan.coverity.com/projects/libzip) diff --git a/3rdparty/libzip/THANKS b/3rdparty/libzip/THANKS new file mode 100644 index 0000000000..843349ea71 --- /dev/null +++ b/3rdparty/libzip/THANKS @@ -0,0 +1,120 @@ +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: + +Agostino Sarubbo +Alexander Galanin <al@galanin.nnov.ru> +Alexandr Shadchin <alexandr.shadchin@gmail.com> +Alexey Bykov <gnfalex@rambler.ru> +Andreas Deininger <andreas@deininger.net> +Andreas Falkenhahn <andreas@falkenhahn.com> +Andrew Brampton <brampton@gmail.com> +Andrew Molyneux <andrew@molyneuxfamily.co.uk> +Ankur Kothari <ankz.kothari@gmail.com> +Antonin Décimo <antonin.decimo@gmail.com> +Arseniy Terekhin <senyai@gmail.com> +BALATON Zoltan <balaton@eik.bme.hu> +Benjamin Gilbert <bgilbert@backtick.net> +Beuc <beuc@beuc.net> +Boaz Stolk <bstolk@aweta.nl> +Bogdan <bogiebog@gmail.com> +Brian 'geeknik' Carpenter <geeknik@protonmail.ch> +Carl Mastrangelo <notcarl@google.com> +Cédric Tabin +celan69 +Charlie Li <git@vishwin.info> +Chris Nehren <cnehren+libzip@pobox.com> +Christoph Cullmann <cullmann@kde.org> +Christoph M. Becker <cmbecker69@gmx.de> +Coverity <info@coverity.com> +Dane Springmeyer <dane.springmeyer@gmail.com> +Ларионов Даниил <scumcoder@yandex.ru> +David Demelier <demelier.david@gmail.com> +Dean Ellis <dellis1972@googlemail.com> +Declan Moran +Del Merritt <del@alum.mit.edu> +Devin Davila <daviladsoftware@gmail.com> +Dmytro Rybachenko <atmoliton@gmail.com> +Elvis Angelaccio +Erwin Haid <erwin.haid@gmx.de> +Eun-cheol Joo +Fabrice Fontaine +Florian Delizy <florian.delizy@gmail.com> +Force Charlie <charlieio@outlook.com> +François Simon <AT.GFI.Francois.SIMON@sesam-vitale.fr> +Frederik Ramm <frederik@remote.org> +gk7huki <gk7huki@gmail.com> +Gerard ODonnell +Hanno Böck <hanno@hboeck.de> +HeeMyung +Heiko Becker +Heiko Hund <heiko@ist.eigentlich.net> +Ilya Voronin +Info-ZIP group +Jan Weiß <jan@geheimwerk.de> +Jay Freeman (saurik) <saurik@saurik.com> +jloqfjgk@github +Joachim Reichel <joachim.reichel@gmx.de> +João Custódio <joao_custodio@symantec.com> +Joel Ebrahimi <joel.ebrahimi@gmail.com> +Jono Spiro <jono.spiro@gmail.com> +Julien Schueller <schueller@phimeca.com> +kensington <kensington@gentoo.org> +Keith Jones <keith@keithjjones.com> +Khaled Mardam-Bey +Kohei Yoshida <kohei.yoshida@gmail.com> +Leith Bade <leith@mapbox.com> +Lubomir I. Ivanov <neolit123@gmail.com> +Maël Nison +Martin Buchholz <martinrb@google.com> +Martin Herkt <lachs0r@srsfckn.biz> +Martin Szulecki <m.szulecki@libimobiledevice.org> +Michael Balzer +Michael Beck <mm.beck@gmx.net> +MichaÅ‚ Janiszewski <janisozaur+libzip@gmail.com> +Michal Vyskocil <mvyskocil@suse.cz> +Mikhail Gusarov <dottedmag@dottedmag.net>. +Miklos Vajna +Morris Hafner +Oliver Kaiser <under.northern.sky@googlemail.com> +Oliver Kuckertz <oliver.kuckertz@mologie.de> +OSS-Fuzz Team +Ørjan Malde <red@foxi.me> +Pascal Terjan <pterjan@gmail.com> +Patrick Spendrin <ps_ml@gmx.de> +Paul Harris <harris.pc@gmail.com> +Paul Sheppard <shepsoft@googlemail.com> +Pavel Raiskup <praiskup@redhat.com> +Pierre Joye <pierre.php@gmail.com> +Pierre-Louis Cabelguen <plcabelguen@googlemail.com> +Randy <randy408@protonmail.com> +Remi Collet <remi@fedoraproject.org> +Richard Schütz +Rick Carback <carback1@umbc.edu> +Rikard Falkeborn <rikard.falkeborn@gmail.com> +Robert Norris <rw_norris@hotmail.com> +Roberto Tirabassi <rtirabassi@3di.it> +Roland Ortloff <Ortloff.R@gmx.de> +Rosen Penev <rosenp@gmail.com> +Ryan Burns <rtburns@protonmail.com> +Sebastian Kemper <sebastian_ml@gmx.net> +Sebastian Schmitt <sebastian.schmitt@auvesy.de> +Sergei Ozerov <ru.programmist@gmail.com> +Simon Talbot <simont@nse.co.uk> +Stephen Bryant <steve@bawue.de> +Tabata Shintaro <tabata.shintaro@gmail.com> +Tarmo Pikaro <tapika@yahoo.com> +Taylor C. Richberger +TC +Tim Lunn <Tim@feathertop.org> +Timo Warns <warns@pre-sense.de> +Tom Callaway <tcallawa@redhat.com> +Tomas Hoger <thoger@redhat.com> +Tomáš Malý <malytomas@ucpu.cz> +Torsten Paul <Torsten.Paul@gmx.de> +Transporter <ogre.transporter@gmail.com> +Vassili Courzakis <vcoxvco@googlemail.com> +William Lee +Wojciech Michalski <wmichalski@quay.pl> +Wolfgang Glunz <Wolfgang.Glunz@gmx.de> diff --git a/3rdparty/libzip/TODO.md b/3rdparty/libzip/TODO.md new file mode 100644 index 0000000000..a7305aa461 --- /dev/null +++ b/3rdparty/libzip/TODO.md @@ -0,0 +1,179 @@ +## Before next release + +reconsider zip_source_zip (uncompressed data for whole file not easy to get) + +## 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 + +* `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 + +* add flag `ZIP_FL_SUPPORT_MULTIPLE_OPENS` and allow zip_fopen (perhaps other functions) on added/replaced files with such sources +* add seek support for AES-encrypted files +* 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: `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 TravisCI. +* improve man page formatting of tagged lists on webpage (`<dl>`) +* 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/3rdparty/libzip/android/do.sh b/3rdparty/libzip/android/do.sh new file mode 100755 index 0000000000..c4641c9f23 --- /dev/null +++ b/3rdparty/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=../../${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/3rdparty/libzip/android/docker/Dockerfile b/3rdparty/libzip/android/docker/Dockerfile new file mode 100644 index 0000000000..5532bde28b --- /dev/null +++ b/3rdparty/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 <userid>:<groupid> ./build +# > sudo chown -R <userid>:<groupid> ./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/3rdparty/libzip/android/readme.txt b/3rdparty/libzip/android/readme.txt new file mode 100644 index 0000000000..aa69fbd455 --- /dev/null +++ b/3rdparty/libzip/android/readme.txt @@ -0,0 +1,10 @@ + +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. diff --git a/3rdparty/libzip/appveyor.yml b/3rdparty/libzip/appveyor.yml new file mode 100644 index 0000000000..21d645619d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake-compat/CMakePushCheckState.cmake b/3rdparty/libzip/cmake-compat/CMakePushCheckState.cmake new file mode 100644 index 0000000000..3e519ee512 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake-compat/CheckLibraryExists.cmake b/3rdparty/libzip/cmake-compat/CheckLibraryExists.cmake new file mode 100644 index 0000000000..76901ab618 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake-compat/CheckSymbolExists.cmake b/3rdparty/libzip/cmake-compat/CheckSymbolExists.cmake new file mode 100644 index 0000000000..79d3d7d785 --- /dev/null +++ b/3rdparty/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(<symbol> <files> <variable>) + + Check that the ``<symbol>`` is available after including given header + ``<files>`` and store the result in a ``<variable>``. Specify the list + of files in one argument as a semicolon-separated list. + ``<variable>`` 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 <CMake Language Lists>` of macros to define (-DFOO=bar). +``CMAKE_REQUIRED_INCLUDES`` + a :ref:`;-list <CMake Language Lists>` of header search paths to pass to + the compiler. +``CMAKE_REQUIRED_LINK_OPTIONS`` + a :ref:`;-list <CMake Language Lists>` of options to add to the link command. +``CMAKE_REQUIRED_LIBRARIES`` + a :ref:`;-list <CMake Language Lists>` 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/3rdparty/libzip/cmake-compat/FindBZip2.cmake b/3rdparty/libzip/cmake-compat/FindBZip2.cmake new file mode 100644 index 0000000000..98ab72cd85 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake-compat/FindGnuTLS.cmake b/3rdparty/libzip/cmake-compat/FindGnuTLS.cmake new file mode 100644 index 0000000000..819f000121 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake-compat/FindLibLZMA.cmake b/3rdparty/libzip/cmake-compat/FindLibLZMA.cmake new file mode 100644 index 0000000000..200d6bf8d6 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake b/3rdparty/libzip/cmake-compat/FindPackageHandleStandardArgs.cmake new file mode 100644 index 0000000000..a078049e2b --- /dev/null +++ b/3rdparty/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(<PackageName>)` calls. It handles the +``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``. +It also sets the ``<PackageName>_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(<PackageName> + (DEFAULT_MSG|<custom-failure-message>) + <required-var>... + ) + + find_package_handle_standard_args(<PackageName> + [FOUND_VAR <result-var>] + [REQUIRED_VARS <required-var>...] + [VERSION_VAR <version-var>] + [HANDLE_COMPONENTS] + [CONFIG_MODE] + [NAME_MISMATCHED] + [REASON_FAILURE_MESSAGE <reason-failure-message>] + [FAIL_MESSAGE <custom-failure-message>] + ) + + The ``<PackageName>_FOUND`` variable will be set to ``TRUE`` if all + the variables ``<required-var>...`` 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|<custom-failure-message>)`` + 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 <result-var>`` + Obsolete. Specifies either ``<PackageName>_FOUND`` or + ``<PACKAGENAME>_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 <required-var>...`` + 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 <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 ``<PackageName>_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(<PackageName> NO_MODULE)``. This implies + a ``VERSION_VAR`` value of ``<PackageName>_VERSION``. The command + will automatically check whether the package configuration file + was found. + + ``REASON_FAILURE_MESSAGE <reason-failure-message>`` + Specify a custom message of the reason for the failure which will be + appended to the default generated message. + + ``FAIL_MESSAGE <custom-failure-message>`` + Specify a custom failure message instead of using the default + generated message. Not recommended. + + ``NAME_MISMATCHED`` + Indicate that the ``<PackageName>`` 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 ``<required-var>``. On repeated CMake runs, +the same message will not be printed again. + +.. note:: + + If ``<PackageName>`` 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) + # <PackageName>_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 <PackageName>_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/3rdparty/libzip/cmake-compat/FindPackageMessage.cmake b/3rdparty/libzip/cmake-compat/FindPackageMessage.cmake new file mode 100644 index 0000000000..0628b98169 --- /dev/null +++ b/3rdparty/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(<name> "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/3rdparty/libzip/cmake-compat/SelectLibraryConfigurations.cmake b/3rdparty/libzip/cmake-compat/SelectLibraryConfigurations.cmake new file mode 100644 index 0000000000..4c0e9a8c0a --- /dev/null +++ b/3rdparty/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 <wdicharry@stellarscience.com>. + +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/3rdparty/libzip/cmake-config.h.in b/3rdparty/libzip/cmake-config.h.in new file mode 100644 index 0000000000..544adbde9c --- /dev/null +++ b/3rdparty/libzip/cmake-config.h.in @@ -0,0 +1,63 @@ +#ifndef HAD_CONFIG_H +#define HAD_CONFIG_H +#ifndef _HAD_ZIPCONF_H +#include "zipconf.h" +#endif +/* BEGIN DEFINES */ +#cmakedefine HAVE___PROGNAME +#cmakedefine HAVE__CLOSE +#cmakedefine HAVE__DUP +#cmakedefine HAVE__FDOPEN +#cmakedefine HAVE__FILENO +#cmakedefine HAVE__SETMODE +#cmakedefine HAVE__SNPRINTF +#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_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_MBEDTLS +#cmakedefine HAVE_MKSTEMP +#cmakedefine HAVE_NULLABLE +#cmakedefine HAVE_OPENSSL +#cmakedefine HAVE_SETMODE +#cmakedefine HAVE_SNPRINTF +#cmakedefine HAVE_STRCASECMP +#cmakedefine HAVE_STRDUP +#cmakedefine HAVE_STRICMP +#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/3rdparty/libzip/cmake-zipconf.h.in b/3rdparty/libzip/cmake-zipconf.h.in new file mode 100644 index 0000000000..b88ed267fa --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/cmake/Dist.cmake b/3rdparty/libzip/cmake/Dist.cmake new file mode 100644 index 0000000000..829112f443 --- /dev/null +++ b/3rdparty/libzip/cmake/Dist.cmake @@ -0,0 +1,83 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at <libzip@nih.at> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (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 ${ARCHIVE_NAME}.tar.gz HEAD + COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${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 ${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/3rdparty/libzip/cmake/FindMbedTLS.cmake b/3rdparty/libzip/cmake/FindMbedTLS.cmake new file mode 100644 index 0000000000..244b0c57c2 --- /dev/null +++ b/3rdparty/libzip/cmake/FindMbedTLS.cmake @@ -0,0 +1,132 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at <libzip@nih.at> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (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) + if(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/3rdparty/libzip/cmake/FindNettle.cmake b/3rdparty/libzip/cmake/FindNettle.cmake new file mode 100644 index 0000000000..982ac81ee1 --- /dev/null +++ b/3rdparty/libzip/cmake/FindNettle.cmake @@ -0,0 +1,141 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at <libzip@nih.at> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/cmake/FindZstd.cmake b/3rdparty/libzip/cmake/FindZstd.cmake new file mode 100644 index 0000000000..a0da503814 --- /dev/null +++ b/3rdparty/libzip/cmake/FindZstd.cmake @@ -0,0 +1,135 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at <libzip@nih.at> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/examples/CMakeLists.txt b/3rdparty/libzip/examples/CMakeLists.txt new file mode 100644 index 0000000000..9019e0ab6a --- /dev/null +++ b/3rdparty/libzip/examples/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(in-memory in-memory.c) +target_link_libraries(in-memory zip) +target_include_directories(in-memory PRIVATE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) diff --git a/3rdparty/libzip/examples/in-memory.c b/3rdparty/libzip/examples/in-memory.c new file mode 100644 index 0000000000..19f60ee115 --- /dev/null +++ b/3rdparty/libzip/examples/in-memory.c @@ -0,0 +1,217 @@ +/* + in-memory.c -- modify zip file in memory + Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> + +#include <zip.h> + +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/3rdparty/libzip/examples/windows-open.c b/3rdparty/libzip/examples/windows-open.c new file mode 100644 index 0000000000..d01ea06741 --- /dev/null +++ b/3rdparty/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-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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.h> + +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/3rdparty/libzip/lib/CMakeLists.txt b/3rdparty/libzip/lib/CMakeLists.txt new file mode 100644 index 0000000000..1069cec14c --- /dev/null +++ b/3rdparty/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_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_mkstempm.c + 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.4 SOVERSION 5) +endif() + +target_link_libraries(zip PRIVATE ZLIB::ZLIB) +target_include_directories(zip + PUBLIC + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/lib> + $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> + ) + +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/3rdparty/libzip/lib/compat.h b/3rdparty/libzip/lib/compat.h new file mode 100644 index 0000000000..47c28fde91 --- /dev/null +++ b/3rdparty/libzip/lib/compat.h @@ -0,0 +1,194 @@ +#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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 + +#ifdef _WIN32 +#ifndef ZIP_EXTERN +#ifndef ZIP_STATIC +#define ZIP_EXTERN __declspec(dllexport) +#endif +#endif +/* for dup(), close(), etc. */ +#include <io.h> +#endif + +#ifdef HAVE_STDBOOL_H +#include <stdbool.h> +#else +typedef char bool; +#define true 1 +#define false 0 +#endif + +#include <errno.h> + +/* 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__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 + +#if !defined(HAVE_STRCASECMP) +#if defined(HAVE__STRICMP) +#define strcasecmp _stricmp +#elif defined(HAVE_STRICMP) +#define strcasecmp stricmp +#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 <limits.h> +#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/3rdparty/libzip/lib/zip.h b/3rdparty/libzip/lib/zip.h new file mode 100644 index 0000000000..4b9b9e9586 --- /dev/null +++ b/3rdparty/libzip/lib/zip.h @@ -0,0 +1,484 @@ +#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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zipconf.h> + +#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 <stdio.h> +#include <sys/types.h> +#include <time.h> + +/* 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 */ + +/* 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 */ +}; +typedef enum zip_source_cmd zip_source_cmd_t; + +#define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd) (((zip_int64_t)1) << (cmd)) + +/* 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 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 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_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_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_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 *zip_source_win32a(zip_t *, const char *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *zip_source_win32a_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *); +ZIP_EXTERN zip_source_t *zip_source_win32handle(zip_t *, void *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *zip_source_win32handle_create(void *, zip_uint64_t, zip_int64_t, zip_error_t *); +ZIP_EXTERN zip_source_t *zip_source_win32w(zip_t *, const wchar_t *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *zip_source_win32w_create(const wchar_t *, zip_uint64_t, zip_int64_t, zip_error_t *); +#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/3rdparty/libzip/lib/zip_add.c b/3rdparty/libzip/lib/zip_add.c new file mode 100644 index 0000000000..dd6dcbc8c6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_add_dir.c b/3rdparty/libzip/lib/zip_add_dir.c new file mode 100644 index 0000000000..41de94bc86 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_add_entry.c b/3rdparty/libzip/lib/zip_add_entry.c new file mode 100644 index 0000000000..6f3c1626ad --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_algorithm_bzip2.c b/3rdparty/libzip/lib/zip_algorithm_bzip2.c new file mode 100644 index 0000000000..ebc68d9583 --- /dev/null +++ b/3rdparty/libzip/lib/zip_algorithm_bzip2.c @@ -0,0 +1,285 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <bzlib.h> +#include <limits.h> +#include <stdlib.h> + +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; + + int ret; + + if (ctx->zstr.avail_in == 0 && !ctx->end_of_input) { + *length = 0; + return ZIP_COMPRESSION_NEED_DATA; + } + + ctx->zstr.avail_out = (unsigned int)ZIP_MIN(UINT_MAX, *length); + 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 = *length - 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/3rdparty/libzip/lib/zip_algorithm_deflate.c b/3rdparty/libzip/lib/zip_algorithm_deflate.c new file mode 100644 index 0000000000..8707eecf4f --- /dev/null +++ b/3rdparty/libzip/lib/zip_algorithm_deflate.c @@ -0,0 +1,265 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <limits.h> +#include <stdlib.h> +#include <zlib.h> + +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; + + int ret; + + ctx->zstr.avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + 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 = *length - 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/3rdparty/libzip/lib/zip_algorithm_xz.c b/3rdparty/libzip/lib/zip_algorithm_xz.c new file mode 100644 index 0000000000..f0c2fd37ab --- /dev/null +++ b/3rdparty/libzip/lib/zip_algorithm_xz.c @@ -0,0 +1,406 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <limits.h> +#include <lzma.h> +#include <stdlib.h> +#include <zlib.h> + +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); + memcpy(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; + 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); + memcpy(data, 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; + } + } + + ctx->zstr.avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.next_out = (Bytef *)data; + + ret = lzma_code(&ctx->zstr, ctx->end_of_input ? LZMA_FINISH : LZMA_RUN); + *length = *length - 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/3rdparty/libzip/lib/zip_algorithm_zstd.c b/3rdparty/libzip/lib/zip_algorithm_zstd.c new file mode 100644 index 0000000000..a7e2d672a8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <limits.h> +#include <stdlib.h> +#include <zstd.h> +#include <zstd_errors.h> + +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/3rdparty/libzip/lib/zip_buffer.c b/3rdparty/libzip/lib/zip_buffer.c new file mode 100644 index 0000000000..4e5783e895 --- /dev/null +++ b/3rdparty/libzip/lib/zip_buffer.c @@ -0,0 +1,324 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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) { + if (_zip_buffer_left(buffer) < length) { + length = _zip_buffer_left(buffer); + } + + memcpy(data, _zip_buffer_get(buffer, length), length); + + return length; +} + + +zip_buffer_t * +_zip_buffer_new(zip_uint8_t *data, zip_uint64_t size) { + bool free_data = (data == NULL); + zip_buffer_t *buffer; + + if (data == NULL) { + if ((data = (zip_uint8_t *)malloc(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; + } + + memcpy(dst, 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/3rdparty/libzip/lib/zip_close.c b/3rdparty/libzip/lib/zip_close.c new file mode 100644 index 0000000000..a990c2f502 --- /dev/null +++ b/3rdparty/libzip/lib/zip_close.c @@ -0,0 +1,698 @@ +/* + zip_close.c -- close zip archive and update changes + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> +#ifdef _WIN32 +#include <fcntl.h> +#include <io.h> +#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 ((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; + } + if (de->encryption_method == ZIP_EM_TRAD_PKWARE) { + de->bitflags |= ZIP_GPBF_DATA_DESCRIPTOR; + } + + 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); + size_t n; + double total = (double)len; + + if (!byte_array_init(buf, BUFSIZE)) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + while (len > 0) { + n = len > BUFSIZE ? BUFSIZE : len; + 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/3rdparty/libzip/lib/zip_crypto.h b/3rdparty/libzip/lib/zip_crypto.h new file mode 100644 index 0000000000..ac6e109266 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_crypto_commoncrypto.c b/3rdparty/libzip/lib/zip_crypto_commoncrypto.c new file mode 100644 index 0000000000..58b797df6d --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#include "zipint.h" + +#include "zip_crypto.h" + +#include <fcntl.h> +#include <unistd.h> + +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/3rdparty/libzip/lib/zip_crypto_commoncrypto.h b/3rdparty/libzip/lib/zip_crypto_commoncrypto.h new file mode 100644 index 0000000000..1eae1b707b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <CommonCrypto/CommonCrypto.h> + +#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/3rdparty/libzip/lib/zip_crypto_gnutls.c b/3rdparty/libzip/lib/zip_crypto_gnutls.c new file mode 100644 index 0000000000..406fceb0e1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_crypto_gnutls.h b/3rdparty/libzip/lib/zip_crypto_gnutls.h new file mode 100644 index 0000000000..6743186890 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <nettle/aes.h> +#include <nettle/pbkdf2.h> + +#include <gnutls/gnutls.h> + +#include <gnutls/crypto.h> + +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/3rdparty/libzip/lib/zip_crypto_mbedtls.c b/3rdparty/libzip/lib/zip_crypto_mbedtls.c new file mode 100644 index 0000000000..09cdf096f0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#include "zipint.h" + +#include "zip_crypto.h" + +#include <mbedtls/ctr_drbg.h> +#include <mbedtls/entropy.h> +#include <mbedtls/pkcs5.h> + +#include <limits.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; + } + + 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/3rdparty/libzip/lib/zip_crypto_mbedtls.h b/3rdparty/libzip/lib/zip_crypto_mbedtls.h new file mode 100644 index 0000000000..a82b2fd2a0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <mbedtls/aes.h> +#include <mbedtls/md.h> + +#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/3rdparty/libzip/lib/zip_crypto_openssl.c b/3rdparty/libzip/lib/zip_crypto_openssl.c new file mode 100644 index 0000000000..5cbc5ce2c0 --- /dev/null +++ b/3rdparty/libzip/lib/zip_crypto_openssl.c @@ -0,0 +1,137 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#include "zipint.h" + +#include "zip_crypto.h" + +#include <limits.h> +#include <openssl/rand.h> + +#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; + + if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + AES_set_encrypt_key(key, key_size, aes); + + return aes; +} + +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 (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/3rdparty/libzip/lib/zip_crypto_openssl.h b/3rdparty/libzip/lib/zip_crypto_openssl.h new file mode 100644 index 0000000000..d959b8dea0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <openssl/aes.h> +#include <openssl/hmac.h> + +#define _zip_crypto_aes_t AES_KEY +#define _zip_crypto_hmac_t HMAC_CTX + +void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); +#define _zip_crypto_aes_encrypt_block(aes, in, out) (AES_encrypt((in), (out), (aes)), true) +_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/3rdparty/libzip/lib/zip_crypto_win.c b/3rdparty/libzip/lib/zip_crypto_win.c new file mode 100644 index 0000000000..8202bfe189 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <limits.h> + +#include "zipint.h" + +#include "zip_crypto.h" + +#define WIN32_LEAN_AND_MEAN +#define NOCRYPT + +#include <windows.h> + +#include <bcrypt.h> + +#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 <math.h> + +#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 */ + memcpy(U, 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 { + memcpy(U, V, DIGEST_SIZE); + dwULen = DIGEST_SIZE; + } + + if (!hmacCalculate(&prfCtx, U, dwULen, V)) { + goto PBKDF2_end; + } + + myxor(Ti, V, DIGEST_SIZE); + } + + if (i != l) { + memcpy(&pbDerivedKey[(i - 1) * DIGEST_SIZE], Ti, DIGEST_SIZE); + } + else { + /* Take only the first r bytes */ + memcpy(&pbDerivedKey[(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/3rdparty/libzip/lib/zip_crypto_win.h b/3rdparty/libzip/lib/zip_crypto_win.h new file mode 100644 index 0000000000..be9fdc6a69 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_delete.c b/3rdparty/libzip/lib/zip_delete.c new file mode 100644 index 0000000000..7d82d9afde --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_dir_add.c b/3rdparty/libzip/lib/zip_dir_add.c new file mode 100644 index 0000000000..89eb43292c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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 ((s = (char *)malloc(len + 2)) == NULL) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + strcpy(s, name); + 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/3rdparty/libzip/lib/zip_dirent.c b/3rdparty/libzip/lib/zip_dirent.c new file mode 100644 index 0000000000..a7c336bcc4 --- /dev/null +++ b/3rdparty/libzip/lib/zip_dirent.c @@ -0,0 +1,1163 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <time.h> + +#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) + memcpy(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; + zip_buffer_t *ef_buffer; + 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); + /* TODO: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */ + if (ef == NULL) { + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + + if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + + 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); + if (!from_buffer) { + _zip_buffer_free(buffer); + } + return -1; + } + } + _zip_buffer_free(ef_buffer); + } + + 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; +} + + +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: + if (de->uncomp_size < 20 /* TODO: constant */) { + crc_valid = false; + } + 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; + +#ifdef HAVE_LOCALTIME_R + struct tm tm; + tpm = localtime_r(&intime, &tm); +#else + tpm = localtime(&intime); +#endif + 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)); + + return; +} + + +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/3rdparty/libzip/lib/zip_discard.c b/3rdparty/libzip/lib/zip_discard.c new file mode 100644 index 0000000000..42f4eb85ee --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_entry.c b/3rdparty/libzip/lib/zip_entry.c new file mode 100644 index 0000000000..dfc6419170 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_error.c b/3rdparty/libzip/lib/zip_error.c new file mode 100644 index 0000000000..6c7e49f53b --- /dev/null +++ b/3rdparty/libzip/lib/zip_error.c @@ -0,0 +1,151 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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) { + _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/3rdparty/libzip/lib/zip_error_clear.c b/3rdparty/libzip/lib/zip_error_clear.c new file mode 100644 index 0000000000..f6555396d2 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_error_get.c b/3rdparty/libzip/lib/zip_error_get.c new file mode 100644 index 0000000000..f310ed33e7 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_error_get_sys_type.c b/3rdparty/libzip/lib/zip_error_get_sys_type.c new file mode 100644 index 0000000000..d9eb47a1a8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_error_strerror.c b/3rdparty/libzip/lib/zip_error_strerror.c new file mode 100644 index 0000000000..c283d8870a --- /dev/null +++ b/3rdparty/libzip/lib/zip_error_strerror.c @@ -0,0 +1,108 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <zlib.h> + +#include "zipint.h" + +ZIP_EXTERN const char * +zip_error_strerror(zip_error_t *err) { + const char *zip_error_string, *system_error_string; + char buf[128], *s; + + zip_error_fini(err); + + if (err->zip_err < 0 || err->zip_err >= _zip_err_str_count) { + snprintf(buf, sizeof(buf), "Unknown error %d", err->zip_err); + buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */ + zip_error_string = NULL; + system_error_string = buf; + } + else { + zip_error_string = _zip_err_str[err->zip_err].description; + + switch (_zip_err_str[err->zip_err].type) { + case ZIP_ET_SYS: + system_error_string = strerror(err->sys_err); + 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) { + snprintf(buf, sizeof(buf), "invalid detail error %u", error); + buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */ + system_error_string = buf; + } + else if (_zip_err_details[error].type == ZIP_DETAIL_ET_ENTRY && index < MAX_DETAIL_INDEX) { + snprintf(buf, sizeof(buf), "entry %d: %s", index, _zip_err_details[error].description); + buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */ + system_error_string = buf; + } + else { + system_error_string = _zip_err_details[error].description; + } + break; + } + + default: + system_error_string = NULL; + } + } + + if (system_error_string == NULL) { + return zip_error_string; + } + else { + if ((s = (char *)malloc(strlen(system_error_string) + (zip_error_string ? strlen(zip_error_string) + 2 : 0) + 1)) == NULL) { + return _zip_err_str[ZIP_ER_MEMORY].description; + } + + sprintf(s, "%s%s%s", (zip_error_string ? zip_error_string : ""), (zip_error_string ? ": " : ""), system_error_string); + err->str = s; + + return s; + } +} diff --git a/3rdparty/libzip/lib/zip_error_to_str.c b/3rdparty/libzip/lib/zip_error_to_str.c new file mode 100644 index 0000000000..f13ac19cac --- /dev/null +++ b/3rdparty/libzip/lib/zip_error_to_str.c @@ -0,0 +1,67 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <string.h> +#include <zlib.h> + +#define _ZIP_COMPILING_DEPRECATED +#include "zipint.h" + + +ZIP_EXTERN int +zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { + const char *zs, *ss; + + if (ze < 0 || ze >= _zip_err_str_count) { + return snprintf(buf, len, "Unknown error %d", ze); + } + + zs = _zip_err_str[ze].description; + + switch (_zip_err_str[ze].type) { + case ZIP_ET_SYS: + ss = strerror(se); + break; + + case ZIP_ET_ZLIB: + ss = zError(se); + break; + + default: + ss = NULL; + } + + return snprintf(buf, len, "%s%s%s", zs, (ss ? ": " : ""), (ss ? ss : "")); +} diff --git a/3rdparty/libzip/lib/zip_extra_field.c b/3rdparty/libzip/lib/zip_extra_field.c new file mode 100644 index 0000000000..8983f758cb --- /dev/null +++ b/3rdparty/libzip/lib/zip_extra_field.c @@ -0,0 +1,426 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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 */ + 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", 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/3rdparty/libzip/lib/zip_extra_field_api.c b/3rdparty/libzip/lib/zip_extra_field_api.c new file mode 100644 index 0000000000..9a828e4a59 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_fclose.c b/3rdparty/libzip/lib/zip_fclose.c new file mode 100644 index 0000000000..3984b98b16 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_fdopen.c b/3rdparty/libzip/lib/zip_fdopen.c new file mode 100644 index 0000000000..c2708c6621 --- /dev/null +++ b/3rdparty/libzip/lib/zip_fdopen.c @@ -0,0 +1,86 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <unistd.h> +#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; + } + + /* 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; +} diff --git a/3rdparty/libzip/lib/zip_file_add.c b/3rdparty/libzip/lib/zip_file_add.c new file mode 100644 index 0000000000..02b6599812 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_error_clear.c b/3rdparty/libzip/lib/zip_file_error_clear.c new file mode 100644 index 0000000000..b47e3d2432 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_error_get.c b/3rdparty/libzip/lib/zip_file_error_get.c new file mode 100644 index 0000000000..cce1ac2bbc --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_get_comment.c b/3rdparty/libzip/lib/zip_file_get_comment.c new file mode 100644 index 0000000000..59b768a285 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_get_external_attributes.c b/3rdparty/libzip/lib/zip_file_get_external_attributes.c new file mode 100644 index 0000000000..f642918db7 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_get_offset.c b/3rdparty/libzip/lib/zip_file_get_offset.c new file mode 100644 index 0000000000..c9c8fd8de9 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <string.h> + +#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/3rdparty/libzip/lib/zip_file_rename.c b/3rdparty/libzip/lib/zip_file_rename.c new file mode 100644 index 0000000000..d65f64aa39 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <string.h> + +#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/3rdparty/libzip/lib/zip_file_replace.c b/3rdparty/libzip/lib/zip_file_replace.c new file mode 100644 index 0000000000..a8cf86c673 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_set_comment.c b/3rdparty/libzip/lib/zip_file_set_comment.c new file mode 100644 index 0000000000..0276a4752c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_file_set_encryption.c b/3rdparty/libzip/lib/zip_file_set_encryption.c new file mode 100644 index 0000000000..aa0d707d2b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +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/3rdparty/libzip/lib/zip_file_set_external_attributes.c b/3rdparty/libzip/lib/zip_file_set_external_attributes.c new file mode 100644 index 0000000000..6ca01f29ad --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_file_set_mtime.c b/3rdparty/libzip/lib/zip_file_set_mtime.c new file mode 100644 index 0000000000..2753d595e5 --- /dev/null +++ b/3rdparty/libzip/lib/zip_file_set_mtime.c @@ -0,0 +1,68 @@ +/* + zip_file_set_mtime.c -- set modification time of entry. + Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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->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/3rdparty/libzip/lib/zip_file_strerror.c b/3rdparty/libzip/lib/zip_file_strerror.c new file mode 100644 index 0000000000..e21c1dcda5 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_fopen.c b/3rdparty/libzip/lib/zip_fopen.c new file mode 100644 index 0000000000..513f78b625 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_fopen_encrypted.c b/3rdparty/libzip/lib/zip_fopen_encrypted.c new file mode 100644 index 0000000000..5a48437e3a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_fopen_index.c b/3rdparty/libzip/lib/zip_fopen_index.c new file mode 100644 index 0000000000..1f7ce8cb5e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_fopen_index_encrypted.c b/3rdparty/libzip/lib/zip_fopen_index_encrypted.c new file mode 100644 index 0000000000..dfdeffa977 --- /dev/null +++ b/3rdparty/libzip/lib/zip_fopen_index_encrypted.c @@ -0,0 +1,87 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> + +#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->eof = 0; + zf->src = NULL; + + return zf; +} diff --git a/3rdparty/libzip/lib/zip_fread.c b/3rdparty/libzip/lib/zip_fread.c new file mode 100644 index 0000000000..edad9d2a99 --- /dev/null +++ b/3rdparty/libzip/lib/zip_fread.c @@ -0,0 +1,62 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 ((zf->eof) || (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/3rdparty/libzip/lib/zip_fseek.c b/3rdparty/libzip/lib/zip_fseek.c new file mode 100644 index 0000000000..542ca0759b --- /dev/null +++ b/3rdparty/libzip/lib/zip_fseek.c @@ -0,0 +1,51 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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; +} diff --git a/3rdparty/libzip/lib/zip_ftell.c b/3rdparty/libzip/lib/zip_ftell.c new file mode 100644 index 0000000000..42067a1dd4 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_get_archive_comment.c b/3rdparty/libzip/lib/zip_get_archive_comment.c new file mode 100644 index 0000000000..6752380514 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <string.h> + +#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/3rdparty/libzip/lib/zip_get_archive_flag.c b/3rdparty/libzip/lib/zip_get_archive_flag.c new file mode 100644 index 0000000000..e4d412cf5c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_get_encryption_implementation.c b/3rdparty/libzip/lib/zip_get_encryption_implementation.c new file mode 100644 index 0000000000..191e805b22 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_get_file_comment.c b/3rdparty/libzip/lib/zip_get_file_comment.c new file mode 100644 index 0000000000..dd118160d8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_get_name.c b/3rdparty/libzip/lib/zip_get_name.c new file mode 100644 index 0000000000..8777868649 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <string.h> + +#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/3rdparty/libzip/lib/zip_get_num_entries.c b/3rdparty/libzip/lib/zip_get_num_entries.c new file mode 100644 index 0000000000..16d901c6db --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_get_num_files.c b/3rdparty/libzip/lib/zip_get_num_files.c new file mode 100644 index 0000000000..1c6d6bb8c4 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <limits.h> + + +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/3rdparty/libzip/lib/zip_hash.c b/3rdparty/libzip/lib/zip_hash.c new file mode 100644 index 0000000000..e01d9356c1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +/* 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 <seander@cs.stanford.edu> + (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/3rdparty/libzip/lib/zip_io_util.c b/3rdparty/libzip/lib/zip_io_util.c new file mode 100644 index 0000000000..3ee36709f1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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; + } + memcpy(r, 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/3rdparty/libzip/lib/zip_libzip_version.c b/3rdparty/libzip/lib/zip_libzip_version.c new file mode 100644 index 0000000000..6e20724a5a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_memdup.c b/3rdparty/libzip/lib/zip_memdup.c new file mode 100644 index 0000000000..8f6175bd62 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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; + } + + memcpy(ret, mem, len); + + return ret; +} diff --git a/3rdparty/libzip/lib/zip_mkstempm.c b/3rdparty/libzip/lib/zip_mkstempm.c new file mode 100644 index 0000000000..ccdd62a249 --- /dev/null +++ b/3rdparty/libzip/lib/zip_mkstempm.c @@ -0,0 +1,93 @@ +/* + zip_mkstempm.c -- mkstemp replacement that accepts a mode argument + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <fcntl.h> +#include <string.h> +#include <sys/stat.h> + +#include "zipint.h" + +/* + * create temporary file with same permissions as previous one; + * or default permissions if there is no previous file + */ +int +_zip_mkstempm(char *path, int mode) { + int fd; + char *start, *end, *xs; + + int xcnt = 0; + + end = path + strlen(path); + start = end - 1; + while (start >= path && *start == 'X') { + xcnt++; + start--; + } + + if (xcnt == 0) { + errno = EINVAL; + return -1; + } + + start++; + + for (;;) { + zip_uint32_t value = zip_random_uint32(); + + xs = start; + + while (xs < end) { + char digit = value % 36; + if (digit < 10) { + *(xs++) = digit + '0'; + } + else { + *(xs++) = digit - 10 + 'a'; + } + value /= 36; + } + + if ((fd = open(path, 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 */ + (void)chmod(path, (mode_t)mode); + } + return fd; + } + if (errno != EEXIST) { + return -1; + } + } +} diff --git a/3rdparty/libzip/lib/zip_name_locate.c b/3rdparty/libzip/lib/zip_name_locate.c new file mode 100644 index 0000000000..8a88404771 --- /dev/null +++ b/3rdparty/libzip/lib/zip_name_locate.c @@ -0,0 +1,92 @@ +/* + zip_name_locate.c -- get index 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <string.h> +#ifdef HAVE_STRINGS_H +#include <strings.h> +#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 *); + 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; + } + + if (flags & (ZIP_FL_NOCASE | ZIP_FL_NODIR | ZIP_FL_ENC_CP437)) { + /* 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); + return (zip_int64_t)i; + } + } + + zip_error_set(error, ZIP_ER_NOENT, 0); + return -1; + } + else { + return _zip_hash_lookup(za->names, (const zip_uint8_t *)fname, flags, error); + } +} diff --git a/3rdparty/libzip/lib/zip_new.c b/3rdparty/libzip/lib/zip_new.c new file mode 100644 index 0000000000..3768d5b5aa --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_open.c b/3rdparty/libzip/lib/zip_open.c new file mode 100644 index 0000000000..1d2f69a711 --- /dev/null +++ b/3rdparty/libzip/lib/zip_open.c @@ -0,0 +1,861 @@ +/* + zip_open.c -- open zip archive 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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 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) { + static zip_int64_t needed_support_read = -1; + static zip_int64_t needed_support_write = -1; + + 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 (needed_support_read == -1) { + needed_support_read = zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_STAT, -1); + needed_support_write = 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, -1); + } + if ((supported & needed_support_read) != needed_support_read) { + zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); + return NULL; + } + if ((supported & needed_support_write) != needed_support_write) { + 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. */ + if (((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local->crc != 0 || local->comp_size != 0 || local->uncomp_size != 0)) + 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; + 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); + while ((match = _zip_memmem(match, _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 unsigned char * +_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen) { + const unsigned char *p; + + if ((biglen < littlelen) || (littlelen == 0)) + return NULL; + p = big - 1; + while ((p = (const unsigned char *)memchr(p + 1, little[0], (size_t)(big - (p + 1)) + (size_t)(biglen - littlelen) + 1)) != NULL) { + if (memcmp(p + 1, little + 1, littlelen - 1) == 0) + return (unsigned char *)p; + } + + return NULL; +} + + +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/3rdparty/libzip/lib/zip_pkware.c b/3rdparty/libzip/lib/zip_pkware.c new file mode 100644 index 0000000000..1b1b461a0b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <zlib.h> + +#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/3rdparty/libzip/lib/zip_progress.c b/3rdparty/libzip/lib/zip_progress.c new file mode 100644 index 0000000000..a881df4766 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + + +#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/3rdparty/libzip/lib/zip_random_unix.c b/3rdparty/libzip/lib/zip_random_unix.c new file mode 100644 index 0000000000..da44d3cf21 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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 <fcntl.h> +#include <unistd.h> + +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 <stdlib.h> + +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/3rdparty/libzip/lib/zip_random_uwp.c b/3rdparty/libzip/lib/zip_random_uwp.c new file mode 100644 index 0000000000..04b03b402f --- /dev/null +++ b/3rdparty/libzip/lib/zip_random_uwp.c @@ -0,0 +1,82 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <bcrypt.h> +#include <ntstatus.h> +#include <windows.h> + +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 (hr != STATUS_SUCCESS || hAlg == NULL) { + return false; + } + hr = BCryptGenRandom(&hAlg, buffer, length, 0); + BCryptCloseAlgorithmProvider(&hAlg, 0); + if (hr != STATUS_SUCCESS) { + return false; + } + return true; +} + +#endif + +#ifndef HAVE_RANDOM_UINT32 +#include <stdlib.h> + +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/3rdparty/libzip/lib/zip_random_win32.c b/3rdparty/libzip/lib/zip_random_win32.c new file mode 100644 index 0000000000..436306b1b1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <windows.h> + +#ifndef HAVE_SECURE_RANDOM + +#include <wincrypt.h> + +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 <stdlib.h> + +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/3rdparty/libzip/lib/zip_rename.c b/3rdparty/libzip/lib/zip_rename.c new file mode 100644 index 0000000000..3e67b7c2ad --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_replace.c b/3rdparty/libzip/lib/zip_replace.c new file mode 100644 index 0000000000..e9a2973173 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_set_archive_comment.c b/3rdparty/libzip/lib/zip_set_archive_comment.c new file mode 100644 index 0000000000..ee6f2ba11c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_set_archive_flag.c b/3rdparty/libzip/lib/zip_set_archive_flag.c new file mode 100644 index 0000000000..a5afc818ae --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_set_default_password.c b/3rdparty/libzip/lib/zip_set_default_password.c new file mode 100644 index 0000000000..625ac3fad8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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/3rdparty/libzip/lib/zip_set_file_comment.c b/3rdparty/libzip/lib/zip_set_file_comment.c new file mode 100644 index 0000000000..2e7dcb792c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_set_file_compression.c b/3rdparty/libzip/lib/zip_set_file_compression.c new file mode 100644 index 0000000000..d2027c9921 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_set_name.c b/3rdparty/libzip/lib/zip_set_name.c new file mode 100644 index 0000000000..af4ec93493 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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/3rdparty/libzip/lib/zip_source_accept_empty.c b/3rdparty/libzip/lib/zip_source_accept_empty.c new file mode 100644 index 0000000000..10f40124d6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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) { + int 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 = (int)_zip_source_call(src, NULL, 0, ZIP_SOURCE_ACCEPT_EMPTY); + + return ret != 0; +} diff --git a/3rdparty/libzip/lib/zip_source_begin_write.c b/3rdparty/libzip/lib/zip_source_begin_write.c new file mode 100644 index 0000000000..cefb809241 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_begin_write.c @@ -0,0 +1,52 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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_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/3rdparty/libzip/lib/zip_source_begin_write_cloning.c b/3rdparty/libzip/lib/zip_source_begin_write_cloning.c new file mode 100644 index 0000000000..71911e794f --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_begin_write_cloning.c @@ -0,0 +1,52 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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_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/3rdparty/libzip/lib/zip_source_buffer.c b/3rdparty/libzip/lib/zip_source_buffer.c new file mode 100644 index 0000000000..e0ab72be67 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_buffer.c @@ -0,0 +1,620 @@ +/* + zip_source_buffer.c -- create zip data source from buffer + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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) { + memcpy(&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; + } + + memcpy(data, &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, -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; + } + + 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[clone->nfragments - 1].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 - 1); + + buffer->shared_buffer = clone; + clone->shared_buffer = buffer; + buffer->shared_fragments = clone->nfragments; + 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; + + 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; + } + + if ((fragments = realloc(buffer->fragments, sizeof(buffer->fragments[0]) * capacity)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + buffer->fragments = fragments; + if ((offsets = realloc(buffer->fragment_offsets, sizeof(buffer->fragment_offsets[0]) * (capacity + 1))) == 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; + 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); + + memcpy(data + n, buffer->fragments[i].data + fragment_offset, 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 n, 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]; + n = 0; + while (n < length) { + zip_uint64_t left = ZIP_MIN(length - n, buffer->fragments[i].length - fragment_offset); + + memcpy(buffer->fragments[i].data + fragment_offset, data + n, left); + + if (left == buffer->fragments[i].length - fragment_offset) { + i++; + } + n += left; + fragment_offset = 0; + } + + buffer->offset += n; + buffer->current_fragment = i; + if (buffer->offset > buffer->size) { + buffer->size = buffer->offset; + } + + return (zip_int64_t)n; +} diff --git a/3rdparty/libzip/lib/zip_source_call.c b/3rdparty/libzip/lib/zip_source_call.c new file mode 100644 index 0000000000..41b5c0ffa0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_close.c b/3rdparty/libzip/lib/zip_source_close.c new file mode 100644 index 0000000000..48efe8af86 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_commit_write.c b/3rdparty/libzip/lib/zip_source_commit_write.c new file mode 100644 index 0000000000..30243d5568 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_commit_write.c @@ -0,0 +1,63 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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_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/3rdparty/libzip/lib/zip_source_compress.c b/3rdparty/libzip/lib/zip_source_compress.c new file mode 100644 index 0000000000..9776065f97 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_compress.c @@ -0,0 +1,398 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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; + memcpy(data, 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, -1); + + default: + zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); + return -1; + } +} diff --git a/3rdparty/libzip/lib/zip_source_crc.c b/3rdparty/libzip/lib/zip_source_crc.c new file mode 100644 index 0000000000..ebbeaa7c5e --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_crc.c @@ -0,0 +1,198 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <limits.h> +#include <stdlib.h> +#include <zlib.h> + +#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) { + /* 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: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} diff --git a/3rdparty/libzip/lib/zip_source_error.c b/3rdparty/libzip/lib/zip_source_error.c new file mode 100644 index 0000000000..042901fbdf --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_file.h b/3rdparty/libzip/lib/zip_source_file.h new file mode 100644 index 0000000000..43a464533c --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file.h @@ -0,0 +1,90 @@ +/* + zip_source_file.h -- header for common file operations + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 vaild */ + 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/3rdparty/libzip/lib/zip_source_file_common.c b/3rdparty/libzip/lib/zip_source_file_common.c new file mode 100644 index 0000000000..0012395718 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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) { + memcpy(&ctx->st, st, sizeof(ctx->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, -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; + } + memcpy(data, &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; + } + + memcpy(data, &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/3rdparty/libzip/lib/zip_source_file_stdio.c b/3rdparty/libzip/lib/zip_source_file_stdio.c new file mode 100644 index 0000000000..15817716c0 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_stdio.c @@ -0,0 +1,208 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> + +#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; +} + + +/* + * fopen replacement that sets the close-on-exec flag + * some implementations support an fopen 'e' flag for that, + * but e.g. macOS doesn't. + */ +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/3rdparty/libzip/lib/zip_source_file_stdio.h b/3rdparty/libzip/lib/zip_source_file_stdio.h new file mode 100644 index 0000000000..1bf698ce28 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_stdio.h @@ -0,0 +1,47 @@ +#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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> + +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); + +FILE *_zip_fopen_close_on_exec(const char *name, bool writeable); + +#endif /* _HAD_ZIP_SOURCE_FILE_STDIO_H */ diff --git a/3rdparty/libzip/lib/zip_source_file_stdio_named.c b/3rdparty/libzip/lib/zip_source_file_stdio_named.c new file mode 100644 index 0000000000..5387c7663f --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_stdio_named.c @@ -0,0 +1,313 @@ +/* + zip_source_file_stdio_named.c -- source for stdio 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <sys/stat.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#ifdef HAVE_CLONEFILE +#include <sys/attr.h> +#include <sys/clonefile.h> +#define CAN_CLONE +#endif +#ifdef HAVE_FICLONERANGE +#include <linux/fs.h> +#include <sys/ioctl.h> +#define CAN_CLONE +#endif + +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); + +/* 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) { + char *temp; + int tfd; + int mode; + FILE *tfp; + struct stat st; + + if ((temp = (char *)malloc(strlen(ctx->fname) + 8)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (stat(ctx->fname, &st) == 0) { + mode = st.st_mode; + } + else { + mode = -1; + } + + sprintf(temp, "%s.XXXXXX", ctx->fname); + + if ((tfd = _zip_mkstempm(temp, mode)) == -1) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } + + if ((tfp = fdopen(tfd, "r+b")) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + close(tfd); + (void)remove(temp); + free(temp); + return -1; + } + + ctx->fout = tfp; + ctx->tmpname = temp; + + 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) { + char *temp; + FILE *tfp; + + if (offset > ZIP_OFF_MAX) { + zip_error_set(&ctx->error, ZIP_ER_SEEK, E2BIG); + return -1; + } + + if ((temp = (char *)malloc(strlen(ctx->fname) + 8)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + sprintf(temp, "%s.XXXXXX", ctx->fname); + +#ifdef HAVE_CLONEFILE +#ifndef __clang_analyzer__ + /* we can't use mkstemp, since clonefile insists on creating the file */ + if (mktemp(temp) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } +#endif + + if (clonefile(ctx->fname, temp, 0) < 0) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } + if ((tfp = _zip_fopen_close_on_exec(temp, true)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)remove(temp); + free(temp); + 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); + free(temp); + return -1; + } + + if ((fd = mkstemp(temp)) < 0) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + 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(temp); + free(temp); + return -1; + } + + if ((tfp = fdopen(fd, "r+b")) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)close(fd); + (void)remove(temp); + free(temp); + return -1; + } + } +#endif + + if (ftruncate(fileno(tfp), (off_t)offset) < 0) { + (void)fclose(tfp); + (void)remove(temp); + free(temp); + return -1; + } + if (fseeko(tfp, (off_t)offset, SEEK_SET) < 0) { + (void)fclose(tfp); + (void)remove(temp); + free(temp); + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + } + + ctx->fout = tfp; + ctx->tmpname = temp; + + 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; +} diff --git a/3rdparty/libzip/lib/zip_source_file_win32.c b/3rdparty/libzip/lib/zip_source_file_win32.c new file mode 100644 index 0000000000..6547fc20e7 --- /dev/null +++ b/3rdparty/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-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 -1; + } + + 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) < 0) { + 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/3rdparty/libzip/lib/zip_source_file_win32.h b/3rdparty/libzip/lib/zip_source_file_win32.h new file mode 100644 index 0000000000..88e45b1f92 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_win32.h @@ -0,0 +1,76 @@ +#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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <windows.h> + +#include <aclapi.h> + +#include <stdlib.h> + +#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); + +#endif /* _HAD_ZIP_SOURCE_FILE_WIN32_H */ diff --git a/3rdparty/libzip/lib/zip_source_file_win32_ansi.c b/3rdparty/libzip/lib/zip_source_file_win32_ansi.c new file mode 100644 index 0000000000..f299692b8e --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_win32_ansi.c @@ -0,0 +1,85 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 */ + +zip_win32_file_operations_t ops_ansi = { + ansi_allocate_tempname, + CreateFileA, + DeleteFileA, + GetFileAttributesA, + GetFileAttributesExA, + ansi_make_tempname, + MoveFileExA, + SetFileAttributesA, + strdup +}; + +/* 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(buf, len, "%s.%08x", name, i); +} diff --git a/3rdparty/libzip/lib/zip_source_file_win32_named.c b/3rdparty/libzip/lib/zip_source_file_win32_named.c new file mode 100644 index 0000000000..1fe5591807 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_win32_named.c @@ -0,0 +1,275 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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; + void *temp = NULL; + 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/3rdparty/libzip/lib/zip_source_file_win32_utf16.c b/3rdparty/libzip/lib/zip_source_file_win32_utf16.c new file mode 100644 index 0000000000..6aef2bb49b --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_file_win32_utf16.c @@ -0,0 +1,111 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 */ + +zip_win32_file_operations_t ops_utf16 = { + utf16_allocate_tempname, + utf16_create_file, + DeleteFileW, + GetFileAttributesW, + GetFileAttributesExW, + utf16_make_tempname, + MoveFileExW, + SetFileAttributesW, + utf16_strdup +}; + +/* 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((wchar_t *)buf, 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/3rdparty/libzip/lib/zip_source_file_win32_utf8.c b/3rdparty/libzip/lib/zip_source_file_win32_utf8.c new file mode 100644 index 0000000000..d6728e34fd --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_free.c b/3rdparty/libzip/lib/zip_source_free.c new file mode 100644 index 0000000000..2e6944e5a6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_source_function.c b/3rdparty/libzip/lib/zip_source_function.c new file mode 100644 index 0000000000..44db94752c --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_function.c @@ -0,0 +1,98 @@ +/* + zip_source_function.c -- create zip data source from 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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; + } + + 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/3rdparty/libzip/lib/zip_source_get_file_attributes.c b/3rdparty/libzip/lib/zip_source_get_file_attributes.c new file mode 100644 index 0000000000..734767a0e5 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_get_file_attributes.c @@ -0,0 +1,106 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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; + + 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/3rdparty/libzip/lib/zip_source_is_deleted.c b/3rdparty/libzip/lib/zip_source_is_deleted.c new file mode 100644 index 0000000000..c2c7eb5df0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_layered.c b/3rdparty/libzip/lib/zip_source_layered.c new file mode 100644 index 0000000000..f6db2a71c1 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_layered.c @@ -0,0 +1,67 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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; + + 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 = cb(src, ud, NULL, 0, ZIP_SOURCE_SUPPORTS); + if (zs->supports < 0) { + zs->supports = ZIP_SOURCE_SUPPORTS_READABLE; + } + + return zs; +} diff --git a/3rdparty/libzip/lib/zip_source_open.c b/3rdparty/libzip/lib/zip_source_open.c new file mode 100644 index 0000000000..b12a4c28fd --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_pkware_decode.c b/3rdparty/libzip/lib/zip_source_pkware_decode.c new file mode 100644 index 0000000000..a1c9e3a9b3 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_pkware_decode.c @@ -0,0 +1,220 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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, -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: + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } +} + + +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/3rdparty/libzip/lib/zip_source_pkware_encode.c b/3rdparty/libzip/lib/zip_source_pkware_encode.c new file mode 100644 index 0000000000..7c77e1e867 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_pkware_encode.c @@ -0,0 +1,249 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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: + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } +} + + +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/3rdparty/libzip/lib/zip_source_read.c b/3rdparty/libzip/lib/zip_source_read.c new file mode 100644 index 0000000000..ee7686a18b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_remove.c b/3rdparty/libzip/lib/zip_source_remove.c new file mode 100644 index 0000000000..46230cdf73 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_remove.c @@ -0,0 +1,60 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 (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/3rdparty/libzip/lib/zip_source_rollback_write.c b/3rdparty/libzip/lib/zip_source_rollback_write.c new file mode 100644 index 0000000000..6f98c39433 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_rollback_write.c @@ -0,0 +1,46 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 (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/3rdparty/libzip/lib/zip_source_seek.c b/3rdparty/libzip/lib/zip_source_seek.c new file mode 100644 index 0000000000..1acd6d888e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_seek_write.c b/3rdparty/libzip/lib/zip_source_seek_write.c new file mode 100644 index 0000000000..5599bcb127 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_seek_write.c @@ -0,0 +1,51 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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_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/3rdparty/libzip/lib/zip_source_stat.c b/3rdparty/libzip/lib/zip_source_stat.c new file mode 100644 index 0000000000..a9745e067e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_supports.c b/3rdparty/libzip/lib/zip_source_supports.c new file mode 100644 index 0000000000..66a5303c78 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_supports.c @@ -0,0 +1,65 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdarg.h> + +#include "zipint.h" + + +zip_int64_t +zip_source_supports(zip_source_t *src) { + return src->supports; +} + + +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/3rdparty/libzip/lib/zip_source_tell.c b/3rdparty/libzip/lib/zip_source_tell.c new file mode 100644 index 0000000000..8518739c53 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_tell_write.c b/3rdparty/libzip/lib/zip_source_tell_write.c new file mode 100644 index 0000000000..8edee67b93 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_tell_write.c @@ -0,0 +1,46 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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_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/3rdparty/libzip/lib/zip_source_window.c b/3rdparty/libzip/lib/zip_source_window.c new file mode 100644 index 0000000000..6f457b6199 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_window.c @@ -0,0 +1,338 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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) { + memcpy(&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_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; + } + + memcpy(data, &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: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} + + +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/3rdparty/libzip/lib/zip_source_winzip_aes_decode.c b/3rdparty/libzip/lib/zip_source_winzip_aes_decode.c new file mode 100644 index 0000000000..2999654152 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_winzip_aes_decode.c @@ -0,0 +1,265 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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, -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: + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } +} + + +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/3rdparty/libzip/lib/zip_source_winzip_aes_encode.c b/3rdparty/libzip/lib/zip_source_winzip_aes_encode.c new file mode 100644 index 0000000000..44c4e4bd66 --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_winzip_aes_encode.c @@ -0,0 +1,254 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + +#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: + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } +} + + +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/3rdparty/libzip/lib/zip_source_write.c b/3rdparty/libzip/lib/zip_source_write.c new file mode 100644 index 0000000000..bb72b1454b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_source_zip.c b/3rdparty/libzip/lib/zip_source_zip.c new file mode 100644 index 0000000000..e6cedafe29 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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, NULL, 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/3rdparty/libzip/lib/zip_source_zip_new.c b/3rdparty/libzip/lib/zip_source_zip_new.c new file mode 100644 index 0000000000..cf3d2677fc --- /dev/null +++ b/3rdparty/libzip/lib/zip_source_zip_new.c @@ -0,0 +1,190 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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) { + zip_source_t *src, *s2; + zip_stat_t st; + zip_file_attributes_t attributes; + zip_dirent_t *de; + bool partial_data, needs_crc, needs_decrypt, needs_decompress; + + if (srcza == NULL || srcidx >= srcza->nentry || len > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 && (ZIP_ENTRY_DATA_CHANGED(srcza->entry + srcidx) || srcza->entry[srcidx].deleted)) { + zip_error_set(error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (zip_stat_index(srcza, srcidx, flags | ZIP_FL_UNCHANGED, &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; + } + + /* overflow or past end of file */ + if ((start > 0 || len > 0) && (start + len < start || start + len > st.size)) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if (len == 0) { + len = st.size - start; + } + + partial_data = len < st.size; + needs_decrypt = ((flags & ZIP_FL_ENCRYPTED) == 0) && (st.encryption_method != ZIP_EM_NONE); + needs_decompress = ((flags & ZIP_FL_COMPRESSED) == 0) && (st.comp_method != ZIP_CM_STORE); + /* when reading the whole file, check for CRC errors */ + needs_crc = ((flags & ZIP_FL_COMPRESSED) == 0 || st.comp_method == ZIP_CM_STORE) && !partial_data; + + 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); + + if (st.comp_size == 0) { + return zip_source_buffer_with_attributes_create(NULL, 0, 0, &attributes, error); + } + + if (partial_data && !needs_decrypt && !needs_decompress) { + struct zip_stat st2; + + st2.size = len; + st2.comp_size = len; + st2.comp_method = ZIP_CM_STORE; + st2.mtime = st.mtime; + st2.valid = ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_MTIME; + + if ((src = _zip_source_window_new(srcza->src, start, (zip_int64_t)len, &st2, &attributes, srcza, srcidx, error)) == NULL) { + return NULL; + } + } + else { + if (st.comp_size > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if ((src = _zip_source_window_new(srcza->src, 0, (zip_int64_t)st.comp_size, &st, &attributes, srcza, srcidx, error)) == NULL) { + return NULL; + } + } + + 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)) { + s2 = zip_source_window_create(src, start, (zip_int64_t)len, 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/3rdparty/libzip/lib/zip_stat.c b/3rdparty/libzip/lib/zip_stat.c new file mode 100644 index 0000000000..4b7c495021 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_stat_index.c b/3rdparty/libzip/lib/zip_stat_index.c new file mode 100644 index 0000000000..62dc0455e0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_stat_init.c b/3rdparty/libzip/lib/zip_stat_init.c new file mode 100644 index 0000000000..f513bdef6a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <string.h> + +#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/3rdparty/libzip/lib/zip_strerror.c b/3rdparty/libzip/lib/zip_strerror.c new file mode 100644 index 0000000000..e22db65ebf --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_string.c b/3rdparty/libzip/lib/zip_string.c new file mode 100644 index 0000000000..70133155a5 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> +#include <zlib.h> + +#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; + } + + memcpy(s->raw, 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/3rdparty/libzip/lib/zip_unchange.c b/3rdparty/libzip/lib/zip_unchange.c new file mode 100644 index 0000000000..d80a6adb23 --- /dev/null +++ b/3rdparty/libzip/lib/zip_unchange.c @@ -0,0 +1,93 @@ +/* + zip_unchange.c -- undo changes to 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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; + const char *orig_name, *changed_name; + + if (idx >= za->nentry) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) { + 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; + } + } + else { + orig_name = NULL; + } + + 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 (_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/3rdparty/libzip/lib/zip_unchange_all.c b/3rdparty/libzip/lib/zip_unchange_all.c new file mode 100644 index 0000000000..7b0a4c066d --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_unchange_archive.c b/3rdparty/libzip/lib/zip_unchange_archive.c new file mode 100644 index 0000000000..a0616cce6b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/lib/zip_unchange_data.c b/3rdparty/libzip/lib/zip_unchange_data.c new file mode 100644 index 0000000000..153c839377 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/lib/zip_utf-8.c b/3rdparty/libzip/lib/zip_utf-8.c new file mode 100644 index 0000000000..ebf67fae64 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + + +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/3rdparty/libzip/lib/zip_winzip_aes.c b/3rdparty/libzip/lib/zip_winzip_aes.c new file mode 100644 index 0000000000..b36e46c64f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#include <string.h> + + +#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) { + memcpy(password_verify, 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/3rdparty/libzip/lib/zipint.h b/3rdparty/libzip/lib/zipint.h new file mode 100644 index 0000000000..eab1e3a6c6 --- /dev/null +++ b/3rdparty/libzip/lib/zipint.h @@ -0,0 +1,647 @@ +#ifndef _HAD_ZIPINT_H +#define _HAD_ZIPINT_H + +/* + zipint.h -- internal 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> +#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 maxiumum 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. */ + +typedef zip_int64_t (*zip_source_layered_callback)(zip_source_t *, void *, void *, zip_uint64_t, enum zip_source_cmd); +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_layered(zip_t *, zip_source_t *, zip_source_layered_callback, void *); +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 *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); +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 */ + bool eof; + 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 <string.h> +#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); +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); +void _zip_error_set_from_source(zip_error_t *, zip_source_t *); + +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); + +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 *, const zip_string_t *); +void _zip_string_free(zip_string_t *); +zip_uint32_t _zip_string_crc32(const zip_string_t *); +const zip_uint8_t *_zip_string_get(zip_string_t *, zip_uint32_t *, zip_flags_t, zip_error_t *); +zip_uint16_t _zip_string_length(const zip_string_t *); +zip_string_t *_zip_string_new(const zip_uint8_t *, zip_uint16_t, zip_flags_t, zip_error_t *); +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/3rdparty/libzip/libzip-config.cmake.in b/3rdparty/libzip/libzip-config.cmake.in new file mode 100644 index 0000000000..5b9aa55806 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/libzip.pc.in b/3rdparty/libzip/libzip.pc.in new file mode 100644 index 0000000000..58b3dca7c1 --- /dev/null +++ b/3rdparty/libzip/libzip.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_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/3rdparty/libzip/man/CMakeLists.txt b/3rdparty/libzip/man/CMakeLists.txt new file mode 100644 index 0000000000..7f4b0ec563 --- /dev/null +++ b/3rdparty/libzip/man/CMakeLists.txt @@ -0,0 +1,165 @@ +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_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/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.html b/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.html new file mode 100644 index 0000000000..bea0f3c6f8 --- /dev/null +++ b/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.html @@ -0,0 +1,114 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_GET_ARGS(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_GET_ARGS(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_GET_ARGS(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">ZIP_SOURCE_GET_ARGS</code> — +<div class="Nd">validate and cast arguments to source callback</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">type *</var> + <br/> + <code class="Fn">ZIP_SOURCE_GET_ARGS</code>(<var class="Fa" style="white-space: nowrap;">type</var>, + <var class="Fa" style="white-space: nowrap;">void *data</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint64_t len</var>, + <var class="Fa" style="white-space: nowrap;">zip_error_t *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">ZIP_SOURCE_GET_ARGS</code>() macro casts + <var class="Ar">data</var> to a pointer to <var class="Ar">type</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +On success, <code class="Fn">ZIP_SOURCE_GET_ARGS</code>() returns + <var class="Ar">data</var>. In case of error, it returns + <code class="Dv">NULL</code> and sets <var class="Ar">error</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">ZIP_SOURCE_GET_ARGS</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">len</var> is less than the size of + <var class="Ar">type</var></dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">ZIP_SOURCE_GET_ARGS</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.man b/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.man new file mode 100644 index 0000000000..0e23ebd2af --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc b/3rdparty/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc new file mode 100644 index 0000000000..2735964e16 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/handle_links b/3rdparty/libzip/man/handle_links new file mode 100755 index 0000000000..7c2ed37d35 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/man/libzip.html b/3rdparty/libzip/man/libzip.html new file mode 100644 index 0000000000..fabeff0e6c --- /dev/null +++ b/3rdparty/libzip/man/libzip.html @@ -0,0 +1,266 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + libzip.mdoc -- general overview of available functions + Copyright (C) 2005-2021 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>LIBZIP(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">LIBZIP(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">LIBZIP(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">libzip</code> — +<div class="Nd">library for manipulating zip archives</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Nm">libzip</code> is a library for reading, creating, and modifying + zip archives. +<p class="Pp">The main design criteria for <code class="Nm">libzip</code> + were:</p> +<ul class="Bl-bullet Bl-compact"> + <li>Do not create corrupt files, even in case of errors.</li> + <li>Do not delete data.</li> + <li>Be efficient.</li> +</ul> +<p class="Pp">For this reason, when modifying zip archives, + <code class="Nm">libzip</code> writes to a temporary file and replaces the + original zip archive atomically.</p> +<p class="Pp">Below there are two sections listing functions: one for how to + read from zip archives and one for how to create/modify them.</p> +<section class="Ss"> +<h2 class="Ss" id="THREAD_SAFETY"><a class="permalink" href="#THREAD_SAFETY">THREAD + SAFETY</a></h2> +In general, different zip archives opened by <code class="Nm">libzip</code> 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 + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a> or + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, access to + the target archive must be synchronized with access to the source archive as + well. +</section> +</section> +<section class="Sh"> +<h1 class="Sh" id="READING_ZIP_ARCHIVES"><a class="permalink" href="#READING_ZIP_ARCHIVES">READING + ZIP ARCHIVES</a></h1> +<section class="Ss"> +<h2 class="Ss" id="open_archive"><a class="permalink" href="#open_archive">open + archive</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_open.html">zip_open(3)</a></li> + <li><a class="Xr" href="zip_fdopen.html">zip_fdopen(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="find_files"><a class="permalink" href="#find_files">find + files</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="read_files"><a class="permalink" href="#read_files">read + files</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_fopen.html">zip_fopen(3)</a></li> + <li><a class="Xr" href="zip_fopen_encrypted.html">zip_fopen_encrypted(3)</a></li> + <li><a class="Xr" href="zip_fopen_index.html">zip_fopen_index(3)</a></li> + <li><a class="Xr" href="zip_fopen_index_encrypted.html">zip_fopen_index_encrypted(3)</a></li> + <li><a class="Xr" href="zip_fread.html">zip_fread(3)</a></li> + <li><a class="Xr" href="zip_fseek.html">zip_fseek(3)</a> (uncompressed files + only)</li> + <li><a class="Xr" href="zip_ftell.html">zip_ftell(3)</a> (uncompressed files + only)</li> + <li><a class="Xr" href="zip_fclose.html">zip_fclose(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="close_archive"><a class="permalink" href="#close_archive">close + archive</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_close.html">zip_close(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="miscellaneous"><a class="permalink" href="#miscellaneous">miscellaneous</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_stat.html">zip_stat(3)</a></li> + <li><a class="Xr" href="zip_compression_method_supported.html">zip_compression_method_supported(3)</a></li> + <li><a class="Xr" href="zip_encryption_method_supported.html">zip_encryption_method_supported(3)</a></li> + <li><a class="Xr" href="zip_file_get_comment.html">zip_file_get_comment(3)</a></li> + <li><a class="Xr" href="zip_file_get_external_attributes.html">zip_file_get_external_attributes(3)</a></li> + <li><a class="Xr" href="zip_get_archive_comment.html">zip_get_archive_comment(3)</a></li> + <li><a class="Xr" href="zip_get_archive_flag.html">zip_get_archive_flag(3)</a></li> + <li><a class="Xr" href="zip_get_name.html">zip_get_name(3)</a></li> + <li><a class="Xr" href="zip_get_num_entries.html">zip_get_num_entries(3)</a></li> + <li><a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a></li> +</ul> +</section> +</section> +<section class="Sh"> +<h1 class="Sh" id="CREATING/MODIFYING_ZIP_ARCHIVES"><a class="permalink" href="#CREATING/MODIFYING_ZIP_ARCHIVES">CREATING/MODIFYING + ZIP ARCHIVES</a></h1> +<section class="Ss"> +<h2 class="Ss" id="create/open_archive"><a class="permalink" href="#create/open_archive">create/open + archive</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_open.html">zip_open(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="add/change_files_and_directories"><a class="permalink" href="#add/change_files_and_directories">add/change + files and directories</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_dir_add.html">zip_dir_add(3)</a></li> + <li><a class="Xr" href="zip_file_add.html">zip_file_add(3)</a></li> + <li><a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a></li> + <li><a class="Xr" href="zip_file_set_comment.html">zip_file_set_comment(3)</a></li> + <li><a class="Xr" href="zip_file_set_dostime.html">zip_file_set_dostime(3)</a></li> + <li><a class="Xr" href="zip_file_set_external_attributes.html">zip_file_set_external_attributes(3)</a></li> + <li><a class="Xr" href="zip_file_set_encryption.html">zip_file_set_encryption(3)</a></li> + <li><a class="Xr" href="zip_file_set_mtime.html">zip_file_set_mtime(3)</a></li> + <li><a class="Xr" href="zip_set_file_compression.html">zip_set_file_compression(3)</a></li> + <li><a class="Xr" href="zip_source_buffer.html">zip_source_buffer(3)</a></li> + <li><a class="Xr" href="zip_source_file.html">zip_source_file(3)</a></li> + <li><a class="Xr" href="zip_source_filep.html">zip_source_filep(3)</a></li> + <li><a class="Xr" href="zip_source_free.html">zip_source_free(3)</a></li> + <li><a class="Xr" href="zip_source_function.html">zip_source_function(3)</a></li> + <li><a class="Xr" href="zip_source_zip.html">zip_source_zip(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="rename_files"><a class="permalink" href="#rename_files">rename + files</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_rename.html">zip_rename(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="delete_files"><a class="permalink" href="#delete_files">delete + files</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_delete.html">zip_delete(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="revert_changes"><a class="permalink" href="#revert_changes">revert + changes</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_unchange.html">zip_unchange(3)</a></li> + <li><a class="Xr" href="zip_unchange_all.html">zip_unchange_all(3)</a></li> + <li><a class="Xr" href="zip_unchange_archive.html">zip_unchange_archive(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="read/modify_extra_fields"><a class="permalink" href="#read/modify_extra_fields">read/modify + extra fields</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_file_extra_field_by_id.html">zip_file_extra_field_by_id(3)</a></li> + <li><a class="Xr" href="zip_file_extra_field_delete.html">zip_file_extra_field_delete(3)</a></li> + <li><a class="Xr" href="zip_file_extra_field_delete_by_id.html">zip_file_extra_field_delete_by_id(3)</a></li> + <li><a class="Xr" href="zip_file_extra_field_get.html">zip_file_extra_field_get(3)</a></li> + <li><a class="Xr" href="zip_file_extra_field_set.html">zip_file_extra_field_set(3)</a></li> + <li><a class="Xr" href="zip_file_extra_fields_count.html">zip_file_extra_fields_count(3)</a></li> + <li><a class="Xr" href="zip_file_extra_fields_count_by_id.html">zip_file_extra_fields_count_by_id(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="close_archive_(writing)"><a class="permalink" href="#close_archive_(writing)">close + archive (writing)</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_close.html">zip_close(3)</a></li> + <li><a class="Xr" href="zip_discard.html">zip_discard(3)</a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="miscellaneous_(writing)"><a class="permalink" href="#miscellaneous_(writing)">miscellaneous + (writing)</a></h2> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_file_attributes_init.html">zip_file_attributes_init(3)</a></li> + <li><a class="Xr" href="zip_libzip_version.html">zip_libzip_version(3)</a></li> + <li><a class="Xr" href="zip_register_cancel_callback_with_state.html">zip_register_cancel_callback_with_state(3)</a></li> + <li><a class="Xr" href="zip_register_progress_callback_with_state.html">zip_register_progress_callback_with_state(3)</a></li> + <li><a class="Xr" href="zip_set_archive_comment.html">zip_set_archive_comment(3)</a></li> + <li><a class="Xr" href="zip_set_archive_flag.html">zip_set_archive_flag(3)</a></li> + <li><a class="Xr" href="zip_source.html">zip_source(3)</a></li> +</ul> +</section> +</section> +<section class="Sh"> +<h1 class="Sh" id="ERROR_HANDLING"><a class="permalink" href="#ERROR_HANDLING">ERROR + HANDLING</a></h1> +<ul class="Bl-bullet Bl-compact"> + <li><a class="Xr" href="zip_error_strerror.html">zip_error_strerror(3)</a></li> + <li><a class="Xr" href="zip_strerror.html">zip_strerror(3)</a></li> + <li><a class="Xr" href="zip_file_strerror.html">zip_file_strerror(3)</a></li> + <li><a class="Xr" href="zip_file_get_error.html">zip_file_get_error(3)</a></li> + <li><a class="Xr" href="zip_get_error.html">zip_get_error(3)</a></li> + <li><a class="Xr" href="zip_error_init_with_code.html">zip_error_init_with_code(3)</a></li> + <li><a class="Xr" href="zip_error_system_type.html">zip_error_system_type(3)</a></li> + <li><a class="Xr" href="zip_errors.html">zip_errors(3)</a></li> +</ul> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 6, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/libzip.man b/3rdparty/libzip/man/libzip.man new file mode 100644 index 0000000000..62c6bbfb33 --- /dev/null +++ b/3rdparty/libzip/man/libzip.man @@ -0,0 +1,322 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" libzip.mdoc -- general overview of available functions +.\" Copyright (C) 2005-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "April 6, 2021" "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 <zip.h>\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. +.SS "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_fseek(3) +(uncompressed files only) +.TP 4n +\fB\(bu\fR +zip_ftell(3) +(uncompressed files only) +.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) +.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_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_by_id(3) +.PD 0 +.TP 4n +\fB\(bu\fR +zip_file_extra_field_delete(3) +.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_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_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/3rdparty/libzip/man/libzip.mdoc b/3rdparty/libzip/man/libzip.mdoc new file mode 100644 index 0000000000..8799d30d54 --- /dev/null +++ b/3rdparty/libzip/man/libzip.mdoc @@ -0,0 +1,262 @@ +.\" libzip.mdoc -- general overview of available functions +.\" Copyright (C) 2005-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 6, 2021 +.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. +.Ss 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_fseek 3 +(uncompressed files only) +.It +.Xr zip_ftell 3 +(uncompressed files only) +.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 +.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_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_by_id 3 +.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_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_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/3rdparty/libzip/man/links b/3rdparty/libzip/man/links new file mode 100644 index 0000000000..807dd49bee --- /dev/null +++ b/3rdparty/libzip/man/links @@ -0,0 +1,23 @@ +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_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_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/3rdparty/libzip/man/update-html.cmake b/3rdparty/libzip/man/update-html.cmake new file mode 100644 index 0000000000..4bc469b4b7 --- /dev/null +++ b/3rdparty/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 "(<a class=\"Xr\" href=\")([^\"]*)(\">)" "\\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/3rdparty/libzip/man/update-man.cmake b/3rdparty/libzip/man/update-man.cmake new file mode 100644 index 0000000000..3f915d6bcf --- /dev/null +++ b/3rdparty/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 [0-9.]*" "NiH" MAN "${MAN}") +FILE(WRITE ${OUT}.new "${MAN}") +CONFIGURE_FILE(${OUT}.new ${OUT} COPYONLY) +FILE(REMOVE ${OUT}.new) + diff --git a/3rdparty/libzip/man/zip_add.html b/3rdparty/libzip/man/zip_add.html new file mode 100644 index 0000000000..511d0d303f --- /dev/null +++ b/3rdparty/libzip/man/zip_add.html @@ -0,0 +1,121 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ADD(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ADD(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ADD(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_add</code>, <code class="Nm">zip_replace</code> — +<div class="Nd">add file to zip archive or replace file in zip archive (obsolete + interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_add</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>, <var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_replace</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_add</code>() is the obsolete version of + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>. It is the same as + calling <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a> with an + empty <var class="Ar">flags</var> argument. Similarly, the + <code class="Fn">zip_replace</code>() function is the obsolete version of + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>. It is the + same as calling + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a> with an + empty <var class="Ar">flags</var> argument. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_add</code>() was added in libzip 0.6. In libzip 0.10 the + return type was changed from <var class="Vt">int</var> to + <var class="Vt">zip_int64_t</var>. It was deprecated in libzip 0.11, use + <code class="Fn">zip_file_add</code>() instead. +<p class="Pp"><code class="Fn">zip_replace</code>() was added in libzip 0.6. In + libzip 0.10 the type of <var class="Ar">index</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint64_t</var>. It was + deprecated in libzip 0.11, use <code class="Fn">zip_file_replace</code>() + instead.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_add.man b/3rdparty/libzip/man/zip_add.man new file mode 100644 index 0000000000..451645f416 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_add.mdoc b/3rdparty/libzip/man/zip_add.mdoc new file mode 100644 index 0000000000..27c5319019 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_add_dir.html b/3rdparty/libzip/man/zip_add_dir.html new file mode 100644 index 0000000000..2025c289da --- /dev/null +++ b/3rdparty/libzip/man/zip_add_dir.html @@ -0,0 +1,102 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ADD_DIR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ADD_DIR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ADD_DIR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_add_dir</code> — +<div class="Nd">add directory to zip archive (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_add_dir</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_add_dir</code>() is the obsolete version of + <a class="Xr" href="zip_dir_add.html">zip_dir_add(3)</a>. It is the same as + calling <a class="Xr" href="zip_dir_add.html">zip_dir_add(3)</a> with an empty + flags argument. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_dir_add.html">zip_dir_add(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_add_dir</code>() was added in libzip 0.8. In libzip 0.10 + the return type was changed from <var class="Vt">int</var> to + <var class="Vt">zip_int64_t</var>. It was deprecated in libzip 0.11, use + <code class="Fn">zip_dir_add</code>() instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_add_dir.man b/3rdparty/libzip/man/zip_add_dir.man new file mode 100644 index 0000000000..90f313d3f4 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_add_dir.mdoc b/3rdparty/libzip/man/zip_add_dir.mdoc new file mode 100644 index 0000000000..f28d1d5b36 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_close.html b/3rdparty/libzip/man/zip_close.html new file mode 100644 index 0000000000..585ccbe5dc --- /dev/null +++ b/3rdparty/libzip/man/zip_close.html @@ -0,0 +1,151 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_close.mdoc -- close 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_CLOSE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_CLOSE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_CLOSE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_close</code> — +<div class="Nd">close zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_close</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_close</code>() function writes any changes made to + <var class="Ar">archive</var> to disk. If <var class="Ar">archive</var> + contains no files, the file is completely removed (no empty archive is + written). If successful, <var class="Ar">archive</var> is freed. Otherwise + <var class="Ar">archive</var> is left unchanged and must still be freed. +<p class="Pp">To close and free a zip archive without saving changes, use + <a class="Xr" href="zip_discard.html">zip_discard(3)</a>.</p> +<p class="Pp">Progress updates for GUIs can be implemented using + <a class="Xr" href="zip_register_progress_callback_with_state.html">zip_register_progress_callback_with_state(3)</a>. + Cancelling the write of an archive during <code class="Nm">zip_close</code> + can be implemented using + <a class="Xr" href="zip_register_cancel_callback_with_state.html">zip_register_cancel_callback_with_state(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_close</code>() will fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_EOF"><code class="Er" id="ZIP_ER_EOF">ZIP_ER_EOF</code></a>]</dt> + <dd>Unexpected end-of-file found while reading from a file.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INTERNAL"><code class="Er" id="ZIP_ER_INTERNAL">ZIP_ER_INTERNAL</code></a>]</dt> + <dd>The callback function of an added or replaced file returned an error but + failed to report which.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd>The <var class="Ar">path</var> argument is + <code class="Dv">NULL</code>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOZIP"><code class="Er" id="ZIP_ER_NOZIP">ZIP_ER_NOZIP</code></a>]</dt> + <dd>File is not a zip archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_READ"><code class="Er" id="ZIP_ER_READ">ZIP_ER_READ</code></a>]</dt> + <dd>A file read failed.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RENAME"><code class="Er" id="ZIP_ER_RENAME">ZIP_ER_RENAME</code></a>]</dt> + <dd>A temporary file could not be renamed to its final name.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_SEEK"><code class="Er" id="ZIP_ER_SEEK">ZIP_ER_SEEK</code></a>]</dt> + <dd>A file seek failed.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_TMPOPEN"><code class="Er" id="ZIP_ER_TMPOPEN">ZIP_ER_TMPOPEN</code></a>]</dt> + <dd>A temporary file could not be created.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_WRITE"><code class="Er" id="ZIP_ER_WRITE">ZIP_ER_WRITE</code></a>]</dt> + <dd>A file write failed.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_ZLIB"><code class="Er" id="ZIP_ER_ZLIB">ZIP_ER_ZLIB</code></a>]</dt> + <dd>An error occurred while (de)compressing a stream with + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/zlib.html">zlib(3)</a>.</dd> +</dl> +Additionally, any errors returned by the callback function for added or replaced + files will be passed back. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_discard.html">zip_discard(3)</a>, + <a class="Xr" href="zip_fdopen.html">zip_fdopen(3)</a>, + <a class="Xr" href="zip_get_error.html">zip_get_error(3)</a>, + <a class="Xr" href="zip_open.html">zip_open(3)</a>, + <a class="Xr" href="zip_register_cancel_callback_with_state.html">zip_register_cancel_callback_with_state(3)</a>, + <a class="Xr" href="zip_register_progress_callback_with_state.html">zip_register_progress_callback_with_state(3)</a>, + <a class="Xr" href="zip_strerror.html">zip_strerror(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_close</code>() was added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 6, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_close.man b/3rdparty/libzip/man/zip_close.man new file mode 100644 index 0000000000..7bccb20fa0 --- /dev/null +++ b/3rdparty/libzip/man/zip_close.man @@ -0,0 +1,142 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_close.mdoc -- close 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 6, 2021" "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 <zip.h>\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> diff --git a/3rdparty/libzip/man/zip_close.mdoc b/3rdparty/libzip/man/zip_close.mdoc new file mode 100644 index 0000000000..c6239c0d8a --- /dev/null +++ b/3rdparty/libzip/man/zip_close.mdoc @@ -0,0 +1,125 @@ +.\" zip_close.mdoc -- close 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 6, 2021 +.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 diff --git a/3rdparty/libzip/man/zip_compression_method_supported.html b/3rdparty/libzip/man/zip_compression_method_supported.html new file mode 100644 index 0000000000..a0cfbfef31 --- /dev/null +++ b/3rdparty/libzip/man/zip_compression_method_supported.html @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_COMPRESSION_METHOD_SUPPORTED(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_COMPRESSION_METHOD_SUPPORTED(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_COMPRESSION_METHOD_SUPPORTED(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_compression_method_supported</code> — +<div class="Nd">return if a compression method is supported</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_compression_method_supported</code>(<var class="Fa" style="white-space: nowrap;">zip_int32_t + method</var>, <var class="Fa" style="white-space: nowrap;">int + compress</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_compression_method_supported</code>() returns if the + compression method <var class="Ar">method</var> is supported for compression + (if <var class="Ar">compress</var> is zero) or decompression (otherwise). +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Returns 1 if the method is supported, 0 otherwise. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_encryption_method_supported.html">zip_encryption_method_supported(3)</a>, + <a class="Xr" href="zip_set_file_compression.html">zip_set_file_compression(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_compression_method_supported</code>() was added in libzip + 1.7.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 2, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_compression_method_supported.man b/3rdparty/libzip/man/zip_compression_method_supported.man new file mode 100644 index 0000000000..44811f2748 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_compression_method_supported.mdoc b/3rdparty/libzip/man/zip_compression_method_supported.mdoc new file mode 100644 index 0000000000..b375a30b40 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_delete.html b/3rdparty/libzip/man/zip_delete.html new file mode 100644 index 0000000000..fc2f693212 --- /dev/null +++ b/3rdparty/libzip/man/zip_delete.html @@ -0,0 +1,114 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_DELETE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_DELETE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_DELETE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_delete</code> — +<div class="Nd">delete file from zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_delete</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The file at position <var class="Ar">index</var> in the zip archive + <var class="Ar">archive</var> is marked as deleted. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_delete</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_unchange.html">zip_unchange(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_delete</code>() was added in libzip 0.6. In libzip 0.10 the + type of <var class="Ar">index</var> was changed from <var class="Vt">int</var> + to <var class="Vt">zip_uint64_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_delete.man b/3rdparty/libzip/man/zip_delete.man new file mode 100644 index 0000000000..d607c1eae6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_delete.mdoc b/3rdparty/libzip/man/zip_delete.mdoc new file mode 100644 index 0000000000..dc8346e41b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_dir_add.html b/3rdparty/libzip/man/zip_dir_add.html new file mode 100644 index 0000000000..e297326beb --- /dev/null +++ b/3rdparty/libzip/man/zip_dir_add.html @@ -0,0 +1,134 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_DIR_ADD(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_DIR_ADD(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_DIR_ADD(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_dir_add</code> — +<div class="Nd">add directory to zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_dir_add</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_dir_add</code>() adds a directory to a zip + archive. The argument <var class="Ar">archive</var> specifies the zip archive + to which the directory should be added. <var class="Ar">name</var> is the + directory's name in the zip archive. +<p class="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 <var class="Ar">flags</var> argument can be + any of:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>Guess encoding of <var class="Ar">name</var> (default). (Only CP-437 and + UTF-8 are recognized.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_UTF_8"><code class="Dv" id="ZIP_FL_ENC_UTF_8">ZIP_FL_ENC_UTF_8</code></a></dt> + <dd>Interpret <var class="Ar">name</var> as UTF-8.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_CP437"><code class="Dv" id="ZIP_FL_ENC_CP437">ZIP_FL_ENC_CP437</code></a></dt> + <dd>Interpret <var class="Ar">name</var> as code page 437 (CP-437).</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the index of the new entry in the archive is + returned. Otherwise, -1 is returned and the error code in + <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_dir_add</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_EXISTS"><code class="Er" id="ZIP_ER_EXISTS">ZIP_ER_EXISTS</code></a>]</dt> + <dd>There is already an entry called <var class="Ar">name</var> in the + archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">archive</var> or <var class="Ar">name</var> are + <code class="Dv">NULL</code>, or invalid UTF-8 encoded file names.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_dir_add</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 20, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_dir_add.man b/3rdparty/libzip/man/zip_dir_add.man new file mode 100644 index 0000000000..4c863febe5 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_dir_add.mdoc b/3rdparty/libzip/man/zip_dir_add.mdoc new file mode 100644 index 0000000000..01e0a22bb7 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_discard.html b/3rdparty/libzip/man/zip_discard.html new file mode 100644 index 0000000000..05502dd7a7 --- /dev/null +++ b/3rdparty/libzip/man/zip_discard.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_DISCARD(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_DISCARD(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_DISCARD(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_discard</code> — +<div class="Nd">close zip archive and discard changes</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_discard</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_discard</code>() function closes + <var class="Ar">archive</var> and frees the memory allocated for it. Any + changes to the archive are not written to disk and discarded. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_close.html">zip_close(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_discard</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_discard.man b/3rdparty/libzip/man/zip_discard.man new file mode 100644 index 0000000000..591f7735ce --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_discard.mdoc b/3rdparty/libzip/man/zip_discard.mdoc new file mode 100644 index 0000000000..7404a48376 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_encryption_method_supported.html b/3rdparty/libzip/man/zip_encryption_method_supported.html new file mode 100644 index 0000000000..7b4603ebb9 --- /dev/null +++ b/3rdparty/libzip/man/zip_encryption_method_supported.html @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ENCRYPTION_METHOD_SUPPORTED(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ENCRYPTION_METHOD_SUPPORTED(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ENCRYPTION_METHOD_SUPPORTED(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_encryption_method_supported</code> — +<div class="Nd">return if an encryption method is supported</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_encryption_method_supported</code>(<var class="Fa" style="white-space: nowrap;">zip_int16_t + method</var>, <var class="Fa" style="white-space: nowrap;">int + encrypt</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_encryption_method_supported</code>() returns if the + encryption method <var class="Ar">method</var> is supported for encryption (if + <var class="Ar">encrypt</var> is zero) or decryption (otherwise). +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Returns 1 if the method is supported, 0 otherwise. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_compression_method_supported.html">zip_compression_method_supported(3)</a>, + <a class="Xr" href="zip_file_set_encryption.html">zip_file_set_encryption(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_encryption_method_supported</code>() was added in libzip + 1.7.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 2, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_encryption_method_supported.man b/3rdparty/libzip/man/zip_encryption_method_supported.man new file mode 100644 index 0000000000..4ab4e3bce0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_encryption_method_supported.mdoc b/3rdparty/libzip/man/zip_encryption_method_supported.mdoc new file mode 100644 index 0000000000..43f6ff971b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_clear.html b/3rdparty/libzip/man/zip_error_clear.html new file mode 100644 index 0000000000..7f9350ce1c --- /dev/null +++ b/3rdparty/libzip/man/zip_error_clear.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_CLEAR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_CLEAR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_CLEAR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_clear</code>, + <code class="Nm">zip_file_error_clear</code> — +<div class="Nd">clear error state for archive or file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_error_clear</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_file_error_clear</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_clear</code>() function clears the error state + for the zip archive <var class="Ar">archive</var>. +<p class="Pp">The <code class="Fn">zip_file_error_clear</code>() function does + the same for the zip file <var class="Ar">file</var>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_get_error.html">zip_get_error(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_clear</code>() and + <code class="Fn">zip_file_error_clear</code>() were added in libzip 0.8. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_clear.man b/3rdparty/libzip/man/zip_error_clear.man new file mode 100644 index 0000000000..650a36b9da --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_clear.mdoc b/3rdparty/libzip/man/zip_error_clear.mdoc new file mode 100644 index 0000000000..c322630eac --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_code_system.html b/3rdparty/libzip/man/zip_error_code_system.html new file mode 100644 index 0000000000..783a19adba --- /dev/null +++ b/3rdparty/libzip/man/zip_error_code_system.html @@ -0,0 +1,99 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_CODE_SYSTEM(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_CODE_SYSTEM(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_CODE_SYSTEM(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_code_system</code> — +<div class="Nd">get operating system error part of zip_error</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_error_code_system</code>(<var class="Fa" style="white-space: nowrap;">const + zip_error_t *ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_code_system</code>() function returns the system + specific part of the error from the zip_error error <var class="Ar">ze</var>. + For finding out what system reported the error, use + <a class="Xr" href="zip_error_system_type.html">zip_error_system_type(3)</a>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_code_zip.html">zip_error_code_zip(3)</a>, + <a class="Xr" href="zip_error_system_type.html">zip_error_system_type(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_code_system</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_code_system.man b/3rdparty/libzip/man/zip_error_code_system.man new file mode 100644 index 0000000000..4eb0cad8de --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_code_system.mdoc b/3rdparty/libzip/man/zip_error_code_system.mdoc new file mode 100644 index 0000000000..c87a206923 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_code_zip.html b/3rdparty/libzip/man/zip_error_code_zip.html new file mode 100644 index 0000000000..91f874a057 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_code_zip.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_CODE_ZIP(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_CODE_ZIP(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_CODE_ZIP(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_code_zip</code> — +<div class="Nd">get libzip error part of zip_error</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_error_code_zip</code>(<var class="Fa" style="white-space: nowrap;">const + zip_error_t *ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_code_zip</code>() function returns the libzip + specific part of the error from the zip_error error <var class="Ar">ze</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_code_system.html">zip_error_code_system(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_code_zip</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_code_zip.man b/3rdparty/libzip/man/zip_error_code_zip.man new file mode 100644 index 0000000000..2a53981484 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_code_zip.mdoc b/3rdparty/libzip/man/zip_error_code_zip.mdoc new file mode 100644 index 0000000000..c68fff431b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_fini.html b/3rdparty/libzip/man/zip_error_fini.html new file mode 100644 index 0000000000..7263ba34bc --- /dev/null +++ b/3rdparty/libzip/man/zip_error_fini.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_FINI(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_FINI(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_FINI(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_fini</code> — +<div class="Nd">clean up zip_error structure</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_error_fini</code>(<var class="Fa" style="white-space: nowrap;">zip_error_t + *ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_fini</code>() function cleans up and frees + internally allocated memory of the zip_error pointed to by + <var class="Ar">ze</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_init.html">zip_error_init(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_fini</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_fini.man b/3rdparty/libzip/man/zip_error_fini.man new file mode 100644 index 0000000000..2e4a1ae39b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_fini.mdoc b/3rdparty/libzip/man/zip_error_fini.mdoc new file mode 100644 index 0000000000..136db4ce47 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_get.html b/3rdparty/libzip/man/zip_error_get.html new file mode 100644 index 0000000000..575c42c63c --- /dev/null +++ b/3rdparty/libzip/man/zip_error_get.html @@ -0,0 +1,150 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_GET(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_GET(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_GET(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_get</code>, + <code class="Nm">zip_file_error_get</code> — +<div class="Nd">get error codes for archive or file (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_error_get</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">int *zep</var>, + <var class="Fa" style="white-space: nowrap;">int *sep</var>);</p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_file_error_get</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>, <var class="Fa" style="white-space: nowrap;">int *zep</var>, + <var class="Fa" style="white-space: nowrap;">int *sep</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_error_get</code>() and + <code class="Fn">zip_file_error_get</code>() are deprecated. Use + <a class="Xr" href="zip_error_code_system.html">zip_error_code_system(3)</a>, + <a class="Xr" href="zip_error_code_zip.html">zip_error_code_zip(3)</a>, + <a class="Xr" href="zip_file_get_error.html">zip_file_get_error(3)</a>, and + <a class="Xr" href="zip_get_error.html">zip_get_error(3)</a> instead. +<p class="Pp">For <code class="Fn">zip_error_get</code>(), replace</p> +<div class="Bd Pp Bd-indent"> +<pre> +int ze, se; +zip_error_get(za, &ze, &se); +</pre> +</div> +with +<div class="Bd Pp Bd-indent"> +<pre> +int ze, se; +zip_error_t *error = zip_get_error(za); +ze = zip_error_code_zip(error); +se = zip_error_code_system(error); +</pre> +</div> +For <code class="Fn">zip_file_error_get</code>(), replace +<div class="Bd Pp Bd-indent"> +<pre> +int ze, se; +zip_file_error_get(zf, &ze, &se); +</pre> +</div> +with +<div class="Bd Pp Bd-indent"> +<pre> +int ze, se; +zip_error_t *error = zip_file_get_error(zf); +ze = zip_error_code_zip(error); +se = zip_error_code_system(error); +</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_code_system.html">zip_error_code_system(3)</a>, + <a class="Xr" href="zip_error_code_zip.html">zip_error_code_zip(3)</a>, + <a class="Xr" href="zip_file_get_error.html">zip_file_get_error(3)</a>, + <a class="Xr" href="zip_get_error.html">zip_get_error(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_get</code>() was added in libzip 0.6. It was + deprecated in libzip 1.0, use <code class="Fn">zip_get_error</code>(), + <code class="Fn">zip_error_code_zip</code>(), / + <code class="Fn">zip_error_code_system</code>() instead. +<p class="Pp"><code class="Fn">zip_file_error_get</code>() was added in libzip + 0.6. It was deprecated in libzip 1.0, use + <code class="Fn">zip_file_get_error</code>(), + <code class="Fn">zip_error_code_zip</code>(), / + <code class="Fn">zip_error_code_system</code>() instead.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_get.man b/3rdparty/libzip/man/zip_error_get.man new file mode 100644 index 0000000000..43e2c0654b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_get.mdoc b/3rdparty/libzip/man/zip_error_get.mdoc new file mode 100644 index 0000000000..527139436a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_get_sys_type.html b/3rdparty/libzip/man/zip_error_get_sys_type.html new file mode 100644 index 0000000000..1e67c9b994 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_get_sys_type.html @@ -0,0 +1,116 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_GET_SYS_TYPE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_GET_SYS_TYPE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_GET_SYS_TYPE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_get_sys_type</code> — +<div class="Nd">get type of system error code (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_error_get_sys_type</code>(<var class="Fa" style="white-space: nowrap;">int + ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_error_get_sys_type</code>() is deprecated; use + <a class="Xr" href="zip_error_init_with_code.html">zip_error_init_with_code(3)</a> + and + <a class="Xr" href="zip_error_system_type.html">zip_error_system_type(3)</a> + instead. +<p class="Pp">Replace</p> +<div class="Bd Pp Bd-indent"> +<pre> +int i = zip_error_get_sys_type(ze); +</pre> +</div> +with +<div class="Bd Pp Bd-indent"> +<pre> +zip_error_t error; +zip_error_init_with_code(&error, ze); +int i = zip_error_system_type(&error); +</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_init_with_code.html">zip_error_init_with_code(3)</a>, + <a class="Xr" href="zip_error_system_type.html">zip_error_system_type(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_get_sys_type</code>() was added in libzip 0.6. It was + deprecated in libzip 1.0, use <code class="Fn">zip_error_system_type</code>() + instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_get_sys_type.man b/3rdparty/libzip/man/zip_error_get_sys_type.man new file mode 100644 index 0000000000..753a94cfed --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_get_sys_type.mdoc b/3rdparty/libzip/man/zip_error_get_sys_type.mdoc new file mode 100644 index 0000000000..16d3af78d3 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_init.html b/3rdparty/libzip/man/zip_error_init.html new file mode 100644 index 0000000000..18e22bb9d5 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_init.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_INIT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_INIT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_INIT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_init</code>, + <code class="Nm">zip_error_init_with_code</code> — +<div class="Nd">initialize zip_error structure</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_error_init</code>(<var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_error_init_with_code</code>(<var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>, <var class="Fa" style="white-space: nowrap;">int + ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_init</code>() function initializes the zip_error + pointed to by <var class="Ar">error</var>. <var class="Ar">*error</var> must + be allocated before calling <code class="Fn">zip_error_init</code>(). +<p class="Pp">The <code class="Fn">zip_error_init_with_code</code>() function + does the same, but additionally sets the zip error code to + <var class="Ar">ze</var> and sets the system error code to the current + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html">errno(3)</a> value, if appropriate.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_fini.html">zip_error_fini(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_init</code>() and + <code class="Fn">zip_error_init_with_code</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_init.man b/3rdparty/libzip/man/zip_error_init.man new file mode 100644 index 0000000000..7623e982f1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_init.mdoc b/3rdparty/libzip/man/zip_error_init.mdoc new file mode 100644 index 0000000000..b524303ef8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_set.html b/3rdparty/libzip/man/zip_error_set.html new file mode 100644 index 0000000000..b1d87e76d0 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_set.html @@ -0,0 +1,101 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_SET(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_SET(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_SET(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_set</code> — +<div class="Nd">fill in zip_error structure</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_error_set</code>(<var class="Fa" style="white-space: nowrap;">zip_error_t + *ze</var>, <var class="Fa" style="white-space: nowrap;">int le</var>, + <var class="Fa" style="white-space: nowrap;">int se</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_set</code>() function sets the zip_error pointed + to by <var class="Ar">ze</var> to the libzip error code + <var class="Ar">le</var> and the system error code <var class="Ar">se</var>. +<p class="Pp"><var class="Ar">ze</var> must be allocated and initialized with + <a class="Xr" href="zip_error_init.html">zip_error_init(3)</a> before + calling <code class="Fn">zip_error</code>(<var class="Fa">set</var>).</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_init.html">zip_error_init(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_set</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 2, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_set.man b/3rdparty/libzip/man/zip_error_set.man new file mode 100644 index 0000000000..0908d1e018 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_set.man @@ -0,0 +1,74 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "April 2, 2020" "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 <zip.h>\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\fR(\fIset\fR). +.SH "SEE ALSO" +libzip(3), +zip_error_init(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/3rdparty/libzip/man/zip_error_set.mdoc b/3rdparty/libzip/man/zip_error_set.mdoc new file mode 100644 index 0000000000..68e81f3441 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_set.mdoc @@ -0,0 +1,69 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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 +.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/3rdparty/libzip/man/zip_error_strerror.html b/3rdparty/libzip/man/zip_error_strerror.html new file mode 100644 index 0000000000..b1379f268e --- /dev/null +++ b/3rdparty/libzip/man/zip_error_strerror.html @@ -0,0 +1,101 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_STRERROR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_STRERROR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_STRERROR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_strerror</code> — +<div class="Nd">create human-readable string for zip_error</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_error_strerror</code>(<var class="Fa" style="white-space: nowrap;">zip_error_t + *ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_strerror</code>() function returns an error + message string corresponding to <var class="Ar">ze</var> like + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html">strerror(3)</a>. This string will stay + valid until the next call to <code class="Fn">zip_error_strerror</code>() or + until <a class="Xr" href="zip_error_fini.html">zip_error_fini(3)</a> is + called. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html">strerror(3)</a>, + <a class="Xr" href="zip_error_fini.html">zip_error_fini(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_strerror</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_strerror.man b/3rdparty/libzip/man/zip_error_strerror.man new file mode 100644 index 0000000000..f1396ce35e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_strerror.mdoc b/3rdparty/libzip/man/zip_error_strerror.mdoc new file mode 100644 index 0000000000..8d44c993f0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_system_type.html b/3rdparty/libzip/man/zip_error_system_type.html new file mode 100644 index 0000000000..463b50c6c9 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_system_type.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_SYSTEM_TYPE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_SYSTEM_TYPE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_SYSTEM_TYPE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_system_type</code> — +<div class="Nd">return type of system error</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_error_system_type</code>(<var class="Fa" style="white-space: nowrap;">const + zip_error_t *ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_error_system_type</code>() function returns the type of + the system specific part for the zip_error <var class="Ar">ze</var>. + Currently, the following system types are defined: +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_ET_NONE"><code class="Dv" id="ZIP_ET_NONE">ZIP_ET_NONE</code></a></dt> + <dd>System specific part of <var class="Ar">ze</var> is unused.</dd> + <dt><a class="permalink" href="#ZIP_ET_SYS"><code class="Dv" id="ZIP_ET_SYS">ZIP_ET_SYS</code></a></dt> + <dd>System specific part of <var class="Ar">ze</var> is an + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html">errno(2)</a>.</dd> + <dt><a class="permalink" href="#ZIP_ET_ZLIB"><code class="Dv" id="ZIP_ET_ZLIB">ZIP_ET_ZLIB</code></a></dt> + <dd>System specific part of <var class="Ar">ze</var> is a + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/zlib.html">zlib(3)</a> error.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_code_system.html">zip_error_code_system(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_system_type</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_system_type.man b/3rdparty/libzip/man/zip_error_system_type.man new file mode 100644 index 0000000000..0d55f4a3bb --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_system_type.mdoc b/3rdparty/libzip/man/zip_error_system_type.mdoc new file mode 100644 index 0000000000..f9fbfce5e0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_to_data.html b/3rdparty/libzip/man/zip_error_to_data.html new file mode 100644 index 0000000000..6ec45f5a77 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_to_data.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_TO_DATA(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_TO_DATA(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_TO_DATA(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_to_data</code> — +<div class="Nd">convert zip_error to return value suitable for + ZIP_SOURCE_ERROR</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_error_to_data</code>(<var class="Fa" style="white-space: nowrap;">const + zip_error_t *ze</var>, <var class="Fa" style="white-space: nowrap;">void + *data</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + len</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Fn">zip_error_to_data</code>() function converts the zip_error + <var class="Ar">ze</var> into data suitable as return value for + <code class="Dv">ZIP_SOURCE_ERROR</code>. The data is written into the buffer + <var class="Ar">data</var> of size <var class="Ar">len</var>. If the buffer is + not large enough to hold 2 ints, an error is returned. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_error_to_data</code>() returns 2*(sizeof int) on success, + and -1 on error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_to_data</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_to_data.man b/3rdparty/libzip/man/zip_error_to_data.man new file mode 100644 index 0000000000..f6551292f1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_to_data.mdoc b/3rdparty/libzip/man/zip_error_to_data.mdoc new file mode 100644 index 0000000000..e7ba170b1f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_error_to_str.html b/3rdparty/libzip/man/zip_error_to_str.html new file mode 100644 index 0000000000..cf6ce642d2 --- /dev/null +++ b/3rdparty/libzip/man/zip_error_to_str.html @@ -0,0 +1,124 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERROR_TO_STR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERROR_TO_STR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERROR_TO_STR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_error_to_str</code> — +<div class="Nd">get string representation of zip error (obsolete + interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_error_to_str</code>(<var class="Fa" style="white-space: nowrap;">char + *buf</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + len</var>, <var class="Fa" style="white-space: nowrap;">int ze</var>, + <var class="Fa" style="white-space: nowrap;">int se</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_error_to_str</code>() is deprecated; use + <a class="Xr" href="zip_error_init_with_code.html">zip_error_init_with_code(3)</a> + and <a class="Xr" href="zip_error_strerror.html">zip_error_strerror(3)</a> + instead. +<p class="Pp">Replace</p> +<div class="Bd Pp Bd-indent"> +<pre> +char buf[BUFSIZE]; +zip_error_to_str(buf, sizeof(buf), ze, se); +printf("%s", buf); +</pre> +</div> +with +<div class="Bd Pp Bd-indent"> +<pre> +zip_error_t error; +zip_error_init_with_code(&error, ze); +printf("%s", zip_error_strerror(&error)); +zip_error_fini(&error); +</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_init_with_code.html">zip_error_init_with_code(3)</a>, + <a class="Xr" href="zip_error_strerror.html">zip_error_strerror(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_error_to_str</code>() was added in libzip 0.6. In libzip + 0.10 the type of <var class="Ar">len</var> was changed from + <var class="Vt">size_t</var> to <var class="Vt">zip_uint64_t</var>. It was + deprecated in libzip 1.0, use + <code class="Fn">zip_error_init_with_code</code>() and + <code class="Fn">zip_error_strerror</code>() instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_error_to_str.man b/3rdparty/libzip/man/zip_error_to_str.man new file mode 100644 index 0000000000..0db434aa50 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_error_to_str.mdoc b/3rdparty/libzip/man/zip_error_to_str.mdoc new file mode 100644 index 0000000000..7054d3e43a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_errors.html b/3rdparty/libzip/man/zip_errors.html new file mode 100644 index 0000000000..d7c25d2a16 --- /dev/null +++ b/3rdparty/libzip/man/zip_errors.html @@ -0,0 +1,150 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_ERRORS(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_ERRORS(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_ERRORS(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_errors</code> — +<div class="Nd">list of all libzip error codes</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The following error codes are used by libzip: +<dl class="Bl-tag"> + <dt>[<code class="Er">ZIP_ER_CHANGED</code>]</dt> + <dd>Entry has been changed.</dd> + <dt>[<code class="Er">ZIP_ER_CLOSE</code>]</dt> + <dd>Closing zip archive failed.</dd> + <dt>[<code class="Er">ZIP_ER_COMPNOTSUPP</code>]</dt> + <dd>Compression method not supported.</dd> + <dt>[<code class="Er">ZIP_ER_COMPRESSED_DATA</code>]</dt> + <dd>Compressed data invalid.</dd> + <dt>[<code class="Er">ZIP_ER_CRC</code>]</dt> + <dd>CRC error.</dd> + <dt>[<code class="Er">ZIP_ER_DELETED</code>]</dt> + <dd>Entry has been deleted.</dd> + <dt>[<code class="Er">ZIP_ER_ENCRNOTSUPP</code>]</dt> + <dd>Encryption method not supported.</dd> + <dt>[<code class="Er">ZIP_ER_EOF</code>]</dt> + <dd>Premature end of file.</dd> + <dt>[<code class="Er">ZIP_ER_EXISTS</code>]</dt> + <dd>File already exists.</dd> + <dt>[<code class="Er">ZIP_ER_INCONS</code>]</dt> + <dd>Zip archive inconsistent.</dd> + <dt>[<code class="Er">ZIP_ER_INTERNAL</code>]</dt> + <dd>Internal error.</dd> + <dt>[<code class="Er">ZIP_ER_INUSE</code>]</dt> + <dd>Resource still in use.</dd> + <dt>[<code class="Er">ZIP_ER_INVAL</code>]</dt> + <dd>Invalid argument.</dd> + <dt>[<code class="Er">ZIP_ER_MEMORY</code>]</dt> + <dd>Malloc failure.</dd> + <dt>[<code class="Er">ZIP_ER_MULTIDISK</code>]</dt> + <dd>Multi-disk zip archives not supported.</dd> + <dt>[<code class="Er">ZIP_ER_NOENT</code>]</dt> + <dd>No such file.</dd> + <dt>[<code class="Er">ZIP_ER_NOPASSWD</code>]</dt> + <dd>No password provided.</dd> + <dt>[<code class="Er">ZIP_ER_NOZIP</code>]</dt> + <dd>Not a zip archive.</dd> + <dt>[<code class="Er">ZIP_ER_OK</code>]</dt> + <dd>No error.</dd> + <dt>[<code class="Er">ZIP_ER_OPEN</code>]</dt> + <dd>Can't open file.</dd> + <dt>[<code class="Er">ZIP_ER_OPNOTSUPP</code>]</dt> + <dd>Operation not supported.</dd> + <dt>[<code class="Er">ZIP_ER_RDONLY</code>]</dt> + <dd>Read-only archive.</dd> + <dt>[<code class="Er">ZIP_ER_READ</code>]</dt> + <dd>Read error.</dd> + <dt>[<code class="Er">ZIP_ER_REMOVE</code>]</dt> + <dd>Can't remove file.</dd> + <dt>[<code class="Er">ZIP_ER_RENAME</code>]</dt> + <dd>Renaming temporary file failed.</dd> + <dt>[<code class="Er">ZIP_ER_SEEK</code>]</dt> + <dd>Seek error.</dd> + <dt>[<code class="Er">ZIP_ER_TELL</code>]</dt> + <dd>Tell error.</dd> + <dt>[<code class="Er">ZIP_ER_TMPOPEN</code>]</dt> + <dd>Failure to create temporary file.</dd> + <dt>[<code class="Er">ZIP_ER_WRITE</code>]</dt> + <dd>Write error.</dd> + <dt>[<code class="Er">ZIP_ER_WRONGPASSWD</code>]</dt> + <dd>Wrong password provided.</dd> + <dt>[<code class="Er">ZIP_ER_ZIPCLOSED</code>]</dt> + <dd>Containing zip archive was closed.</dd> + <dt>[<code class="Er">ZIP_ER_ZLIB</code>]</dt> + <dd>Zlib error.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_errors.man b/3rdparty/libzip/man/zip_errors.man new file mode 100644 index 0000000000..353c23b862 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_errors.mdoc b/3rdparty/libzip/man/zip_errors.mdoc new file mode 100644 index 0000000000..5c1d8fd69f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_fclose.html b/3rdparty/libzip/man/zip_fclose.html new file mode 100644 index 0000000000..4c57364057 --- /dev/null +++ b/3rdparty/libzip/man/zip_fclose.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FCLOSE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FCLOSE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FCLOSE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_fclose</code> — +<div class="Nd">close file in zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_fclose</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_fclose</code>() function closes + <var class="Ar">file</var> and frees the memory allocated for it. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, the error code is returned. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>, + <a class="Xr" href="zip_fread.html">zip_fread(3)</a>, + <a class="Xr" href="zip_fseek.html">zip_fseek(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_fclose</code>() was added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_fclose.man b/3rdparty/libzip/man/zip_fclose.man new file mode 100644 index 0000000000..977a7b7771 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_fclose.mdoc b/3rdparty/libzip/man/zip_fclose.mdoc new file mode 100644 index 0000000000..0bbeee7cd1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_fdopen.html b/3rdparty/libzip/man/zip_fdopen.html new file mode 100644 index 0000000000..f3b84ebda3 --- /dev/null +++ b/3rdparty/libzip/man/zip_fdopen.html @@ -0,0 +1,154 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FDOPEN(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FDOPEN(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FDOPEN(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_fdopen</code> — +<div class="Nd">open zip archive using open file descriptor</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_t *</var> + <br/> + <code class="Fn">zip_fdopen</code>(<var class="Fa" style="white-space: nowrap;">int + fd</var>, <var class="Fa" style="white-space: nowrap;">int flags</var>, + <var class="Fa" style="white-space: nowrap;">int *errorp</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The zip archive specified by the open file descriptor <var class="Ar">fd</var> + is opened and a pointer to a <var class="Ft">struct zip</var>, used to + manipulate the archive, is returned. In contrast to + <a class="Xr" href="zip_open.html">zip_open(3)</a>, using + <code class="Nm">zip_fdopen</code> the archive can only be opened in read-only + mode. The <var class="Ar">fd</var> argument may not be used any longer after + calling <code class="Nm">zip_fdopen</code>. The <var class="Fa">flags</var> + are specified by <i class="Em">or</i><span class="No">'ing</span> the + following values, or 0 for none of them. +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_CHECKCONS"><code class="Dv" id="ZIP_CHECKCONS">ZIP_CHECKCONS</code></a></dt> + <dd>Perform additional stricter consistency checks on the archive, and error + if they fail.</dd> +</dl> +</div> +<p class="Pp">If an error occurs and <var class="Ar">errorp</var> is + <span class="No">non-</span><code class="Dv">NULL</code>, it will be set to + the corresponding error code.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion <code class="Fn">zip_fdopen</code>() returns a + <var class="Ft">struct zip</var> pointer, and <var class="Ar">fd</var> should + not be used any longer, nor passed to + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html">close(2)</a>. Otherwise, + <code class="Dv">NULL</code> is returned and <var class="Ar">*errorp</var> is + set to indicate the error. In the error case, <var class="Ar">fd</var> remains + unchanged. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +The file specified by <var class="Ar">fd</var> is prepared for use by + <a class="Xr" href="libzip.html">libzip(3)</a> unless: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INCONS"><code class="Er" id="ZIP_ER_INCONS">ZIP_ER_INCONS</code></a>]</dt> + <dd>Inconsistencies were found in the file specified by + <var class="Ar">path</var>. This error is often caused by specifying + <code class="Dv">ZIP_CHECKCONS</code> but can also happen without it.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd>The <var class="Ar">flags</var> argument is invalid. Not all + <a class="Xr" href="zip_open.html">zip_open(3)</a> flags are allowed for + <code class="Nm">zip_fdopen</code>, see + <a class="Sx" href="#DESCRIPTION">DESCRIPTION</a>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOZIP"><code class="Er" id="ZIP_ER_NOZIP">ZIP_ER_NOZIP</code></a>]</dt> + <dd>The file specified by <var class="Ar">fd</var> is not a zip archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_OPEN"><code class="Er" id="ZIP_ER_OPEN">ZIP_ER_OPEN</code></a>]</dt> + <dd>The file specified by <var class="Ar">fd</var> could not be prepared for + use by <a class="Xr" href="libzip.html">libzip(3)</a>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_READ"><code class="Er" id="ZIP_ER_READ">ZIP_ER_READ</code></a>]</dt> + <dd>A read error occurred; see <var class="Va">errno</var> for details.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_SEEK"><code class="Er" id="ZIP_ER_SEEK">ZIP_ER_SEEK</code></a>]</dt> + <dd>The file specified by <var class="Ar">fd</var> does not allow seeks.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_close.html">zip_close(3)</a>, + <a class="Xr" href="zip_error_strerror.html">zip_error_strerror(3)</a>, + <a class="Xr" href="zip_open.html">zip_open(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_fdopen</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_fdopen.man b/3rdparty/libzip/man/zip_fdopen.man new file mode 100644 index 0000000000..075a649dac --- /dev/null +++ b/3rdparty/libzip/man/zip_fdopen.man @@ -0,0 +1,158 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "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 <zip.h>\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_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/3rdparty/libzip/man/zip_fdopen.mdoc b/3rdparty/libzip/man/zip_fdopen.mdoc new file mode 100644 index 0000000000..0db086e7e0 --- /dev/null +++ b/3rdparty/libzip/man/zip_fdopen.mdoc @@ -0,0 +1,147 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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_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/3rdparty/libzip/man/zip_file_add.html b/3rdparty/libzip/man/zip_file_add.html new file mode 100644 index 0000000000..c702ac22e6 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_add.html @@ -0,0 +1,178 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_ADD(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_ADD(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_ADD(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_add</code>, <code class="Nm">zip_file_replace</code> + — +<div class="Nd">add file to zip archive or replace file in zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_file_add</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>, <var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_replace</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_file_add</code>() adds a file to a zip + archive, while <code class="Fn">zip_file_replace</code>() replaces an existing + file in a zip archive. The argument <var class="Ar">archive</var> specifies + the zip archive to which the file should be added. <var class="Ar">name</var> + is the file's name in the zip archive (for + <code class="Fn">zip_file_add</code>()), while <var class="Ar">index</var> + specifies which file should be replaced (for + <code class="Fn">zip_file_replace</code>()). The <var class="Ar">flags</var> + argument can be any combination of <code class="Dv">ZIP_FL_OVERWRITE</code> + with one of <code class="Dv">ZIP_FL_ENC_*</code>: +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_OVERWRITE"><code class="Dv" id="ZIP_FL_OVERWRITE">ZIP_FL_OVERWRITE</code></a></dt> + <dd>Overwrite any existing file of the same name. For + <code class="Nm">zip_file_add</code> only.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>Guess encoding of <var class="Ar">name</var> (default). (Only CP-437 and + UTF-8 are recognized.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_UTF_8"><code class="Dv" id="ZIP_FL_ENC_UTF_8">ZIP_FL_ENC_UTF_8</code></a></dt> + <dd>Interpret <var class="Ar">name</var> as UTF-8.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_CP437"><code class="Dv" id="ZIP_FL_ENC_CP437">ZIP_FL_ENC_CP437</code></a></dt> + <dd>Interpret <var class="Ar">name</var> as code page 437 (CP-437).</dd> +</dl> +The data is obtained from the <var class="Ar">source</var> argument, see + <a class="Xr" href="zip_source.html">zip_source(3)</a>. +<p class="Pp"><i class="Em">NOTE</i>: + <a class="Xr" href="zip_source_free.html">zip_source_free(3)</a> should not + be called on a <var class="Ar">source</var> after it was used successfully + in a <code class="Nm">zip_file_add</code> or + <code class="Nm">zip_file_replace</code> call.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, <code class="Fn">zip_file_add</code>() returns the + index of the new file in the archive, and + <code class="Fn">zip_file_replace</code>() returns 0. Otherwise, -1 is + returned and the error code in <var class="Ar">archive</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1> +<div class="Bd Bd-indent"> +<pre> +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)); +} +</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_add</code>() and + <code class="Fn">zip_file_replace</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_EXISTS"><code class="Er" id="ZIP_ER_EXISTS">ZIP_ER_EXISTS</code></a>]</dt> + <dd>There is already a file called <var class="Ar">name</var> in the archive. + (Only applies to <code class="Fn">zip_file_add</code>(), and only if + <code class="Dv">ZIP_FL_OVERWRITE</code> is not provided).</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">source</var> or <var class="Ar">name</var> are + <code class="Dv">NULL</code>, or <var class="Ar">index</var> is + invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RDONLY"><code class="Er" id="ZIP_ER_RDONLY">ZIP_ER_RDONLY</code></a>]</dt> + <dd>Archive was opened in read-only mode.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_add</code>() and + <code class="Fn">zip_file_replace</code>() were added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_add.man b/3rdparty/libzip/man/zip_file_add.man new file mode 100644 index 0000000000..c27f3cd85d --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_add.mdoc b/3rdparty/libzip/man/zip_file_add.mdoc new file mode 100644 index 0000000000..4c29e27f6f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_attributes_init.html b/3rdparty/libzip/man/zip_file_attributes_init.html new file mode 100644 index 0000000000..14f31db0ba --- /dev/null +++ b/3rdparty/libzip/man/zip_file_attributes_init.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_ATTRIBUTES_INIT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_ATTRIBUTES_INIT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_ATTRIBUTES_INIT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_attributes_init</code> — +<div class="Nd">initialize zip file attributes structure</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_file_attributes_init</code>(<var class="Fa" style="white-space: nowrap;">zip_file_attributes_t + *attributes</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_attributes_init</code>() initializes a + <var class="Vt">zip_file_attributes_t</var> structure with default values. It + must be called before modifying such a structure for the first time. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_attributes_init</code>() was added in libzip 1.7.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 17, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_attributes_init.man b/3rdparty/libzip/man/zip_file_attributes_init.man new file mode 100644 index 0000000000..ca28199cbd --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_attributes_init.mdoc b/3rdparty/libzip/man/zip_file_attributes_init.mdoc new file mode 100644 index 0000000000..7a5e06c60b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_extra_field_delete.html b/3rdparty/libzip/man/zip_file_extra_field_delete.html new file mode 100644 index 0000000000..fb67159002 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_extra_field_delete.html @@ -0,0 +1,159 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_EXTRA_FIELD_DELETE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_EXTRA_FIELD_DELETE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_EXTRA_FIELD_DELETE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_extra_field_delete</code>, + <code class="Nm">zip_file_extra_field_delete_by_id</code> — +<div class="Nd">delete extra field for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_extra_field_delete</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_index</var>, + <var class="Fa" style="white-space: nowrap;">zip_flags_t flags</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_extra_field_delete_by_id</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_id</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_index</var>, + <var class="Fa" style="white-space: nowrap;">zip_flags_t flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_extra_field_delete</code>() function deletes the + extra field with index <var class="Ar">extra_field_index</var> for the file at + position <var class="Ar">index</var> in the zip archive. +<p class="Pp">If <var class="Ar">extra_field_index</var> is + <code class="Dv">ZIP_EXTRA_FIELD_ALL</code>, then all extra fields will be + deleted.</p> +<p class="Pp">The following <var class="Ar">flags</var> are supported:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_CENTRAL"><code class="Dv" id="ZIP_FL_CENTRAL">ZIP_FL_CENTRAL</code></a></dt> + <dd>Delete extra fields from the archive's central directory.</dd> + <dt><a class="permalink" href="#ZIP_FL_LOCAL"><code class="Dv" id="ZIP_FL_LOCAL">ZIP_FL_LOCAL</code></a></dt> + <dd>Delete extra fields from the local file headers.</dd> +</dl> +</div> +<p class="Pp">The <code class="Fn">zip_file_extra_field_delete_by_id</code>() + function deletes the extra field with ID (two-byte signature) + <var class="Ar">extra_field_id</var> and index + <var class="Ar">extra_field_index</var> (in other words, the + <var class="Ar">extra_field_index</var><span class="No">'th</span> extra + field with ID <var class="Ar">extra_field_id</var>) The other arguments are + the same as for <code class="Fn">zip_file_extra_field_delete</code>() + (<code class="Dv">ZIP_EXTRA_FIELD_ALL</code> will delete all extra fields of + the specified ID).</p> +<p class="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 + <code class="Dv">ZIP_FL_CENTRAL</code> and + <code class="Dv">ZIP_FL_LOCAL</code> in <var class="Ar">flags</var>, except + when deleting all extra fields (i.e., + <var class="Ar">extra_field_index</var> being + <code class="Dv">ZIP_EXTRA_FIELD_ALL</code>).</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_extra_field_delete</code>() and + <code class="Fn">zip_file_extra_field_delete_by_id</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_NOENT"><code class="Er" id="ZIP_ER_NOENT">ZIP_ER_NOENT</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_extra_field_get.html">zip_file_extra_field_get(3)</a>, + <a class="Xr" href="zip_file_extra_field_set.html">zip_file_extra_field_set(3)</a>, + <a class="Xr" href="zip_file_extra_fields_count.html">zip_file_extra_fields_count(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_extra_field_delete</code>() and + <code class="Fn">zip_file_extra_field_delete_by_id</code>() were added in + libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_extra_field_delete.man b/3rdparty/libzip/man/zip_file_extra_field_delete.man new file mode 100644 index 0000000000..ccc5071d74 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_extra_field_delete.mdoc b/3rdparty/libzip/man/zip_file_extra_field_delete.mdoc new file mode 100644 index 0000000000..005e7470b9 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_extra_field_get.html b/3rdparty/libzip/man/zip_file_extra_field_get.html new file mode 100644 index 0000000000..0d7b305d69 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_extra_field_get.html @@ -0,0 +1,176 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_EXTRA_FIELD_GET(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_EXTRA_FIELD_GET(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_EXTRA_FIELD_GET(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_extra_field_get</code>, + <code class="Nm">zip_file_extra_field_get_by_id</code> — +<div class="Nd">get extra field for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const zip_uint8_t *</var> + <br/> + <code class="Fn">zip_file_extra_field_get</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_index</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t *idp</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t *lenp</var>, + <var class="Fa" style="white-space: nowrap;">zip_flags_t flags</var>);</p> +<p class="Pp"><var class="Ft">const zip_uint8_t *</var> + <br/> + <code class="Fn">zip_file_extra_field_get_by_id</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_id</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_index</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t *lenp</var>, + <var class="Fa" style="white-space: nowrap;">zip_flags_t flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_extra_field_get</code>() function returns the + extra field with index <var class="Ar">extra_field_index</var> for the file at + position <var class="Ar">index</var> in the zip archive. This pointer should + not be modified or <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/free.html">free(3)</a>'d, and becomes + invalid when <var class="Ar">archive</var> is closed. If + <var class="Ar">idp</var> is not <code class="Dv">NULL</code>, the integer to + which it points will be set to the ID (two-byte signature) of the selected + extra field. If <var class="Ar">lenp</var> is not + <code class="Dv">NULL</code>, the integer to which it points will be set to + the length of the extra field. Generally speaking, <var class="Ar">lenp</var> + and <var class="Ar">idp</var> should be passed since only the extra field data + is returned (i.e., neither the ID nor the length, if the + <var class="Ar">idp</var> and <var class="Ar">lenp</var> arguments are not + provided). +<p class="Pp">The following <var class="Ar">flags</var> are supported:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_CENTRAL"><code class="Dv" id="ZIP_FL_CENTRAL">ZIP_FL_CENTRAL</code></a></dt> + <dd>Return extra fields from the archive's central directory.</dd> + <dt><a class="permalink" href="#ZIP_FL_LOCAL"><code class="Dv" id="ZIP_FL_LOCAL">ZIP_FL_LOCAL</code></a></dt> + <dd>Return extra fields from the local file headers.</dd> + <dt><a class="permalink" href="#ZIP_FL_UNCHANGED"><code class="Dv" id="ZIP_FL_UNCHANGED">ZIP_FL_UNCHANGED</code></a></dt> + <dd>Return the original unchanged extra fields, ignoring any changes + made.</dd> +</dl> +</div> +<p class="Pp">The <code class="Fn">zip_file_extra_field_get_by_id</code>() + function returns the extra field with ID (two-byte signature) + <var class="Ar">extra_field_id</var> and index + <var class="Ar">extra_field_index</var> (in other words, the + <var class="Ar">extra_field_index</var><span class="No">'th</span> extra + field with ID <var class="Ar">extra_field_id</var>) The other arguments are + the same as for <code class="Fn">zip_file_extra_field_get</code>().</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, a pointer to an extra field is returned, or + <code class="Dv">NULL</code> if there is no extra field with that + <var class="Ar">extra_field_index</var> for the file with index + <var class="Ar">index</var>. In case of an error, <code class="Dv">NULL</code> + is returned and the error code in <var class="Ar">archive</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_extra_field_get</code>() and + <code class="Fn">zip_file_extra_field_get_by_id</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_NOENT"><code class="Er" id="ZIP_ER_NOENT">ZIP_ER_NOENT</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>, or <var class="Ar">extra_field_index</var> + is not a valid extra file index (for ID + <var class="Ar">extra_field_id</var>).</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_extra_field_delete.html">zip_file_extra_field_delete(3)</a>, + <a class="Xr" href="zip_file_extra_field_set.html">zip_file_extra_field_set(3)</a>, + <a class="Xr" href="zip_file_extra_fields_count.html">zip_file_extra_fields_count(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_extra_field_get</code>() and + <code class="Fn">zip_file_extra_field_get_by_id</code>() were added in libzip + 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +<section class="Sh"> +<h1 class="Sh" id="CAVEATS"><a class="permalink" href="#CAVEATS">CAVEATS</a></h1> +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 + <code class="Fn">zip_file_extra_field_get</code>() since they are used by + <a class="Xr" href="libzip.html">libzip(3)</a> internally. +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_extra_field_get.man b/3rdparty/libzip/man/zip_file_extra_field_get.man new file mode 100644 index 0000000000..39c54284f0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_extra_field_get.mdoc b/3rdparty/libzip/man/zip_file_extra_field_get.mdoc new file mode 100644 index 0000000000..72b2c873b3 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_extra_field_set.html b/3rdparty/libzip/man/zip_file_extra_field_set.html new file mode 100644 index 0000000000..e9decdb7c1 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_extra_field_set.html @@ -0,0 +1,148 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_EXTRA_FIELD_SET(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_EXTRA_FIELD_SET(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_EXTRA_FIELD_SET(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_extra_field_set</code> — +<div class="Nd">set extra field for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_extra_field_set</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_id</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_index</var>, <var class="Fa" style="white-space: nowrap;">const + zip_uint8_t *extra_field_data</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint16_t len</var>, + <var class="Fa" style="white-space: nowrap;">zip_flags_t flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_extra_field_set</code>() function sets the extra + field with ID (two-byte signature) <var class="Ar">extra_field_id</var> and + index <var class="Ar">extra_field_index</var> for the file at position + <var class="Ar">index</var> in the zip archive. The extra field's data will be + set to <var class="Ar">extra_field_data</var> and length + <var class="Ar">len</var>. If a new entry shall be appended, set + <var class="Ar">extra_field_index</var> to + <code class="Dv">ZIP_EXTRA_FIELD_NEW</code>. +<p class="Pp">At least one of the following <var class="Ar">flags</var> must be + set:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_CENTRAL"><code class="Dv" id="ZIP_FL_CENTRAL">ZIP_FL_CENTRAL</code></a></dt> + <dd>Set extra field in the archive's central directory.</dd> + <dt><a class="permalink" href="#ZIP_FL_LOCAL"><code class="Dv" id="ZIP_FL_LOCAL">ZIP_FL_LOCAL</code></a></dt> + <dd>Set extra field in the local file headers.</dd> +</dl> +</div> +<p class="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 <code class="Fn">zip_file_extra_field_set</code>() since they + are set by <a class="Xr" href="libzip.html">libzip(3)</a> automatically when + needed.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_extra_field_set</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd>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 <var class="Ar">extra_field_index</var> is too + large.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOENT"><code class="Er" id="ZIP_ER_NOENT">ZIP_ER_NOENT</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_extra_field_delete.html">zip_file_extra_field_delete(3)</a>, + <a class="Xr" href="zip_file_extra_field_get.html">zip_file_extra_field_get(3)</a>, + <a class="Xr" href="zip_file_extra_fields_count.html">zip_file_extra_fields_count(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_extra_field_set</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_extra_field_set.man b/3rdparty/libzip/man/zip_file_extra_field_set.man new file mode 100644 index 0000000000..3db94fe430 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_extra_field_set.mdoc b/3rdparty/libzip/man/zip_file_extra_field_set.mdoc new file mode 100644 index 0000000000..3e6abc1163 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_extra_fields_count.html b/3rdparty/libzip/man/zip_file_extra_fields_count.html new file mode 100644 index 0000000000..591f0215e1 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_extra_fields_count.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_EXTRA_FIELDS_COUNT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_EXTRA_FIELDS_COUNT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_EXTRA_FIELDS_COUNT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_extra_fields_count</code>, + <code class="Nm">zip_file_extra_fields_count_by_id</code> — +<div class="Nd">count extra fields for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int16_t</var> + <br/> + <code class="Fn">zip_file_extra_fields_count</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +<p class="Pp"><var class="Ft">zip_int16_t</var> + <br/> + <code class="Fn">zip_file_extra_fields_count_by_id</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + extra_field_id</var>, + <var class="Fa" style="white-space: nowrap;">zip_flags_t flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_extra_fields_count</code>() function counts the + extra fields for the file at position <var class="Ar">index</var> in the zip + archive. +<p class="Pp">The following <var class="Ar">flags</var> are supported:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_CENTRAL"><code class="Dv" id="ZIP_FL_CENTRAL">ZIP_FL_CENTRAL</code></a></dt> + <dd>Count extra fields from the archive's central directory.</dd> + <dt><a class="permalink" href="#ZIP_FL_LOCAL"><code class="Dv" id="ZIP_FL_LOCAL">ZIP_FL_LOCAL</code></a></dt> + <dd>Count extra fields from the local file headers.</dd> + <dt><a class="permalink" href="#ZIP_FL_UNCHANGED"><code class="Dv" id="ZIP_FL_UNCHANGED">ZIP_FL_UNCHANGED</code></a></dt> + <dd>Count the original unchanged extra fields, ignoring any changes made.</dd> +</dl> +</div> +<p class="Pp">The <code class="Fn">zip_file_extra_fields_count_by_id</code>() + function counts the extra fields with ID (two-byte signature) + <var class="Ar">extra_field_id</var>. The other arguments are the same as + for <code class="Fn">zip_file_extra_fields_count</code>().</p> +<p class="Pp">Extra fields that are the same in the central directory and the + local file header are merged into one. Therefore, the counts with + <code class="Dv">ZIP_FL_CENTRAL</code> and + <code class="Dv">ZIP_FL_LOCAL</code> do not need to add up to the same value + as when given <code class="Dv">ZIP_FL_CENTRAL|ZIP_FL_LOCAL</code> at the + same time.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the requested number of extra fields is returned. + Otherwise, -1 is returned and the error code in <var class="Ar">archive</var> + is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_extra_fields_count</code>() and + <code class="Fn">zip_file_extra_fields_count_by_id</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_NOENT"><code class="Er" id="ZIP_ER_NOENT">ZIP_ER_NOENT</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_extra_field_delete.html">zip_file_extra_field_delete(3)</a>, + <a class="Xr" href="zip_file_extra_field_get.html">zip_file_extra_field_get(3)</a>, + <a class="Xr" href="zip_file_extra_field_set.html">zip_file_extra_field_set(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_extra_fields_count</code>() and + <code class="Fn">zip_file_extra_fields_count_by_id</code>() were added in + libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_extra_fields_count.man b/3rdparty/libzip/man/zip_file_extra_fields_count.man new file mode 100644 index 0000000000..35a85e1470 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_extra_fields_count.mdoc b/3rdparty/libzip/man/zip_file_extra_fields_count.mdoc new file mode 100644 index 0000000000..47bb9a3f02 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_get_comment.html b/3rdparty/libzip/man/zip_file_get_comment.html new file mode 100644 index 0000000000..4b95548351 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_get_comment.html @@ -0,0 +1,143 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_GET_COMMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_GET_COMMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_GET_COMMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_get_comment</code> — +<div class="Nd">get comment for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_file_get_comment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint32_t + *lenp</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_get_comment</code>() function returns the comment + for the file at position <var class="Ar">index</var> in the zip archive. The + name is in UTF-8 encoding unless <code class="Dv">ZIP_FL_ENC_RAW</code> was + specified (see below). This pointer should not be modified or + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/free.html">free(3)</a>'d, and becomes invalid when + <var class="Ar">archive</var> is closed. If <var class="Ar">lenp</var> is not + <code class="Dv">NULL</code>, the integer to which it points will be set to + the length of the comment. If <var class="Ar">flags</var> is set to + <code class="Dv">ZIP_FL_UNCHANGED</code>, the original unchanged comment is + returned. +<p class="Pp">Additionally, the following <var class="Ar">flags</var> are + supported:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_ENC_RAW"><code class="Dv" id="ZIP_FL_ENC_RAW">ZIP_FL_ENC_RAW</code></a></dt> + <dd>Return the unmodified comment as it is in the ZIP archive.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>(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.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_STRICT"><code class="Dv" id="ZIP_FL_ENC_STRICT">ZIP_FL_ENC_STRICT</code></a></dt> + <dd>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.</dd> +</dl> +</div> +<i class="Em">Note</i>: ASCII is a subset of both CP-437 and UTF-8. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, a pointer to the comment is returned, or + <code class="Dv">NULL</code> if there is no comment. In case of an error, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_get_comment</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_set_comment.html">zip_file_set_comment(3)</a>, + <a class="Xr" href="zip_get_archive_comment.html">zip_get_archive_comment(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_get_comment</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_get_comment.man b/3rdparty/libzip/man/zip_file_get_comment.man new file mode 100644 index 0000000000..cdaa5c6285 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_get_comment.mdoc b/3rdparty/libzip/man/zip_file_get_comment.mdoc new file mode 100644 index 0000000000..a554f13ca2 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_get_error.html b/3rdparty/libzip/man/zip_file_get_error.html new file mode 100644 index 0000000000..d52f83a469 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_get_error.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_GET_ERROR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_GET_ERROR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_GET_ERROR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_get_error</code> — +<div class="Nd">extract zip_error from zip_file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_error_t *</var> + <br/> + <code class="Fn">zip_file_get_error</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *zf</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Fn">zip_file_get_error</code>() function returns the zip_error + associated with the zip_file <var class="Ar">zf</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_get_error</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_get_error.man b/3rdparty/libzip/man/zip_file_get_error.man new file mode 100644 index 0000000000..d364ac08fc --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_get_error.mdoc b/3rdparty/libzip/man/zip_file_get_error.mdoc new file mode 100644 index 0000000000..56628a1c78 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_get_external_attributes.html b/3rdparty/libzip/man/zip_file_get_external_attributes.html new file mode 100644 index 0000000000..d5ce85919b --- /dev/null +++ b/3rdparty/libzip/man/zip_file_get_external_attributes.html @@ -0,0 +1,176 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_get_external_attributes</code> — +<div class="Nd">get external attributes for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_get_external_attributes</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">zip_uint8_t + *opsys</var>, <var class="Fa" style="white-space: nowrap;">zip_uint32_t + *attributes</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_get_external_attributes</code>() function returns + the operating system and external attributes for the file at position + <var class="Ar">index</var> in the zip archive. The external attributes + usually contain the operating system-specific file permissions. If + <var class="Ar">flags</var> is set to + <code class="Dv">ZIP_FL_UNCHANGED</code>, the original unchanged values are + returned. If <var class="Ar">opsys</var> or <var class="Ar">attributes</var> + are <code class="Dv">NULL</code>, they are not filled in. +<p class="Pp">The following operating systems are defined by the zip + specification:</p> +<ul class="Bl-item Bd-indent Bl-compact"> + <li><a class="permalink" href="#ZIP_OPSYS_ACORN_RISC"><code class="Dv" id="ZIP_OPSYS_ACORN_RISC">ZIP_OPSYS_ACORN_RISC</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_ALTERNATE_MVS"><code class="Dv" id="ZIP_OPSYS_ALTERNATE_MVS">ZIP_OPSYS_ALTERNATE_MVS</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_AMIGA"><code class="Dv" id="ZIP_OPSYS_AMIGA">ZIP_OPSYS_AMIGA</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_ATARI_ST"><code class="Dv" id="ZIP_OPSYS_ATARI_ST">ZIP_OPSYS_ATARI_ST</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_BEOS"><code class="Dv" id="ZIP_OPSYS_BEOS">ZIP_OPSYS_BEOS</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_CPM"><code class="Dv" id="ZIP_OPSYS_CPM">ZIP_OPSYS_CPM</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_DOS"><code class="Dv" id="ZIP_OPSYS_DOS">ZIP_OPSYS_DOS</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_MACINTOSH"><code class="Dv" id="ZIP_OPSYS_MACINTOSH">ZIP_OPSYS_MACINTOSH</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_MVS"><code class="Dv" id="ZIP_OPSYS_MVS">ZIP_OPSYS_MVS</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_OPENVMS"><code class="Dv" id="ZIP_OPSYS_OPENVMS">ZIP_OPSYS_OPENVMS</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_OS_2"><code class="Dv" id="ZIP_OPSYS_OS_2">ZIP_OPSYS_OS_2</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_OS_400"><code class="Dv" id="ZIP_OPSYS_OS_400">ZIP_OPSYS_OS_400</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_OS_X"><code class="Dv" id="ZIP_OPSYS_OS_X">ZIP_OPSYS_OS_X</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_TANDEM"><code class="Dv" id="ZIP_OPSYS_TANDEM">ZIP_OPSYS_TANDEM</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_UNIX"><code class="Dv" id="ZIP_OPSYS_UNIX">ZIP_OPSYS_UNIX</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_VFAT"><code class="Dv" id="ZIP_OPSYS_VFAT">ZIP_OPSYS_VFAT</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_VM_CMS"><code class="Dv" id="ZIP_OPSYS_VM_CMS">ZIP_OPSYS_VM_CMS</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_VSE"><code class="Dv" id="ZIP_OPSYS_VSE">ZIP_OPSYS_VSE</code></a></li> + <li><a class="permalink" href="#ZIP_OPSYS_WINDOWS_NTFS"><code class="Dv" id="ZIP_OPSYS_WINDOWS_NTFS">ZIP_OPSYS_WINDOWS_NTFS</code></a> + (uncommon, use <code class="Dv">ZIP_OPSYS_DOS</code> instead)</li> + <li><a class="permalink" href="#ZIP_OPSYS_Z_SYSTEM"><code class="Dv" id="ZIP_OPSYS_Z_SYSTEM">ZIP_OPSYS_Z_SYSTEM</code></a></li> +</ul> +<p class="Pp">The defines above follow the PKWARE Inc. Appnote; please note that + the InfoZIP Appnote has a slightly different mapping.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, 0 is returned. In case of an error, + <code class="Dv">-1</code> is returned and the error code in + <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1> +The following code can be used to expand <var class="Ar">attributes</var> if the + operating system is <code class="Dv">ZIP_OPSYS_DOS</code>. +<div class="Bd Pp"> +<pre> +#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; +} +</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_get_external_attributes</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_set_external_attributes.html">zip_file_set_external_attributes(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_get_external_attributes</code>() was added in libzip + 0.11.2. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_get_external_attributes.man b/3rdparty/libzip/man/zip_file_get_external_attributes.man new file mode 100644 index 0000000000..acd3fbb49f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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 <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; +} +.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/3rdparty/libzip/man/zip_file_get_external_attributes.mdoc b/3rdparty/libzip/man/zip_file_get_external_attributes.mdoc new file mode 100644 index 0000000000..5b3cdcc81e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <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; +} +.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/3rdparty/libzip/man/zip_file_rename.html b/3rdparty/libzip/man/zip_file_rename.html new file mode 100644 index 0000000000..c4d2aa9aba --- /dev/null +++ b/3rdparty/libzip/man/zip_file_rename.html @@ -0,0 +1,132 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_RENAME(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_RENAME(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_RENAME(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_rename</code> — +<div class="Nd">rename file in zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_rename</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The file at position <var class="Ar">index</var> in the zip archive + <var class="Ar">archive</var> is renamed to <var class="Ar">name</var>. The + <var class="Ar">flags</var> argument can be any of: +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>Guess encoding of <var class="Ar">name</var> (default). (Only CP-437 and + UTF-8 are recognized.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_UTF_8"><code class="Dv" id="ZIP_FL_ENC_UTF_8">ZIP_FL_ENC_UTF_8</code></a></dt> + <dd>Interpret <var class="Ar">name</var> as UTF-8.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_CP437"><code class="Dv" id="ZIP_FL_ENC_CP437">ZIP_FL_ENC_CP437</code></a></dt> + <dd>Interpret <var class="Ar">name</var> as code page 437 (CP-437).</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_rename</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_DELETED"><code class="Er" id="ZIP_ER_DELETED">ZIP_ER_DELETED</code></a>]</dt> + <dd>The file to be renamed has been deleted from the archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_EXISTS"><code class="Er" id="ZIP_ER_EXISTS">ZIP_ER_EXISTS</code></a>]</dt> + <dd>There is already a file called <var class="Ar">name</var> in the + archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>, <var class="Ar">name is</var> + <code class="Dv">NULL</code>, 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.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_unchange.html">zip_unchange(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_rename</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_rename.man b/3rdparty/libzip/man/zip_file_rename.man new file mode 100644 index 0000000000..4dc57f0388 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_rename.mdoc b/3rdparty/libzip/man/zip_file_rename.mdoc new file mode 100644 index 0000000000..a14fe6645f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_set_comment.html b/3rdparty/libzip/man/zip_file_set_comment.html new file mode 100644 index 0000000000..5277baac8a --- /dev/null +++ b/3rdparty/libzip/man/zip_file_set_comment.html @@ -0,0 +1,137 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_SET_COMMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_SET_COMMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_SET_COMMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_set_comment</code> — +<div class="Nd">set comment for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_set_comment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">const char + *comment</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_set_comment</code>() function sets the comment for + the file at position <var class="Ar">index</var> in the zip archive to + <var class="Ar">comment</var> of length <var class="Ar">len</var>. If + <var class="Ar">comment</var> is <code class="Dv">NULL</code> and + <var class="Ar">len</var> is 0, the file comment will be removed. The + <var class="Ar">flags</var> argument can be any of: +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>Guess encoding of <var class="Ar">comment</var> (default). (Only CP-437 + and UTF-8 are recognized.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_UTF_8"><code class="Dv" id="ZIP_FL_ENC_UTF_8">ZIP_FL_ENC_UTF_8</code></a></dt> + <dd>Interpret <var class="Ar">comment</var> as UTF-8.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_CP437"><code class="Dv" id="ZIP_FL_ENC_CP437">ZIP_FL_ENC_CP437</code></a></dt> + <dd>Interpret <var class="Ar">comment</var> as code page 437 (CP-437).</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_set_comment</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>, or <var class="Ar">len</var> is less than 0 + or longer than the maximum comment length in a zip file (65535), or + <var class="Ar">comment</var> is not a valid UTF-8 encoded string.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RDONLY"><code class="Er" id="ZIP_ER_RDONLY">ZIP_ER_RDONLY</code></a>]</dt> + <dd>The <var class="Ar">archive</var> was opened in read-only mode.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_get_comment.html">zip_file_get_comment(3)</a>, + <a class="Xr" href="zip_get_archive_comment.html">zip_get_archive_comment(3)</a>, + <a class="Xr" href="zip_set_archive_comment.html">zip_set_archive_comment(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_set_comment</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_set_comment.man b/3rdparty/libzip/man/zip_file_set_comment.man new file mode 100644 index 0000000000..2b019c4223 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_set_comment.mdoc b/3rdparty/libzip/man/zip_file_set_comment.mdoc new file mode 100644 index 0000000000..4328aac690 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_set_encryption.html b/3rdparty/libzip/man/zip_file_set_encryption.html new file mode 100644 index 0000000000..bcf453a25b --- /dev/null +++ b/3rdparty/libzip/man/zip_file_set_encryption.html @@ -0,0 +1,150 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_SET_ENCRYPTION(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_SET_ENCRYPTION(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_SET_ENCRYPTION(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_set_encryption</code> — +<div class="Nd">set encryption method for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_set_encryption</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + method</var>, <var class="Fa" style="white-space: nowrap;">const char + *password</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_set_encryption</code>() function sets the + encryption method for the file at position <var class="Ar">index</var> in the + zip archive to <var class="Ar">method</var> using the password + <var class="Ar">password</var>. The <var class="Ar">method</var> is the same + as returned by <a class="Xr" href="zip_stat.html">zip_stat(3)</a>. For the + <var class="Ar">method</var> argument, currently only the following values are + supported: +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_EM_NONE"><code class="Dv" id="ZIP_EM_NONE">ZIP_EM_NONE</code></a></dt> + <dd>No encryption.</dd> + <dt><a class="permalink" href="#ZIP_EM_AES_128"><code class="Dv" id="ZIP_EM_AES_128">ZIP_EM_AES_128</code></a></dt> + <dd>Winzip AES-128 encryption.</dd> + <dt><a class="permalink" href="#ZIP_EM_AES_192"><code class="Dv" id="ZIP_EM_AES_192">ZIP_EM_AES_192</code></a></dt> + <dd>Winzip AES-192 encryption.</dd> + <dt><a class="permalink" href="#ZIP_EM_AES_256"><code class="Dv" id="ZIP_EM_AES_256">ZIP_EM_AES_256</code></a></dt> + <dd>Winzip AES-256 encryption.</dd> + <dt><a class="permalink" href="#ZIP_EM_TRAD_PKWARE"><code class="Dv" id="ZIP_EM_TRAD_PKWARE">ZIP_EM_TRAD_PKWARE</code></a></dt> + <dd>Traditional PKWare encryption. Do not use this method, it is not secure. + It is only provided for backwards compatibility.</dd> +</dl> +<p class="Pp">If <var class="Ar">password</var> is <code class="Dv">NULL</code>, + the default password provided by + <a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a> + is used.</p> +<p class="Pp">The current encryption method for a file in a zip archive can be + determined using <a class="Xr" href="zip_stat.html">zip_stat(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_set_encryption</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_ENCRNOTSUPP"><code class="Er" id="ZIP_ER_ENCRNOTSUPP">ZIP_ER_ENCRNOTSUPP</code></a>]</dt> + <dd>Unsupported compression method requested.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>, or the argument combination is + invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RDONLY"><code class="Er" id="ZIP_ER_RDONLY">ZIP_ER_RDONLY</code></a>]</dt> + <dd>Read-only zip file, no changes allowed.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_encryption_method_supported.html">zip_encryption_method_supported(3)</a>, + <a class="Xr" href="zip_fopen_encrypted.html">zip_fopen_encrypted(3)</a>, + <a class="Xr" href="zip_fopen_index_encrypted.html">zip_fopen_index_encrypted(3)</a>, + <a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a>, + <a class="Xr" href="zip_stat.html">zip_stat(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_set_encryption</code>() was added in libzip 1.2.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 2, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_set_encryption.man b/3rdparty/libzip/man/zip_file_set_encryption.man new file mode 100644 index 0000000000..a6414e46a0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_set_encryption.mdoc b/3rdparty/libzip/man/zip_file_set_encryption.mdoc new file mode 100644 index 0000000000..2bfd971b11 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_set_external_attributes.html b/3rdparty/libzip/man/zip_file_set_external_attributes.html new file mode 100644 index 0000000000..87a9f97ffb --- /dev/null +++ b/3rdparty/libzip/man/zip_file_set_external_attributes.html @@ -0,0 +1,125 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_SET_EXTERNAL_ATTRIBUTES(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_SET_EXTERNAL_ATTRIBUTES(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_SET_EXTERNAL_ATTRIBUTES(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_set_external_attributes</code> — +<div class="Nd">set external attributes for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_set_external_attributes</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">zip_uint8_t + opsys</var>, <var class="Fa" style="white-space: nowrap;">zip_uint32_t + attributes</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_set_external_attributes</code>() function sets the + operating system and external attributes for the file at position + <var class="Ar">index</var> in the zip archive. Currently, no + <var class="Ar">flags</var> are supported. +<p class="Pp">For a list of known <var class="Ar">opsys</var> values, see + <a class="Xr" href="zip_file_get_external_attributes.html">zip_file_get_external_attributes(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_set_external_attributes</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RDONLY"><code class="Er" id="ZIP_ER_RDONLY">ZIP_ER_RDONLY</code></a>]</dt> + <dd>The <var class="Ar">archive</var> was opened in read-only mode.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_get_external_attributes.html">zip_file_get_external_attributes(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_set_external_attributes</code>() was added in libzip + 0.11.2. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_set_external_attributes.man b/3rdparty/libzip/man/zip_file_set_external_attributes.man new file mode 100644 index 0000000000..76c375ed8e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_set_external_attributes.mdoc b/3rdparty/libzip/man/zip_file_set_external_attributes.mdoc new file mode 100644 index 0000000000..d7fa082331 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_file_set_mtime.html b/3rdparty/libzip/man/zip_file_set_mtime.html new file mode 100644 index 0000000000..c7b479d446 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_set_mtime.html @@ -0,0 +1,164 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_file_set_mtime.mdoc -- set mtime for file in zip + Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP files. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_SET_MTIME(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_SET_MTIME(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_SET_MTIME(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_set_dostime</code>, + <code class="Nm">zip_file_set_mtime</code> — +<div class="Nd">set last modification time (mtime) for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_set_dostime</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + dostime</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + dosdate</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_file_set_mtime</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">time_t + mtime</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_file_set_mtime</code>() function sets the last + modification time (mtime) for the file at position <var class="Ar">index</var> + in the zip archive to <var class="Ar">mtime</var>. Currently, no support for + any <var class="Ar">flags</var> is implemented. +<p class="Pp">In the zip archive, the time and date are saved as two 16-bit + integers. To set the values directly, call the + <code class="Fn">zip_file_set_dostime</code>() function. The values of the + time bytes are defined as follows:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt>0-4</dt> + <dd>seconds divided by two (1-2 = 1, 3-4 = 2, ...)</dd> + <dt>5-10</dt> + <dd>minute (0-59)</dd> + <dt>11-15</dt> + <dd>hour (0-23)</dd> +</dl> +</div> +<p class="Pp">The values of the date bytes are defined as follows:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt>0-4</dt> + <dd>day of the month (1-31)</dd> + <dt>5-8</dt> + <dd>month (January = 1, February = 2, ...)</dd> + <dt>9-15</dt> + <dd>year offset from 1980 (1980 = 0, 1981 = 1, ...)</dd> +</dl> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_file_set_dostime</code>() and + <code class="Fn">zip_file_set_mtime</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RDONLY"><code class="Er" id="ZIP_ER_RDONLY">ZIP_ER_RDONLY</code></a>]</dt> + <dd>The <var class="Ar">archive</var> was opened in read-only mode.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_stat.html">zip_stat(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_set_mtime</code>() was added in libzip 1.0. + <code class="Fn">zip_file_set_dostime</code>() was added in libzip 1.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +<section class="Sh"> +<h1 class="Sh" id="CAVEATS"><a class="permalink" href="#CAVEATS">CAVEATS</a></h1> +Following historical practice, the <code class="Fn">zip_file_set_mtime</code>() + function translates the time from the zip archive into the local time zone. If + you want to avoid this, use the <code class="Fn">zip_file_set_dostime</code>() + function instead. +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">August 24, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_set_mtime.man b/3rdparty/libzip/man/zip_file_set_mtime.man new file mode 100644 index 0000000000..d3928bcbba --- /dev/null +++ b/3rdparty/libzip/man/zip_file_set_mtime.man @@ -0,0 +1,141 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_file_set_mtime.mdoc -- set mtime for file in zip +.\" Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "August 24, 2020" "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 <zip.h>\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_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/3rdparty/libzip/man/zip_file_set_mtime.mdoc b/3rdparty/libzip/man/zip_file_set_mtime.mdoc new file mode 100644 index 0000000000..f47c6b1184 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_set_mtime.mdoc @@ -0,0 +1,124 @@ +.\" zip_file_set_mtime.mdoc -- set mtime for file in zip +.\" Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP files. +.\" The authors can be contacted at <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 24, 2020 +.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_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/3rdparty/libzip/man/zip_file_strerror.html b/3rdparty/libzip/man/zip_file_strerror.html new file mode 100644 index 0000000000..d9db6acaf5 --- /dev/null +++ b/3rdparty/libzip/man/zip_file_strerror.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FILE_STRERROR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FILE_STRERROR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FILE_STRERROR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_file_strerror</code>, <code class="Nm">zip_strerror</code> + — +<div class="Nd">get string representation for a zip error</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_file_strerror</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>);</p> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_strerror</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_strerror</code>() function returns a string describing + the last error for the zip archive <var class="Ar">archive</var>, while the + <code class="Fn">zip_file_strerror</code>() function does the same for a zip + file <var class="Ar">file</var> (one file in an archive). The returned string + must not be modified or freed, and becomes invalid when + <var class="Ar">archive</var> or <var class="Ar">file</var>, respectively, is + closed or on the next call to <code class="Fn">zip_strerror</code>() or + <code class="Fn">zip_file_strerror</code>(), respectively, for the same + archive. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_file_strerror</code>() and + <code class="Fn">zip_strerror</code>() return a pointer to the error string. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_strerror.html">zip_error_strerror(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_file_strerror</code>() and + <code class="Fn">zip_strerror</code>() were added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_file_strerror.man b/3rdparty/libzip/man/zip_file_strerror.man new file mode 100644 index 0000000000..8ee81a12ce --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_file_strerror.mdoc b/3rdparty/libzip/man/zip_file_strerror.mdoc new file mode 100644 index 0000000000..f10073b9c8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_fopen.html b/3rdparty/libzip/man/zip_fopen.html new file mode 100644 index 0000000000..a34ac9d689 --- /dev/null +++ b/3rdparty/libzip/man/zip_fopen.html @@ -0,0 +1,171 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FOPEN(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FOPEN(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FOPEN(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_fopen</code>, <code class="Nm">zip_fopen_index</code> + — +<div class="Nd">open file in zip archive for reading</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_file_t *</var> + <br/> + <code class="Fn">zip_fopen</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +<p class="Pp"><var class="Ft">zip_file_t *</var> + <br/> + <code class="Fn">zip_fopen_index</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_fopen</code>() function opens the file name + <var class="Ar">fname</var> in <var class="Ar">archive</var>. The + <var class="Ar">flags</var> argument specifies how the name lookup should be + done, according to the values are described in + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a>. Also, the + following values may be <i class="Em">or</i><span class="No">'ed</span> to it. +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_COMPRESSED"><code class="Dv" id="ZIP_FL_COMPRESSED">ZIP_FL_COMPRESSED</code></a></dt> + <dd>Read the compressed data. Otherwise the data is uncompressed by + <code class="Fn">zip_fread</code>().</dd> + <dt><a class="permalink" href="#ZIP_FL_UNCHANGED"><code class="Dv" id="ZIP_FL_UNCHANGED">ZIP_FL_UNCHANGED</code></a></dt> + <dd>Read the original data from the zip archive, ignoring any changes made to + the file.</dd> +</dl> +</div> +<p class="Pp">The <code class="Fn">zip_fopen_index</code>() function opens the + file at position <var class="Ar">index</var>.</p> +<p class="Pp">If encrypted data is encountered, the functions call + <a class="Xr" href="zip_fopen_encrypted.html">zip_fopen_encrypted(3)</a> or + <a class="Xr" href="zip_fopen_index_encrypted.html">zip_fopen_index_encrypted(3)</a> + respectively, using the default password set with + <a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, a <var class="Ft">struct zip_file</var> pointer is + returned. Otherwise, <code class="Dv">NULL</code> is returned and the error + code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_CHANGED"><code class="Er" id="ZIP_ER_CHANGED">ZIP_ER_CHANGED</code></a>]</dt> + <dd>The file data has been changed.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_COMPNOTSUPP"><code class="Er" id="ZIP_ER_COMPNOTSUPP">ZIP_ER_COMPNOTSUPP</code></a>]</dt> + <dd>The compression method used is not supported.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_ENCRNOTSUPP"><code class="Er" id="ZIP_ER_ENCRNOTSUPP">ZIP_ER_ENCRNOTSUPP</code></a>]</dt> + <dd>The encryption method used is not supported.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOPASSWD"><code class="Er" id="ZIP_ER_NOPASSWD">ZIP_ER_NOPASSWD</code></a>]</dt> + <dd>The file is encrypted, but no password has been provided.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_READ"><code class="Er" id="ZIP_ER_READ">ZIP_ER_READ</code></a>]</dt> + <dd>A file read error occurred.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_SEEK"><code class="Er" id="ZIP_ER_SEEK">ZIP_ER_SEEK</code></a>]</dt> + <dd>A file seek error occurred.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_WRONGPASSWD"><code class="Er" id="ZIP_ER_WRONGPASSWD">ZIP_ER_WRONGPASSWD</code></a>]</dt> + <dd>The provided password does not match the password used for encryption. + Note that some incorrect passwords are not detected by the check done by + <code class="Fn">zip_fopen</code>().</dd> + <dt>[<a class="permalink" href="#ZIP_ER_ZLIB"><code class="Er" id="ZIP_ER_ZLIB">ZIP_ER_ZLIB</code></a>]</dt> + <dd>Initializing the zlib stream failed.</dd> +</dl> +<p class="Pp">The function <code class="Fn">zip_fopen</code>() may also fail and + set <var class="Va">zip_err</var> for any of the errors specified for the + routine + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a>.</p> +<p class="Pp">The function <code class="Fn">zip_fopen_index</code>() may also + fail with <code class="Er">ZIP_ER_INVAL</code> if + <var class="Ar">index</var> is invalid.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fclose.html">zip_fclose(3)</a>, + <a class="Xr" href="zip_fread.html">zip_fread(3)</a>, + <a class="Xr" href="zip_fseek.html">zip_fseek(3)</a>, + <a class="Xr" href="zip_get_num_entries.html">zip_get_num_entries(3)</a>, + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a>, + <a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_fopen</code>() and + <code class="Fn">zip_fopen_index</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_fopen.man b/3rdparty/libzip/man/zip_fopen.man new file mode 100644 index 0000000000..95e010007b --- /dev/null +++ b/3rdparty/libzip/man/zip_fopen.man @@ -0,0 +1,166 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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. +.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. +.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/3rdparty/libzip/man/zip_fopen.mdoc b/3rdparty/libzip/man/zip_fopen.mdoc new file mode 100644 index 0000000000..fb54f87c61 --- /dev/null +++ b/3rdparty/libzip/man/zip_fopen.mdoc @@ -0,0 +1,147 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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. +.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. +.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/3rdparty/libzip/man/zip_fopen_encrypted.html b/3rdparty/libzip/man/zip_fopen_encrypted.html new file mode 100644 index 0000000000..f80a3ede8e --- /dev/null +++ b/3rdparty/libzip/man/zip_fopen_encrypted.html @@ -0,0 +1,158 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FOPEN_ENCRYPTED(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FOPEN_ENCRYPTED(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FOPEN_ENCRYPTED(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_fopen_encrypted</code>, + <code class="Nm">zip_fopen_index_encrypted</code> — +<div class="Nd">open encrypted file in zip archive for reading</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_file_t *</var> + <br/> + <code class="Fn">zip_fopen_encrypted</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">const char + *password</var>);</p> +<p class="Pp"><var class="Ft">zip_file_t *</var> + <br/> + <code class="Fn">zip_fopen_index_encrypted</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">const char + *password</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_fopen_encrypted</code>() function opens the encrypted + file name <var class="Ar">fname</var> in <var class="Ar">archive</var> using + the password given in the <var class="Ar">password</var> argument. If + <var class="Ar">password</var> is <code class="Dv">NULL</code> or the empty + string, the default password is used (see + <a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a>). + The <var class="Ar">flags</var> argument are the same as for + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>. +<p class="Pp">The <code class="Fn">zip_fopen_index_encrypted</code>() function + opens the file at position <var class="Ar">index</var>, see + <a class="Xr" href="zip_fopen_index.html">zip_fopen_index(3)</a>. These + functions are called automatically by + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>; you only need to call + them if you want to specify a non-default password (see + <a class="Xr" href="zip_set_default_password.html">zip_set_default_password(3)</a>).</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, a <var class="Ft">struct zip_file</var> pointer is + returned. Otherwise, <code class="Dv">NULL</code> is returned and the error + code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_NOPASSWD"><code class="Er" id="ZIP_ER_NOPASSWD">ZIP_ER_NOPASSWD</code></a>]</dt> + <dd>No password was provided.</dd> +</dl> +<p class="Pp">The function <code class="Fn">zip_fopen_encrypted</code>() may + also fail and set <var class="Va">zip_err</var> for any of the errors + specified for the routine + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>.</p> +<p class="Pp">The function <code class="Fn">zip_fopen_index_encrypted</code>() + may also fail and set <var class="Va">zip_err</var> for any of the errors + specified for the routine + <a class="Xr" href="zip_fopen_index.html">zip_fopen_index(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fclose.html">zip_fclose(3)</a>, + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>, + <a class="Xr" href="zip_fread.html">zip_fread(3)</a>, + <a class="Xr" href="zip_get_num_entries.html">zip_get_num_entries(3)</a>, + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_fopen_encrypted</code>() and + <code class="Fn">zip_fopen_index_encrypted</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +<section class="Sh"> +<h1 class="Sh" id="CAVEATS"><a class="permalink" href="#CAVEATS">CAVEATS</a></h1> +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 <code class="Er">ZIP_ER_WRONGPASSWD</code>, 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. +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 15, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_fopen_encrypted.man b/3rdparty/libzip/man/zip_fopen_encrypted.man new file mode 100644 index 0000000000..8bf4e0cd83 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_fopen_encrypted.mdoc b/3rdparty/libzip/man/zip_fopen_encrypted.mdoc new file mode 100644 index 0000000000..80fd4b7ea3 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_fread.html b/3rdparty/libzip/man/zip_fread.html new file mode 100644 index 0000000000..eda3ebc83d --- /dev/null +++ b/3rdparty/libzip/man/zip_fread.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_fread.mdoc -- read from 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FREAD(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FREAD(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FREAD(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_fread</code> — +<div class="Nd">read from file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_fread</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>, <var class="Fa" style="white-space: nowrap;">void *buf</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint64_t nbytes</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_fread</code>() function reads at most + <var class="Ar">nbytes</var> bytes from <var class="Ar">file</var> into + <var class="Ar">buf</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +If successful, the number of bytes actually read is returned. Otherwise, -1 is + returned. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fclose.html">zip_fclose(3)</a>, + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>, + <a class="Xr" href="zip_fseek.html">zip_fseek(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_fread</code>() was added in libzip 0.6. In libzip 0.10 the + return type was changed from <var class="Vt">ssize_t</var> to + <var class="Vt">zip_int64_t</var>. In libzip 0.10 the type of + <var class="Ar">nbytes</var> was changed from <var class="Vt">size_t</var> to + <var class="Vt">zip_uint64_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_fread.man b/3rdparty/libzip/man/zip_fread.man new file mode 100644 index 0000000000..d0eb517e91 --- /dev/null +++ b/3rdparty/libzip/man/zip_fread.man @@ -0,0 +1,83 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fread.mdoc -- read from 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "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 <zip.h>\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 at most +\fInbytes\fR +bytes from +\fIfile\fR +into +\fIbuf\fR. +.SH "RETURN VALUES" +If successful, the number of bytes actually read is returned. +Otherwise, \-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/3rdparty/libzip/man/zip_fread.mdoc b/3rdparty/libzip/man/zip_fread.mdoc new file mode 100644 index 0000000000..4d3e8d6c7f --- /dev/null +++ b/3rdparty/libzip/man/zip_fread.mdoc @@ -0,0 +1,78 @@ +.\" zip_fread.mdoc -- read from 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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 at most +.Ar nbytes +bytes from +.Ar file +into +.Ar buf . +.Sh RETURN VALUES +If successful, the number of bytes actually read is returned. +Otherwise, \-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/3rdparty/libzip/man/zip_fseek.html b/3rdparty/libzip/man/zip_fseek.html new file mode 100644 index 0000000000..43900659f4 --- /dev/null +++ b/3rdparty/libzip/man/zip_fseek.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_fseek.mdoc -- seek in file + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FSEEK(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FSEEK(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FSEEK(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_fseek</code> — +<div class="Nd">seek in file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int8_t</var> + <br/> + <code class="Fn">zip_fseek</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + offset</var>, <var class="Fa" style="white-space: nowrap;">int + whence</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_fseek</code>() function seeks to the specified + <var class="Ar">offset</var> relative to <var class="Ar">whence</var>, just + like <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html">fseek(3)</a>. +<p class="Pp"><code class="Nm">zip_fseek</code> only works on uncompressed + (stored) data. When called on compressed data it will return an error.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +If successful, <code class="Nm">zip_fseek</code> returns 0. Otherwise, -1 is + returned. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fclose.html">zip_fclose(3)</a>, + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>, + <a class="Xr" href="zip_fread.html">zip_fread(3)</a>, + <a class="Xr" href="zip_ftell.html">zip_ftell(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_fseek</code>() was added in libzip 1.2.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_fseek.man b/3rdparty/libzip/man/zip_fseek.man new file mode 100644 index 0000000000..d69e0e6f41 --- /dev/null +++ b/3rdparty/libzip/man/zip_fseek.man @@ -0,0 +1,80 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_fseek.mdoc -- seek in file +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_fseek\fR +\- seek in file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include <zip.h>\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 +.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) data. +When called on compressed data it will return an error. +.SH "RETURN VALUES" +If successful, +\fBzip_fseek\fR +returns 0. +Otherwise, \-1 is returned. +.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. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/3rdparty/libzip/man/zip_fseek.mdoc b/3rdparty/libzip/man/zip_fseek.mdoc new file mode 100644 index 0000000000..756ca2726e --- /dev/null +++ b/3rdparty/libzip/man/zip_fseek.mdoc @@ -0,0 +1,75 @@ +.\" zip_fseek.mdoc -- seek in file +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_FSEEK 3 +.Os +.Sh NAME +.Nm zip_fseek +.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" +.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) data. +When called on compressed data it will return an error. +.Sh RETURN VALUES +If successful, +.Nm +returns 0. +Otherwise, \-1 is returned. +.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. +.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/3rdparty/libzip/man/zip_ftell.html b/3rdparty/libzip/man/zip_ftell.html new file mode 100644 index 0000000000..cd74df9d3d --- /dev/null +++ b/3rdparty/libzip/man/zip_ftell.html @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_FTELL(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_FTELL(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_FTELL(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_ftell</code> — +<div class="Nd">tell position in file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_ftell</code>(<var class="Fa" style="white-space: nowrap;">zip_file_t + *file</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_ftell</code>() function reports the current offset in + the file. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +If successful, <code class="Nm">zip_ftell</code> returns the current file + position. Otherwise, -1 is returned. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fclose.html">zip_fclose(3)</a>, + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>, + <a class="Xr" href="zip_fread.html">zip_fread(3)</a>, + <a class="Xr" href="zip_fseek.html">zip_fseek(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_ftell</code>() was added in libzip 1.2.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">July 21, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_ftell.man b/3rdparty/libzip/man/zip_ftell.man new file mode 100644 index 0000000000..2a441c64a8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_ftell.mdoc b/3rdparty/libzip/man/zip_ftell.mdoc new file mode 100644 index 0000000000..dff0eff9d8 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_get_archive_comment.html b/3rdparty/libzip/man/zip_get_archive_comment.html new file mode 100644 index 0000000000..19f05962b9 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_archive_comment.html @@ -0,0 +1,131 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_ARCHIVE_COMMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_ARCHIVE_COMMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_ARCHIVE_COMMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_archive_comment</code> — +<div class="Nd">get zip archive comment</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_get_archive_comment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">int + *lenp</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_get_archive_comment</code>() function returns the + comment for the entire zip archive. The return value is in UTF-8 encoding + unless <code class="Dv">ZIP_FL_ENC_RAW</code> was specified (see below). This + pointer should not be modified or + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/free.html">free(3)</a>'d, and becomes invalid when + <var class="Ar">archive</var> is closed. If <var class="Ar">lenp</var> is not + <code class="Dv">NULL</code>, the integer to which it points will be set to + the length of the comment. If <var class="Ar">flags</var> is set to + <code class="Dv">ZIP_FL_UNCHANGED</code>, the original unchanged comment is + returned. +<p class="Pp">Additionally, the following <var class="Ar">flags</var> are + supported:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_ENC_RAW"><code class="Dv" id="ZIP_FL_ENC_RAW">ZIP_FL_ENC_RAW</code></a></dt> + <dd>Return the unmodified archive comment as it is in the ZIP archive.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>(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.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_STRICT"><code class="Dv" id="ZIP_FL_ENC_STRICT">ZIP_FL_ENC_STRICT</code></a></dt> + <dd>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.</dd> +</dl> +</div> +<i class="Em">Note</i>: ASCII is a subset of both CP-437 and UTF-8. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, a pointer to the comment is returned, or + <code class="Dv">NULL</code> if there is no comment. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_get_comment.html">zip_file_get_comment(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_archive_comment</code>() was added in libzip 0.7. In + libzip 0.11 the type of <var class="Ar">flags</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_flags_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_archive_comment.man b/3rdparty/libzip/man/zip_get_archive_comment.man new file mode 100644 index 0000000000..6c2d99cac0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_get_archive_comment.mdoc b/3rdparty/libzip/man/zip_get_archive_comment.mdoc new file mode 100644 index 0000000000..1e2eb7e83b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_get_archive_flag.html b/3rdparty/libzip/man/zip_get_archive_flag.html new file mode 100644 index 0000000000..9c0be94948 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_archive_flag.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_ARCHIVE_FLAG(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_ARCHIVE_FLAG(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_ARCHIVE_FLAG(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_archive_flag</code> — +<div class="Nd">get status flags for zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_get_archive_flag</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flag</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_get_archive_flag</code>() function returns if the flag + <var class="Ar">flag</var> is set for the archive + <var class="Ar">archive</var>. The archive flags might have been changed with + <code class="Fn">zip_set_archive_flag</code>(); if <var class="Ar">flags</var> + is set to <code class="Dv">ZIP_FL_UNCHANGED</code>, the original unchanged + flags are tested. +<p class="Pp">Supported flags are:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_AFL_RDONLY"><code class="Dv" id="ZIP_AFL_RDONLY">ZIP_AFL_RDONLY</code></a></dt> + <dd>The archive is read-only.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_get_archive_flag</code>() returns 1 if + <var class="Ar">flag</var> is set for <var class="Ar">archive</var>, 0 if not, + and -1 if an error occurred. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_set_archive_flag.html">zip_set_archive_flag(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_archive_flag</code>() was added in libzip 0.9. In + libzip 0.11 the type of <var class="Ar">flag</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_flags_t m</var> and the type + of <var class="Ar">flags</var> was changed from <var class="Vt">int</var> to + <var class="Vt">zip_flags_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_archive_flag.man b/3rdparty/libzip/man/zip_get_archive_flag.man new file mode 100644 index 0000000000..4f9d08b163 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_get_archive_flag.mdoc b/3rdparty/libzip/man/zip_get_archive_flag.mdoc new file mode 100644 index 0000000000..baf6b05966 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_get_error.html b/3rdparty/libzip/man/zip_get_error.html new file mode 100644 index 0000000000..7ba9468079 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_error.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_ERROR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_ERROR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_ERROR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_error</code> — +<div class="Nd">get zip error for archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_error_t *</var> + <br/> + <code class="Fn">zip_get_error</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_get_error</code>() function returns the zip error for + the zip archive <var class="Ar">archive</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_code_system.html">zip_error_code_system(3)</a>, + <a class="Xr" href="zip_error_code_zip.html">zip_error_code_zip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_error</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_error.man b/3rdparty/libzip/man/zip_get_error.man new file mode 100644 index 0000000000..9cddbc2a3e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_get_error.mdoc b/3rdparty/libzip/man/zip_get_error.mdoc new file mode 100644 index 0000000000..8ce2ea5e82 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_get_file_comment.html b/3rdparty/libzip/man/zip_get_file_comment.html new file mode 100644 index 0000000000..fe7492f246 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_file_comment.html @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_FILE_COMMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_FILE_COMMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_FILE_COMMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_file_comment</code> — +<div class="Nd">get comment for file in zip (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_get_file_comment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">int *lenp</var>, + <var class="Fa" style="white-space: nowrap;">int flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_get_file_comment</code>() function is the obsolete + version of + <a class="Xr" href="zip_file_get_comment.html">zip_file_get_comment(3)</a>. + The only differences are the types of the <var class="Ar">lenp</var> and + <var class="Ar">flags</var> arguments. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_get_comment.html">zip_file_get_comment(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_file_comment</code>() was added in libzip 0.7. In + libzip 0.10 the type of <var class="Ar">index</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint64_t</var>. It was + deprecated in libzip 0.11, use <code class="Fn">zip_file_get_comment</code>() + instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_file_comment.man b/3rdparty/libzip/man/zip_get_file_comment.man new file mode 100644 index 0000000000..011871daaa --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_get_file_comment.mdoc b/3rdparty/libzip/man/zip_get_file_comment.mdoc new file mode 100644 index 0000000000..a22159e527 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_get_name.html b/3rdparty/libzip/man/zip_get_name.html new file mode 100644 index 0000000000..d3e747eba3 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_name.html @@ -0,0 +1,146 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_NAME(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_NAME(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_NAME(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_name</code> — +<div class="Nd">get name of file by index</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_get_name</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_get_name</code>() function returns the name of the file + at position <var class="Ar">index</var> in <var class="Ar">archive</var>. The + name is in UTF-8 encoding unless <code class="Dv">ZIP_FL_ENC_RAW</code> was + specified (see below). +<p class="Pp">If <var class="Ar">flags</var> is set to + <code class="Dv">ZIP_FL_UNCHANGED</code>, the original unchanged filename is + returned. The returned string must not be modified or freed, and becomes + invalid when <var class="Ar">archive</var> is closed.</p> +<p class="Pp">Additionally, the following <var class="Ar">flags</var> are + supported:</p> +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_ENC_RAW"><code class="Dv" id="ZIP_FL_ENC_RAW">ZIP_FL_ENC_RAW</code></a></dt> + <dd>Return the unmodified names as it is in the ZIP archive.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>(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.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_STRICT"><code class="Dv" id="ZIP_FL_ENC_STRICT">ZIP_FL_ENC_STRICT</code></a></dt> + <dd>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.</dd> +</dl> +</div> +<i class="Em">Note</i>: ASCII is a subset of both CP-437 and UTF-8. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, a pointer to the name is returned. Otherwise, + <code class="Dv">NULL</code> and the error code in + <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_get_name</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_DELETED"><code class="Er" id="ZIP_ER_DELETED">ZIP_ER_DELETED</code></a>]</dt> + <dd><var class="Ar">index</var> refers to a file that has been deleted (see + <a class="Xr" href="zip_delete.html">zip_delete(3)</a>).</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>, or <var class="Ar">index</var> points to an + added file and <code class="Dv">ZIP_FL_UNCHANGED</code> is set.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_name</code>() was added in libzip 0.6. In libzip 0.10 + the type of <var class="Ar">index</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint64_t</var>. In libzip + 0.11 the type of <var class="Ar">flags</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_flags_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_name.man b/3rdparty/libzip/man/zip_get_name.man new file mode 100644 index 0000000000..9a6351ea6e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_get_name.mdoc b/3rdparty/libzip/man/zip_get_name.mdoc new file mode 100644 index 0000000000..bb1ea0a59f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_get_num_entries.html b/3rdparty/libzip/man/zip_get_num_entries.html new file mode 100644 index 0000000000..5c20530b0e --- /dev/null +++ b/3rdparty/libzip/man/zip_get_num_entries.html @@ -0,0 +1,111 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_NUM_ENTRIES(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_NUM_ENTRIES(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_NUM_ENTRIES(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_num_entries</code> — +<div class="Nd">get number of files in archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_get_num_entries</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_get_num_entries</code>() function returns the number of + files in <var class="Ar">archive</var>. If <var class="Ar">flags</var> is set + to <code class="Dv">ZIP_FL_UNCHANGED</code>, the original number of entries is + returned. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_get_num_entries</code>() returns the number of files in the + zip archive, or -1 if <var class="Ar">archive</var> is + <code class="Dv">NULL</code>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fopen_index.html">zip_fopen_index(3)</a>, + <a class="Xr" href="zip_stat_index.html">zip_stat_index(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_num_entries</code>() was added in libzip 0.10. In + libzip 0.11 the return type was changed from + <var class="Vt">zip_uint64_t</var> to <var class="Vt">zip_int64_t</var>. In + libzip 0.11 the type of <var class="Ar">flags</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_flags_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_num_entries.man b/3rdparty/libzip/man/zip_get_num_entries.man new file mode 100644 index 0000000000..f33f6ecf44 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_num_entries.man @@ -0,0 +1,87 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_get_num_entries\fR +\- get number of files in archive +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include <zip.h>\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 files in +\fIarchive\fR. +If +\fIflags\fR +is set to +\fRZIP_FL_UNCHANGED\fR, +the original number of entries is returned. +.SH "RETURN VALUES" +\fBzip_get_num_entries\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_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/3rdparty/libzip/man/zip_get_num_entries.mdoc b/3rdparty/libzip/man/zip_get_num_entries.mdoc new file mode 100644 index 0000000000..bfc70050f7 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_num_entries.mdoc @@ -0,0 +1,82 @@ +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_ENTRIES 3 +.Os +.Sh NAME +.Nm zip_get_num_entries +.Nd get number of files 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 files in +.Ar archive . +If +.Ar flags +is set to +.Dv ZIP_FL_UNCHANGED , +the original number of entries is returned. +.Sh RETURN VALUES +.Fn zip_get_num_entries +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_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/3rdparty/libzip/man/zip_get_num_files.html b/3rdparty/libzip/man/zip_get_num_files.html new file mode 100644 index 0000000000..d2f75fda40 --- /dev/null +++ b/3rdparty/libzip/man/zip_get_num_files.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_GET_NUM_FILES(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_GET_NUM_FILES(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_GET_NUM_FILES(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_get_num_files</code> — +<div class="Nd">get number of files in archive (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_get_num_files</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<i class="Em">This function is deprecated</i>. <i class="Em">Use</i> + <a class="Xr" href="zip_get_num_entries.html">zip_get_num_entries(3)</a> + <i class="Em">instead</i>. +<p class="Pp">The <code class="Fn">zip_get_num_files</code>() function returns + the number of files in <var class="Ar">archive</var>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_get_num_files</code>() returns the number of files in the + zip archive, or -1 if <var class="Ar">archive</var> is + <code class="Dv">NULL</code>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fopen_index.html">zip_fopen_index(3)</a>, + <a class="Xr" href="zip_stat_index.html">zip_stat_index(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_get_num_files</code>() was added in libzip 0.6. It was + deprecated in libzip 0.11, use + <code class="Fn">zip_get_num_entries</code>(<var class="Fa">instead</var>) + instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_get_num_files.man b/3rdparty/libzip/man/zip_get_num_files.man new file mode 100644 index 0000000000..0760eeda5c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_get_num_files.mdoc b/3rdparty/libzip/man/zip_get_num_files.mdoc new file mode 100644 index 0000000000..30ebbc38cf --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_libzip_version.html b/3rdparty/libzip/man/zip_libzip_version.html new file mode 100644 index 0000000000..3e454ca7bb --- /dev/null +++ b/3rdparty/libzip/man/zip_libzip_version.html @@ -0,0 +1,98 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_LIBZIP_VERSION(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_LIBZIP_VERSION(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_LIBZIP_VERSION(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_libzip_version</code> — +<div class="Nd">return run-time version of library</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">const char *</var> + <br/> + <code class="Fn">zip_libzip_version</code>(<var class="Fa" style="white-space: nowrap;">void</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Nm">zip_libzip_version</code> returns the version number of the + library as string in the format “$MAJOR.$MINOR.$MICRO$SUFFIX” + where <var class="Ar">$MAJOR</var> is the major version, + <var class="Ar">$MINOR</var> the minor, <var class="Ar">$MICRO</var> the + micro, and <var class="Ar">$SUFFIX</var> a suffix that's only set for + development versions. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_libzip_version</code>() was added in libzip 1.3.1. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_libzip_version.man b/3rdparty/libzip/man/zip_libzip_version.man new file mode 100644 index 0000000000..3b2bcee864 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_libzip_version.mdoc b/3rdparty/libzip/man/zip_libzip_version.mdoc new file mode 100644 index 0000000000..89737368c6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_name_locate.html b/3rdparty/libzip/man/zip_name_locate.html new file mode 100644 index 0000000000..5d5dba6f21 --- /dev/null +++ b/3rdparty/libzip/man/zip_name_locate.html @@ -0,0 +1,149 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_name_locate.mdoc -- get index of file by name + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_NAME_LOCATE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_NAME_LOCATE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_NAME_LOCATE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_name_locate</code> — +<div class="Nd">get index of file by name</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_name_locate</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_name_locate</code>() function returns the index of the + file named <var class="Ar">fname</var> in <var class="Ar">archive</var>. If + <var class="Ar">archive</var> does not contain a file with that name, -1 is + returned. The <var class="Fa">flags</var> are specified by + <i class="Em">or</i><span class="No">'ing</span> the following values, or 0 + for none of them. +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_NOCASE"><code class="Dv" id="ZIP_FL_NOCASE">ZIP_FL_NOCASE</code></a></dt> + <dd>Ignore case distinctions. (Will only work well if the file names are + ASCII.) With this flag, <code class="Fn">zip_name_locate</code>() will be + slow for archives with many files.</dd> + <dt><a class="permalink" href="#ZIP_FL_NODIR"><code class="Dv" id="ZIP_FL_NODIR">ZIP_FL_NODIR</code></a></dt> + <dd>Ignore directory part of file name in archive. With this flag, + <code class="Fn">zip_name_locate</code>() will be slow for archives with + many files.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_RAW"><code class="Dv" id="ZIP_FL_ENC_RAW">ZIP_FL_ENC_RAW</code></a></dt> + <dd>Compare against the unmodified names as it is in the ZIP archive.</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_GUESS"><code class="Dv" id="ZIP_FL_ENC_GUESS">ZIP_FL_ENC_GUESS</code></a></dt> + <dd>(Default.) Guess the encoding of the name in the ZIP archive and convert + it to UTF-8, if necessary, before comparing. (Only CP-437 and UTF-8 are + recognized.)</dd> + <dt><a class="permalink" href="#ZIP_FL_ENC_STRICT"><code class="Dv" id="ZIP_FL_ENC_STRICT">ZIP_FL_ENC_STRICT</code></a></dt> + <dd>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 before comparing.</dd> +</dl> +</div> +<i class="Em">Note</i>: ASCII is a subset of both CP-437 and UTF-8. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_name_locate</code>() returns the index of the file named + <var class="Ar">fname</var> or -1, if <var class="Ar">archive</var> does not + contain an entry of that name. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_name_locate</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd>One of the arguments is invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOENT"><code class="Er" id="ZIP_ER_NOENT">ZIP_ER_NOENT</code></a>]</dt> + <dd>No entry of the name <var class="Ar">fname</var> is found in the + archive.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_get_name.html">zip_get_name(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_name_locate</code>() was added in libzip 0.6. In libzip + 0.11 the return type was changed from <var class="Vt">int</var> to + <var class="Vt">zip_int64_t</var>. In libzip 0.11 the type of + <var class="Ar">flags</var> was changed from <var class="Vt">int</var> to + <var class="Vt">zip_flags_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 22, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_name_locate.man b/3rdparty/libzip/man/zip_name_locate.man new file mode 100644 index 0000000000..1b910b089b --- /dev/null +++ b/3rdparty/libzip/man/zip_name_locate.man @@ -0,0 +1,137 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_name_locate.mdoc -- get index of file by name +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "September 22, 2020" "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 <zip.h>\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. +The +\fIflags\fR +are specified by +\fIor\fR'ing +the following values, or 0 for none of them. +.RS 6n +.TP 15n +\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 15n +\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 15n +\fRZIP_FL_ENC_RAW\fR +.br +Compare against the unmodified names as it is in the ZIP archive. +.TP 15n +\fRZIP_FL_ENC_GUESS\fR +(Default.) +Guess the encoding of the name in the ZIP archive and convert it +to UTF-8, if necessary, before comparing. +(Only CP-437 and UTF-8 are recognized.) +.TP 15n +\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 before comparing. +.RE +\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/3rdparty/libzip/man/zip_name_locate.mdoc b/3rdparty/libzip/man/zip_name_locate.mdoc new file mode 100644 index 0000000000..6ffe5c35de --- /dev/null +++ b/3rdparty/libzip/man/zip_name_locate.mdoc @@ -0,0 +1,125 @@ +.\" zip_name_locate.mdoc -- get index of file by name +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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. +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_NOCASE +.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_RAW +Compare against 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, before comparing. +(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 before comparing. +.El +.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/3rdparty/libzip/man/zip_open.html b/3rdparty/libzip/man/zip_open.html new file mode 100644 index 0000000000..4edad5f9c6 --- /dev/null +++ b/3rdparty/libzip/man/zip_open.html @@ -0,0 +1,176 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_open.mdoc -- open 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_OPEN(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_OPEN(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_OPEN(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_open</code>, <code class="Nm">zip_open_from_source</code> + — +<div class="Nd">open zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_t *</var> + <br/> + <code class="Fn">zip_open</code>(<var class="Fa" style="white-space: nowrap;">const + char *path</var>, <var class="Fa" style="white-space: nowrap;">int + flags</var>, <var class="Fa" style="white-space: nowrap;">int + *errorp</var>);</p> +<p class="Pp"><var class="Ft">zip_t *</var> + <br/> + <code class="Fn">zip_open_from_source</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *zs</var>, <var class="Fa" style="white-space: nowrap;">int flags</var>, + <var class="Fa" style="white-space: nowrap;">zip_error_t *ze</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_open</code>() function opens the zip archive specified + by <var class="Ar">path</var> and returns a pointer to a + <var class="Ft">struct zip</var>, used to manipulate the archive. The + <var class="Fa">flags</var> are specified by + <i class="Em">or</i><span class="No">'ing</span> the following values, or 0 + for none of them. +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_CHECKCONS"><code class="Dv" id="ZIP_CHECKCONS">ZIP_CHECKCONS</code></a></dt> + <dd>Perform additional stricter consistency checks on the archive, and error + if they fail.</dd> + <dt><a class="permalink" href="#ZIP_CREATE"><code class="Dv" id="ZIP_CREATE">ZIP_CREATE</code></a></dt> + <dd>Create the archive if it does not exist.</dd> + <dt><a class="permalink" href="#ZIP_EXCL"><code class="Dv" id="ZIP_EXCL">ZIP_EXCL</code></a></dt> + <dd>Error if archive already exists.</dd> + <dt><a class="permalink" href="#ZIP_TRUNCATE"><code class="Dv" id="ZIP_TRUNCATE">ZIP_TRUNCATE</code></a></dt> + <dd>If archive exists, ignore its current contents. In other words, handle it + the same way as an empty archive.</dd> + <dt><a class="permalink" href="#ZIP_RDONLY"><code class="Dv" id="ZIP_RDONLY">ZIP_RDONLY</code></a></dt> + <dd>Open archive in read-only mode.</dd> +</dl> +</div> +<p class="Pp">If an error occurs and <var class="Ar">errorp</var> is + non-<code class="Dv">NULL</code>, it will be set to the corresponding error + code.</p> +<p class="Pp">The <code class="Fn">zip_open_from_source</code>() function opens + a zip archive encapsulated by the zip_source <var class="Fa">zs</var> using + the provided <var class="Fa">flags</var>. In case of error, the zip_error + <var class="Fa">ze</var> is filled in.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion <code class="Fn">zip_open</code>() and + <code class="Fn">zip_open_from_source</code>() return a <var class="Ft">struct + zip</var> pointer. Otherwise, <code class="Dv">NULL</code> is returned and + <code class="Fn">zip_open</code>() sets <var class="Ar">*errorp</var> to + indicate the error, while + <code class="Fn">zip_open_from</code>(<var class="Fa">source</var>) sets + <var class="Ar">ze</var> to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +The archive specified by <var class="Ar">path</var> is opened unless: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_EXISTS"><code class="Er" id="ZIP_ER_EXISTS">ZIP_ER_EXISTS</code></a>]</dt> + <dd>The file specified by <var class="Ar">path</var> exists and + <code class="Dv">ZIP_EXCL</code> is set.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INCONS"><code class="Er" id="ZIP_ER_INCONS">ZIP_ER_INCONS</code></a>]</dt> + <dd>Inconsistencies were found in the file specified by + <var class="Ar">path</var>. This error is often caused by specifying + <code class="Dv">ZIP_CHECKCONS</code> but can also happen without it.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd>The <var class="Ar">path</var> argument is + <code class="Dv">NULL</code>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOENT"><code class="Er" id="ZIP_ER_NOENT">ZIP_ER_NOENT</code></a>]</dt> + <dd>The file specified by <var class="Ar">path</var> does not exist and + <code class="Dv">ZIP_CREATE</code> is not set.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_NOZIP"><code class="Er" id="ZIP_ER_NOZIP">ZIP_ER_NOZIP</code></a>]</dt> + <dd>The file specified by <var class="Ar">path</var> is not a zip + archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_OPEN"><code class="Er" id="ZIP_ER_OPEN">ZIP_ER_OPEN</code></a>]</dt> + <dd>The file specified by <var class="Ar">path</var> could not be opened.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_READ"><code class="Er" id="ZIP_ER_READ">ZIP_ER_READ</code></a>]</dt> + <dd>A read error occurred; see <var class="Va">errno</var> for details.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_SEEK"><code class="Er" id="ZIP_ER_SEEK">ZIP_ER_SEEK</code></a>]</dt> + <dd>The file specified by <var class="Ar">path</var> does not allow + seeks.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_close.html">zip_close(3)</a>, + <a class="Xr" href="zip_error_strerror.html">zip_error_strerror(3)</a>, + <a class="Xr" href="zip_fdopen.html">zip_fdopen(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_open</code>() and + <code class="Fn">zip_open_from_source</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_open.man b/3rdparty/libzip/man/zip_open.man new file mode 100644 index 0000000000..bdc9a9c3b9 --- /dev/null +++ b/3rdparty/libzip/man/zip_open.man @@ -0,0 +1,192 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_open.mdoc -- open 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "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 <zip.h>\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 "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. +.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/3rdparty/libzip/man/zip_open.mdoc b/3rdparty/libzip/man/zip_open.mdoc new file mode 100644 index 0000000000..946eea3a71 --- /dev/null +++ b/3rdparty/libzip/man/zip_open.mdoc @@ -0,0 +1,170 @@ +.\" zip_open.mdoc -- open 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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 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 +.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/3rdparty/libzip/man/zip_register_cancel_callback_with_state.html b/3rdparty/libzip/man/zip_register_cancel_callback_with_state.html new file mode 100644 index 0000000000..5872b43636 --- /dev/null +++ b/3rdparty/libzip/man/zip_register_cancel_callback_with_state.html @@ -0,0 +1,121 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_register_cancel_callback_with_state.mdoc -- allow cancelling during zip_close + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_register_cancel_callback_with_state</code> — +<div class="Nd">allow cancelling during zip_close</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Vt">typedef void (*zip_cancel_callback)(zip_t *, + double, void *);</var></p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_register_cancel_callback_with_state</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, + <var class="Fa" style="white-space: nowrap;">zip_cancel_callback + callback</var>, <var class="Fa" style="white-space: nowrap;">void + (*ud_free)(void *)</var>, <var class="Fa" style="white-space: nowrap;">void + *ud</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +This function can be used to cancel writing of a zip archive during + <a class="Xr" href="zip_close.html">zip_close(3)</a>. +<p class="Pp">The + <code class="Fn">zip_register_cancel_callback_with_state</code>() function + registers a callback function <var class="Ar">callback</var> for the zip + archive <var class="Ar">archive</var>. The <var class="Ar">ud_free</var> + function is called during cleanup for deleting the userdata supplied in + <var class="Ar">ud</var>.</p> +<p class="Pp">The callback function is called during + <a class="Xr" href="zip_close.html">zip_close(3)</a> in regular intervals + (after every zip archive entry that's completely written to disk, and while + writing data for entries) with zip archive <var class="Ar">archive</var>, + the current progress state (see + <a class="Xr" href="zip_register_progress_callback_with_state.html">zip_register_progress_callback_with_state(3)</a>) + as a <var class="Vt">double</var>, and the user-provided user-data + <var class="Ar">ud</var> as arguments. The progress state is a + <var class="Vt">double</var> in the range from 0.0 to 1.0.</p> +<p class="Pp">The callback function should be fast, since it will be called + often.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_close.html">zip_close(3)</a>, + <a class="Xr" href="zip_register_progress_callback_with_state.html">zip_register_progress_callback_with_state(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_register_cancel_callback_with_state</code>() was added in + libzip 1.6.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 6, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_register_cancel_callback_with_state.man b/3rdparty/libzip/man/zip_register_cancel_callback_with_state.man new file mode 100644 index 0000000000..7ddf69c6bf --- /dev/null +++ b/3rdparty/libzip/man/zip_register_cancel_callback_with_state.man @@ -0,0 +1,94 @@ +.\" 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 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "April 6, 2021" "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 <zip.h>\fR +.sp +\fItypedef void (*zip_cancel_callback)(zip_t *, double, 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, +the current progress state (see +zip_register_progress_callback_with_state(3)) +as a +\fIdouble\fR, +and the user-provided user-data +\fIud\fR +as arguments. +The progress state is a +\fIdouble\fR +in the range from 0.0 to 1.0. +.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/3rdparty/libzip/man/zip_register_cancel_callback_with_state.mdoc b/3rdparty/libzip/man/zip_register_cancel_callback_with_state.mdoc new file mode 100644 index 0000000000..58fdc59b9d --- /dev/null +++ b/3rdparty/libzip/man/zip_register_cancel_callback_with_state.mdoc @@ -0,0 +1,88 @@ +.\" zip_register_cancel_callback_with_state.mdoc -- allow cancelling during zip_close +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 6, 2021 +.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 void (*zip_cancel_callback)(zip_t *, double, 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 , +the current progress state (see +.Xr zip_register_progress_callback_with_state 3 ) +as a +.Vt double , +and the user-provided user-data +.Ar ud +as arguments. +The progress state is a +.Vt double +in the range from 0.0 to 1.0. +.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/3rdparty/libzip/man/zip_register_progress_callback.html b/3rdparty/libzip/man/zip_register_progress_callback.html new file mode 100644 index 0000000000..e61b7ceb94 --- /dev/null +++ b/3rdparty/libzip/man/zip_register_progress_callback.html @@ -0,0 +1,111 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_REGISTER_PROGRESS_CALLBACK(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_REGISTER_PROGRESS_CALLBACK(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_REGISTER_PROGRESS_CALLBACK(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_register_progress_callback</code> — +<div class="Nd">provide updates during zip_close (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Vt">typedef void + (*zip_progress_callback_t)(double);</var></p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_register_progress_callback</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, + <var class="Fa" style="white-space: nowrap;">zip_progress_callback_t + progress_callback</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_register_progress_callback</code>() is the + obsolete version of + <a class="Xr" href="zip_register_progress_callback_with_state.html">zip_register_progress_callback_with_state(3)</a>. +<p class="Pp">The <code class="Fn">zip_register_progress_callback</code>() + function registers a callback function + <var class="Ar">progress_callback</var> for the zip archive + <var class="Ar">archive</var>. This function is called during + <a class="Xr" href="zip_close.html">zip_close(3)</a> after every zip archive + entry that's completely written to disk. The value is a + <var class="Vt">double</var> in the range from 0.0 to 1.0. This can be used + to provide progress indicators for user interfaces.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_close.html">zip_close(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_register_progress_callback</code>() was added in libzip + 1.2.0. It was deprecated in libzip 1.3.0, use + <code class="Fn">zip_register_progress_callback_with_state</code>() instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_register_progress_callback.man b/3rdparty/libzip/man/zip_register_progress_callback.man new file mode 100644 index 0000000000..3d0e5b94dc --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_register_progress_callback.mdoc b/3rdparty/libzip/man/zip_register_progress_callback.mdoc new file mode 100644 index 0000000000..9fd0cd0d7c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_register_progress_callback_with_state.html b/3rdparty/libzip/man/zip_register_progress_callback_with_state.html new file mode 100644 index 0000000000..b2f2bfde1c --- /dev/null +++ b/3rdparty/libzip/man/zip_register_progress_callback_with_state.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_REGISTER_PROGRESS_CALLBACK_WITH_STATE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_register_progress_callback_with_state</code> — +<div class="Nd">provide updates during zip_close</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Vt">typedef void (*zip_progress_callback)(zip_t *, + double, void *);</var></p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_register_progress_callback_with_state</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">double + precision</var>, + <var class="Fa" style="white-space: nowrap;">zip_progress_callback + callback</var>, <var class="Fa" style="white-space: nowrap;">void + (*ud_free)(void *)</var>, <var class="Fa" style="white-space: nowrap;">void + *ud</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_register_progress_callback_with_state</code>() function + registers a callback function <var class="Ar">callback</var> for the zip + archive <var class="Ar">archive</var>. The <var class="Ar">precision</var> + 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 <var class="Ar">ud_free</var> function is called during cleanup for + deleting the userdata supplied in <var class="Ar">ud</var>. +<p class="Pp">The callback function is called during + <a class="Xr" href="zip_close.html">zip_close(3)</a> in regular intervals + (after every zip archive entry that's completely written to disk, and while + writing data for entries) with zip archive <var class="Ar">archive</var>, + the current progression state as a <var class="Vt">double</var>, and the + user-provided user-data <var class="Ar">ud</var> as arguments. The + progression state is a <var class="Vt">double</var> in the range from 0.0 to + 1.0. This can be used to provide progress indicators for user + interfaces.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_close.html">zip_close(3)</a>, + <a class="Xr" href="zip_register_cancel_callback_with_state.html">zip_register_cancel_callback_with_state(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_register_progress_callback_with_state</code>() was added in + libzip 1.3.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_register_progress_callback_with_state.man b/3rdparty/libzip/man/zip_register_progress_callback_with_state.man new file mode 100644 index 0000000000..56c912d59b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_register_progress_callback_with_state.mdoc b/3rdparty/libzip/man/zip_register_progress_callback_with_state.mdoc new file mode 100644 index 0000000000..5d881b6c28 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_rename.html b/3rdparty/libzip/man/zip_rename.html new file mode 100644 index 0000000000..22d9b454c8 --- /dev/null +++ b/3rdparty/libzip/man/zip_rename.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_RENAME(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_RENAME(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_RENAME(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_rename</code> — +<div class="Nd">rename file in zip archive (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_rename</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Fn">zip_rename</code>() is the obsolete version of + <a class="Xr" href="zip_file_rename.html">zip_file_rename(3)</a>. It is the + same as calling + <a class="Xr" href="zip_file_rename.html">zip_file_rename(3)</a> with an empty + flags argument. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_rename.html">zip_file_rename(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_rename</code>() was added in libzip 0.6. In libzip 0.10 the + type of <var class="Ar">index</var> was changed from <var class="Vt">int</var> + to <var class="Vt">zip_uint64_t</var>. It was deprecated in libzip 0.11, use + <code class="Fn">zip_file_rename</code>() instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_rename.man b/3rdparty/libzip/man/zip_rename.man new file mode 100644 index 0000000000..ea8b8c08b1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_rename.mdoc b/3rdparty/libzip/man/zip_rename.mdoc new file mode 100644 index 0000000000..ce3a748cf4 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_set_archive_comment.html b/3rdparty/libzip/man/zip_set_archive_comment.html new file mode 100644 index 0000000000..6e0e7402a7 --- /dev/null +++ b/3rdparty/libzip/man/zip_set_archive_comment.html @@ -0,0 +1,124 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SET_ARCHIVE_COMMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SET_ARCHIVE_COMMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SET_ARCHIVE_COMMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_set_archive_comment</code> — +<div class="Nd">set zip archive comment</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_set_archive_comment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *comment</var>, <var class="Fa" style="white-space: nowrap;">zip_uint16_t + len</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_set_archive_comment</code>() function sets the comment + for the entire zip archive. If <var class="Ar">comment</var> is + <code class="Dv">NULL</code> and <var class="Ar">len</var> is 0, the archive + comment will be removed. <var class="Ar">comment</var> must be encoded in + ASCII or UTF-8. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_set_archive_comment</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">len</var> is less than 0 or longer than the maximum + comment length in a zip file (65535), or <var class="Ar">comment</var> is + not a valid UTF-8 encoded string.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_get_comment.html">zip_file_get_comment(3)</a>, + <a class="Xr" href="zip_file_set_comment.html">zip_file_set_comment(3)</a>, + <a class="Xr" href="zip_get_archive_comment.html">zip_get_archive_comment(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_set_archive_comment</code>() was added in libzip 0.7. In + libzip 0.11 the type of <var class="Ar">len</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint16_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_set_archive_comment.man b/3rdparty/libzip/man/zip_set_archive_comment.man new file mode 100644 index 0000000000..2833cc0733 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_set_archive_comment.mdoc b/3rdparty/libzip/man/zip_set_archive_comment.mdoc new file mode 100644 index 0000000000..4fe8a25d0a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_set_archive_flag.html b/3rdparty/libzip/man/zip_set_archive_flag.html new file mode 100644 index 0000000000..3cdebd90dc --- /dev/null +++ b/3rdparty/libzip/man/zip_set_archive_flag.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SET_ARCHIVE_FLAG(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SET_ARCHIVE_FLAG(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SET_ARCHIVE_FLAG(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_set_archive_flag</code> — +<div class="Nd">set zip archive flag</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_set_archive_flag</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flag</var>, <var class="Fa" style="white-space: nowrap;">int + value</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_set_archive_flag</code>() function sets the flag + <var class="Ar">flag</var> for the archive <var class="Ar">archive</var> to + the value <var class="Ar">value</var>. +<p class="Pp">Currently there are no supported flags.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned, and -1 if an error occurred. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_get_archive_flag.html">zip_get_archive_flag(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_set_archive_flag</code>() was added in libzip 0.9. In + libzip 0.11 the type of <var class="Ar">flag</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_flags_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_set_archive_flag.man b/3rdparty/libzip/man/zip_set_archive_flag.man new file mode 100644 index 0000000000..0cacf4c946 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_set_archive_flag.mdoc b/3rdparty/libzip/man/zip_set_archive_flag.mdoc new file mode 100644 index 0000000000..116a340ffb --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_set_default_password.html b/3rdparty/libzip/man/zip_set_default_password.html new file mode 100644 index 0000000000..2f39f2a52a --- /dev/null +++ b/3rdparty/libzip/man/zip_set_default_password.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SET_DEFAULT_PASSWORD(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SET_DEFAULT_PASSWORD(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SET_DEFAULT_PASSWORD(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_set_default_password</code> — +<div class="Nd">set default password for encrypted files in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_set_default_password</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *password</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_set_default_password</code>() function sets the default + password used when accessing encrypted files. If + <var class="Ar">password</var> is <code class="Dv">NULL</code> or the empty + string, the default password is unset. +<p class="Pp">If you prefer a different password for single files, use + <a class="Xr" href="zip_fopen_encrypted.html">zip_fopen_encrypted(3)</a> + instead of <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>. Usually, + however, the same password is used for every file in an zip archive.</p> +<p class="Pp">The password is not verified when calling this function. See the + <a class="Sx" href="#CAVEATS">CAVEATS</a> section in + <a class="Xr" href="zip_fopen_encrypted.html">zip_fopen_encrypted(3)</a> for + more details about password handling.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_set_default_password</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_fopen.html">zip_fopen(3)</a>, + <a class="Xr" href="zip_fopen_encrypted.html">zip_fopen_encrypted(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_set_default_password</code>() was added in libzip 0.10. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">September 15, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_set_default_password.man b/3rdparty/libzip/man/zip_set_default_password.man new file mode 100644 index 0000000000..f2265e5139 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_set_default_password.mdoc b/3rdparty/libzip/man/zip_set_default_password.mdoc new file mode 100644 index 0000000000..a1f1335463 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_set_file_comment.html b/3rdparty/libzip/man/zip_set_file_comment.html new file mode 100644 index 0000000000..048dc373dd --- /dev/null +++ b/3rdparty/libzip/man/zip_set_file_comment.html @@ -0,0 +1,109 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SET_FILE_COMMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SET_FILE_COMMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SET_FILE_COMMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_set_file_comment</code> — +<div class="Nd">set comment for file in zip (obsolete interface)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_set_file_comment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">const char + *comment</var>, <var class="Fa" style="white-space: nowrap;">int + len</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_set_file_comment</code>() function is the obsolete + version of + <a class="Xr" href="zip_file_set_comment.html">zip_file_set_comment(3)</a>. + The only differences are the type of the <var class="Ar">len</var> argument + and the additional <var class="Ar">flags</var> argument. + <code class="Fn">zip_set_file_comment</code>() is the same as calling + <a class="Xr" href="zip_file_set_comment.html">zip_file_set_comment(3)</a> + with an empty <var class="Ar">flags</var> argument. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_set_comment.html">zip_file_set_comment(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_set_file_comment</code>() was added in libzip 0.7. In + libzip 0.10 the type of <var class="Ar">index</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint64_t</var>. It was + deprecated in libzip 0.11, use <code class="Fn">zip_file_set_comment</code>() + instead. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_set_file_comment.man b/3rdparty/libzip/man/zip_set_file_comment.man new file mode 100644 index 0000000000..2ba8a7c9f2 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_set_file_comment.mdoc b/3rdparty/libzip/man/zip_set_file_comment.mdoc new file mode 100644 index 0000000000..f6e2b378aa --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_set_file_compression.html b/3rdparty/libzip/man/zip_set_file_compression.html new file mode 100644 index 0000000000..40db4e4dad --- /dev/null +++ b/3rdparty/libzip/man/zip_set_file_compression.html @@ -0,0 +1,162 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SET_FILE_COMPRESSION(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SET_FILE_COMPRESSION(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SET_FILE_COMPRESSION(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_set_file_compression</code> — +<div class="Nd">set compression method for file in zip</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_set_file_compression</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_int32_t + comp</var>, <var class="Fa" style="white-space: nowrap;">zip_uint32_t + comp_flags</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_set_file_compression</code>() function sets the + compression method for the file at position <var class="Ar">index</var> in the + zip archive to <var class="Ar">comp</var> with the compression method specific + <var class="Ar">comp_flags</var>. The <var class="Ar">comp</var> is the same + as returned by <a class="Xr" href="zip_stat.html">zip_stat(3)</a>. For the + <var class="Ar">comp</var> argument, currently only the following values are + supported: +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_CM_DEFAULT"><code class="Dv" id="ZIP_CM_DEFAULT">ZIP_CM_DEFAULT</code></a></dt> + <dd>default compression; currently the same as + <code class="Dv">ZIP_CM_DEFLATE</code>, but <var class="Ar">flags</var> + are ignored.</dd> + <dt><a class="permalink" href="#ZIP_CM_STORE"><code class="Dv" id="ZIP_CM_STORE">ZIP_CM_STORE</code></a></dt> + <dd>Store the file uncompressed.</dd> + <dt><a class="permalink" href="#ZIP_CM_BZIP2"><code class="Dv" id="ZIP_CM_BZIP2">ZIP_CM_BZIP2</code></a></dt> + <dd>Compress the file using the <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/bzip2.html">bzip2(1)</a> + algorithm.</dd> + <dt><a class="permalink" href="#ZIP_CM_DEFLATE"><code class="Dv" id="ZIP_CM_DEFLATE">ZIP_CM_DEFLATE</code></a></dt> + <dd>Deflate the file with the <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/zlib.html">zlib(3)</a> + algorithm and default options.</dd> + <dt><a class="permalink" href="#ZIP_CM_XZ"><code class="Dv" id="ZIP_CM_XZ">ZIP_CM_XZ</code></a></dt> + <dd>Use the <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/xz.html">xz(1)</a> algorithm for + compression</dd> + <dt><a class="permalink" href="#ZIP_CM_ZSTD"><code class="Dv" id="ZIP_CM_ZSTD">ZIP_CM_ZSTD</code></a></dt> + <dd>Use the <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/zstd.html">zstd(1)</a> algorithm for + compression</dd> +</dl> +<p class="Pp"><i class="Em">NOTE</i>: Only the deflate and store methods can be + assumed to be universally supported.</p> +<p class="Pp">The <var class="Ar">comp_flags</var> 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 <code class="Dv">ZIP_CM_BZIP</code>, + <code class="Dv">ZIP_CM_DEFLATE</code>, and + <code class="Dv">ZIP_CM_XZ</code> 1 is the fastest compression and 9 the + best, 0 chooses the default. For <code class="Dv">ZIP_CM_ZSTD</code> + possible values are + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/ZSTD_minCLevel.html">ZSTD_minCLevel(3)</a> to + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/ZSTD_maxCLevel.html">ZSTD_maxCLevel(3)</a>.</p> +<p class="Pp">Further compression method specific flags might be added over + time.</p> +<p class="Pp">The current compression method for a file in a zip archive can be + determined using <a class="Xr" href="zip_stat.html">zip_stat(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_set_file_compression</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_COMPNOTSUPP"><code class="Er" id="ZIP_ER_COMPNOTSUPP">ZIP_ER_COMPNOTSUPP</code></a>]</dt> + <dd>Unsupported compression method requested.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">archive</var>, or the argument combination is + invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_RDONLY"><code class="Er" id="ZIP_ER_RDONLY">ZIP_ER_RDONLY</code></a>]</dt> + <dd>Read-only zip file, no changes allowed.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_compression_method_supported.html">zip_compression_method_supported(3)</a>, + <a class="Xr" href="zip_stat.html">zip_stat(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_set_file_compression</code>() was added in libzip 0.11. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">June 18, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_set_file_compression.man b/3rdparty/libzip/man/zip_set_file_compression.man new file mode 100644 index 0000000000..7f6630aa09 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_set_file_compression.mdoc b/3rdparty/libzip/man/zip_set_file_compression.mdoc new file mode 100644 index 0000000000..53a36141fc --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source.html b/3rdparty/libzip/man/zip_source.html new file mode 100644 index 0000000000..571040ec41 --- /dev/null +++ b/3rdparty/libzip/man/zip_source.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source</code> — +<div class="Nd">zip data source structure</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Vt">zip_source_t *zs</var>;</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +A <var class="Vt">struct zip_source</var> is a data source used by + <a class="Xr" href="libzip.html">libzip(3)</a> 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 + <a class="Xr" href="zip_source_buffer.html">zip_source_buffer(3)</a>, + <a class="Xr" href="zip_source_buffer_create.html">zip_source_buffer_create(3)</a>, + <a class="Xr" href="zip_source_file.html">zip_source_file(3)</a>, + <a class="Xr" href="zip_source_file_create.html">zip_source_file_create(3)</a>, + <a class="Xr" href="zip_source_filep.html">zip_source_filep(3)</a>, + <a class="Xr" href="zip_source_filep_create.html">zip_source_filep_create(3)</a>, + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a>, + <a class="Xr" href="zip_source_function_create.html">zip_source_function_create(3)</a>, + <a class="Xr" href="zip_source_window.html">zip_source_window(3)</a>, or + <a class="Xr" href="zip_source_zip.html">zip_source_zip(3)</a>. + <var class="Vt">zip_source_t</var> is reference counted, and created with a + reference count of 1. + <a class="Xr" href="zip_open_from_source.html">zip_open_from_source(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, and + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a> will + decrement the reference count of the <var class="Vt">zip_source_t</var> when + they are done using it, so + <a class="Xr" href="zip_source_free.html">zip_source_free(3)</a> only needs to + be called when these functions return an error. Use + <a class="Xr" href="zip_source_keep.html">zip_source_keep(3)</a> to increase + the reference count, for example if you need the source after + <a class="Xr" href="zip_close.html">zip_close(3)</a>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source_buffer.html">zip_source_buffer(3)</a>, + <a class="Xr" href="zip_source_file.html">zip_source_file(3)</a>, + <a class="Xr" href="zip_source_filep.html">zip_source_filep(3)</a>, + <a class="Xr" href="zip_source_free.html">zip_source_free(3)</a>, + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a>, + <a class="Xr" href="zip_source_window.html">zip_source_window(3)</a>, + <a class="Xr" href="zip_source_zip.html">zip_source_zip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source.man b/3rdparty/libzip/man/zip_source.man new file mode 100644 index 0000000000..b683b56dd9 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source.mdoc b/3rdparty/libzip/man/zip_source.mdoc new file mode 100644 index 0000000000..0b3cafae93 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_begin_write.html b/3rdparty/libzip/man/zip_source_begin_write.html new file mode 100644 index 0000000000..b65682a563 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_begin_write.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_BEGIN_WRITE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_BEGIN_WRITE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_BEGIN_WRITE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_begin_write</code>, + <code class="Nm">zip_source_begin_write_cloning</code> — +<div class="Nd">prepare zip source for writing</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_begin_write</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_begin_write_cloning</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + offset</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_begin_write</code>() and + <code class="Fn">zip_source_begin_write_cloning</code>() prepare + <var class="Fa">source</var> for writing. Usually this involves creating + temporary files or allocating buffers. +<p class="Pp"><code class="Fn">zip_source_begin_write_cloning</code>() preserves + the first <var class="Ar">offset</var> bytes of the original file. This is + done efficiently, and writes to <var class="Ar">source</var> won't overwrite + the original data until <code class="Fn">zip_commit_write</code>() is + called.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_commit_write.html">zip_source_commit_write(3)</a>, + <a class="Xr" href="zip_source_rollback_write.html">zip_source_rollback_write(3)</a>, + <a class="Xr" href="zip_source_seek_write.html">zip_source_seek_write(3)</a>, + <a class="Xr" href="zip_source_tell_write.html">zip_source_tell_write(3)</a>, + <a class="Xr" href="zip_source_write.html">zip_source_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_begin_write</code>() was added in libzip 1.0. +<p class="Pp"><code class="Fn">zip_source_begin_write_cloning</code>() was added + in libzip 1.4.0.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_begin_write.man b/3rdparty/libzip/man/zip_source_begin_write.man new file mode 100644 index 0000000000..a0a21c5212 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_begin_write.mdoc b/3rdparty/libzip/man/zip_source_begin_write.mdoc new file mode 100644 index 0000000000..bef77e2627 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_buffer.html b/3rdparty/libzip/man/zip_source_buffer.html new file mode 100644 index 0000000000..6681cf2cf3 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_buffer.html @@ -0,0 +1,135 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_BUFFER(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_BUFFER(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_BUFFER(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_buffer</code>, + <code class="Nm">zip_source_buffer_create</code> — +<div class="Nd">create zip data source from buffer</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_buffer</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const void + *data</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + len</var>, <var class="Fa" style="white-space: nowrap;">int + freep</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_buffer_create</code>(<var class="Fa" style="white-space: nowrap;">const + void *data</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + len</var>, <var class="Fa" style="white-space: nowrap;">int freep</var>, + <var class="Fa" style="white-space: nowrap;">zip_error_t *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_buffer</code>() and + <code class="Fn">zip_source_buffer_create</code>() create a zip source from + the buffer <var class="Ar">data</var> of size <var class="Ar">len</var>. If + <var class="Ar">freep</var> is non-zero, the buffer will be freed when it is + no longer needed. <var class="Ar">data</var> must remain valid for the + lifetime of the created source. +<p class="Pp">The source can be used to open a zip archive from.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_buffer</code>() and + <code class="Fn">zip_source_buffer_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">len</var> is greater than zero and + <var class="Ar">data</var> is <code class="Dv">NULL</code>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_open_from_source.html">zip_open_from_source(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_buffer</code>() and + <code class="Fn">zip_source_buffer_create</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_buffer.man b/3rdparty/libzip/man/zip_source_buffer.man new file mode 100644 index 0000000000..4a368d9e7e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_buffer.mdoc b/3rdparty/libzip/man/zip_source_buffer.mdoc new file mode 100644 index 0000000000..081e7e2a48 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_buffer_fragment.html b/3rdparty/libzip/man/zip_source_buffer_fragment.html new file mode 100644 index 0000000000..a40c2596f2 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_buffer_fragment.html @@ -0,0 +1,150 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_BUFFER_FRAGMENT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_BUFFER_FRAGMENT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_BUFFER_FRAGMENT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_buffer_fragment</code>, + <code class="Nm">zip_source_buffer_fragment_create</code> — +<div class="Nd">create zip data source from multiple buffer</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_buffer_fragment</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, + <var class="Fa" style="white-space: nowrap;">zip_buffer_fragment_t + *fragments</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + nfragments</var>, <var class="Fa" style="white-space: nowrap;">int + freep</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_buffer_fragment_create</code>(<var class="Fa" style="white-space: nowrap;">zip_buffer_fragment_t + *fragments</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + nfragments</var>, <var class="Fa" style="white-space: nowrap;">int + freep</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_buffer_fragment</code>() and + <code class="Fn">zip_source_buffer_fragment_create</code>() create a zip + source from the data in <var class="Ar">fragments</var>. + <var class="Ar">nfragments</var> specifies the number of fragments. If + <var class="Ar">freep</var> is non-zero, the data will be freed when it is no + longer needed. +<div class="Bd Pp"> +<pre> +struct zip_stat { + zip_uint8_t *data; /* pointer to the actual data */ + zip_uint64_t length; /* length of this fragment */ +}; +</pre> +</div> +<p class="Pp">The data <var class="Ar">fragments</var> point to must remain + valid for the lifetime of the created source. + <var class="Ar">fragments</var> itself can be discarded once the source is + created.</p> +<p class="Pp">The source can be used to open a zip archive from.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_buffer</code>() and + <code class="Fn">zip_source_buffer_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">nfragments</var> is greater than zero and + <var class="Ar">fragments</var> is <code class="Dv">NULL</code>.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_open_from_source.html">zip_open_from_source(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_buffer_fragment</code>() and + <code class="Fn">zip_source_buffer_fragment_create</code>() were added in + libzip 1.4.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_buffer_fragment.man b/3rdparty/libzip/man/zip_source_buffer_fragment.man new file mode 100644 index 0000000000..f0669778d2 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_buffer_fragment.mdoc b/3rdparty/libzip/man/zip_source_buffer_fragment.mdoc new file mode 100644 index 0000000000..8965528f6f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_close.html b/3rdparty/libzip/man/zip_source_close.html new file mode 100644 index 0000000000..efe33754b9 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_close.html @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_CLOSE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_CLOSE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_CLOSE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_close</code> — +<div class="Nd">close zip_source (which was open for reading)</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_close</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_close</code>() closes + <var class="Fa">source</var>, indicating that no more data will be read. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_free.html">zip_source_free(3)</a>, + <a class="Xr" href="zip_source_open.html">zip_source_open(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_close</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_close.man b/3rdparty/libzip/man/zip_source_close.man new file mode 100644 index 0000000000..cd886e81f0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_close.mdoc b/3rdparty/libzip/man/zip_source_close.mdoc new file mode 100644 index 0000000000..197695d989 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_commit_write.html b/3rdparty/libzip/man/zip_source_commit_write.html new file mode 100644 index 0000000000..0ac6950e11 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_commit_write.html @@ -0,0 +1,109 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_COMMIT_WRITE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_COMMIT_WRITE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_COMMIT_WRITE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_commit_write</code> — +<div class="Nd">finalize changes to zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_commit_write</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_commit_write</code>() finishes writing + data to <var class="Fa">source</var> and replaces the original with the newly + written data. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a>, + <a class="Xr" href="zip_source_rollback_write.html">zip_source_rollback_write(3)</a>, + <a class="Xr" href="zip_source_seek_write.html">zip_source_seek_write(3)</a>, + <a class="Xr" href="zip_source_tell_write.html">zip_source_tell_write(3)</a>, + <a class="Xr" href="zip_source_write.html">zip_source_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_commit_write</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_commit_write.man b/3rdparty/libzip/man/zip_source_commit_write.man new file mode 100644 index 0000000000..2df6abb574 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_commit_write.mdoc b/3rdparty/libzip/man/zip_source_commit_write.mdoc new file mode 100644 index 0000000000..69c4f1b35e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_error.html b/3rdparty/libzip/man/zip_source_error.html new file mode 100644 index 0000000000..492cf6fd76 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_error.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_ERROR(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_ERROR(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_ERROR(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_error</code> — +<div class="Nd">get zip error for data source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_error_t *</var> + <br/> + <code class="Fn">zip_source_error</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_source_error</code>() function returns the zip error + for the data source <var class="Ar">source</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_error_code_system.html">zip_error_code_system(3)</a>, + <a class="Xr" href="zip_error_code_zip.html">zip_error_code_zip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_error</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_error.man b/3rdparty/libzip/man/zip_source_error.man new file mode 100644 index 0000000000..62e7544b7d --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_error.mdoc b/3rdparty/libzip/man/zip_source_error.mdoc new file mode 100644 index 0000000000..af098d1bcd --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_file.html b/3rdparty/libzip/man/zip_source_file.html new file mode 100644 index 0000000000..6cb7a9f7e4 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_file.html @@ -0,0 +1,141 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_FILE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_FILE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_FILE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_file</code>, + <code class="Nm">zip_source_file_create</code> — +<div class="Nd">create data source from a file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_file</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_file_create</code>(<var class="Fa" style="white-space: nowrap;">const + char *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_file</code>() and + <code class="Fn">zip_source_file_create</code>() create a zip source from a + file. They open <var class="Ar">fname</var> and read <var class="Ar">len</var> + bytes from offset <var class="Ar">start</var> from it. If + <var class="Ar">len</var> is 0 or -1, the whole file (starting from + <var class="Ar">start</var>) is used. +<p class="Pp">If the file supports seek, the source can be used to open a zip + archive from.</p> +<p class="Pp">The file is opened and read when the data from the source is used, + usually by <code class="Fn">zip_close</code>() or + <code class="Fn">zip_open_from_source</code>().</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_file</code>() and + <code class="Fn">zip_source_file_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">fname</var>, <var class="Ar">start</var>, or + <var class="Ar">len</var> are invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_OPEN"><code class="Er" id="ZIP_ER_OPEN">ZIP_ER_OPEN</code></a>]</dt> + <dd>Opening <var class="Ar">fname</var> failed.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_file</code>() and + <code class="Fn">zip_source_file_create</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_file.man b/3rdparty/libzip/man/zip_source_file.man new file mode 100644 index 0000000000..56471f9043 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_file.mdoc b/3rdparty/libzip/man/zip_source_file.mdoc new file mode 100644 index 0000000000..cffd4936f2 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_filep.html b/3rdparty/libzip/man/zip_source_filep.html new file mode 100644 index 0000000000..96a3584e2b --- /dev/null +++ b/3rdparty/libzip/man/zip_source_filep.html @@ -0,0 +1,137 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_FILEP(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_FILEP(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_FILEP(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_filep</code>, + <code class="Nm">zip_source_filep_create</code> — +<div class="Nd">create data source from FILE *</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_filep</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">FILE + *file</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_filep_create</code>(<var class="Fa" style="white-space: nowrap;">FILE + *file</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_filep</code>() and + <code class="Fn">zip_source_filep_create</code>() create a zip source from a + file stream. They read <var class="Ar">len</var> bytes from offset + <var class="Ar">start</var> from the open file stream + <var class="Ar">file</var>. If <var class="Ar">len</var> is 0 or -1, the whole + file (starting from <var class="Ar">start</var>) is used. +<p class="Pp">If the file stream supports seeking, the source can be used to + open a read-only zip archive from.</p> +<p class="Pp">The file stream is closed when the source is being freed, usually + by <a class="Xr" href="zip_close.html">zip_close(3)</a>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_filep</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">file</var>, <var class="Ar">start</var>, or + <var class="Ar">len</var> are invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_filep</code>() and + <code class="Fn">zip_source_filep_create</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_filep.man b/3rdparty/libzip/man/zip_source_filep.man new file mode 100644 index 0000000000..f7c96f95e7 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_filep.mdoc b/3rdparty/libzip/man/zip_source_filep.mdoc new file mode 100644 index 0000000000..088c75075f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_free.html b/3rdparty/libzip/man/zip_source_free.html new file mode 100644 index 0000000000..abf319a84d --- /dev/null +++ b/3rdparty/libzip/man/zip_source_free.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_FREE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_FREE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_FREE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_free</code> — +<div class="Nd">free zip data source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_source_free</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_free</code>() decrements the reference + count of <var class="Ar">source</var> and frees it if the reference count + drops to 0. If <var class="Ar">source</var> is <code class="Dv">NULL</code>, + it does nothing. +<p class="Pp"><i class="Em">NOTE</i>: This function should not be called on a + <var class="Ar">source</var> after it was used successfully in a + <a class="Xr" href="zip_open_from_source.html">zip_open_from_source(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, or + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a> call.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_keep.html">zip_source_keep(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_free</code>() was added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_free.man b/3rdparty/libzip/man/zip_source_free.man new file mode 100644 index 0000000000..5f79671889 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_free.mdoc b/3rdparty/libzip/man/zip_source_free.mdoc new file mode 100644 index 0000000000..816f7a1e1f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_function.html b/3rdparty/libzip/man/zip_source_function.html new file mode 100644 index 0000000000..b0f05b8ec8 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_function.html @@ -0,0 +1,380 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_source_function.mdoc -- create data source from function + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_FUNCTION(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_FUNCTION(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_FUNCTION(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_function</code>, + <code class="Nm">zip_source_function_create</code> — +<div class="Nd">create data source from function</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_function</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, + <var class="Fa" style="white-space: nowrap;">zip_source_callback fn</var>, + <var class="Fa" style="white-space: nowrap;">void *userdata</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_function_create</code>(<var class="Fa" style="white-space: nowrap;">zip_source_callback + fn</var>, <var class="Fa" style="white-space: nowrap;">void *userdata</var>, + <var class="Fa" style="white-space: nowrap;">zip_error_t *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_function</code>() and + <code class="Fn">zip_source_function_create</code>() creates a zip source from + the user-provided function <var class="Ar">fn</var>, which must be of the + following type: +<p class="Pp"><var class="Ft">typedef zip_int64_t</var> + <code class="Fn">(*zip_source_callback)</code>(<var class="Fa">void + *userdata</var>, <var class="Fa">void *data</var>, + <var class="Fa">zip_uint64_t len</var>, <var class="Fa">zip_source_cmd_t + cmd</var>);</p> +<p class="Pp"><var class="Ar">archive</var> or <var class="Ar">error</var> are + used for reporting errors and can be <code class="Dv">NULL</code>.</p> +<p class="Pp">When called by the library, the first argument is the + <var class="Ar">userdata</var> argument supplied to the function. The next + two arguments are a buffer <var class="Ar">data</var> of size + <var class="Ar">len</var> when data is passed in or expected to be returned, + or else <code class="Dv">NULL</code> and 0. The last argument, + <var class="Ar">cmd</var>, specifies which action the function should + perform.</p> +<p class="Pp">Depending on the uses, there are three useful sets of commands to + be supported by a <code class="Fn">zip_source_callback</code>():</p> +<dl class="Bl-tag"> + <dt>read source</dt> + <dd>Providing streamed data (for file data added to archives). Must support + <code class="Dv">ZIP_SOURCE_OPEN</code>, + <code class="Dv">ZIP_SOURCE_READ</code>, + <code class="Dv">ZIP_SOURCE_CLOSE</code>, + <code class="Dv">ZIP_SOURCE_STAT</code>, and + <code class="Dv">ZIP_SOURCE_ERROR</code>.</dd> + <dt>seekable read source</dt> + <dd>Same as previous, but from a source allowing reading from arbitrary + offsets (also for read-only zip archive). Must additionally support + <code class="Dv">ZIP_SOURCE_SEEK</code>, + <code class="Dv">ZIP_SOURCE_TELL</code>, and + <code class="Dv">ZIP_SOURCE_SUPPORTS</code>.</dd> + <dt>read/write source</dt> + <dd>Same as previous, but additionally allowing writing (also for writable zip + archives). Must additionally support + <code class="Dv">ZIP_SOURCE_BEGIN_WRITE</code>, + <code class="Dv">ZIP_SOURCE_COMMIT_WRITE</code>, + <code class="Dv">ZIP_SOURCE_ROLLBACK_WRITE</code>, + <code class="Dv">ZIP_SOURCE_SEEK_WRITE</code>, + <code class="Dv">ZIP_SOURCE_TELL_WRITE</code>, and + <code class="Dv">ZIP_SOURCE_REMOVE</code>.</dd> +</dl> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_ACCEPT_EMPTY</code></h2> +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. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_BEGIN_WRITE</code></h2> +Prepare the source for writing. Use this to create any temporary file(s). +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_BEGIN_WRITE_CLONING</code></h2> +Prepare the source for writing, keeping the first <var class="Ar">len</var> + 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 + <code class="Dv">ZIP_SOURCE_ROLLBACK_WRITE</code>). +<p class="Pp">The next write should happen at byte + <var class="Ar">offset</var>.</p> +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_CLOSE</code></h2> +Reading is done. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_COMMIT_WRITE</code></h2> +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. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_ERROR</code></h2> +Get error information. <var class="Ar">data</var> 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 + <a class="Xr" href="zip_errors.html">zip_errors(3)</a> for details on the + error codes. If the source stores error information in a zip_error_t, use + <a class="Xr" href="zip_error_to_data.html">zip_error_to_data(3)</a> and + return its return value. Otherwise, return 2 * sizeof(int). +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_FREE</code></h2> +Clean up and free all resources, including <var class="Ar">userdata</var>. The + callback function will not be called again. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_GET_FILE_ATTRIBUTES</code></h2> +Provide information about various data. Then the data should be put in the + appropriate entry in the passed <var class="Vt">zip_file_attributes_t</var> + argument, and the appropriate <code class="Dv">ZIP_FILE_ATTRIBUTES_*</code> + value must be or'ed into the <var class="Ar">valid</var> member to denote that + the corresponding data has been provided. A + <var class="Vt">zip_file_attributes_t</var> structure can be initialized using + <a class="Xr" href="zip_file_attributes_init.html">zip_file_attributes_init(3)</a>. +<dl class="Bl-tag"> + <dt>ASCII mode</dt> + <dd>If a file is a plaintext file in ASCII. Can be used by extraction tools to + automatically convert line endings (part of the interal file attributes). + Member <var class="Ar">ascii</var>, flag + <code class="Dv">ZIP_FILE_ATTRIBUTES_ASCII</code>.</dd> + <dt>General Purpose Bit Flags (limited to Compression Flags)</dt> + <dd>The general purpose bit flag in the zip in the local and central directory + headers contain information about the compression method. Member + <var class="Ar">general_purpose_bit_flags</var> and + <var class="Ar">general_purpose_bit_mask</var> to denote which members + have been set; flag + <code class="Dv">ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS</code>.</dd> + <dt>External File Attributes</dt> + <dd>The external file attributes (usually operating system-specific). Member + <var class="Ar">external_file_attributes</var>, flag + <code class="Dv">ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES</code>.</dd> + <dt>Version Needed</dt> + <dd>A minimum version needed required to unpack this entry (in the usual + "major * 10 + minor" format). Member + <var class="Ar">version_needed</var>, flag + <code class="Dv">ZIP_FILE_ATTRIBUTES_VERSION_NEEDED</code>.</dd> + <dt>Operating System</dt> + <dd>One of the operating systems as defined by the + <code class="Dv">ZIP_OPSYS_*</code> variables (see + <span class="Pa">zip.h</span>). This value affects the interpretation of + the external file attributes. Member <var class="Ar">host_system</var>, + flag <code class="Dv">ZIP_FILE_ATTRIBUTES_HOST_SYSTEM</code>.</dd> +</dl> +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_OPEN</code></h2> +Prepare for reading. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_READ</code></h2> +Read data into the buffer <var class="Ar">data</var> of size + <var class="Ar">len</var>. Return the number of bytes placed into + <var class="Ar">data</var> on success, and zero for end-of-file. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_REMOVE</code></h2> +Remove the underlying file. This is called if a zip archive is empty when + closed. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_ROLLBACK_WRITE</code></h2> +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. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_SEEK</code></h2> +Specify position to read next byte from, like + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html">fseek(3)</a>. Use + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/ZIP_SOURCE_GET_ARGS.html">ZIP_SOURCE_GET_ARGS(3)</a> to + decode the arguments into the following struct: +<div class="Bd Pp"> +<pre> +struct zip_source_args_seek { + zip_int64_t offset; + int whence; +}; +</pre> +</div> +<p class="Pp">If the size of the source's data is known, use + <a class="Xr" href="zip_source_seek_compute_offset.html">zip_source_seek_compute_offset(3)</a> + to validate the arguments and compute the new offset.</p> +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_SEEK_WRITE</code></h2> +Specify position to write next byte to, like + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html">fseek(3)</a>. See + <code class="Dv">ZIP_SOURCE_SEEK</code> for details. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_STAT</code></h2> +Get meta information for the input data. <var class="Ar">data</var> points to an + allocated <var class="Vt">struct zip_stat</var>, which should be initialized + using <a class="Xr" href="zip_stat_init.html">zip_stat_init(3)</a> and then + filled in. +<p class="Pp">For uncompressed, unencrypted data, all information is optional. + However, fill in as much information as is readily available.</p> +<p class="Pp">If the data is compressed, + <code class="Dv">ZIP_STAT_COMP_METHOD</code>, + <code class="Dv">ZIP_STAT_SIZE</code>, and + <code class="Dv">ZIP_STAT_CRC</code> must be filled in.</p> +<p class="Pp">If the data is encrypted, + <code class="Dv">ZIP_STAT_ENCRYPTION_METHOD</code>, + <code class="Dv">ZIP_STAT_COMP_METHOD</code>, + <code class="Dv">ZIP_STAT_SIZE</code>, and + <code class="Dv">ZIP_STAT_CRC</code> must be filled in.</p> +<p class="Pp">Information only available after the source has been read (e.g., + size) can be omitted in an earlier call. <i class="Em">NOTE</i>: + <code class="Fn">zip_source_function</code>() may be called with this + argument even after being called with + <code class="Dv">ZIP_SOURCE_CLOSE</code>.</p> +<p class="Pp">Return sizeof(struct zip_stat) on success.</p> +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_SUPPORTS</code></h2> +Return bitmap specifying which commands are supported. Use + <a class="Xr" href="zip_source_make_command_bitmap.html">zip_source_make_command_bitmap(3)</a>. + If this command is not implemented, the source is assumed to be a read source + without seek support. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_TELL</code></h2> +Return the current read offset in the source, like + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/ftell.html">ftell(3)</a>. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_TELL_WRITE</code></h2> +Return the current write offset in the source, like + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/ftell.html">ftell(3)</a>. +</section> +<section class="Ss"> +<h2 class="Ss"><code class="Dv">ZIP_SOURCE_WRITE</code></h2> +Write data to the source. Return number of bytes written. +</section> +<section class="Ss"> +<h2 class="Ss" id="Return_Values"><a class="permalink" href="#Return_Values">Return + Values</a></h2> +Commands should return -1 on error. <code class="Dv">ZIP_SOURCE_ERROR</code> + will be called to retrieve the error code. On success, commands return 0, + unless specified otherwise in the description above. +</section> +<section class="Ss"> +<h2 class="Ss" id="Calling_Conventions"><a class="permalink" href="#Calling_Conventions">Calling + Conventions</a></h2> +The library will always issue <code class="Dv">ZIP_SOURCE_OPEN</code> before + issuing <code class="Dv">ZIP_SOURCE_READ</code>, + <code class="Dv">ZIP_SOURCE_SEEK</code>, or + <code class="Dv">ZIP_SOURCE_TELL</code>. When it no longer wishes to read from + this source, it will issue <code class="Dv">ZIP_SOURCE_CLOSE</code>. If the + library wishes to read the data again, it will issue + <code class="Dv">ZIP_SOURCE_OPEN</code> a second time. If the function is + unable to provide the data again, it should return -1. +<p class="Pp"><code class="Dv">ZIP_SOURCE_BEGIN_WRITE</code> or + <code class="Dv">ZIP_SOURCE_BEGIN_WRITE_CLONING</code> will be called before + <code class="Dv">ZIP_SOURCE_WRITE</code>, + <code class="Dv">ZIP_SOURCE_SEEK_WRITE</code>, or + <code class="Dv">ZIP_SOURCE_TELL_WRITE</code>. When writing is complete, + either <code class="Dv">ZIP_SOURCE_COMMIT_WRITE</code> or + <code class="Dv">ZIP_SOURCE_ROLLBACK_WRITE</code> will be called.</p> +<p class="Pp"><code class="Dv">ZIP_SOURCE_ACCEPT_EMPTY</code>, + <code class="Dv">ZIP_SOURCE_GET_FILE_ATTRIBUTES</code>, and + <code class="Dv">ZIP_SOURCE_STAT</code> can be issued at any time.</p> +<p class="Pp"><code class="Dv">ZIP_SOURCE_ERROR</code> will only be issued in + response to the function returning -1.</p> +<p class="Pp"><code class="Dv">ZIP_SOURCE_FREE</code> will be the last command + issued; if <code class="Dv">ZIP_SOURCE_OPEN</code> was called and succeeded, + <code class="Dv">ZIP_SOURCE_CLOSE</code> will be called before + <code class="Dv">ZIP_SOURCE_FREE</code>, and similarly for + <code class="Dv">ZIP_SOURCE_BEGIN_WRITE</code> or + <code class="Dv">ZIP_SOURCE_BEGIN_WRITE_CLONING</code> and + <code class="Dv">ZIP_SOURCE_COMMIT_WRITE</code> or + <code class="Dv">ZIP_SOURCE_ROLLBACK_WRITE</code>.</p> +</section> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error (unless it is <code class="Dv">NULL</code>). +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_function</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_attributes_init.html">zip_file_attributes_init(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_stat_init.html">zip_stat_init(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_function</code>() and + <code class="Fn">zip_source_function_create</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 17, 2020</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_function.man b/3rdparty/libzip/man/zip_source_function.man new file mode 100644 index 0000000000..4fc01d900f --- /dev/null +++ b/3rdparty/libzip/man/zip_source_function.man @@ -0,0 +1,413 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_function.mdoc -- create data source from function +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "April 17, 2020" "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 <zip.h>\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() +creates 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. +.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 interal 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 "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/3rdparty/libzip/man/zip_source_function.mdoc b/3rdparty/libzip/man/zip_source_function.mdoc new file mode 100644 index 0000000000..8272ea1327 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_function.mdoc @@ -0,0 +1,399 @@ +.\" zip_source_function.mdoc -- create data source from function +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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 +creates 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 . +.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 interal 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 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/3rdparty/libzip/man/zip_source_is_deleted.html b/3rdparty/libzip/man/zip_source_is_deleted.html new file mode 100644 index 0000000000..166c7d34f5 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_is_deleted.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_IS_DELETED(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_IS_DELETED(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_IS_DELETED(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_is_deleted</code> — +<div class="Nd">check if zip_source is deleted</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_is_deleted</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_is_deleted</code>() returns whether the + zip_source was deleted. This can for example happen when all entries are + removed from a zip archive. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +<code class="Fn">zip_source_is_deleted</code>() returns 1 if the zip_source is + deleted and 0 otherwise. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_is_deleted</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_is_deleted.man b/3rdparty/libzip/man/zip_source_is_deleted.man new file mode 100644 index 0000000000..89dab743bd --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_is_deleted.mdoc b/3rdparty/libzip/man/zip_source_is_deleted.mdoc new file mode 100644 index 0000000000..9903058f78 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_keep.html b/3rdparty/libzip/man/zip_source_keep.html new file mode 100644 index 0000000000..fc7d1d16f6 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_keep.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_KEEP(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_KEEP(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_KEEP(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_keep</code> — +<div class="Nd">increment reference count of zip data source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_source_keep</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_keep</code>() increments the reference + count of <var class="Ar">source</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_free.html">zip_source_free(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_keep</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_keep.man b/3rdparty/libzip/man/zip_source_keep.man new file mode 100644 index 0000000000..488673cbea --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_keep.mdoc b/3rdparty/libzip/man/zip_source_keep.mdoc new file mode 100644 index 0000000000..122c4f84a9 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_make_command_bitmap.html b/3rdparty/libzip/man/zip_source_make_command_bitmap.html new file mode 100644 index 0000000000..d6ce945ebe --- /dev/null +++ b/3rdparty/libzip/man/zip_source_make_command_bitmap.html @@ -0,0 +1,99 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_MAKE_COMMAND_BITMAP(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_MAKE_COMMAND_BITMAP(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_MAKE_COMMAND_BITMAP(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_make_command_bitmap</code> — +<div class="Nd">create bitmap of supported source operations</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_source_make_command_bitmap</code>(<var class="Fa" style="white-space: nowrap;">zip_source_cmd_t + command</var>, <var class="Fa" style="white-space: nowrap;">...</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_source_make_command_bitmap</code>() function returns a + bitmap of source commands suitable as return value for + <code class="Dv">ZIP_SOURCE_SUPPORTS</code>. It includes all the commands from + the argument list, which must be terminated by -1. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_make_command_bitmap</code>() was added in libzip + 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_make_command_bitmap.man b/3rdparty/libzip/man/zip_source_make_command_bitmap.man new file mode 100644 index 0000000000..3dc3ed5d0b --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_make_command_bitmap.mdoc b/3rdparty/libzip/man/zip_source_make_command_bitmap.mdoc new file mode 100644 index 0000000000..28d296f2f1 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_open.html b/3rdparty/libzip/man/zip_source_open.html new file mode 100644 index 0000000000..9dc5a579a4 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_open.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_OPEN(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_OPEN(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_OPEN(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_open</code> — +<div class="Nd">open zip_source for reading</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_open</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_open</code>() opens + <var class="Fa">source</var> for reading. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a>, + <a class="Xr" href="zip_source_close.html">zip_source_close(3)</a>, + <a class="Xr" href="zip_source_read.html">zip_source_read(3)</a>, + <a class="Xr" href="zip_source_seek.html">zip_source_seek(3)</a>, + <a class="Xr" href="zip_source_tell.html">zip_source_tell(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_open</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_open.man b/3rdparty/libzip/man/zip_source_open.man new file mode 100644 index 0000000000..dc337baf63 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_open.mdoc b/3rdparty/libzip/man/zip_source_open.mdoc new file mode 100644 index 0000000000..00371f64f0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_read.html b/3rdparty/libzip/man/zip_source_read.html new file mode 100644 index 0000000000..1269a42e69 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_read.html @@ -0,0 +1,112 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_source_read.mdoc -- read data from 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_READ(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_READ(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_READ(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_read</code> — +<div class="Nd">read data from zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_source_read</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">void + *data</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + len</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_read</code>() reads up to + <var class="Ar">len</var> bytes of data from <var class="Ar">source</var> at + the current read offset into the buffer <var class="Ar">data</var>. +<p class="Pp">The zip source <var class="Ar">source</var> has to be opened for + reading by calling + <a class="Xr" href="zip_source_open.html">zip_source_open(3)</a> first.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion the number of bytes read is returned. Upon reading + end-of-file, zero is returned. Otherwise, -1 is returned and the error + information in <var class="Ar">source</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_seek.html">zip_source_seek(3)</a>, + <a class="Xr" href="zip_source_tell.html">zip_source_tell(3)</a>, + <a class="Xr" href="zip_source_write.html">zip_source_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_read</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_read.man b/3rdparty/libzip/man/zip_source_read.man new file mode 100644 index 0000000000..78ea1bf334 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_read.man @@ -0,0 +1,83 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_read.mdoc -- read data from 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "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 <zip.h>\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. +Upon reading end-of-file, zero 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/3rdparty/libzip/man/zip_source_read.mdoc b/3rdparty/libzip/man/zip_source_read.mdoc new file mode 100644 index 0000000000..1e7bc02d0b --- /dev/null +++ b/3rdparty/libzip/man/zip_source_read.mdoc @@ -0,0 +1,78 @@ +.\" zip_source_read.mdoc -- read data from 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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. +Upon reading end-of-file, zero 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/3rdparty/libzip/man/zip_source_rollback_write.html b/3rdparty/libzip/man/zip_source_rollback_write.html new file mode 100644 index 0000000000..9ba26954c7 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_rollback_write.html @@ -0,0 +1,110 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zip_source_rollback_write.mdoc -- undo 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_ROLLBACK_WRITE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_ROLLBACK_WRITE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_ROLLBACK_WRITE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_rollback_write</code> — +<div class="Nd">undo changes to zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_source_rollback_write</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_rollback_write</code>() reverts changes + written to <var class="Fa">source</var>, restoring the data before + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a> + was called. Usually this removes temporary files or frees buffers. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a>, + <a class="Xr" href="zip_source_commit_write.html">zip_source_commit_write(3)</a>, + <a class="Xr" href="zip_source_seek_write.html">zip_source_seek_write(3)</a>, + <a class="Xr" href="zip_source_tell_write.html">zip_source_tell_write(3)</a>, + <a class="Xr" href="zip_source_write.html">zip_source_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_rollback_write</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_rollback_write.man b/3rdparty/libzip/man/zip_source_rollback_write.man new file mode 100644 index 0000000000..1665dbe96d --- /dev/null +++ b/3rdparty/libzip/man/zip_source_rollback_write.man @@ -0,0 +1,78 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_rollback_write.mdoc -- undo 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "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 <zip.h>\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 "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_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/3rdparty/libzip/man/zip_source_rollback_write.mdoc b/3rdparty/libzip/man/zip_source_rollback_write.mdoc new file mode 100644 index 0000000000..50a2a603b3 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_rollback_write.mdoc @@ -0,0 +1,73 @@ +.\" zip_source_rollback_write.mdoc -- undo 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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_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 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_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/3rdparty/libzip/man/zip_source_seek.html b/3rdparty/libzip/man/zip_source_seek.html new file mode 100644 index 0000000000..6fad803004 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_seek.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_SEEK(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_SEEK(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_SEEK(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_seek</code> — +<div class="Nd">set read offset in zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_seek</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + offset</var>, <var class="Fa" style="white-space: nowrap;">int + whence</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_seek</code>() sets the current read + offset for <var class="Fa">source</var>. Just like in + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html">fseek(3)</a>, depending on the + <var class="Ar">whence</var> argument, the <var class="Ar">offset</var> is + counted relative from: +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#SEEK_SET"><code class="Dv" id="SEEK_SET">SEEK_SET</code></a></dt> + <dd>start of file</dd> + <dt><a class="permalink" href="#SEEK_CUR"><code class="Dv" id="SEEK_CUR">SEEK_CUR</code></a></dt> + <dd>current read offset in file</dd> + <dt><a class="permalink" href="#SEEK_END"><code class="Dv" id="SEEK_END">SEEK_END</code></a></dt> + <dd>end of file</dd> +</dl> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_read.html">zip_source_read(3)</a>, + <a class="Xr" href="zip_source_tell.html">zip_source_tell(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_seek</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_seek.man b/3rdparty/libzip/man/zip_source_seek.man new file mode 100644 index 0000000000..399597ed9c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_seek.mdoc b/3rdparty/libzip/man/zip_source_seek.mdoc new file mode 100644 index 0000000000..6518ba7007 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_seek_compute_offset.html b/3rdparty/libzip/man/zip_source_seek_compute_offset.html new file mode 100644 index 0000000000..15fee4545b --- /dev/null +++ b/3rdparty/libzip/man/zip_source_seek_compute_offset.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_SEEK_COMPUTE_OFFSET(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_SEEK_COMPUTE_OFFSET(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_SEEK_COMPUTE_OFFSET(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_seek_compute_offset</code> — +<div class="Nd">validate arguments and compute offset</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_source_seek_compute_offset</code>(<var class="Fa" style="white-space: nowrap;">zip_uint64_t + offset</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + length</var>, <var class="Fa" style="white-space: nowrap;">void *data</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint64_t data_length</var>, + <var class="Fa" style="white-space: nowrap;">zip_error_t *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +Use this function to compute the offset for a + <code class="Dv">ZIP_SOURCE_SEEK</code> or + <code class="Dv">ZIP_SOURCE_SEEK_WRITE</code> command. + <var class="Ar">data</var> and <var class="Ar">data_length</var> are the + arguments to the source callback, <var class="Ar">offset</var> is the current + offset and <var class="Ar">length</var> is the length of the source data or, + for <code class="Dv">ZIP_SOURCE_SEEK_WRITE</code>, the amount of data written. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +On success, it returns the new offset, on error it returns -1 and sets + <var class="Ar">error</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_seek_compute_offset</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd>One of the arguments is invalid or the seek would place the offset outside + the data.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="zip_source_function.html">zip_source_function(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_seek_compute_offset</code>() was added in libzip + 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_seek_compute_offset.man b/3rdparty/libzip/man/zip_source_seek_compute_offset.man new file mode 100644 index 0000000000..a1b1cc13d4 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_seek_compute_offset.mdoc b/3rdparty/libzip/man/zip_source_seek_compute_offset.mdoc new file mode 100644 index 0000000000..bcf159a839 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_seek_write.html b/3rdparty/libzip/man/zip_source_seek_write.html new file mode 100644 index 0000000000..76eb2669ec --- /dev/null +++ b/3rdparty/libzip/man/zip_source_seek_write.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_SEEK_WRITE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_SEEK_WRITE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_SEEK_WRITE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_seek_write</code> — +<div class="Nd">set write offset in zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_seek_write</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + offset</var>, <var class="Fa" style="white-space: nowrap;">int + whence</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_seek_write</code>() sets the current + write offset for <var class="Fa">source</var>. Just like in + <a class="Xr" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html">fseek(3)</a>, depending on the + <var class="Ar">whence</var> argument, the <var class="Ar">offset</var> is + counted relative from: +<div class="Bd-indent"> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#SEEK_SET"><code class="Dv" id="SEEK_SET">SEEK_SET</code></a></dt> + <dd>start of file</dd> + <dt><a class="permalink" href="#SEEK_CUR"><code class="Dv" id="SEEK_CUR">SEEK_CUR</code></a></dt> + <dd>current write offset in file</dd> + <dt><a class="permalink" href="#SEEK_END"><code class="Dv" id="SEEK_END">SEEK_END</code></a></dt> + <dd>end of file</dd> +</dl> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a>, + <a class="Xr" href="zip_source_commit_write.html">zip_source_commit_write(3)</a>, + <a class="Xr" href="zip_source_rollback_write.html">zip_source_rollback_write(3)</a>, + <a class="Xr" href="zip_source_tell_write.html">zip_source_tell_write(3)</a>, + <a class="Xr" href="zip_source_write.html">zip_source_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_seek_write</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_seek_write.man b/3rdparty/libzip/man/zip_source_seek_write.man new file mode 100644 index 0000000000..567588d421 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_seek_write.mdoc b/3rdparty/libzip/man/zip_source_seek_write.mdoc new file mode 100644 index 0000000000..fac0159398 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_stat.html b/3rdparty/libzip/man/zip_source_stat.html new file mode 100644 index 0000000000..9e1cb4fe56 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_stat.html @@ -0,0 +1,154 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_STAT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_STAT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_STAT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_stat</code> — +<div class="Nd">get information about zip_source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_source_stat</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_stat_t + *sb</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_source_stat</code>() function obtains information about + the zip source <var class="Ar">source</var> +<p class="Pp">The <var class="Ar">sb</var> argument is a pointer to a + <var class="Ft">struct zip_source_stat</var> (shown below), into which + information about the zip source is placed.</p> +<div class="Bd Pp"> +<pre> +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 */ +}; +</pre> +</div> +The structure pointed to by <var class="Ar">sb</var> must be initialized with + <code class="Fn">zip_stat_init</code>(<var class="Fa">3</var>) before calling + <code class="Fn">zip_source_stat</code>(). +<p class="Pp">The <var class="Ar">valid</var> field of the structure specifies + which other fields are valid. Check if the flag defined by the following + defines are in <var class="Ar">valid</var> before accessing the fields:</p> +<div class="Bd-indent"> +<dl class="Bl-tag Bl-compact"> + <dt><a class="permalink" href="#ZIP_STAT_NAME"><code class="Dv" id="ZIP_STAT_NAME">ZIP_STAT_NAME</code></a></dt> + <dd><var class="Ar">name</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_INDEX"><code class="Dv" id="ZIP_STAT_INDEX">ZIP_STAT_INDEX</code></a></dt> + <dd><var class="Ar">index</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_SIZE"><code class="Dv" id="ZIP_STAT_SIZE">ZIP_STAT_SIZE</code></a></dt> + <dd><var class="Ar">size</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_COMP_SIZE"><code class="Dv" id="ZIP_STAT_COMP_SIZE">ZIP_STAT_COMP_SIZE</code></a></dt> + <dd><var class="Ar">comp_size</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_MTIME"><code class="Dv" id="ZIP_STAT_MTIME">ZIP_STAT_MTIME</code></a></dt> + <dd><var class="Ar">mtime</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_CRC"><code class="Dv" id="ZIP_STAT_CRC">ZIP_STAT_CRC</code></a></dt> + <dd><var class="Ar">crc</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_COMP_METHOD"><code class="Dv" id="ZIP_STAT_COMP_METHOD">ZIP_STAT_COMP_METHOD</code></a></dt> + <dd><var class="Ar">comp_method</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_ENCRYPTION_METHOD"><code class="Dv" id="ZIP_STAT_ENCRYPTION_METHOD">ZIP_STAT_ENCRYPTION_METHOD</code></a></dt> + <dd><var class="Ar">encryption_method</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_FLAGS"><code class="Dv" id="ZIP_STAT_FLAGS">ZIP_STAT_FLAGS</code></a></dt> + <dd><var class="Ar">flags</var></dd> +</dl> +</div> +<p class="Pp"><i class="Em">NOTE</i>: Some fields may only be filled out after + all data has been read from the source, for example the + <var class="Ar">crc</var> or <var class="Ar">size</var> fields.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">source</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_stat</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_stat.man b/3rdparty/libzip/man/zip_source_stat.man new file mode 100644 index 0000000000..598b22ffce --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_stat.mdoc b/3rdparty/libzip/man/zip_source_stat.mdoc new file mode 100644 index 0000000000..b5916a8b5e --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_tell.html b/3rdparty/libzip/man/zip_source_tell.html new file mode 100644 index 0000000000..4668d5bc40 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_tell.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_TELL(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_TELL(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_TELL(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_tell</code> — +<div class="Nd">report current read offset in zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_source_tell</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_tell</code>() returns the current read + offset for <var class="Fa">source</var>. The return value can be passed to + <a class="Xr" href="zip_source_seek.html">zip_source_seek(3)</a> with + <var class="Ar">whence</var> set to <code class="Dv">SEEK_SET</code> to return + to the same location in the source. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion the current read offset is returned. Otherwise, -1 is + returned and the error information in <var class="Ar">source</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_read.html">zip_source_read(3)</a>, + <a class="Xr" href="zip_source_tell_write.html">zip_source_tell_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_tell</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_tell.man b/3rdparty/libzip/man/zip_source_tell.man new file mode 100644 index 0000000000..088ec861d6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_tell.mdoc b/3rdparty/libzip/man/zip_source_tell.mdoc new file mode 100644 index 0000000000..e8249184bd --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_tell_write.html b/3rdparty/libzip/man/zip_source_tell_write.html new file mode 100644 index 0000000000..3c6f9082bb --- /dev/null +++ b/3rdparty/libzip/man/zip_source_tell_write.html @@ -0,0 +1,112 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_TELL_WRITE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_TELL_WRITE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_TELL_WRITE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_tell_write</code> — +<div class="Nd">report current write offset in zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_source_tell_write</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_tell_write</code>() returns the current + write offset for <var class="Fa">source</var>. The return value can be passed + to + <a class="Xr" href="zip_source_seek_write.html">zip_source_seek_write(3)</a> + with <var class="Ar">whence</var> set to <code class="Dv">SEEK_SET</code> to + return to the same location in the source. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion the current write offset is returned. Otherwise, -1 + is returned and the error information in <var class="Ar">source</var> is set + to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a>, + <a class="Xr" href="zip_source_commit_write.html">zip_source_commit_write(3)</a>, + <a class="Xr" href="zip_source_rollback_write.html">zip_source_rollback_write(3)</a>, + <a class="Xr" href="zip_source_tell.html">zip_source_tell(3)</a>, + <a class="Xr" href="zip_source_write.html">zip_source_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_tell_write</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_tell_write.man b/3rdparty/libzip/man/zip_source_tell_write.man new file mode 100644 index 0000000000..4208e5cc56 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_tell_write.mdoc b/3rdparty/libzip/man/zip_source_tell_write.mdoc new file mode 100644 index 0000000000..00fc3b1c7c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_win32a.html b/3rdparty/libzip/man/zip_source_win32a.html new file mode 100644 index 0000000000..44dd02bf4c --- /dev/null +++ b/3rdparty/libzip/man/zip_source_win32a.html @@ -0,0 +1,143 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_WIN32A(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_WIN32A(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_WIN32A(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_win32a</code>, + <code class="Nm">zip_source_win32a_create</code> — +<div class="Nd">create data source from a Windows ANSI file name</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_win32a</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_win32a_create</code>(<var class="Fa" style="white-space: nowrap;">const + char *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_win32a</code>() and + <code class="Fn">zip_source_win32a_create</code>() create a zip source on + Windows using a Windows ANSI name. They open <var class="Ar">fname</var> and + read <var class="Ar">len</var> bytes from offset <var class="Ar">start</var> + from it. If <var class="Ar">len</var> is 0 or -1, the whole file (starting + from <var class="Ar">start</var>) is used. +<p class="Pp">If the file supports seek, the source can be used to open a zip + archive from.</p> +<p class="Pp">The file is opened and read when the data from the source is used, + usually by <code class="Fn">zip_close</code>() or + <code class="Fn">zip_open_from_source</code>().</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_win32a</code>() and + <code class="Fn">zip_source_win32a_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">fname</var>, <var class="Ar">start</var>, or + <var class="Ar">len</var> are invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_OPEN"><code class="Er" id="ZIP_ER_OPEN">ZIP_ER_OPEN</code></a>]</dt> + <dd>Opening <var class="Ar">fname</var> failed.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_win32handle.html">zip_source_win32handle(3)</a>, + <a class="Xr" href="zip_source_win32w.html">zip_source_win32w(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_win32a</code>() and + <code class="Fn">zip_source_win32a_create</code>() were added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_win32a.man b/3rdparty/libzip/man/zip_source_win32a.man new file mode 100644 index 0000000000..c6144d35c0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_win32a.mdoc b/3rdparty/libzip/man/zip_source_win32a.mdoc new file mode 100644 index 0000000000..557ae7d36a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_win32handle.html b/3rdparty/libzip/man/zip_source_win32handle.html new file mode 100644 index 0000000000..41c8f2c0cc --- /dev/null +++ b/3rdparty/libzip/man/zip_source_win32handle.html @@ -0,0 +1,143 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_WIN32HANDLE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_WIN32HANDLE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_WIN32HANDLE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_win32handle</code>, + <code class="Nm">zip_source_win32handle_create</code> — +<div class="Nd">create data source from a Windows file handle</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_win32handle</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">HANDLE h</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint64_t start</var>, + <var class="Fa" style="white-space: nowrap;">zip_int64_t len</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_win32handle_create</code>(<var class="Fa" style="white-space: nowrap;">HANDLE + h</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_win32handle</code>() and + <code class="Fn">zip_source_win32handle_create</code>() create a zip source + from a Windows file handle. They open <var class="Ar">fname</var> and read + <var class="Ar">len</var> bytes from offset <var class="Ar">start</var> from + it. If <var class="Ar">len</var> is 0 or -1, the whole file (starting from + <var class="Ar">start</var>) is used. +<p class="Pp">If the file supports seek, the source can be used to open a zip + archive from.</p> +<p class="Pp">The file is opened and read when the data from the source is used, + usually by <code class="Fn">zip_close</code>() or + <code class="Fn">zip_open_from_source</code>().</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_w32handle</code>() and + <code class="Fn">zip_source_w32handle_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">fname</var>, <var class="Ar">start</var>, or + <var class="Ar">len</var> are invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_OPEN"><code class="Er" id="ZIP_ER_OPEN">ZIP_ER_OPEN</code></a>]</dt> + <dd>Opening <var class="Ar">fname</var> failed.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_win32a.html">zip_source_win32a(3)</a>, + <a class="Xr" href="zip_source_win32w.html">zip_source_win32w(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_win32handle</code>() and + <code class="Fn">zip_source_win32handle_create</code>() were added in libzip + 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_win32handle.man b/3rdparty/libzip/man/zip_source_win32handle.man new file mode 100644 index 0000000000..b014a7ba25 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_win32handle.mdoc b/3rdparty/libzip/man/zip_source_win32handle.mdoc new file mode 100644 index 0000000000..ab01543502 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_win32w.html b/3rdparty/libzip/man/zip_source_win32w.html new file mode 100644 index 0000000000..f2e1189337 --- /dev/null +++ b/3rdparty/libzip/man/zip_source_win32w.html @@ -0,0 +1,142 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_WIN32W(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_WIN32W(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_WIN32W(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_win32w</code>, + <code class="Nm">zip_source_win32w_create</code> — +<div class="Nd">create data source from a Windows Unicode file name</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_win32w</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const wchar_t + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_win32w_create</code>(<var class="Fa" style="white-space: nowrap;">const + wchar_t *fname</var>, + <var class="Fa" style="white-space: nowrap;">zip_uint64_t start</var>, + <var class="Fa" style="white-space: nowrap;">zip_int64_t len</var>, + <var class="Fa" style="white-space: nowrap;">zip_error_t *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_win32w</code>() and + <code class="Fn">zip_source_win32w_create</code>() create a zip source on + Windows using a Windows Unicode name. They open <var class="Ar">fname</var> + and read <var class="Ar">len</var> bytes from offset + <var class="Ar">start</var> from it. If <var class="Ar">len</var> is 0 or -1, + the whole file (starting from <var class="Ar">start</var>) is used. +<p class="Pp">If the file supports seek, the source can be used to open a zip + archive from.</p> +<p class="Pp">The file is opened and read when the data from the source is used, + usually by <code class="Fn">zip_close</code>() or + <code class="Fn">zip_open_from_source</code>().</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_win32w</code>() and + <code class="Fn">zip_source_win32w_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">fname</var>, <var class="Ar">start</var>, or + <var class="Ar">len</var> are invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_OPEN"><code class="Er" id="ZIP_ER_OPEN">ZIP_ER_OPEN</code></a>]</dt> + <dd>Opening <var class="Ar">fname</var> failed.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_win32a.html">zip_source_win32a(3)</a>, + <a class="Xr" href="zip_source_win32handle.html">zip_source_win32handle(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_win32w</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">June 22, 2018</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_win32w.man b/3rdparty/libzip/man/zip_source_win32w.man new file mode 100644 index 0000000000..e1241fc40a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_win32w.mdoc b/3rdparty/libzip/man/zip_source_win32w.mdoc new file mode 100644 index 0000000000..904760bcb3 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_window.html b/3rdparty/libzip/man/zip_source_window.html new file mode 100644 index 0000000000..aa38ca7ece --- /dev/null +++ b/3rdparty/libzip/man/zip_source_window.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_WINDOW(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_WINDOW(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_WINDOW(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_window_create</code> — +<div class="Nd">create zip data source overlay</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_window_create</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_source_window_create</code>() function create a zip + source from an underlying zip source, restricting access to a particular + window starting at byte <var class="Ar">start</var> and having size + <var class="Ar">len</var>. If <var class="Ar">len</var> is -1, the window + spans to the end of the underlying source. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">error</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_window_create</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">src</var> is <code class="Dv">NULL</code>; there is an + integer overflow adding <var class="Ar">start</var> and + <var class="Ar">len</var>; or <var class="Ar">len</var> is less than + -1.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_window_create</code>() was added in libzip 1.8.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 29, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_window.man b/3rdparty/libzip/man/zip_source_window.man new file mode 100644 index 0000000000..8b53ac8f86 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_window.mdoc b/3rdparty/libzip/man/zip_source_window.mdoc new file mode 100644 index 0000000000..a6c952478c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_write.html b/3rdparty/libzip/man/zip_source_write.html new file mode 100644 index 0000000000..88749bce8e --- /dev/null +++ b/3rdparty/libzip/man/zip_source_write.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_WRITE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_WRITE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_WRITE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_write</code> — +<div class="Nd">write data to zip source</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_int64_t</var> + <br/> + <code class="Fn">zip_source_write</code>(<var class="Fa" style="white-space: nowrap;">zip_source_t + *source</var>, <var class="Fa" style="white-space: nowrap;">const void + *data</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + len</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The function <code class="Fn">zip_source_write</code>() writes + <var class="Ar">len</var> bytes from the buffer <var class="Ar">data</var> to + the zip source <var class="Ar">source</var> at the current write offset. +<p class="Pp">The zip source <var class="Ar">source</var> has to be prepared for + writing by calling + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a> + first.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion the number of bytes written is returned. Otherwise, + -1 is returned and the error information in <var class="Ar">source</var> is + set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a>, + <a class="Xr" href="zip_source_begin_write.html">zip_source_begin_write(3)</a>, + <a class="Xr" href="zip_source_commit_write.html">zip_source_commit_write(3)</a>, + <a class="Xr" href="zip_source_rollback_write.html">zip_source_rollback_write(3)</a>, + <a class="Xr" href="zip_source_seek_write.html">zip_source_seek_write(3)</a>, + <a class="Xr" href="zip_source_tell_write.html">zip_source_tell_write(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_write</code>() was added in libzip 1.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_write.man b/3rdparty/libzip/man/zip_source_write.man new file mode 100644 index 0000000000..58d808ee20 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_write.mdoc b/3rdparty/libzip/man/zip_source_write.mdoc new file mode 100644 index 0000000000..00836b0348 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_source_zip.html b/3rdparty/libzip/man/zip_source_zip.html new file mode 100644 index 0000000000..067e72576f --- /dev/null +++ b/3rdparty/libzip/man/zip_source_zip.html @@ -0,0 +1,157 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_SOURCE_ZIP(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_SOURCE_ZIP(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_SOURCE_ZIP(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_source_zip</code>, + <code class="Nm">zip_source_zip_create</code> — +<div class="Nd">create data source from zip file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_zip</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_t + *srcarchive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + srcidx</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>);</p> +<p class="Pp"><var class="Ft">zip_source_t *</var> + <br/> + <code class="Fn">zip_source_zip_create</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *srcarchive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + srcidx</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + start</var>, <var class="Fa" style="white-space: nowrap;">zip_int64_t + len</var>, <var class="Fa" style="white-space: nowrap;">zip_error_t + *error</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The functions <code class="Fn">zip_source_zip</code>() and + <code class="Fn">zip_source_zip_create</code>() create a zip source from a + file in a zip archive. The <var class="Ar">srcarchive</var> argument is the + (open) zip archive containing the source zip file at index + <var class="Ar">srcidx</var>. <var class="Ar">len</var> bytes from offset + <var class="Ar">start</var> will be used in the zip_source. If + <var class="Ar">len</var> is 0 or -1, the rest of the file, starting from + <var class="Ar">start</var>, is used. If <var class="Ar">start</var> is zero + and <var class="Ar">len</var> is -1, the whole file will be copied without + decompressing it. +<p class="Pp">Supported flags are:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#ZIP_FL_UNCHANGED"><code class="Dv" id="ZIP_FL_UNCHANGED">ZIP_FL_UNCHANGED</code></a></dt> + <dd>Try to get the original data without any changes that may have been made + to <var class="Ar">srcarchive</var> after opening it.</dd> + <dt><a class="permalink" href="#ZIP_FL_RECOMPRESS"><code class="Dv" id="ZIP_FL_RECOMPRESS">ZIP_FL_RECOMPRESS</code></a></dt> + <dd>When adding the data from <var class="Ar">srcarchive</var>, re-compress it + using the current settings instead of copying the compressed data.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion, the created source is returned. Otherwise, + <code class="Dv">NULL</code> is returned and the error code in + <var class="Ar">archive</var> or <var class="Ar">error</var> is set to + indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_source_zip</code>() and + <code class="Fn">zip_source_zip_create</code>() fail if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_CHANGED"><code class="Er" id="ZIP_ER_CHANGED">ZIP_ER_CHANGED</code></a>]</dt> + <dd>Unchanged data was requested, but it is not available.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">srcarchive</var>, <var class="Ar">srcidx</var>, + <var class="Ar">start</var>, or <var class="Ar">len</var> are + invalid.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_MEMORY"><code class="Er" id="ZIP_ER_MEMORY">ZIP_ER_MEMORY</code></a>]</dt> + <dd>Required memory could not be allocated.</dd> +</dl> +Additionally, it can return all error codes from + <code class="Fn">zip_stat_index</code>() and + <code class="Fn">zip_fopen_index</code>(). +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_file_add.html">zip_file_add(3)</a>, + <a class="Xr" href="zip_file_replace.html">zip_file_replace(3)</a>, + <a class="Xr" href="zip_source.html">zip_source(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_source_zip</code>() was added in libzip 1.0. + <code class="Fn">zip_source_zip_create</code>() was added in libzip 1.8.0. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">April 4, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_source_zip.man b/3rdparty/libzip/man/zip_source_zip.man new file mode 100644 index 0000000000..14f1b24d27 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_source_zip.mdoc b/3rdparty/libzip/man/zip_source_zip.mdoc new file mode 100644 index 0000000000..27f33451b6 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_stat.html b/3rdparty/libzip/man/zip_stat.html new file mode 100644 index 0000000000..699c78f64b --- /dev/null +++ b/3rdparty/libzip/man/zip_stat.html @@ -0,0 +1,190 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_STAT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_STAT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_STAT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_stat</code>, <code class="Nm">zip_stat_index</code> + — +<div class="Nd">get information about file</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_stat</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">const char + *fname</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">zip_stat_t + *sb</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_stat_index</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>, <var class="Fa" style="white-space: nowrap;">zip_flags_t + flags</var>, <var class="Fa" style="white-space: nowrap;">zip_stat_t + *sb</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_stat</code>() function obtains information about the + file named <var class="Ar">fname</var> in <var class="Ar">archive</var>. The + <var class="Ar">flags</var> argument specifies how the name lookup should be + done. Its values are described in + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a>. Also, + <code class="Dv">ZIP_FL_UNCHANGED</code> may be + <i class="Em">or</i><span class="No">'ed</span> to it to request information + about the original file in the archive, ignoring any changes made. +<p class="Pp">The <code class="Fn">zip_stat_index</code>() function obtains + information about the file at position <var class="Ar">index</var>.</p> +<p class="Pp">The <var class="Ar">sb</var> argument is a pointer to a + <var class="Ft">struct zip_stat</var> (shown below), into which information + about the file is placed.</p> +<div class="Bd Pp"> +<pre> +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 */ +}; +</pre> +</div> +The structure pointed to by <var class="Ar">sb</var> must be allocated before + calling <code class="Fn">zip_stat</code>() or + <code class="Fn">zip_stat_index</code>(). +<p class="Pp">The <var class="Ar">valid</var> field of the structure specifies + which other fields are valid. Check if the flag defined by the following + defines are in <var class="Ar">valid</var> before accessing the fields:</p> +<div class="Bd-indent"> +<dl class="Bl-tag Bl-compact"> + <dt><a class="permalink" href="#ZIP_STAT_NAME"><code class="Dv" id="ZIP_STAT_NAME">ZIP_STAT_NAME</code></a></dt> + <dd><var class="Ar">name</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_INDEX"><code class="Dv" id="ZIP_STAT_INDEX">ZIP_STAT_INDEX</code></a></dt> + <dd><var class="Ar">index</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_SIZE"><code class="Dv" id="ZIP_STAT_SIZE">ZIP_STAT_SIZE</code></a></dt> + <dd><var class="Ar">size</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_COMP_SIZE"><code class="Dv" id="ZIP_STAT_COMP_SIZE">ZIP_STAT_COMP_SIZE</code></a></dt> + <dd><var class="Ar">comp_size</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_MTIME"><code class="Dv" id="ZIP_STAT_MTIME">ZIP_STAT_MTIME</code></a></dt> + <dd><var class="Ar">mtime</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_CRC"><code class="Dv" id="ZIP_STAT_CRC">ZIP_STAT_CRC</code></a></dt> + <dd><var class="Ar">crc</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_COMP_METHOD"><code class="Dv" id="ZIP_STAT_COMP_METHOD">ZIP_STAT_COMP_METHOD</code></a></dt> + <dd><var class="Ar">comp_method</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_ENCRYPTION_METHOD"><code class="Dv" id="ZIP_STAT_ENCRYPTION_METHOD">ZIP_STAT_ENCRYPTION_METHOD</code></a></dt> + <dd><var class="Ar">encryption_method</var></dd> + <dt><a class="permalink" href="#ZIP_STAT_FLAGS"><code class="Dv" id="ZIP_STAT_FLAGS">ZIP_STAT_FLAGS</code></a></dt> + <dd><var class="Ar">flags</var></dd> +</dl> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error information in <var class="Ar">archive</var> is set to indicate the + error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +The function <code class="Fn">zip_stat</code>() can fail for any of the errors + specified for the routine + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a>. +<p class="Pp">The function <code class="Fn">zip_stat_index</code>() fails and + sets the error information to <code class="Er">ZIP_ER_INVAL</code> if + <var class="Ar">index</var> is invalid. If + <code class="Dv">ZIP_FL_UNCHANGED</code> is not set and no information can + be obtained from the source callback, the error information is set to + <code class="Er">ZIP_ER_CHANGED</code>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_get_num_entries.html">zip_get_num_entries(3)</a>, + <a class="Xr" href="zip_name_locate.html">zip_name_locate(3)</a>, + <a class="Xr" href="zip_stat_init.html">zip_stat_init(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_stat</code>() was added in libzip 0.6. In libzip 0.11 the + type of <var class="Ar">flags</var> was changed from <var class="Vt">int</var> + to <var class="Vt">zip_flags_t</var>. +<p class="Pp"><code class="Fn">zip_stat_index</code>() was added in libzip 0.6. + In libzip 0.10 the type of <var class="Ar">index</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint64_t</var>. In libzip + 0.11 the type of <var class="Ar">flags</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_flags_t</var>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_stat.man b/3rdparty/libzip/man/zip_stat.man new file mode 100644 index 0000000000..93b6fdd5cb --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_stat.mdoc b/3rdparty/libzip/man/zip_stat.mdoc new file mode 100644 index 0000000000..4d5661ef4c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_stat_init.html b/3rdparty/libzip/man/zip_stat_init.html new file mode 100644 index 0000000000..99b36dee22 --- /dev/null +++ b/3rdparty/libzip/man/zip_stat_init.html @@ -0,0 +1,109 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_STAT_INIT(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_STAT_INIT(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_STAT_INIT(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_stat_init</code> — +<div class="Nd">initialize zip_stat structure</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">zip_stat_init</code>(<var class="Fa" style="white-space: nowrap;">zip_stat_t + *sb</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +The <code class="Fn">zip_stat_init</code>() function initializes the members of + a struct zip_stat. The current members are described in + <a class="Xr" href="zip_stat.html">zip_stat(3)</a>, but this function should + be used to initialize it to make sure none are missed. The structure pointed + to by <var class="Ar">sb</var> must be allocated before calling + <code class="Fn">zip_stat_init</code>(). +<p class="Pp">This function should be used by functions provided to + <a class="Xr" href="zip_source_function.html">zip_source_function(3)</a> + when returning <code class="Dv">ZIP_SOURCE_STAT</code> information to make + sure all fields are initialized.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +If <var class="Ar">sb</var> is valid, the function is always successful. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_stat.html">zip_stat(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_stat_init</code>() was added in libzip 0.8. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_stat_init.man b/3rdparty/libzip/man/zip_stat_init.man new file mode 100644 index 0000000000..75f3ea9b4d --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_stat_init.mdoc b/3rdparty/libzip/man/zip_stat_init.mdoc new file mode 100644 index 0000000000..0d464a6149 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_unchange.html b/3rdparty/libzip/man/zip_unchange.html new file mode 100644 index 0000000000..671abede58 --- /dev/null +++ b/3rdparty/libzip/man/zip_unchange.html @@ -0,0 +1,116 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_UNCHANGE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_UNCHANGE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_UNCHANGE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_unchange</code> — +<div class="Nd">undo changes to file in zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_unchange</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>, <var class="Fa" style="white-space: nowrap;">zip_uint64_t + index</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +Changes to the file at position <var class="Ar">index</var> are reverted. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="ERRORS"><a class="permalink" href="#ERRORS">ERRORS</a></h1> +<code class="Fn">zip_unchange</code>() fails if: +<dl class="Bl-tag"> + <dt>[<a class="permalink" href="#ZIP_ER_EXISTS"><code class="Er" id="ZIP_ER_EXISTS">ZIP_ER_EXISTS</code></a>]</dt> + <dd>Unchanging the name would result in a duplicate name in the archive.</dd> + <dt>[<a class="permalink" href="#ZIP_ER_INVAL"><code class="Er" id="ZIP_ER_INVAL">ZIP_ER_INVAL</code></a>]</dt> + <dd><var class="Ar">index</var> is not a valid file index in + <var class="Ar">zip</var>.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_unchange_all.html">zip_unchange_all(3)</a>, + <a class="Xr" href="zip_unchange_archive.html">zip_unchange_archive(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_unchange</code>() was added in libzip 0.6. In libzip 0.10 + the type of <var class="Ar">index</var> was changed from + <var class="Vt">int</var> to <var class="Vt">zip_uint64_t</var>. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_unchange.man b/3rdparty/libzip/man/zip_unchange.man new file mode 100644 index 0000000000..c7ec25f55d --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_unchange.mdoc b/3rdparty/libzip/man/zip_unchange.mdoc new file mode 100644 index 0000000000..6bde36bb5a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_unchange_all.html b/3rdparty/libzip/man/zip_unchange_all.html new file mode 100644 index 0000000000..ab94a0038f --- /dev/null +++ b/3rdparty/libzip/man/zip_unchange_all.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_UNCHANGE_ALL(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_UNCHANGE_ALL(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_UNCHANGE_ALL(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_unchange_all</code> — +<div class="Nd">undo all changes in a zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_unchange_all</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +All changes to files and global information in <var class="Ar">archive</var> are + reverted. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_unchange.html">zip_unchange(3)</a>, + <a class="Xr" href="zip_unchange_archive.html">zip_unchange_archive(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_unchange_all</code>() was added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_unchange_all.man b/3rdparty/libzip/man/zip_unchange_all.man new file mode 100644 index 0000000000..4fcbee3205 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_unchange_all.mdoc b/3rdparty/libzip/man/zip_unchange_all.mdoc new file mode 100644 index 0000000000..b676eb557a --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zip_unchange_archive.html b/3rdparty/libzip/man/zip_unchange_archive.html new file mode 100644 index 0000000000..f40ea4edcd --- /dev/null +++ b/3rdparty/libzip/man/zip_unchange_archive.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIP_UNCHANGE_ARCHIVE(3)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIP_UNCHANGE_ARCHIVE(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ZIP_UNCHANGE_ARCHIVE(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zip_unchange_archive</code> — +<div class="Nd">undo global changes to zip archive</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1> +libzip (-lzip) +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<code class="In">#include <<a class="In">zip.h</a>></code> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">zip_unchange_archive</code>(<var class="Fa" style="white-space: nowrap;">zip_t + *archive</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +Revert all global changes to the archive <var class="Ar">archive</var>. This + reverts changes to the archive comment and global flags. +</section> +<section class="Sh"> +<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN + VALUES</a></h1> +Upon successful completion 0 is returned. Otherwise, -1 is returned and the + error code in <var class="Ar">archive</var> is set to indicate the error. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="libzip.html">libzip(3)</a>, + <a class="Xr" href="zip_unchange.html">zip_unchange(3)</a>, + <a class="Xr" href="zip_unchange_all.html">zip_unchange_all(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Fn">zip_unchange_archive</code>() was added in libzip 0.7. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zip_unchange_archive.man b/3rdparty/libzip/man/zip_unchange_archive.man new file mode 100644 index 0000000000..430eafc00c --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 <zip.h>\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/3rdparty/libzip/man/zip_unchange_archive.mdoc b/3rdparty/libzip/man/zip_unchange_archive.mdoc new file mode 100644 index 0000000000..b3b3d3f1ad --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/man/zipcmp.html b/3rdparty/libzip/man/zipcmp.html new file mode 100644 index 0000000000..9c341dae34 --- /dev/null +++ b/3rdparty/libzip/man/zipcmp.html @@ -0,0 +1,126 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zipcmp.mdoc -- compare zip archives + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIPCMP(1)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIPCMP(1)</td> + <td class="head-vol">General Commands Manual</td> + <td class="head-rtitle">ZIPCMP(1)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zipcmp</code> — +<div class="Nd">compare contents of zip archives</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<table class="Nm"> + <tr> + <td><code class="Nm">zipcmp</code></td> + <td>[<code class="Fl">-ChipqtVv</code>] <var class="Ar">archive1 + archive2</var></td> + </tr> +</table> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Nm">zipcmp</code> compares the zip archives or directories + <var class="Ar">archive1</var> and <var class="Ar">archive2</var> and checks + if they contain the same files, comparing their names, uncompressed sizes, and + CRCs. File order and compressed size differences are ignored. +<p class="Pp">Supported options:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#C"><code class="Fl" id="C">-C</code></a></dt> + <dd>Check consistency of archives. Results in an error if archive is + inconsistent or not valid according to the zip specification.</dd> + <dt><a class="permalink" href="#h"><code class="Fl" id="h">-h</code></a></dt> + <dd>Display a short help message and exit.</dd> + <dt><a class="permalink" href="#i"><code class="Fl" id="i">-i</code></a></dt> + <dd>Compare names ignoring case distinctions.</dd> + <dt><a class="permalink" href="#p"><code class="Fl" id="p">-p</code></a></dt> + <dd>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.</dd> + <dt><a class="permalink" href="#q"><code class="Fl" id="q">-q</code></a></dt> + <dd>Quiet mode. Compare <code class="Fl">-v</code>.</dd> + <dt><a class="permalink" href="#t"><code class="Fl" id="t">-t</code></a></dt> + <dd>Test zip files by comparing the contents to their checksums.</dd> + <dt><a class="permalink" href="#V"><code class="Fl" id="V">-V</code></a></dt> + <dd>Display version information and exit.</dd> + <dt><a class="permalink" href="#v"><code class="Fl" id="v">-v</code></a></dt> + <dd>Verbose mode. Print details about differences to stdout. (This is the + default.)</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="EXIT_STATUS"><a class="permalink" href="#EXIT_STATUS">EXIT + STATUS</a></h1> +<code class="Nm">zipcmp</code> exits 0 if the two archives contain the same + files, 1 if they differ, and >1 if an error occurred. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="zipmerge.html">zipmerge(1)</a>, + <a class="Xr" href="ziptool.html">ziptool(1)</a>, + <a class="Xr" href="libzip.html">libzip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Nm">zipcmp</code> was added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">March 17, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zipcmp.man b/3rdparty/libzip/man/zipcmp.man new file mode 100644 index 0000000000..a5a8b1ba9b --- /dev/null +++ b/3rdparty/libzip/man/zipcmp.man @@ -0,0 +1,102 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zipcmp.mdoc -- compare zip archives +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 17, 2021" "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\-ChipqtVv\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\-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/3rdparty/libzip/man/zipcmp.mdoc b/3rdparty/libzip/man/zipcmp.mdoc new file mode 100644 index 0000000000..d1b151301f --- /dev/null +++ b/3rdparty/libzip/man/zipcmp.mdoc @@ -0,0 +1,95 @@ +.\" zipcmp.mdoc -- compare zip archives +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 17, 2021 +.Dt ZIPCMP 1 +.Os +.Sh NAME +.Nm zipcmp +.Nd compare contents of zip archives +.Sh SYNOPSIS +.Nm +.Op Fl ChipqtVv +.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 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/3rdparty/libzip/man/zipmerge.html b/3rdparty/libzip/man/zipmerge.html new file mode 100644 index 0000000000..86651b3d68 --- /dev/null +++ b/3rdparty/libzip/man/zipmerge.html @@ -0,0 +1,132 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + zipmerge.mdoc -- 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIPMERGE(1)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIPMERGE(1)</td> + <td class="head-vol">General Commands Manual</td> + <td class="head-rtitle">ZIPMERGE(1)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">zipmerge</code> — +<div class="Nd">merge zip archives</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<table class="Nm"> + <tr> + <td><code class="Nm">zipmerge</code></td> + <td>[<code class="Fl">-DhIiSsV</code>] <var class="Ar">target-zip</var> + <var class="Ar">source-zip</var> [<var class="Ar">source-zip + ...</var>]</td> + </tr> +</table> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Nm">zipmerge</code> merges the source zip archives + <var class="Ar">source-zip</var> into the target zip archive + <var class="Ar">target-zip</var>. By default, files in the source zip archives + overwrite existing files of the same name in the target zip archive. +<p class="Pp">Supported options:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#D"><code class="Fl" id="D">-D</code></a></dt> + <dd>Ignore directory components in file name comparisons. This option is slow + for archives with many files.</dd> + <dt><a class="permalink" href="#h"><code class="Fl" id="h">-h</code></a></dt> + <dd>Display a short help message and exit.</dd> + <dt><a class="permalink" href="#I"><code class="Fl" id="I">-I</code></a></dt> + <dd>Ignore case in file name comparisons This option is slow for archives with + many files.</dd> + <dt><a class="permalink" href="#i"><code class="Fl" id="i">-i</code></a></dt> + <dd>Ask before overwriting files. See also <code class="Fl">-s</code>.</dd> + <dt><a class="permalink" href="#S"><code class="Fl" id="S">-S</code></a></dt> + <dd>Do not overwrite files that have the same size and CRC32 in both the + source and target archives.</dd> + <dt><a class="permalink" href="#s"><code class="Fl" id="s">-s</code></a></dt> + <dd>When <code class="Fl">-i</code> is given, do not before overwriting files + that have the same size and CRC32.</dd> + <dt><a class="permalink" href="#V"><code class="Fl" id="V">-V</code></a></dt> + <dd>Display version information and exit.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="EXIT_STATUS"><a class="permalink" href="#EXIT_STATUS">EXIT + STATUS</a></h1> +<code class="Nm">zipmerge</code> exits 0 on success and >1 if an error + occurred. +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="zipcmp.html">zipcmp(1)</a>, + <a class="Xr" href="ziptool.html">ziptool(1)</a>, + <a class="Xr" href="libzip.html">libzip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Nm">zipmerge</code> was added in libzip 0.6. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +<section class="Sh"> +<h1 class="Sh" id="CAVEATS"><a class="permalink" href="#CAVEATS">CAVEATS</a></h1> +<code class="Nm">zipmerge</code> 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 <code class="Nm">zipmerge</code> multiple + times with e.g. 1000 source zip archives each time. +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">March 17, 2021</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/zipmerge.man b/3rdparty/libzip/man/zipmerge.man new file mode 100644 index 0000000000..31f8e582ed --- /dev/null +++ b/3rdparty/libzip/man/zipmerge.man @@ -0,0 +1,104 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zipmerge.mdoc -- 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "March 17, 2021" "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\-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 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/3rdparty/libzip/man/zipmerge.mdoc b/3rdparty/libzip/man/zipmerge.mdoc new file mode 100644 index 0000000000..1325f8cf86 --- /dev/null +++ b/3rdparty/libzip/man/zipmerge.mdoc @@ -0,0 +1,98 @@ +.\" zipmerge.mdoc -- 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 17, 2021 +.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 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 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/3rdparty/libzip/man/ziptool.html b/3rdparty/libzip/man/ziptool.html new file mode 100644 index 0000000000..b5fd2b12e2 --- /dev/null +++ b/3rdparty/libzip/man/ziptool.html @@ -0,0 +1,315 @@ +<!DOCTYPE html> +<html> +<!-- This is an automatically generated file. Do not edit. + ziptool.mdoc -- modify zip archives in multiple ways + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --> +<head> + <meta charset="utf-8"/> + <link rel="stylesheet" href="../nih-man.css" type="text/css" media="all"/> + <title>ZIPTOOL(1)</title> +</head> +<body> +<table class="head"> + <tr> + <td class="head-ltitle">ZIPTOOL(1)</td> + <td class="head-vol">General Commands Manual</td> + <td class="head-rtitle">ZIPTOOL(1)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<code class="Nm">ziptool</code> — +<div class="Nd">modify zip archives</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<table class="Nm"> + <tr> + <td><code class="Nm">ziptool</code></td> + <td>[<code class="Fl">-ceghnrst</code>] [<code class="Fl">-l</code> + <var class="Ar">length</var>] [<code class="Fl">-o</code> + <var class="Ar">offset</var>] <var class="Ar">zip-archive</var> + <code class="Cm">command</code> [<var class="Ar">command-args ...</var>] + [<code class="Cm">command</code> [<var class="Ar">command-args ...</var>] + ...]</td> + </tr> +</table> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<code class="Nm">ziptool</code> modifies the zip archive + <var class="Ar">zip-archive</var> according to the + <var class="Ar">commands</var> given. +<p class="Pp">Supported options:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#c"><code class="Fl" id="c">-c</code></a></dt> + <dd>Check zip archive consistency when opening it.</dd> + <dt><a class="permalink" href="#e"><code class="Fl" id="e">-e</code></a></dt> + <dd>Error if archive already exists (only useful with + <code class="Fl">-n</code>).</dd> + <dt><a class="permalink" href="#g"><code class="Fl" id="g">-g</code></a></dt> + <dd>Guess file name encoding (for <code class="Cm">stat</code> command).</dd> + <dt><a class="permalink" href="#h"><code class="Fl" id="h">-h</code></a></dt> + <dd>Display help.</dd> + <dt><a class="permalink" href="#l"><code class="Fl" id="l">-l</code></a> + <var class="Ar">length</var></dt> + <dd>Only read <var class="Ar">length</var> bytes of archive. See also + <code class="Fl">-o</code>.</dd> + <dt><a class="permalink" href="#n"><code class="Fl" id="n">-n</code></a></dt> + <dd>Create archive if it doesn't exist. See also + <code class="Fl">-e</code>.</dd> + <dt><a class="permalink" href="#o"><code class="Fl" id="o">-o</code></a> + <var class="Ar">offset</var></dt> + <dd>Start reading input archive from <var class="Ar">offset</var>. See also + <code class="Fl">-l</code>.</dd> + <dt><a class="permalink" href="#r"><code class="Fl" id="r">-r</code></a></dt> + <dd>Print raw file name encoding without translation (for + <code class="Cm">stat</code> command).</dd> + <dt><a class="permalink" href="#s"><code class="Fl" id="s">-s</code></a></dt> + <dd>Follow file name convention strictly (for <code class="Cm">stat</code> + command).</dd> + <dt><a class="permalink" href="#t"><code class="Fl" id="t">-t</code></a></dt> + <dd>Disregard current file contents, if any. <i class="Em">Note</i>: use this + with care, it deletes all existing file contents when you modify the + archive.</dd> +</dl> +<section class="Ss"> +<h2 class="Ss" id="Commands"><a class="permalink" href="#Commands">Commands</a></h2> +For all commands below, the index is zero-based. In other words, the first entry + in the zip archive has index 0. +<p class="Pp">Supported commands and arguments are:</p> +<dl class="Bl-tag"> + <dt><a class="permalink" href="#add"><code class="Cm" id="add">add</code></a> + <var class="Ar">name content</var></dt> + <dd>Add file called <var class="Ar">name</var> using the string + <var class="Ar">content</var> from the command line as data.</dd> + <dt><a class="permalink" href="#add_dir"><code class="Cm" id="add_dir">add_dir</code></a> + <var class="Ar">name</var></dt> + <dd>Add directory <var class="Ar">name</var>.</dd> + <dt><a class="permalink" href="#add_file"><code class="Cm" id="add_file">add_file</code></a> + <var class="Ar">name file_to_add offset len</var></dt> + <dd>Add file <var class="Ar">name</var> to archive, using + <var class="Ar">len</var> bytes from the file + <var class="Ar">file_to_add</var> as input data, starting at + <var class="Ar">offset</var>.</dd> + <dt><a class="permalink" href="#add_from_zip"><code class="Cm" id="add_from_zip">add_from_zip</code></a> + <var class="Ar">name archivename index offset len</var></dt> + <dd>Add file called <var class="Ar">name</var> to archive using data from + another zip archive <var class="Ar">archivename</var> using the entry with + index <var class="Ar">index</var> and reading <var class="Ar">len</var> + bytes from <var class="Ar">offset</var>.</dd> + <dt><a class="permalink" href="#cat"><code class="Cm" id="cat">cat</code></a> + <var class="Ar">index</var></dt> + <dd>Output file contents for entry <var class="Ar">index</var> to stdout.</dd> + <dt><a class="permalink" href="#count_extra"><code class="Cm" id="count_extra">count_extra</code></a> + <var class="Ar">index flags</var></dt> + <dd>Print the number of extra fields for archive entry + <var class="Ar">index</var> using <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#count_extra_by_id"><code class="Cm" id="count_extra_by_id">count_extra_by_id</code></a> + <var class="Ar">index extra_id flags</var></dt> + <dd>Print number of extra fields of type <var class="Ar">extra_id</var> for + archive entry <var class="Ar">index</var> using + <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#delete"><code class="Cm" id="delete">delete</code></a> + <var class="Ar">index</var></dt> + <dd>Remove entry at <var class="Ar">index</var> from zip archive.</dd> + <dt><a class="permalink" href="#delete_extra"><code class="Cm" id="delete_extra">delete_extra</code></a> + <var class="Ar">index extra_idx flags</var></dt> + <dd>Remove extra field number <var class="Ar">extra_idx</var> from archive + entry <var class="Ar">index</var> using <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#delete_extra_by_id"><code class="Cm" id="delete_extra_by_id">delete_extra_by_id</code></a> + <var class="Ar">index extra_id extra_index flags</var></dt> + <dd>Remove extra field number <var class="Ar">extra_index</var> of type + <var class="Ar">extra_id</var> from archive entry + <var class="Ar">index</var> using <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#get_archive_comment"><code class="Cm" id="get_archive_comment">get_archive_comment</code></a></dt> + <dd>Print archive comment.</dd> + <dt><a class="permalink" href="#get_extra"><code class="Cm" id="get_extra">get_extra</code></a> + <var class="Ar">index extra_index flags</var></dt> + <dd>Print extra field <var class="Ar">extra_index</var> for archive entry + <var class="Ar">index</var> using <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#get_extra_by_id"><code class="Cm" id="get_extra_by_id">get_extra_by_id</code></a> + <var class="Ar">index extra_id extra_index flags</var></dt> + <dd>Print extra field <var class="Ar">extra_index</var> of type + <var class="Ar">extra_id</var> for archive entry + <var class="Ar">index</var> using <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#get_file_comment"><code class="Cm" id="get_file_comment">get_file_comment</code></a> + <var class="Ar">index</var></dt> + <dd>Get file comment for archive entry <var class="Ar">index</var>.</dd> + <dt><a class="permalink" href="#get_num_entries"><code class="Cm" id="get_num_entries">get_num_entries</code></a> + <var class="Ar">flags</var></dt> + <dd>Print number of entries in archive using <var class="Ar">flags</var>.</dd> + <dt><a class="permalink" href="#name_locate"><code class="Cm" id="name_locate">name_locate</code></a> + <var class="Ar">name flags</var></dt> + <dd>Find entry in archive with the filename <var class="Ar">name</var> using + <var class="Ar">flags</var> and print its index.</dd> + <dt><a class="permalink" href="#rename"><code class="Cm" id="rename">rename</code></a> + <var class="Ar">index name</var></dt> + <dd>Rename archive entry <var class="Ar">index</var> to + <var class="Ar">name</var>.</dd> + <dt><a class="permalink" href="#replace_file_contents"><code class="Cm" id="replace_file_contents">replace_file_contents</code></a> + <var class="Ar">index data</var></dt> + <dd>Replace file contents for archive entry <var class="Ar">index</var> with + the string <var class="Ar">data</var>.</dd> + <dt><a class="permalink" href="#set_archive_comment"><code class="Cm" id="set_archive_comment">set_archive_comment</code></a> + <var class="Ar">comment</var></dt> + <dd>Set archive comment to <var class="Ar">comment</var>.</dd> + <dt><a class="permalink" href="#set_extra"><code class="Cm" id="set_extra">set_extra</code></a> + <var class="Ar">index extra_id extra_index flags value</var></dt> + <dd>Set extra field number <var class="Ar">extra_index</var> of type + <var class="Ar">extra_id</var> for archive entry + <var class="Ar">index</var> using <var class="Ar">flags</var> to + <var class="Ar">value</var>.</dd> + <dt><a class="permalink" href="#set_file_comment"><code class="Cm" id="set_file_comment">set_file_comment</code></a> + <var class="Ar">index comment</var></dt> + <dd>Set file comment for archive entry <var class="Ar">index</var> to string + <var class="Ar">comment</var>.</dd> + <dt><a class="permalink" href="#set_file_compression"><code class="Cm" id="set_file_compression">set_file_compression</code></a> + <var class="Ar">index method compression_flags</var></dt> + <dd>Set file compression method for archive entry <var class="Ar">index</var> + to <var class="Ar">method</var> using + <var class="Ar">compression_flags</var>. <i class="Em">Note</i>: + Currently, <var class="Ar">compression_flags</var> are ignored.</dd> + <dt><a class="permalink" href="#set_file_encryption"><code class="Cm" id="set_file_encryption">set_file_encryption</code></a> + <var class="Ar">index method password</var></dt> + <dd>Set file encryption method for archive entry <var class="Ar">index</var> + to <var class="Ar">method</var> with password + <var class="Ar">password</var>.</dd> + <dt><a class="permalink" href="#set_file_mtime"><code class="Cm" id="set_file_mtime">set_file_mtime</code></a> + <var class="Ar">index timestamp</var></dt> + <dd>Set file modification time for archive entry <var class="Ar">index</var> + to UNIX mtime <var class="Ar">timestamp</var>.</dd> + <dt><a class="permalink" href="#set_file_mtime_all"><code class="Cm" id="set_file_mtime_all">set_file_mtime_all</code></a> + <var class="Ar">timestamp</var></dt> + <dd>Set file modification time for all archive entries to UNIX mtime + <var class="Ar">timestamp</var>.</dd> + <dt><a class="permalink" href="#set_password"><code class="Cm" id="set_password">set_password</code></a> + <var class="Ar">password</var></dt> + <dd>Set default password for encryption/decryption to + <var class="Ar">password</var>.</dd> + <dt><a class="permalink" href="#stat"><code class="Cm" id="stat">stat</code></a> + <var class="Ar">index</var></dt> + <dd>Print information about archive entry <var class="Ar">index</var>.</dd> +</dl> +</section> +<section class="Ss"> +<h2 class="Ss" id="Flags"><a class="permalink" href="#Flags">Flags</a></h2> +Some commands take flag arguments. Supported flags are: +<div class="Bd-indent"> +<dl class="Bl-tag Bl-compact"> + <dt><var class="Ar">C</var></dt> + <dd><a class="permalink" href="#ZIP_FL_NOCASE"><code class="Dv" id="ZIP_FL_NOCASE">ZIP_FL_NOCASE</code></a></dd> + <dt><var class="Ar">c</var></dt> + <dd><a class="permalink" href="#ZIP_FL_CENTRAL"><code class="Dv" id="ZIP_FL_CENTRAL">ZIP_FL_CENTRAL</code></a></dd> + <dt><var class="Ar">d</var></dt> + <dd><a class="permalink" href="#ZIP_FL_NODIR"><code class="Dv" id="ZIP_FL_NODIR">ZIP_FL_NODIR</code></a></dd> + <dt><var class="Ar">l</var></dt> + <dd><a class="permalink" href="#ZIP_FL_LOCAL"><code class="Dv" id="ZIP_FL_LOCAL">ZIP_FL_LOCAL</code></a></dd> + <dt><var class="Ar">u</var></dt> + <dd><a class="permalink" href="#ZIP_FL_UNCHANGED"><code class="Dv" id="ZIP_FL_UNCHANGED">ZIP_FL_UNCHANGED</code></a></dd> +</dl> +</div> +</section> +<section class="Ss"> +<h2 class="Ss" id="Compression_Methods"><a class="permalink" href="#Compression_Methods">Compression + Methods</a></h2> +Some commands take compression method arguments. Supported methods are: +<ul class="Bl-bullet Bd-indent Bl-compact"> + <li><a class="permalink" href="#default"><code class="Dv" id="default">default</code></a></li> + <li><a class="permalink" href="#deflate"><code class="Dv" id="deflate">deflate</code></a></li> + <li><a class="permalink" href="#store"><code class="Dv" id="store">store</code></a></li> +</ul> +</section> +<section class="Ss"> +<h2 class="Ss" id="Encryption_Methods"><a class="permalink" href="#Encryption_Methods">Encryption + Methods</a></h2> +Some commands take encryption method arguments. Supported methods are: +<ul class="Bl-bullet Bd-indent Bl-compact"> + <li><a class="permalink" href="#none"><code class="Dv" id="none">none</code></a></li> + <li><a class="permalink" href="#AES-128"><code class="Dv" id="AES-128">AES-128</code></a></li> + <li><a class="permalink" href="#AES-192"><code class="Dv" id="AES-192">AES-192</code></a></li> + <li><a class="permalink" href="#AES-256"><code class="Dv" id="AES-256">AES-256</code></a></li> +</ul> +</section> +</section> +<section class="Sh"> +<h1 class="Sh" id="EXIT_STATUS"><a class="permalink" href="#EXIT_STATUS">EXIT + STATUS</a></h1> +The <code class="Nm">ziptool</code> utility exits 0 on success, + and >0 if an error occurs. +</section> +<section class="Sh"> +<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1> +Add a file called <span class="Pa">teststring.txt</span> to the zip archive + <span class="Pa">testbuffer.zip</span> with data “This is a + test.\n” where “\n” is replaced with a newline character: +<div class="Bd Pp Bd-indent"> +<pre> +ziptool testbuffer.zip add teststring.txt \"This is a test.\n\" +</pre> +</div> +<p class="Pp">Delete the first file from the zip archive + <span class="Pa">testfile.zip</span>:</p> +<div class="Bd Pp Bd-indent"> +<pre> +ziptool testfile.zip delete 0 +</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<a class="Xr" href="zipcmp.html">zipcmp(1)</a>, + <a class="Xr" href="zipmerge.html">zipmerge(1)</a>, + <a class="Xr" href="libzip.html">libzip(3)</a> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<code class="Nm">ziptool</code> was added in libzip 1.1. +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<span class="An">Dieter Baron</span> + <<a class="Mt" href="mailto:dillo@nih.at">dillo@nih.at</a>> and + <span class="An">Thomas Klausner</span> + <<a class="Mt" href="mailto:tk@giga.or.at">tk@giga.or.at</a>> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">December 18, 2017</td> + <td class="foot-os">NiH</td> + </tr> +</table> +</body> +</html> diff --git a/3rdparty/libzip/man/ziptool.man b/3rdparty/libzip/man/ziptool.man new file mode 100644 index 0000000000..da9829aa78 --- /dev/null +++ b/3rdparty/libzip/man/ziptool.man @@ -0,0 +1,389 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" ziptool.mdoc -- modify zip archives in multiple ways +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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" "December 18, 2017" "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. +Supported flags are: +.RS 6n +.PD 0 +.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 +\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/3rdparty/libzip/man/ziptool.mdoc b/3rdparty/libzip/man/ziptool.mdoc new file mode 100644 index 0000000000..751eeb0c4a --- /dev/null +++ b/3rdparty/libzip/man/ziptool.mdoc @@ -0,0 +1,330 @@ +.\" ziptool.mdoc -- modify zip archives in multiple ways +.\" 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 <libzip@nih.at> +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (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 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. +Supported flags are: +.Bl -tag -width MMM -compact -offset indent +.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 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/3rdparty/libzip/regress/CMakeLists.txt b/3rdparty/libzip/regress/CMakeLists.txt new file mode 100644 index 0000000000..8f0bd29f04 --- /dev/null +++ b/3rdparty/libzip/regress/CMakeLists.txt @@ -0,0 +1,96 @@ +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 "$<TARGET_FILE_DIR:zip>;$ENV{PATH}") +if (TARGET zlib) + set(path "$<TARGET_FILE_DIR:zlib>;${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 $<CONFIG> ${PROJECT_SOURCE_DIR}/regress/${CASE}) + set_tests_properties(${CASE} PROPERTIES SKIP_RETURN_CODE 77) + set_tests_properties(${CASE} PROPERTIES ENVIRONMENT "PATH=${path}") +endforeach() + +add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) diff --git a/3rdparty/libzip/regress/NiHTest.pm b/3rdparty/libzip/regress/NiHTest.pm new file mode 100644 index 0000000000..752dbbf16a --- /dev/null +++ b/3rdparty/libzip/regress/NiHTest.pm @@ -0,0 +1,1415 @@ +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 <ckmame@nih.at> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (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{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; $i<scalar(@strs); $i++) { + my $val = $self->parse_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 = <TST>) { + $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/3rdparty/libzip/regress/add_dir.test b/3rdparty/libzip/regress/add_dir.test new file mode 100644 index 0000000000..b6a4d371c0 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_buffer.test b/3rdparty/libzip/regress/add_from_buffer.test new file mode 100644 index 0000000000..6963c58af5 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_file.test b/3rdparty/libzip/regress/add_from_file.test new file mode 100644 index 0000000000..4f97d27814 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_file_duplicate.test b/3rdparty/libzip/regress/add_from_file_duplicate.test new file mode 100644 index 0000000000..018b260a71 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_file_twice_duplicate.test b/3rdparty/libzip/regress/add_from_file_twice_duplicate.test new file mode 100644 index 0000000000..511c90b2f1 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_file_unchange.test b/3rdparty/libzip/regress/add_from_file_unchange.test new file mode 100644 index 0000000000..dff1c2f68e --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_filep.c b/3rdparty/libzip/regress/add_from_filep.c new file mode 100644 index 0000000000..53aec850c4 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <stdio.h> +#include <string.h> + +#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/3rdparty/libzip/regress/add_from_filep.test b/3rdparty/libzip/regress/add_from_filep.test new file mode 100644 index 0000000000..3a2a8cfe3e --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_stdin.test b/3rdparty/libzip/regress/add_from_stdin.test new file mode 100644 index 0000000000..07f6c4a3ce --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_zip_closed.test b/3rdparty/libzip/regress/add_from_zip_closed.test new file mode 100644 index 0000000000..4c52e56c3b --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_zip_deflated.test b/3rdparty/libzip/regress/add_from_zip_deflated.test new file mode 100644 index 0000000000..ecff27dd41 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_zip_deflated2.test b/3rdparty/libzip/regress/add_from_zip_deflated2.test new file mode 100644 index 0000000000..ad7b4b6043 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_zip_partial_deflated.test b/3rdparty/libzip/regress/add_from_zip_partial_deflated.test new file mode 100644 index 0000000000..69e95c6c85 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_zip_partial_stored.test b/3rdparty/libzip/regress/add_from_zip_partial_stored.test new file mode 100644 index 0000000000..41ebf21388 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_from_zip_stored.test b/3rdparty/libzip/regress/add_from_zip_stored.test new file mode 100644 index 0000000000..2fcbe80cc7 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_stored.test b/3rdparty/libzip/regress/add_stored.test new file mode 100644 index 0000000000..ea96f2532d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/add_stored_in_memory.test b/3rdparty/libzip/regress/add_stored_in_memory.test new file mode 100644 index 0000000000..50467c6e72 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/bigstored.zh b/3rdparty/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<#<FZp5JQIS=E}c8<)fD zhpW5WB6i9tY1L9+g*pNR2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkKcwE`&z z;HW%7b2iKQ0KYy>P9)f>R=47DdiD~X6sCJKb@w+Hqft&JNbec}0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBly@XrE^e1KFV;7|DgKRoB4SJY1GUsoWQZ!;O^w{PkZ zeBNj|17Ul<PfW(SzQH0Np@@w*P9Jk=gF&y+*smtGV}7QHS~WKBpQ`x0vsl;6L$6i* zvDbPdkJZwZ=jWg1SR+7y009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RpQKcn7pM BMp6I( literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/bigzero-zip.zip b/3rdparty/libzip/regress/bigzero-zip.zip new file mode 100644 index 0000000000000000000000000000000000000000..158cb6de22147d50603f20ac7c8868896ae6e365 GIT binary patch literal 10490 zcmeHNk53zQ6#urRn^*#i<Hw?mYG#mWK#7KJDqNl0BtxJo6Ag4s7q`?|3UeD3Sg(^s z6UHoxrb;n~PKFLcO{^;$g=1M55S_#lBx#|CbW$h7qbsaGxVx_<+<LmizrgQZE_ZqP zzL)pD-*?~leeZpg1(KLVAO?4VVcp4{B`1=)i!uPX(24;WNCmH}57xeMSesR=uG&)) z3nZm)8cOt$=crBwL@`GI01;*Y=BLPW5{jg}bla=jy!)Cs#m5KkRVj)ryV^cG&^q?~ z7tJp=UCPdSZ+&@B)tT(=9hXkayy=b|DeES`j;q|YIqo9Z-_ZEYj+ga^*!c9Cb;(aB z+{o12dMn8?)&JY$jA|n{Ys9$V9L8NHndMs)GeHK8J~=ZkhpZf4BjES=QZXE)O7R<9 z{yFS8+lfP4h{ZXqYth4KApu#ES;E4Sh^i}B#w3GNb5E=ZdN!E!L1L8%435*T!r?Op z>WAysZj)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@+<Y+~EeHX|-qO>|{?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(ubUJH<bdhsH*P zIcY2It$%R3&it-m#O1KspFEvJET2l_#VPH9zHUeIbi_}D728s|<pGUo_D(-h<=wN; zSNIPjUSqBA$QBw$*_{czxD5C5-cq%!s;K}IR_s2Tx%oWs)6OHpJf(TZvgEPI?U36c zw~PLYXtzVV9SX82$f6*N&UVpLCOX@plmev`D5XG|EXrh20VP^zKm`<3KtXjoRJTLr zVpJ}U=1Mf`QlKsc>QbQQ7;288o-Cg#D14|Vi+ZvM3V@&h2!VnSC<uYF8Ws&R|101V zZqsv`R<RY9mUAYOZGdvtGQLnVUcp?I<NnS7&JN*06Hakv7*2scj9n(#P25NY>oY=E z3mhVgC^&+_gYZv+J4IT!#j1}gbK~%U2@gdud(YxrJI1+aj<if+b}j+B2<XMbz2t5S z^kWR;9Szgm%~86GVF-f7Malw^I8E|jpu`RQ!36;8iIvZPK@_E{5XC#-iOK@$nw6oV O$o)d(-4a1K0`NCJ-~wm> literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/bogus.zip b/3rdparty/libzip/regress/bogus.zip new file mode 100644 index 0000000000..7e538b626d --- /dev/null +++ b/3rdparty/libzip/regress/bogus.zip @@ -0,0 +1 @@ +bogus data diff --git a/3rdparty/libzip/regress/broken.zip b/3rdparty/libzip/regress/broken.zip new file mode 100644 index 0000000000000000000000000000000000000000..2008c3244d97007f63d7f6be2e9a71d17a123bdb GIT binary patch literal 75091 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 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/buffer-fragment-read.test b/3rdparty/libzip/regress/buffer-fragment-read.test new file mode 100644 index 0000000000..1337560bd6 --- /dev/null +++ b/3rdparty/libzip/regress/buffer-fragment-read.test @@ -0,0 +1,5 @@ +# test reading from a buffer fragment source +return 0 +args -mF 1024 test.zip cat 1 +file test.zip cm-default.zip cm-default.zip +stdout uncompressable diff --git a/3rdparty/libzip/regress/buffer-fragment-write.test b/3rdparty/libzip/regress/buffer-fragment-write.test new file mode 100644 index 0000000000..f3ebc1e04a --- /dev/null +++ b/3rdparty/libzip/regress/buffer-fragment-write.test @@ -0,0 +1,4 @@ +# rename file inside zip archive +return 0 +args -mF 100 rename.zip rename 1 notfile2 +file rename.zip testcomment.zip rename_ok.zip diff --git a/3rdparty/libzip/regress/can_clone_file.c b/3rdparty/libzip/regress/can_clone_file.c new file mode 100644 index 0000000000..887947de5c --- /dev/null +++ b/3rdparty/libzip/regress/can_clone_file.c @@ -0,0 +1,127 @@ +/* + can_clone_file.c -- does the current filesystem support cloning + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#include "config.h" + +#ifdef HAVE_CLONEFILE +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <sys/attr.h> +#include <sys/mount.h> +#include <sys/param.h> +#include <unistd.h> +#elif defined(HAVE_FICLONERANGE) +#include <errno.h> +#include <linux/fs.h> +#include <stdio.h> +#include <string.h> +#include <sys/ioctl.h> +#include <unistd.h> +#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/3rdparty/libzip/regress/cancel_45.test b/3rdparty/libzip/regress/cancel_45.test new file mode 100644 index 0000000000..ad273d3448 --- /dev/null +++ b/3rdparty/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 compressable aaaaaaaaaaaaaa add uncompressable uncompressable add_nul large-compressable 8200 add_file large-uncompressable large-uncompressable 0 -1 +file large-uncompressable large-uncompressable large-uncompressable +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/3rdparty/libzip/regress/cancel_90.test b/3rdparty/libzip/regress/cancel_90.test new file mode 100644 index 0000000000..f4cf028444 --- /dev/null +++ b/3rdparty/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 compressable aaaaaaaaaaaaaa add uncompressable uncompressable add_nul large-compressable 8200 add_file large-uncompressable large-uncompressable 0 -1 +file large-uncompressable large-uncompressable large-uncompressable +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/3rdparty/libzip/regress/cleanup.cmake b/3rdparty/libzip/regress/cleanup.cmake new file mode 100644 index 0000000000..94fd13ffbe --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/clone-buffer-add.test b/3rdparty/libzip/regress/clone-buffer-add.test new file mode 100644 index 0000000000..c66791bff0 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/clone-buffer-delete.test b/3rdparty/libzip/regress/clone-buffer-delete.test new file mode 100644 index 0000000000..f7c987cb16 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/clone-buffer-replace.test b/3rdparty/libzip/regress/clone-buffer-replace.test new file mode 100644 index 0000000000..cb21f339fc --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/clone-fs-add.test b/3rdparty/libzip/regress/clone-fs-add.test new file mode 100644 index 0000000000..f187cb720b --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/clone-fs-delete.test b/3rdparty/libzip/regress/clone-fs-delete.test new file mode 100644 index 0000000000..aea602f994 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/clone-fs-replace.test b/3rdparty/libzip/regress/clone-fs-replace.test new file mode 100644 index 0000000000..3d3b8f360a --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/cm-default.test b/3rdparty/libzip/regress/cm-default.test new file mode 100644 index 0000000000..03e720050c --- /dev/null +++ b/3rdparty/libzip/regress/cm-default.test @@ -0,0 +1,5 @@ +# test default compression stores if smaller +return 0 +args -n test.zip add compressable aaaaaaaaaaaaaa add uncompressable uncompressable add_nul large-compressable 8200 add_file large-uncompressable large-uncompressable 0 -1 +file-new test.zip cm-default.zip +file large-uncompressable large-uncompressable large-uncompressable diff --git a/3rdparty/libzip/regress/cm-default.zip b/3rdparty/libzip/regress/cm-default.zip new file mode 100644 index 0000000000000000000000000000000000000000..3eba2a32cfcaafb1089233f8ed7f4aa23758c828 GIT binary patch literal 8702 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 X5C4DP01Ema73AOb^mo4|{-^t2dw+6V literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/count_entries.test b/3rdparty/libzip/regress/count_entries.test new file mode 100644 index 0000000000..564acdca51 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-correct-password-aes128.test b/3rdparty/libzip/regress/decrypt-correct-password-aes128.test new file mode 100644 index 0000000000..470ba30ffd --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-correct-password-aes192.test b/3rdparty/libzip/regress/decrypt-correct-password-aes192.test new file mode 100644 index 0000000000..a66dd16f82 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-correct-password-aes256.test b/3rdparty/libzip/regress/decrypt-correct-password-aes256.test new file mode 100644 index 0000000000..4eddea8a1d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-correct-password-pkware-2.test b/3rdparty/libzip/regress/decrypt-correct-password-pkware-2.test new file mode 100644 index 0000000000..24f43b54d4 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-correct-password-pkware.test b/3rdparty/libzip/regress/decrypt-correct-password-pkware.test new file mode 100644 index 0000000000..c126394582 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-no-password-aes256.test b/3rdparty/libzip/regress/decrypt-no-password-aes256.test new file mode 100644 index 0000000000..6140a42f79 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-wrong-password-aes128.test b/3rdparty/libzip/regress/decrypt-wrong-password-aes128.test new file mode 100644 index 0000000000..fa4b789e39 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-wrong-password-aes192.test b/3rdparty/libzip/regress/decrypt-wrong-password-aes192.test new file mode 100644 index 0000000000..f04d0da04c --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-wrong-password-aes256.test b/3rdparty/libzip/regress/decrypt-wrong-password-aes256.test new file mode 100644 index 0000000000..836b5b1a8d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-wrong-password-pkware-2.test b/3rdparty/libzip/regress/decrypt-wrong-password-pkware-2.test new file mode 100644 index 0000000000..fb1e66c8b4 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/decrypt-wrong-password-pkware.test b/3rdparty/libzip/regress/decrypt-wrong-password-pkware.test new file mode 100644 index 0000000000..02749557e4 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/delete_add_same.test b/3rdparty/libzip/regress/delete_add_same.test new file mode 100644 index 0000000000..54c0e5a732 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/delete_invalid.test b/3rdparty/libzip/regress/delete_invalid.test new file mode 100644 index 0000000000..9a06306bf0 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/delete_last.test b/3rdparty/libzip/regress/delete_last.test new file mode 100644 index 0000000000..3b415b50ed --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/delete_multiple_last.test b/3rdparty/libzip/regress/delete_multiple_last.test new file mode 100644 index 0000000000..71ac983543 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/delete_multiple_partial.test b/3rdparty/libzip/regress/delete_multiple_partial.test new file mode 100644 index 0000000000..272fab3cfe --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/delete_renamed_rename.test b/3rdparty/libzip/regress/delete_renamed_rename.test new file mode 100644 index 0000000000..e81996c41d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/encrypt-1234.zip b/3rdparty/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@|yX<H;XhraQ-QFW!kV| z_e5LMfb!Xezw%Gl-n@~RUwwSu9lO>3EIex$a!5XwF_>auu&4O>>YVw1<6iD;{du4- zP;|Yp-WGdrrT#fbUJEV}U({<YeSB?jacjr|xs8i0W@|bKaj#5ItC=dlYVA6yS)4i3 z;@RAe{GY$gyTw<(+cUtModenL0p5&Ea?H5GMFJQ?3=F^^Vp!4$Vj+hTD<qWALMXtS Rl?|kl5eNf-v=~S;0|04hiIe~U literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt-aes128-noentropy.zip b/3rdparty/libzip/regress/encrypt-aes128-noentropy.zip new file mode 100644 index 0000000000000000000000000000000000000000..01d5bc607b181bdcc9bdf7ba5b55d97b7d6de767 GIT binary patch literal 260 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xgc#05EtnR#G>D*&j_n1PWYnIRXb5GcnW2gD$) zoDAFysd>pol?5fKDU37O8JHLxT^T_tAi!r`-(Jg2kNw+^^Z!e}w|~ONJh9i`Uk7+I zGRZOHwi=`tWXP6A5DV-EkQRGp+>QV#1c7ahnm`hplLEY1L0$v8kcpubNLPY53;<s| BF&_W` literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt-aes128.zip b/3rdparty/libzip/regress/encrypt-aes128.zip new file mode 100644 index 0000000000000000000000000000000000000000..e48c3c93430b90533a27fb4586e004805911c367 GIT binary patch literal 260 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xgc#05EtnR#G>D*&iagn^MEnIRXb5GcnW2gD$) zoDAFysd>pol?5fKDU37O8JHLxT^Sh|YO5+7g^CYl%AT1ytG9HLZ~D@!ZBw2W$$Woh zxFFFwz?+dtjv2SrARB;&Fl=cAvA}KsX%S(@?Ff)U5ZKnJ2_&&ODZrZ*<TaoRnHWle JbR~$x002`RGC%+T literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt-aes192-noentropy.zip b/3rdparty/libzip/regress/encrypt-aes192-noentropy.zip new file mode 100644 index 0000000000000000000000000000000000000000..0a9ad4b3fa24c3d11fddc2001de3fcb2a380b373 GIT binary patch literal 264 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xgc#05EtnR#G>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/3rdparty/libzip/regress/encrypt-aes192.zip b/3rdparty/libzip/regress/encrypt-aes192.zip new file mode 100644 index 0000000000000000000000000000000000000000..98865ce41e14ece71c9b09122639604473b2abc5 GIT binary patch literal 316 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xiyAj43QlbD%TTEWf0$nt`jfq^9jC>|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/3rdparty/libzip/regress/encrypt-aes256-noentropy.zip b/3rdparty/libzip/regress/encrypt-aes256-noentropy.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3a6cad0193db4559ef5cdd96c6718cee6dbb318 GIT binary patch literal 268 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xgc#05EtnR#G>D*&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/3rdparty/libzip/regress/encrypt-aes256.zip b/3rdparty/libzip/regress/encrypt-aes256.zip new file mode 100644 index 0000000000000000000000000000000000000000..6349cb257fdeabbc3fbbd6051fde6c43dff3f191 GIT binary patch literal 320 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xiyAj43QlbD%TTEWf0$nt`jfq^9jC>|QZ$-un2 zvnm3F!3wwnfQE=LFft@F<N^%=s$ozAVvw<%4BQN<dC5hU1tqB|j5FC8m>3*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&<TFaQ8c Cwn7B} literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt-none.zip b/3rdparty/libzip/regress/encrypt-none.zip new file mode 100644 index 0000000000000000000000000000000000000000..c7ba696f5d9a8c5a8a967070404ee8413094faa7 GIT binary patch literal 218 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xgc#05EtnR#G>D*&!A7pO2auID#M8whg(acW+2 zQDs3%Y6_eI)WFCj$Bf%-pe_bRAl}jlVu39IX|acD!Db6cAqZ@1)C7`ns{*`PK@MhM N0>UgH9R=br005S+C<Xuk literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt-pkware-noentropy.zip b/3rdparty/libzip/regress/encrypt-pkware-noentropy.zip new file mode 100644 index 0000000000000000000000000000000000000000..e0c39a7ce77b84aba948e8a61153dad50de8fbee GIT binary patch literal 246 zcmWIWW@h1H0D+v<dR`ZPidwP(*&xgc#05EtnR#G>D*&iagn<(%m<v=G8rSn%49Es) z1&O8RB^Ol|l%%Fiy5wTZc45ZX8!MmRH@&6(nEP<XuE(tb-s~L6S^~TondF#p+Y2<2 uff0zeG=f-Q2Y|HLGvjsvNFfMpYt#giaQ6gwvw}RszyyR@K)MXXVE_OZ9W;;t literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt.test b/3rdparty/libzip/regress/encrypt.test new file mode 100644 index 0000000000..f9aad430c4 --- /dev/null +++ b/3rdparty/libzip/regress/encrypt.test @@ -0,0 +1,23 @@ +# test encryption support +# TODO: only checks recognition of encrypted entries for now. +return 0 +args encrypt.zzip stat 0 stat 1 +file encrypt.zzip encrypt.zip encrypt.zip +stdout name: 'encrypted' +stdout index: '0' +stdout size: '4' +stdout compressed size: '16' +stdout mtime: 'Mon Apr 24 2006 16:01:34' +stdout crc: '7e3265a8' +stdout compression method: '0' +stdout encryption method: '1' +stdout +stdout name: 'plain' +stdout index: '1' +stdout size: '4' +stdout compressed size: '4' +stdout mtime: 'Mon Apr 24 2006 16:01:42' +stdout crc: '7e3265a8' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/3rdparty/libzip/regress/encrypt.zip b/3rdparty/libzip/regress/encrypt.zip new file mode 100644 index 0000000000000000000000000000000000000000..e50aa385af35d6350cff9feab308fb6c4526cc59 GIT binary patch literal 306 zcmWIWW@h1H;ACK6Fl?A%vLe-}P5{Ve0b))DQHIpK<f6)glGK#Y5KabW+gm;^zCavW z!NQQjAi{8<QG3thZ%$KrdcV{uq$@NAc(ZdLn-Bmt8)y`RDb#F`xgg96G`k=tF*6Tr zt{c!y5QdqXmY>fR;LXS+&Wy`tydXmv7=d_6BZ!6MPF9FJLn{~<U}k_+V7dU=j2NH_ asC$6=A#MTbXJrHFWdgz$AUy-bVE_Q5yFH2k literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt_plus_extra.zip b/3rdparty/libzip/regress/encrypt_plus_extra.zip new file mode 100644 index 0000000000000000000000000000000000000000..6936865426ac6823e0f121d2fa7646736dde6ec7 GIT binary patch literal 348 zcmWIWW@h1H;ACK6Fl?A%vLe-}P5{Ve0b))DEr!&*<f6)glGK#Y5KabW+gm;^zCavW z!NQQjAi|)@DaepoQBstcmYJH9lANDclA2d?piz6z<8Mw=d3wLpDWoej26(e`AR8M1 zwh(AOgDKQPkYymu${@;6kdv612e!-&Xb}j*EKAGJ=L+y<WD;k_<y<9@p$v>byrdDt zLUKGS#POjO4A>nFGZ>@|(^<SAVW`1{Ko-=IKtmx8WMByJW@Q7ZVFJRLKzc2R!vFxN CQcS-9 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encrypt_plus_extra_modified_c.zip b/3rdparty/libzip/regress/encrypt_plus_extra_modified_c.zip new file mode 100644 index 0000000000000000000000000000000000000000..f50d6496e37e8089e0e1722e219b4963bcdce0fb GIT binary patch literal 332 zcmWIWW@h1HU}RumFl?A%vLe-}P5{Ve0b))DEr!&*<f6)glGK#Y5KabW+gm;^zCavW z!NQQjAi|)@DaepoQBstcmYJH9lANDclA2d?piz6z<8Mw=d3wLpDWoej27oO9n#W)Y zwE$!|2(vPXG8E(_X6AtncLN#>!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/3rdparty/libzip/regress/encrypt_plus_extra_modified_l.zip b/3rdparty/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!&*<f6)glGK#Y5KabW+gm;^zCavW z!NQQjAi|)@DahbjQBstcmYJH9lANDclA2d?piz6z<8Mw=d3wLpDWoej27oO9n#W)Y zwE$!|2(vPXG8E(_X6AtncLN#>!Z5?r^7FX@ycwCqnQ=K!31leP=}Q_xEF{OWLL3`f x!2ot-D!L<K27|O=I*S)13^h0r$bvc&Xeh*i3=9F@tZX1POh7mjNY4dv7yv@8N%Q~! literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/encryption-nonrandom-aes128.test b/3rdparty/libzip/regress/encryption-nonrandom-aes128.test new file mode 100644 index 0000000000..4fae471c10 --- /dev/null +++ b/3rdparty/libzip/regress/encryption-nonrandom-aes128.test @@ -0,0 +1,7 @@ +features CRYPTO +precheck ./liboverride-test +description encrypt file without entropy, to make results repeatable +return 0 +preload nonrandomopen.so +args encrypt.zzip set_file_encryption 1 AES-128 no-entropy +file encrypt.zzip encrypt-none.zip encrypt-aes128-noentropy.zip diff --git a/3rdparty/libzip/regress/encryption-nonrandom-aes192.test b/3rdparty/libzip/regress/encryption-nonrandom-aes192.test new file mode 100644 index 0000000000..7f0335ae79 --- /dev/null +++ b/3rdparty/libzip/regress/encryption-nonrandom-aes192.test @@ -0,0 +1,7 @@ +features CRYPTO +precheck ./liboverride-test +description encrypt file without entropy, to make results repeatable +return 0 +preload nonrandomopen.so +args encrypt.zzip set_file_encryption 1 AES-192 no-entropy +file encrypt.zzip encrypt-none.zip encrypt-aes192-noentropy.zip diff --git a/3rdparty/libzip/regress/encryption-nonrandom-aes256.test b/3rdparty/libzip/regress/encryption-nonrandom-aes256.test new file mode 100644 index 0000000000..9d8d6ace56 --- /dev/null +++ b/3rdparty/libzip/regress/encryption-nonrandom-aes256.test @@ -0,0 +1,7 @@ +features CRYPTO +precheck ./liboverride-test +description encrypt file without entropy, to make results repeatable +return 0 +preload nonrandomopen.so +args encrypt.zzip set_file_encryption 1 AES-256 no-entropy +file encrypt.zzip encrypt-none.zip encrypt-aes256-noentropy.zip diff --git a/3rdparty/libzip/regress/encryption-nonrandom-pkware.test b/3rdparty/libzip/regress/encryption-nonrandom-pkware.test new file mode 100644 index 0000000000..2d14e40440 --- /dev/null +++ b/3rdparty/libzip/regress/encryption-nonrandom-pkware.test @@ -0,0 +1,7 @@ +features CRYPTO +precheck ./liboverride-test +description encrypt file by Traditional PKWARE +return 0 +preload nonrandomopen.so +args encrypt.zzip set_file_encryption 1 PKWARE no-entropy +file encrypt.zzip encrypt-none.zip encrypt-pkware-noentropy.zip diff --git a/3rdparty/libzip/regress/encryption-remove.test b/3rdparty/libzip/regress/encryption-remove.test new file mode 100644 index 0000000000..207910085c --- /dev/null +++ b/3rdparty/libzip/regress/encryption-remove.test @@ -0,0 +1,5 @@ +# test AES decryption support, remove encryption from file that has it +features CRYPTO +return 0 +args encrypt.zzip set_password foofoofoo set_file_encryption 1 none "" +file encrypt.zzip encrypt-aes128.zip encrypt-none.zip diff --git a/3rdparty/libzip/regress/encryption-stat.test b/3rdparty/libzip/regress/encryption-stat.test new file mode 100644 index 0000000000..d84d8fcb7f --- /dev/null +++ b/3rdparty/libzip/regress/encryption-stat.test @@ -0,0 +1,23 @@ +features CRYPTO +description encrypt file, look at stat before commit +return 0 +args encrypt.zzip stat 1 set_file_encryption 1 AES-128 no-entropy stat 1 unchange_all +file encrypt.zzip encrypt-none.zip encrypt-none.zip +stdout name: 'encrypted' +stdout index: '1' +stdout size: '10' +stdout compressed size: '10' +stdout mtime: 'Sat Jan 14 2017 21:27:26' +stdout crc: 'fb8c5e55' +stdout compression method: '0' +stdout encryption method: '0' +stdout +stdout name: 'encrypted' +stdout index: '1' +stdout size: '10' +stdout compressed size: '10' +stdout mtime: 'Sat Jan 14 2017 21:27:26' +stdout crc: 'fb8c5e55' +stdout compression method: '0' +stdout encryption method: '257' +stdout diff --git a/3rdparty/libzip/regress/extra_add.test b/3rdparty/libzip/regress/extra_add.test new file mode 100644 index 0000000000..c2020f1bf4 --- /dev/null +++ b/3rdparty/libzip/regress/extra_add.test @@ -0,0 +1,7 @@ +# add extra field +#args encrypt.zip set_extra 0 2345 65535 cl extrafieldcontent +args encrypt.zip set_extra 0 2345 65535 cl extrafieldcontent get_extra_by_id 0 2345 0 c get_extra_by_id 0 2345 0 l +return 0 +file encrypt.zip encrypt.zip encrypt_plus_extra.zip +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 +stdout Extra field 0x0929: len 17, data 0x65787472616669656c64636f6e74656e74 diff --git a/3rdparty/libzip/regress/extra_add_multiple.test b/3rdparty/libzip/regress/extra_add_multiple.test new file mode 100644 index 0000000000..2623755984 --- /dev/null +++ b/3rdparty/libzip/regress/extra_add_multiple.test @@ -0,0 +1,8 @@ +# add extra fields +args testfile.zip set_extra 0 2345 65535 cl extra1 set_extra 0 2345 65535 cl extra2 set_extra 0 2345 0 c extra1c set_extra 0 2345 1 l extra2l get_extra_by_id 0 2345 0 c get_extra_by_id 0 2345 1 c get_extra_by_id 0 2345 0 l get_extra_by_id 0 2345 1 l +return 0 +file testfile.zip testfile.zip testfile-plus-extra.zip +stdout Extra field 0x0929: len 7, data 0x65787472613163 +stdout Extra field 0x0929: len 6, data 0x657874726132 +stdout Extra field 0x0929: len 6, data 0x657874726131 +stdout Extra field 0x0929: len 7, data 0x6578747261326c diff --git a/3rdparty/libzip/regress/extra_count.test b/3rdparty/libzip/regress/extra_count.test new file mode 100644 index 0000000000..7d80e02353 --- /dev/null +++ b/3rdparty/libzip/regress/extra_count.test @@ -0,0 +1,10 @@ +# count extra fields for index +args encrypt.zip count_extra 0 l count_extra 0 c count_extra 0 lc count_extra 1 l count_extra 1 c count_extra 1 lc +return 0 +file encrypt.zip encrypt.zip encrypt.zip +stdout Extra field count: 2 +stdout Extra field count: 2 +stdout Extra field count: 4 +stdout Extra field count: 2 +stdout Extra field count: 2 +stdout Extra field count: 4 diff --git a/3rdparty/libzip/regress/extra_count_by_id.test b/3rdparty/libzip/regress/extra_count_by_id.test new file mode 100644 index 0000000000..5029935d77 --- /dev/null +++ b/3rdparty/libzip/regress/extra_count_by_id.test @@ -0,0 +1,22 @@ +# count extra fields for index +args encrypt.zip count_extra_by_id 0 0 l count_extra_by_id 0 1 l count_extra_by_id 0 21589 l count_extra_by_id 0 30805 l count_extra_by_id 0 21844 l count_extra_by_id 0 12345 l count_extra_by_id 0 0 c count_extra_by_id 0 1 c count_extra_by_id 0 21589 c count_extra_by_id 0 30805 c count_extra_by_id 0 21844 c count_extra_by_id 0 12345 c count_extra_by_id 0 0 cl count_extra_by_id 0 1 cl count_extra_by_id 0 21589 cl count_extra_by_id 0 30805 cl count_extra_by_id 0 21844 cl count_extra_by_id 0 12345 cl +return 0 +file encrypt.zip encrypt.zip encrypt.zip +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 1 +stdout Extra field count: 1 +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 1 +stdout Extra field count: 1 +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 2 +stdout Extra field count: 2 +stdout Extra field count: 0 +stdout Extra field count: 0 diff --git a/3rdparty/libzip/regress/extra_count_ignore_zip64.test b/3rdparty/libzip/regress/extra_count_ignore_zip64.test new file mode 100644 index 0000000000..1766997fb1 --- /dev/null +++ b/3rdparty/libzip/regress/extra_count_ignore_zip64.test @@ -0,0 +1,7 @@ +# count extra fields for index +args bigzero.zip count_extra 0 l count_extra 0 c count_extra 0 lc +return 0 +file bigzero.zip bigzero.zip bigzero.zip +stdout Extra field count: 0 +stdout Extra field count: 0 +stdout Extra field count: 0 diff --git a/3rdparty/libzip/regress/extra_delete.test b/3rdparty/libzip/regress/extra_delete.test new file mode 100644 index 0000000000..9bccc9091e --- /dev/null +++ b/3rdparty/libzip/regress/extra_delete.test @@ -0,0 +1,14 @@ +# delete extra field by index +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 delete_extra 0 2 c delete_extra 0 0 l get_extra 0 0 c get_extra 0 1 c get_extra 0 0 l get_extra 0 1 l +file encrypt.zip encrypt_plus_extra.zip encrypt.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 0x5455: len 9, data 0x033dda4c444dda4c44 +stdout Extra field 0x7855: len 4, data 0x64001400 diff --git a/3rdparty/libzip/regress/extra_delete_by_id.test b/3rdparty/libzip/regress/extra_delete_by_id.test new file mode 100644 index 0000000000..4c8fa006f4 --- /dev/null +++ b/3rdparty/libzip/regress/extra_delete_by_id.test @@ -0,0 +1,6 @@ +# delete extra field by id and index +#args encrypt.zip set_extra 0 2345 65535 cl extrafieldcontent +args encrypt.zip delete_extra_by_id 0 2345 0 c delete_extra_by_id 0 2345 0 l get_extra_by_id 0 2345 0 c +return 1 +file encrypt.zip encrypt_plus_extra.zip encrypt.zip +stderr can't get extra field data for file at index 0, extra field id 2345, ef index 0, flags 512: No such file diff --git a/3rdparty/libzip/regress/extra_field_align.test b/3rdparty/libzip/regress/extra_field_align.test new file mode 100644 index 0000000000..3bb51c9511 --- /dev/null +++ b/3rdparty/libzip/regress/extra_field_align.test @@ -0,0 +1,32 @@ +# try opening simulated Android APK zipaligned files, and similar inconsistent files +setenv LANG C +program tryopen +file extra_field_align_1-0.zzip extra_field_align_1-0.zip extra_field_align_1-0.zip +file extra_field_align_1-ff.zzip extra_field_align_1-ff.zip extra_field_align_1-ff.zip +file extra_field_align_2-0.zzip extra_field_align_2-0.zip extra_field_align_2-0.zip +file extra_field_align_2-ff.zzip extra_field_align_2-ff.zip extra_field_align_2-ff.zip +file extra_field_align_3-0.zzip extra_field_align_3-0.zip extra_field_align_3-0.zip +file extra_field_align_3-ff.zzip extra_field_align_3-ff.zip extra_field_align_3-ff.zip +file extra_field_align_4-ff.zzip extra_field_align_4-ff.zip extra_field_align_4-ff.zip +file extra_field_align_1-ef_00.zzip extra_field_align_1-ef_00.zip extra_field_align_1-ef_00.zip +file extra_field_align_1-ef_ff.zzip extra_field_align_1-ef_ff.zip extra_field_align_1-ef_ff.zip +file extra_field_align_2-ef_00.zzip extra_field_align_2-ef_00.zip extra_field_align_2-ef_00.zip +file extra_field_align_2-ef_ff.zzip extra_field_align_2-ef_ff.zip extra_field_align_2-ef_ff.zip +file extra_field_align_3-ef_00.zzip extra_field_align_3-ef_00.zip extra_field_align_3-ef_00.zip +file extra_field_align_3-ef_ff.zzip extra_field_align_3-ef_ff.zip extra_field_align_3-ef_ff.zip +args -c extra_field_align_1-0.zzip extra_field_align_1-ff.zzip extra_field_align_2-0.zzip extra_field_align_2-ff.zzip extra_field_align_3-0.zzip extra_field_align_3-ff.zzip extra_field_align_4-ff.zzip extra_field_align_1-ef_00.zzip extra_field_align_1-ef_ff.zzip extra_field_align_2-ef_00.zzip extra_field_align_2-ef_ff.zzip extra_field_align_3-ef_00.zzip extra_field_align_3-ef_ff.zzip +return 1 +stdout opening 'extra_field_align_1-0.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_1-ff.zzip' returned error 21/15 +stdout opening 'extra_field_align_2-0.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_2-ff.zzip' returned error 21/15 +stdout opening 'extra_field_align_3-0.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_3-ff.zzip' returned error 21/15 +stdout opening 'extra_field_align_4-ff.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_1-ef_00.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_1-ef_ff.zzip' returned error 21/15 +stdout opening 'extra_field_align_2-ef_00.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_2-ef_ff.zzip' returned error 21/15 +stdout opening 'extra_field_align_3-ef_00.zzip' succeeded, 1 entries +stdout opening 'extra_field_align_3-ef_ff.zzip' returned error 21/15 +stderr 6 errors diff --git a/3rdparty/libzip/regress/extra_field_align_1-0.zip b/3rdparty/libzip/regress/extra_field_align_1-0.zip new file mode 100644 index 0000000000000000000000000000000000000000..11aaaace23735017774baf4e51cd6eec9cac79b9 GIT binary patch literal 110 zcmWIWW@h1H00E7aCLW6)Jf6)0WP>m>10#c>kueCH1b8zt$uZ+r2htA$TN*(mNLPS2 RD;tQ-2!uvJS`EZu006>b4pjgE literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/extra_field_align_1-ef_00.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_1-ef_ff.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_1-ff.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_2-0.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_2-ef_00.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_2-ef_ff.zip b/3rdparty/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&<aRvgE$NTiOd)u literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/extra_field_align_2-ff.zip b/3rdparty/libzip/regress/extra_field_align_2-ff.zip new file mode 100644 index 0000000000000000000000000000000000000000..7bf88a0539442e87fee15e730408a01adbf48258 GIT binary patch literal 110 zcmWIWW@h1H00E7aCLW6)Jf6)0WP>mh5E>dW{5Lc*HVN=%WRhdXtq!Cg1hzDSNRX}o SZ&o%Cn-K_&fV3Kj!vFvgw-4<A literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/extra_field_align_3-0.zip b/3rdparty/libzip/regress/extra_field_align_3-0.zip new file mode 100644 index 0000000000000000000000000000000000000000..401e7b060c6b12978bb04269bcd5d9ecfbe4d159 GIT binary patch literal 110 zcmWIWW@h1H00E7aCLW6)Jf6)0WP>mx12cmmkTx_jHVN=%WRhdXtq!OR47N0aD3GoI SZ&o%Cn-K_&fV3Kj!vFx8xDAT{ literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/extra_field_align_3-ef_00.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_3-ef_ff.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_3-ff.zip b/3rdparty/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/3rdparty/libzip/regress/extra_field_align_4-ff.zip b/3rdparty/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/3rdparty/libzip/regress/extra_get.test b/3rdparty/libzip/regress/extra_get.test new file mode 100644 index 0000000000..4f45887740 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/extra_get_by_id.test b/3rdparty/libzip/regress/extra_get_by_id.test new file mode 100644 index 0000000000..67f49671bd --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/extra_set.test b/3rdparty/libzip/regress/extra_set.test new file mode 100644 index 0000000000..ccdbdc9685 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/extra_set_modify_c.test b/3rdparty/libzip/regress/extra_set_modify_c.test new file mode 100644 index 0000000000..dca49f4362 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/extra_set_modify_l.test b/3rdparty/libzip/regress/extra_set_modify_l.test new file mode 100644 index 0000000000..4dda9b7ceb --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/fdopen_ok.test b/3rdparty/libzip/regress/fdopen_ok.test new file mode 100644 index 0000000000..ff478bb2b3 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/file_comment_encmismatch.test b/3rdparty/libzip/regress/file_comment_encmismatch.test new file mode 100644 index 0000000000..a2b8209463 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/filename_duplicate.zip b/3rdparty/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/3rdparty/libzip/regress/filename_duplicate_empty.zip b/3rdparty/libzip/regress/filename_duplicate_empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4af0d8455c52a12d7d31e57b70ca203d06cbbc6 GIT binary patch literal 186 zcmWIWW@h1H0D--8Z#YPsN7k?b*&qx8C8@<FhFk$~HM@aoZlsiiqpL9js$pc3W5#U~ m$TUVE-qHwSA*;q_CP)oLwF+1@E7(Cy3``6$K)we^ngIY*${P>> literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/filename_empty.zip b/3rdparty/libzip/regress/filename_empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..d32e4e72244cc30fef2055efc3491e713c3cc132 GIT binary patch literal 98 ycmWIWW@h1H0D<K#?~T9=BqG3@kx7mjw>(Vg-$oECz?+o~L^A@R9*~v;aToyfpa_5f literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/fileorder.zip b/3rdparty/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/3rdparty/libzip/regress/firstsecond-split-deflated.zip b/3rdparty/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/3rdparty/libzip/regress/firstsecond-split-stored.zip b/3rdparty/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*2<pQb! zVKyKxPEF3wOM#FO)r?GX%(%@4YGGgm;w_CJ7TA&iZ-f?XR)7>jwCDg?5UT>bSwXe~ Oy}-nf4y2<%90maOuqH47 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/firstsecond.zip b/3rdparty/libzip/regress/firstsecond.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9117e373a2be8412ad15233b69a4b3ea44ad6d3 GIT binary patch literal 318 zcmWIWW@Zs#U|`^22#cHJuwf!&gb<J?48+_(oR(QsTvD8xoS&ECeOgCLPt!w3OViKy z+<9-tjSK-`txQ<73NpwbYb`FxFG@`b4dG;9F4;TVAB0OQxEUB(UNAE-u%rO(!Dcuk zlN>W{mjN{~Faq(GMi2|hodMnujo95K0a6XsXpO27=1NwGE74pS;LXYg(#iyc6M*y# H5QhN(loCYW literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/foo-stored.zip b/3rdparty/libzip/regress/foo-stored.zip new file mode 100644 index 0000000000000000000000000000000000000000..d3adc8022793ed62d69976ca9316d2d5a961c011 GIT binary patch literal 107 zcmWIWW@Zs#0D*;z`kfS0i+h-XY#2_<&j+FaZ$>5&2HdK^+TjFP11lSd&j^HuKw1SX F2>^^N4T=B& literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/fopen_unchanged.c b/3rdparty/libzip/regress/fopen_unchanged.c new file mode 100644 index 0000000000..8e2ee2689f --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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/3rdparty/libzip/regress/fopen_unchanged.test b/3rdparty/libzip/regress/fopen_unchanged.test new file mode 100644 index 0000000000..885f8b7ba3 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/fread.c b/3rdparty/libzip/regress/fread.c new file mode 100644 index 0000000000..f644282c74 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> + +#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_OPEN, ZIP_ER_CHANGED, 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_OPEN, ZIP_ER_CHANGED, 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/3rdparty/libzip/regress/fread.test b/3rdparty/libzip/regress/fread.test new file mode 100644 index 0000000000..234e1a1505 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/fseek.c b/3rdparty/libzip/regress/fseek.c new file mode 100644 index 0000000000..41b7c3f3d5 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdlib.h> + +#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/3rdparty/libzip/regress/fseek_deflated.test b/3rdparty/libzip/regress/fseek_deflated.test new file mode 100644 index 0000000000..7c560afee2 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/fseek_fail.test b/3rdparty/libzip/regress/fseek_fail.test new file mode 100644 index 0000000000..be78a9a9a1 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/fseek_ok.test b/3rdparty/libzip/regress/fseek_ok.test new file mode 100644 index 0000000000..29cfe67f29 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/fuzz_main.c b/3rdparty/libzip/regress/fuzz_main.c new file mode 100644 index 0000000000..0a99d3318e --- /dev/null +++ b/3rdparty/libzip/regress/fuzz_main.c @@ -0,0 +1,50 @@ +#include "zip_read_fuzzer.cc" +#include <stdio.h> +#include <stdlib.h> + +/* 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/3rdparty/libzip/regress/gap-add.zip b/3rdparty/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&<lVY z(Fru-+QO~k5<smW%m&28smb|yDad*tA`rtsdPNwR7&sXEfqFm8^V1Ro>JbNGRv<3P z$Sg|XK6yeXjA7BFo)Cp|I$nVur_Xp^WoCeA1gc^90MwZBQQ`<UkPX5hcju*+J1PJP zm?ex%_RP3_3Df`v+ZsU>&`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/3rdparty/libzip/regress/gap-delete.zip b/3rdparty/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&<lVY z(Fru-+QO~k5<smW%m&28smb|yDad*tA`rs@ycwD7nQ=P+XaE>&YXnh1+mJP2vks!1 cfni&tGmr_fD!`i+<PruZAWQ|)^&k!d0NdL#xc~qF literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/gap-replace.zip b/3rdparty/libzip/regress/gap-replace.zip new file mode 100644 index 0000000000000000000000000000000000000000..27e058053d74ad7ea1af03253cbda5375e345d4f GIT binary patch literal 351 zcmWIWW@h1H0D+>+Zf|pk3)2LFY!GG!;`GFVkc`Y?1t2QPNL5J7%t_T#Ko$Wi&<lVY z(Fru-+QO~k5<smW%m&28smb|yDad*tA`rtsdPRV$7#OYs^>*wxUCs|=gD@))mt<rX zr8p`iXC&sOr>4MkFf!RQ<90Go8yIYB1W`cu1$ZMgU~?cuIRnGCMrR-s;y8#N+zvzN asRuH_&J6Ho1$h@3Y|IQZfb>QXhXDXA^+<yN literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/gap.zip b/3rdparty/libzip/regress/gap.zip new file mode 100644 index 0000000000000000000000000000000000000000..85e3bc7b71f11c5783d32d267dabe96d74d16c4a GIT binary patch literal 358 zcmWIWW@h1H0D+>+Zf|pk3)2LFY!GG!;`GFVkc`Y?1t2QPNL5J7%t_T#Ko$Wi&<lVY z(Fru-+QO~k5<smW%m&28smb|yDad*tA`rtsdPNwR7&sXEfqFm8^V1Ro>JbNGRv<3P z$Sg|XK6yeXjA7BFo)Cp|I$nVur_Xp^Wo8KQW@NHw#_e*TZZO!^2%><_MAm@Koe<>= o4BHx=flP=SA$oAT522?X$OOAKz?&81YhdUxGt2<eJ3t%;0L~pt!~g&Q literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/get_comment.test b/3rdparty/libzip/regress/get_comment.test new file mode 100644 index 0000000000..5f2df0a7a8 --- /dev/null +++ b/3rdparty/libzip/regress/get_comment.test @@ -0,0 +1,14 @@ +# show comments of a zip archive +return 0 +args testcomment.zip get_archive_comment get_file_comment 0 get_file_comment 1 get_file_comment 2 get_file_comment 3 +file testcomment.zip testcomment.zip testcomment.zip +stdout Archive comment: This is the archive comment for the file. +stdout +stdout Long. +stdout +stdout Longer. +stdout +stdout No comment for 'file1' +stdout File comment for 'file2': First one had no comment. +stdout File comment for 'file3': Third one. +stdout File comment for 'file4': Last. diff --git a/3rdparty/libzip/regress/hole.c b/3rdparty/libzip/regress/hole.c new file mode 100644 index 0000000000..e15033c6c2 --- /dev/null +++ b/3rdparty/libzip/regress/hole.c @@ -0,0 +1,190 @@ +/* + hole.c -- convert huge files with mostly NULs to/from source_hole + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <stdio.h> +#include <stdlib.h> + +#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/3rdparty/libzip/regress/incons-archive-comment-longer.zip b/3rdparty/libzip/regress/incons-archive-comment-longer.zip new file mode 100644 index 0000000000000000000000000000000000000000..28d7ed365f9218f5177adae4bd35004f4d817562 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE sfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30b&IP0GkmT$N&HU literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-archive-comment-shorter.zip b/3rdparty/libzip/regress/incons-archive-comment-shorter.zip new file mode 100644 index 0000000000000000000000000000000000000000..d23cad4681d07443bc8309cb2530006d776c61bc GIT binary patch literal 203 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE zfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30b(VF;L_v_g+ztC%;Z#s p<ow*+)VvZsUao-5l1hcl5`~P!Vug}?g(RR{X^BE{Mt)I=9ssuUEXV)= literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-cdoffset.zip b/3rdparty/libzip/regress/incons-cdoffset.zip new file mode 100644 index 0000000000000000000000000000000000000000..153e7a821ec88385d1c2f94ca0d434cb25f630a0 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE sfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr3VNd{)0Gm-8$N&HU literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-compression-method.zip b/3rdparty/libzip/regress/incons-central-compression-method.zip new file mode 100644 index 0000000000000000000000000000000000000000..1bf78f272af373bcc14ec4d880949d6bc5cdff3a GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE ufHxzP95YBa2NvBDKyipkTN*(upjoUCv(U^5@MdL$C}m`D2Qq9x90mZLX&bNr literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-compsize-larger-toolarge.zip b/3rdparty/libzip/regress/incons-central-compsize-larger-toolarge.zip new file mode 100644 index 0000000000000000000000000000000000000000..1c82ef667918515108a178a662476b5aad6608ab GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE ufHxzP95bqJ1-NbrAPZvBmPQZ@XcjBPEHrZhyjj^GN*Nj4feafEhXDYis2j%s literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-compsize-larger.zip b/3rdparty/libzip/regress/incons-central-compsize-larger.zip new file mode 100644 index 0000000000000000000000000000000000000000..67e9a998919f6ba07c4e800ceaee31f5fb7a125c GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE ufHxzP95bqJCb(`1APZvBmPQZ@XcjBPEHrZhyjj^GN*Nj4feafEhXDYa8XKtq literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-compsize-smaller.zip b/3rdparty/libzip/regress/incons-central-compsize-smaller.zip new file mode 100644 index 0000000000000000000000000000000000000000..97dd14a798613a3a4111cafde27717cf96b225d9 GIT binary patch literal 173 zcmWIWW@Zs#U|`^2@GPC-;MUNxpB2nwVBlnsVMv65&=5`r=9TlO`Gat21vdjD%L`@( z29^|{VsD=o28IA{MkYCCRFi-TfaZcsk^qtn42(d$r4ht}8Jidy!U{1L&CCFARyL4A NMj-SD(jFiV0{|LKASD0* literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-crc.zip b/3rdparty/libzip/regress/incons-central-crc.zip new file mode 100644 index 0000000000000000000000000000000000000000..1f882ac66a6c407b043108b3234b675094750b4e GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE ufHxzP95agU9|+wNAVa|>ZD|CtfM&5m%tA9Kz?+o~qLh)r9muc&aToxfaT~Y* literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-date.zip b/3rdparty/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/3rdparty/libzip/regress/incons-central-file-comment-longer.zip b/3rdparty/libzip/regress/incons-central-file-comment-longer.zip new file mode 100644 index 0000000000000000000000000000000000000000..b34c6612435cda05e33e36d95ca455986fd75fcb GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE sfHxzP95XK65)5KcleRPh86dM*A!ebO6X4Ct22#KXgziAv2E<_i0H6;Wz5oCK literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-file-comment-shorter.zip b/3rdparty/libzip/regress/incons-central-file-comment-shorter.zip new file mode 100644 index 0000000000000000000000000000000000000000..7769a9afc860f542232e3d0edcdcbb3b3e0d5c34 GIT binary patch literal 258 zcmZ{e%?-jZ423Cw2Zlgz0AL0rPN<h2SirP~RJ5^_SX6Lh3kE^r#su70f-!I;IFiJ% z6Myf?MLrl#dTG7%x?DZ(@67675EXgWpAP;L^Dlk7BoErSI>HX25x?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/3rdparty/libzip/regress/incons-central-magic-bad.zip b/3rdparty/libzip/regress/incons-central-magic-bad.zip new file mode 100644 index 0000000000000000000000000000000000000000..954563baa48f6eaaa1220964a02e19237b23bc2a GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$p^ rgEu3S95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30dW`rl>r-= literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-magic-bad2.zip b/3rdparty/libzip/regress/incons-central-magic-bad2.zip new file mode 100644 index 0000000000000000000000000000000000000000..f99d9b7194ef44adab07e3e989fb78a7fbb198f3 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE q08p<SGcMf{AVa|>ZD|CtfM&5m%tA9Kz?+o~qLh)r9muc&aToxcI~%M3 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-central-size-larger.zip b/3rdparty/libzip/regress/incons-central-size-larger.zip new file mode 100644 index 0000000000000000000000000000000000000000..0779ce62ec2c50e2172e50cc78e6fa3ca153cc1f GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE ufHxzP95beF1+WPcKoVlomPQZ@XcjBPEHrZhyjj^GN*Nj4feafEhXDYiEE~rF literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-data.zip b/3rdparty/libzip/regress/incons-data.zip new file mode 100644 index 0000000000000000000000000000000000000000..e2ab58ae89a80795698d5391a9c45d5632a955dc GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$o} rfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30dW`rn=c!w literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-ef-central-size-wrong.zip b/3rdparty/libzip/regress/incons-ef-central-size-wrong.zip new file mode 100644 index 0000000000000000000000000000000000000000..a3f4cc118b108f3c5249d966cdbdbd9a9b8d6639 GIT binary patch literal 151 zcmWIWW@Zs#U|`^2SkpYqfv2wi1{;va0>nH(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/3rdparty/libzip/regress/incons-ef-local-id-size.zip b/3rdparty/libzip/regress/incons-ef-local-id-size.zip new file mode 100644 index 0000000000000000000000000000000000000000..44ce2f77d5d441993821bf954f4899a3b72019f2 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<!10|WEfdDHwsxU_<sfsy3}GXn!l3Q$pE rfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30dW`r(wQ6| literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-ef-local-id.zip b/3rdparty/libzip/regress/incons-ef-local-id.zip new file mode 100644 index 0000000000000000000000000000000000000000..aad552155198823b66c95fbc89766e9692effe3e GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<z!Cj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE sfHxzP95XK65+FmtCT(d1u@XZ=SRrPinG@j6$_7!&$lwlS*nl_;0Ge1ErvLx| literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-ef-local-size.zip b/3rdparty/libzip/regress/incons-ef-local-size.zip new file mode 100644 index 0000000000000000000000000000000000000000..ad167101591b99e449980fd7599095b1844eb098 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9ntLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE rfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30dW`rnp7L7 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-eocd-magic-bad.zip b/3rdparty/libzip/regress/incons-eocd-magic-bad.zip new file mode 100644 index 0000000000000000000000000000000000000000..9e49e56a3982572ff6a8017c9ecffb403c5d0711 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE rfHxzP95XK65+FmtCT(d1v4Cc=Ld-%l$HAMG4Wg8h!5zr30dW`rnQ<GK literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-file-count-high.zip b/3rdparty/libzip/regress/incons-file-count-high.zip new file mode 100644 index 0000000000000000000000000000000000000000..876a886f643409f02a28af38f16ca725f4da5f4a GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE sfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4WvK;2;G6S4T!@40G;<6<^TWy literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-file-count-low.zip b/3rdparty/libzip/regress/incons-file-count-low.zip new file mode 100644 index 0000000000000000000000000000000000000000..4af9038886fe5217b977dd209a3a00b07f9dc24d GIT binary patch literal 304 zcmWIWW@Zs#0D*O()7(xQYUpqP*&xgc#A%s1sfNk<c_pcNC58bgN(&Pdx1uXGf+{sa zRr)+Y?GU<BW2jQ&0B=Sn5oX*@0J;JUwl#t%u!GRGpgRSkfq`LLqc&6v&_SrSpgRen WB@C(s=rC3`kT4Sv&IHn6`xyXgur$8_ literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-file-count-overflow.zip b/3rdparty/libzip/regress/incons-file-count-overflow.zip new file mode 100644 index 0000000000000000000000000000000000000000..461722c3c761cfb0de00332fb8e6426f795b786f GIT binary patch literal 198 zcmWIWW@gc400IA^Xb1L%ukQYb0!9WA23<x50R|?pGy|MY<O=X+WRhb>)do@p!i-SW zAi6;i#L*4#W@FQV3d6L4xKO2yFj^m~#uQ2e^|6DPDNsI0U4S<$8;HvYgdp`0wEzJR B7jggq literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-compression-method.zip b/3rdparty/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/3rdparty/libzip/regress/incons-local-compsize-larger.zip b/3rdparty/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<kvf>=PaSRrPinG@j6$_7!&$lwlS*nl_;0IMn+#{d8T literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-compsize-smaller.zip b/3rdparty/libzip/regress/incons-local-compsize-smaller.zip new file mode 100644 index 0000000000000000000000000000000000000000..75f14635778e11f3cb74feb00dc964e89c635900 GIT binary patch literal 173 zcmWIWW@Zs#U|`^2@GPC-;MUNxpBc<!VBlnsVMv65&=5`r=9TlO`Gat21vdjD%L|}F zmK303Z=V(hh5&CyCOKwQlUU&<NdQ?442(d$r4ht}8Jidy!U{1L&CCFARyL4AMj-SD J(jFiV0{|JgASD0* literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-crc.zip b/3rdparty/libzip/regress/incons-local-crc.zip new file mode 100644 index 0000000000000000000000000000000000000000..6f74b150ffba03dcc49a782f80dca3268e6e4bd9 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZU4atWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE ufHxzP95agU7YN-FAVa|>ZD|CtfM&5m%tA9Kz?+o~qLh)r9muc&aToxjQ5(1b literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-filename-long.zip b/3rdparty/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/3rdparty/libzip/regress/incons-local-filename-missing.zip b/3rdparty/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/3rdparty/libzip/regress/incons-local-filename-short.zip b/3rdparty/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<pnbX14{}} wIx)bTkx7mjyKY7X39uO;leRR1m_V~wA!ebO6X4Ct22#KXgziAv2E<_i0Gd)8rvLx| literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-filename.zip b/3rdparty/libzip/regress/incons-local-filename.zip new file mode 100644 index 0000000000000000000000000000000000000000..18782354e8dcbc6bd5a3b48c816202261177353f GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWJ9nFLsDo6Cj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE sfHxzP95XK65+FmtCT(d1u@XZ=SRrPinG@j6$_7!&$lwlS*nl_;0Gmu3sQ>@~ literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-magic-bad.zip b/3rdparty/libzip/regress/incons-local-magic-bad.zip new file mode 100644 index 0000000000000000000000000000000000000000..9a6a061736b101b8a753f0ad9924c2ed6657f6de GIT binary patch literal 153 zcmZ?pW@h1H0D;RTGaQ`vZGXWCWJ9nFLt<zMCj;}@dDHwsxU_<sfsy3}GXn!l3Q$pE rfHxzP95XK65+FmtCT(d1v4Cc=Ld-%lC%~JP4Wg8h!5zr30dW`rkwF`n literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/incons-local-size-larger.zip b/3rdparty/libzip/regress/incons-local-size-larger.zip new file mode 100644 index 0000000000000000000000000000000000000000..4e0bb430b2f176e524aae96e1ae45a18d5c07a60 GIT binary patch literal 153 zcmWIWW@h1H0D;RTGaQ`vZGXWCWGetMBZCY>VrU2_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/3rdparty/libzip/regress/junk-at-end.zip b/3rdparty/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/3rdparty/libzip/regress/junk-at-start.zip b/3rdparty/libzip/regress/junk-at-start.zip new file mode 100644 index 0000000000000000000000000000000000000000..8c983255bf84e2bddd16e9964abdcee63132bb59 GIT binary patch literal 416 zcmYex&*uv8W@h1HU}9ikxLWI`f6R2JH7k$}!YmA;3?-?>C7~gl49t#2jrJfMTEW7Q z!XN^cfa(P*WvHH^Z3LoWfCH*GC9_B$te;c#iQ_CF2I+snoWg+HT3#frAnT1V><8%w z$pGzVWD;k_<$7MQV;F(tmPQa0;ultkUqUMwfNp?j2T5Xj0HU3NL4e_{qYYF$#5+JE lK;A(%0$cd;G9bI49LWf%w@{qI$_8=<GZ3Bv(tAK01^~{~Plf;h literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/junk_at_end.test b/3rdparty/libzip/regress/junk_at_end.test new file mode 100644 index 0000000000..41d94558a1 --- /dev/null +++ b/3rdparty/libzip/regress/junk_at_end.test @@ -0,0 +1,5 @@ +# test archive with junk at end of file +args -l 412 junk-at-end.zzip get_num_entries 0 +return 0 +file junk-at-end.zzip junk-at-end.zip junk-at-end.zip +stdout 3 entries in archive \ No newline at end of file diff --git a/3rdparty/libzip/regress/junk_at_start.test b/3rdparty/libzip/regress/junk_at_start.test new file mode 100644 index 0000000000..d018ffca9c --- /dev/null +++ b/3rdparty/libzip/regress/junk_at_start.test @@ -0,0 +1,5 @@ +# test archive with junk at start of file +args -o 4 junk-at-start.zzip get_num_entries 0 +return 0 +file junk-at-start.zzip junk-at-start.zip junk-at-start.zip +stdout 3 entries in archive \ No newline at end of file diff --git a/3rdparty/libzip/regress/large-uncompressable b/3rdparty/libzip/regress/large-uncompressable new file mode 100644 index 0000000000000000000000000000000000000000..e7e26d9fa9f653ddce6a719f29b973684e22ab41 GIT binary patch literal 8200 zcmV+jAot%@_PVO9B~b2CN^wgQu;Q1X+lX4o7fJEnsZtF^&;F3Sv5-&N!{QP4pdAuU zn$FOyTbE~Es~AV|B)pXySMw|g5q(i93jFXNqnHLZ(&--r$d*lH59sY1fD;w=i9ulK zc(_<{POmnXZ8WIivdf|BlrCB&BuqvvVo>1mdQ&=?<WNap^NmGD`#VI?Q?7<M>rf^$ zI0a@%P#3bgIrXOOB8q0En>d%Fx2AHX3`eU_ipSn%5n)8BD7!hhT}jaQVwQH)`t`;N z;>)ujD<jLCr8L{>v~xNr`a;@Zo(9)}nJ<gU$G0G*ntCcpXY{=(M0fy2+$W)Sv{g zh>Y77UvalD#ijKBhg)_f;rH|tpfIu|H`=h!CK_gpD&T5qVd8zk1vn)bl!e^Vg|nl{ z3_0X+wM6;=kF~zq!UV_qdLtCJVz4#aZTh1Rg6xSc!R?}V)d&Oa5Yit%_;*bDoE_Tv zxww-5)HXihnd}DF3Tfl%IzU;pD%0Ag>DTVC{`bNA`<BvR!ihoTkLFkgFdqK{!kIzB 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 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/liboverride-test.c b/3rdparty/libzip/regress/liboverride-test.c new file mode 100644 index 0000000000..29e478022a --- /dev/null +++ b/3rdparty/libzip/regress/liboverride-test.c @@ -0,0 +1,101 @@ +/* + 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 <ckmame@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the 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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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 <errno.h> +#include <unistd.h> + +#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); + char *so = (char *)malloc(strlen(cwd) + 64); + sprintf(so, "%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 succeded\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/3rdparty/libzip/regress/liboverride.c b/3rdparty/libzip/regress/liboverride.c new file mode 100644 index 0000000000..200f7127a2 --- /dev/null +++ b/3rdparty/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 <ckmame@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the 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/3rdparty/libzip/regress/lzma-no-eos.zip b/3rdparty/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;a<AFGvyPU3-e^^pCw#u(#GwxdFP~fMxUD35T?~gt{=XSpUgrn4OyK^y;gLTR n&liROZ$>722Hf5Uh5!&KfJt0|5#Y_r22#KXgf2k(FIY7I<FACq literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/malloc.c b/3rdparty/libzip/regress/malloc.c new file mode 100644 index 0000000000..1141104311 --- /dev/null +++ b/3rdparty/libzip/regress/malloc.c @@ -0,0 +1,162 @@ +/* + malloc.c -- override *alloc() to allow testing special cases + Copyright (C) 2015-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 <ckmame@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the 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 <stdio.h> +#include <stdlib.h> +/* #include <string.h> */ +#include <errno.h> +#define __USE_GNU +#include <dlfcn.h> +#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/3rdparty/libzip/regress/manyfiles-zip.zip b/3rdparty/libzip/regress/manyfiles-zip.zip new file mode 100644 index 0000000000000000000000000000000000000000..19ad57d66f0a9a153e93d8248e7f08a43863b79d GIT binary patch literal 3434201 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%0D2!?Z z()$hg&S)v-KA>#>#(GjoJF<L8=MJ$SMGv7i(nz0E&$Y-1q)mTvI~)W2NOZeP{L)xL zmL~C^>J-%8L_zJraeuz%<uGuBXYn#*#^|_3!{MGPLLXKzf!VfZXb~|IA|^OF|9L@7 z_a<thB(nq*Hd!4yS(JTo34mD|=1CWZEI8!dL3Ny;|A(+jRjdU8wq|ME0XLT5IjfuB zoaY-3ov)epJN+|Pc11jkE-z}r5A8%PS{9eLkX04f@hOj;&5DZg@P8+11ULn;q54ul z6QvgMt5FU2O^e(pwBS7x`Bim(g>e~}!J`R$4&D<a>Mz?b5>QYoaU)qbr@>14Fu>gL z;wScrTeSBjg1|soO*pC#Ka;Qp{2z1k;ZtkiVhJ|(b|rMENS!W;K7v;P6DYju0e??& zk+JQ6xGC9;bC}2@TjvJr+Mx{vGZr6ItPK8^F@Zgk2x(K17_4X^!m9A~fzjLk++4$T zWAxM+QrNYe0y<-`ilhs;^os6?Rb+GlFLA^2txq*=X;b@3sw4Rc(waGHElbdcoM2Vr z@h8?o(u1bMc?_idAT8L(4{wi0j@3(S_$0(izJJ9p;u$|NTS-z2qgPy?frE4c(&AV$ zg2Q$J9nE6~gL#!$Et7cz(m3hV^&0lA#!|{YAJerSo98Y!+;9vjk#$`rNT;C$I`NAw zjv>!Bv*@DN-hRfNV|dh9zIZL}>OKel)`9_uNA9J(<Dz4Ts~vnpz=2Ub?f^GP1josZ z{4&oeWc_A#Q954?;|oeWrpF8*JoW}Uyi{sdCG`yY@r0N3N!-*+bY3WQAA&}r^+)27 zCi*g}ggr9skSlMO5x8^JVfi}X*^wqH-Q(VDSSE$kAMIvXUR)=+#&Owk&EXP*x!Pu? z|BW9q^@d8jSgsZ7O)<!Ktr3ZgxL_rH<^^I^(r2DQ<_{?!dHO(4ki}6P(DxcX*-(*u z&*!sVXb&n~2sB_*3miLif{#ENWR;GDo|<~5HOEHf(W?ZeProW#-CLulGD{fipoaSr zOyra7g6lke2-AHN+WW>`{cbj5Nu9s7eA$vOz2e4~NhYF{0p?^7!a?t4iTaw=aNmou z+$~0y7?{NN^<l|#Y1msZzB4qy^Q2IJR_1a|dw)p?&b=xj2duX$G{=_e2sL**hO7rU z_n5Fyv|c`Jsi$3>fO3XMXUAi<lcB@!f%SHS?u~eL0J3!69n7+uY(gX7e$5Ik+0Ddi zsHgYNWuDL%i|>cMj#6h^$BNlTH35!HsLyh!DX86h(B0<?)u-!HMhz{$*abuwXWeFi z#BTu-!Oo|q#()=#Pp2mzycj^6;SEHK?q;9=2r<K7GWpZIY9y-}%u@$4VxzPdF7e-! zC>@X>;bKTc!fev6N@Tkd3zFOPAvb_7=CJM#th-x-kOuGYWWjd+No!+#|CtlT8~!6> zF5&45*t-&4^ZQO-_Z95+fL^NOE<>2aXBSX*qwx<1f5Wf7<yTAjm1v>UASM;v{2z&X z80^^JEGHI(BX=VJ6tf5|*39Q-1KpD7sZN%Tsl;PSnY>t&6Ps^>jBSD($(*(Z(%ZeC z_>~REKm70n<MC%aa8myl(@2Q=l-JH@JZJl7`VDqA_nwMm1^#%V$Ds+}Dk1HZs+N9- z5xpRh`yc)c+X&R;G;d;|!r4S(R!7DP9E)W8Uew~(RX_0CTIS*@B7fbke1a`&3yL@w z<iZ1#SgMp^(zL;{P1#xxWtUu|_2D=#i<ZUh6hL4s>t@3^-HyU>H?WW``9R5Z#+HJn zyBPY^J1UZIRb2Dk{GErG8q7vs&98286L?J0@6yhxZ~rq+RJ`>BhtZ?j4@hBS+pj?q z#e4icvPXef{P0_7`SoBNbbZM`l(HWxcxpvl-Z{q9iy?I4Chu6JqS8N6i;Dg5`?CZO zcoTjW|Fgb4I}pp|D?VJphgpn8^iSd;HYCsB?%@nl6A@Y%iUe)E=G?2#Q?X(V5iv<G z>`LyUs<~4>j%RmcN(2t(fB`$yw4XbHVHB`5?xGWwE`&T?xk2Kj*+iRcv=Z9VaM3mq z0ki9M`)%Q@Q$13?R?KLxh1@6^A*QEUMp!Z#n;%j=%KS;98GjsG^lt6`FVJO2LCc=7 zRC@^fl0=xPq43z3d??{Ay(NX_0w+`1fBAccb2vrm_G4s3A*d2iFaZhO@Z7<uQpJAo zqU>^W-ND$xIXE1jM}#CLd?hhR@WUMTzXL4KjcvZ5hGvNVYYn6B2{oR>Y0U;;k;=b_ zMOZ1+ZX}jyb-fvo*qRt<E&)4`oHMz>|5SNVgsG)^oA?Cp33xDD+Yte>D)&t5e}@-# zs43M1>jnBm=GahDa8o@Z%O=#f_gWyH@dOt}hsm3R9W33oLUCH?Q2^=FGsw3$MTyt4 z-|UTEGy%P+0CIQ+B_KyXb<$5F!y>TT6a~O>Zj#lKa`#wi%Ck!U+Uc|-P$hU!5SpA3 zabq;VVbg0oCuGA;79;vv<LwcJcDp1DfSpl`<KLZKRiAetYh8--STr-&X<a+OpLR1g z&m$?@VZXxh8a~^lUl6NAP}{LY&gN~Ts1N^-;jjBo4p=$eC8eenA){WLDDW4<0W$pz z0w+RjY>1~4W>5|#cd}3_q_1Xgo|mNT``D%P`8$|_)n#C97}yl91JVQ;V<O!f81c#9 z*$eD*m3CR(J}hgiWS#Lm!u%zQSnI&ZOyCWz5;_I&aQPAo6r433dp>V3M_L@Nn%kTe z?ZF2x@Fs4hJ_0$HsuA2ZNsN{-4s3}wI3E=dY2rJPjp4n2Wek=qiyP@~cng@yw&iif z6H(^XY2^Qd3OQ&Od5>9WbW?eIeVEA4J?l8P4XlpFEvL~$K&_8-Mm6R&21;HAi4vi4 z2BUOQb<_~Jde&sPvYrm5^|j+>6XO|xwe!Jn74Y(kfR}TQH6j}m>;h{167A?n(RGgJ zW{&D&uAN*`Ln(l6wD}l=@eX@YFFA~fmFQ;}gG;3SylxEcTl1D-4E}n&40`U7bX`?R zr?N3PH*R7NzyLG-!Zxwk;rvQrPlv(hB*9yiVi~}By#Qx_#>^4QE?1=VOjFM5Pb^6W zA2#8n7~Z;IH;|)j$Et+>0yqCB4A+wL07{%T*@7qd(%Kg66^R=q1tde&bxx;MXKzsf z*7D8|cqdp|3TkX0NY<n?+nS)UyE*7r4xH&T^_|<MV5uvWt&8N-m<5N{$DP5iho0U^ zOgcwIWHa`xgk!QODeS^N?Ec&|HirVu`A-qsf{f>-f84Jz%-`p`t;80(r@O3hBx`PJ zF+3PUbm|<ig{@q^TpKqCdPMQ`BQ^+A;-Wg1pb2pPyz?ZWs2$e}PnL2aA`JA&1N2Et zdE##@x#Fn@!_hDwGTCh?x*pu|n2UHCE$3;2M5H0&BgMz>s%g5tc-&F0abJKONuEt4 z(2oiLz#&+|ZY@EZN_8gldgT~)i`kl&Y767b?3wK1k0C<}FI~a~?32A2f{t_6C4W<7 zgavpw?Kf@?<tD*%r-_TV6~NI&1nOZqfh@5lc-W&SID;kh<fuD!<jijn4vOkD6LwJ# zhJ2S*n1tmrgNK%W!E3*%X>T_Zk61mV{(F4cN)eE{_lKa38F}h<I-l{p;Dr8307d-% z;RqE8phNuT!&gSY0F2bj@G(3V@Nnq|>*2A_YSUY<y3?snh*3K(mrD{#$fclu{syDu z`jCo|0pH5GC1qT%v={1Sj%v#%l`P)fD6b}qcQ_2Un5`==d|$_3kMG&VepP*|3047n zDk|h|l{<n!j+p<GCQ!5Sk!GXtlCicg!GncR(NHvLjM@b_<_!<^X78u985n-GrB*53 z<)y@@hVm8~O_iL32y<Aftz5ob8!zKUNX0p}#E-*YQS{@*T~IKXT`6EMLOBl?Ti!NI z(IX6eHOqJ&cunOBzs-=u8SpyTZUb)e;JWU`V!p3u8Jh{HLx)E=WZ&@X+4x)y<Y|ZF zuTGtKwD){|nZxYxd*J=ox>6X>;TR8^42!*u+sN^z4Xy&97?ZSkWR@0Y<Y`@bfy<BO zF};78g3?eu*Z)yTvBHgh)o`PH;+57Cuhg7)C0bLQBF=F7KVR^l1K>t$!HqruH`*+P zU8M?EGv~y>@A@+^A_kLSyPljj<>!DIyv<Q8Y02&*EBHhXMzs`7ATXu*4gRWZnmcIf zMi+2ip-TSG@1NPW-5`*s9uUKo-A-2Ufg-l0W)5nO@yjQ;I|(upow4#6N7c$4?ASlE z&>z~0OJ@(Xka$y3N;^T>!!HLw2b3~ZJ&(VGA$(n@kdr2Juvp|E^uQeSkAy|4&;_J; z38&BXXVH=Ra$cG__lgw%BHUM1j<9vU{oww4PE}x{JpU-yxL$V7cTLa}D3c1+zsK;T z6jGiYI)Zq09&uI@Ip4P#fzR@|cgpxY==oF_aIOF(i<y!rO}*I<0bCLe<v)>o02#F) zzMA%T-iYbf|FlcHtG`Mnqx~}4XCC|Xdm#GV)ODSYTC@^Q{1j;_p`=8rCI9T#pT5IC zabh0=G&rID_F+iP*tNvB#6K1x`VAxwV;Ln_UqTxI8uGyQ;*X5si_Umr%r>DJJ3Pqt zQ&n7QD*ac5dyC3d+xc?*0l+f<nJgwEEXT?uL_f;^C*x?u4NJH|ikZ}MPB_ZWx(0{Z zK8H;c2)k0qQv>I*zQjjN;Jg>W_|CHBKE8pdhJbAzu+7ZK6M-oJfwte<5vz|H^gU}_ zi@W!;m_IRFN(<zseJ-1oojZ};Ref1pv8t1Vj#h$jOfB5UI>0WomvcSk8XfngDG*>A zZlhHj{3_8;tH1UDR8NPV246!Bc4#-Sb?sObUa6fPl;g@ui=&_|m;4)xHIK}kyv0b3 zTfYe)TwgiW?`u%Q^fxUMqR@J6`%!LrEP7KI<sRyz`rZ|&0oO|WPIgT6*URH}j%KzK znQe7uyNRI-8|wgVclxu)qUCsE&iJCjYQjCZfC0xp&0@kRFG;8eQW(m_T5KR^fCL+J zDqHf@eoi4>ErG+iSNLH(PZr>irdsb#gPbnBmI=BnImDMCU=4@4L1L(ya553Y*PvQZ zZE)THEUsu3qIoTkYvUz`M6^@{1X0RiYdO$`DYTcK7tF77ABvJA2rd7q_fg!)MC`9{ zj`-W~g4D$wHECMN7M5&8l@P@v#eE!6r16@$Cg=%aT0&XP62W{6HZfvBNCxW_dnI6) z99*he58jl2jV}lXU-}0Q<I2eIZFW*`UT@@Ww|7D{es|e+dIGK0PG^(*jVn@b;M7T+ z&hB6jWf|D2gj84GHIf*KrMzK8+@jM4_3nxFEer|NNF@Zbua!#z?I^1xnq|}^dvG$I z5l_?|?7;Na5H01IgbrzDL~xXTIt{O2YAn*!pdM$<)6xt~TZb3sQ%QPbVhXs2tj_30 z0*w+}7MOdSF&V(&B9J4a?hfc<;0JF(b4^kdT&)Nkw)zrTI)<I1;l7qOeR^)&CIiDG zEP=zing>QvFO4l!1#sxTilHP+j`46%-I>@rMQjGMq(C=P&R&zG=yqCwL(2NU^(U2d zTyFi$?^|&l;p)WoPrfz0|LD=KrDW(j26a*8SGMV17wP2A5u`WF)Dp@;SKBSXE@o*h z2)Q5Y1yFWr(IklJEg8l+j=#Eg<xH0G<az8WL#+42;VY@LDiBAa^~py~0YK|h&)y?p zwiKsx;09z`j-b9Uzhs!7L~Kq79;rD=dob0*&}bTG(@4ZvDH+Dcd0i9_z)en*<$dq2 z)+<OV;P4%8IN%gg(uSLUVNB87gdP+jdPEO=1^2@owa5)8zHH5x;OP-9ofo*>3FDWV z4X6cYya#ktpZ!{gBVYW0FU=-=k!O8`C(1&E0Ed0xd=%bM9iDQKrkfCCnuCeioP;53 zTqZLpis>mX0}S}QJr$KsaLg5E4-1;CJG~7q^Qsjtm({!$<*E8Fo!C_siRUdg97=T# z*fa@H>1X7|*(#N$3{{sL;T4XTAXqPiB(>4Qo8fSQo-gsU9GOK_1F;9S3!H%HqnyYt zo(J#jhvfoP9{)f*ErvT6yw($zG=amW!u^hZ0T39<cqD7c0}tsZtmJSG4{RwuG>{LG z07*C(axmQ-nrjYHk^1%4vyndq)V<HFCi8~#{7{d!Rmf9cF<UMP5Qyr4h}V0=>?@ti zL;rP%Ut7i=+{EKDiD6ve%Zy!C#JjrBQbf#{$Q=_K&YeOR=^Rw+O{`Ti4^zISo#;y2 z-^%RRn-8?u1Hx`}Gc;N9lFcGQOIg>L%o&%bM|h=jPC(7W&g@fW<g$*?uj1Ht{~iz+ z-zk4a4Uj9>TI59Ts=I50cfK@WUbAewOF%PzdSuz?x67RF*@v$0^zn>Zt{c5~u^HyE z=U4LOQ=T=O)tSIb{$DcxX(`IFd;iYpME<}G`x`F9ls|?ke{4^b2MQ3aX`eUbs>aoT zt0q@nP@~D+=uy`}8ZlBd-*pL8aOJTrp%!LI{1Wth31-Y=C#l+&Xi#oO!hS+34$?26 zge3@U#F0FC#h@?+`|XjCF%*u$kZUz3^$4#}ri2~8w2UKJ2HQQzroYDz2S`$|M$3>A zKYo$QpvE!=fW7$G7zT9!;(m+l7cj;$j%2?h?zD;m!_GM&0#TP$@-DxuWC~_>Y$pPv zD@Rocj5^M@cXt9uliG8L*VZh#r-w*SJxcsAfc*(hs^U4&Hpim@@#XB9i^y5Cr%5XV zq67ve)P@7hVyy_#zj2N*^-REFsl@6S@*c4M42yLTlk|^#)xB%?MrktaIbfZXLTb*n zkjsN>3Rf3#s*OS4ZHoe&xSU`#4#BWJ{Uwenb5x3l$Uqc;o9tn4j%OM(Fy$Y-7{=25 zgmbhdd-E2f`w)yFo5jcM_dg+!WN#)ZWiJBwyO;mB)5WO5@IU3wzKBt?C0LY#-d7@+ z!~y{XXw|gxzz_=%pU)iP#>bQeaFR4j@ZTz^&kZJvTl>X&q<P{w2yeCoe-EYS#nmVX zFI*=~G;z%m+_%98&TH-GWf?Wxw^yn;h$OvrJ?Gn9o_+-%_$z@Q-4<Av=Ld51^9cf( zPVkyZU4!_aCW{*dy<#2`NaH#o8*Z>*^gLMl!GGsFnM(&(6!?=Qmsf+GY<{TTxI<UH zP*OFgQywtgrc*#2EXa54HsFE}AVUm)-OD{;y`7trC*?yRs{>lmW|nX#*XLYGtyrn| z*|?9`b&34F%}{aRpGZOd&-xEeiM+w^UO8^!9T9!?bFRl+v0M*&!%c2FXw0`gAJpWT z4dTXYxbGDCQgB~zv^31^G>p_}0T~=n8p<VwV-}>4Oq+%S-6Z!s1ue3KWlEhT>UJnE z{}%`J6$dn*=b8u@rU-a-pG5haW7eYjpys;VxWYn)@@P$LXnD_ACVgt#Z{Cu(nJ+|i zh{s~F?uF4(qN1{B=4)gMN9A*Z*3kOWjTMnZ;pW7THMs^*ABf<UesJ}$KJWTzm68;z z@lvcN^Nkza?I#kl4?D|b8Q$Q%6)i)avSkG~dV7_-IDa=Bc54T!3)Hu`71Facm()#< zCQE8Owr2rB`vnuY7-immOcr0x+eUDUL{%vX>8UCu!2yiE*AZEwOZVm?9$%}J#L|}3 zb`GYon+_X3<`6w%KUx7#^)&}+n1u1`<O`G31l9Eo-KvBGn)==xC?c|hoYj@}^}e(w z*zjRp=Y%O$!G<m%3wzoP(DD|nao+-*P6Pp!u~aEMSHXrDq8*uM7q%Y8q<@0s{0cg_ zlK(8k5dDxFO|oLDo|*cL8{GNgA8ag)W)trFsvD(}2!2e${paZnt`H3mHI%lZQ9N>_ z4jO@Tdy<WF&6emf7+$XL28kZS&zQsX9U$Bp*39HFT*V@qn9Zr!=kdS99^L$h$F2>f zuNU4U@2yvfqn%B|`Jw$94Oo{0NJPiWlui`ce%*Ol(Cha7VY-gp%c;>kp^@{l@Yn3y zO}$0R@mjbq-4{oxARsZft%87<oinq8K}9%Wkp41_O@DxCH-P#6$lpkA=mn9*miS{4 zGc!=94sln1yT;CZk1sI>;)^L;+_h@|V0vyDAr&jfK&-Y*H<2B`0~Q{J);k1xwC==? zKh16*$$xJ1zU>^<t&9V&p~uFr5rcXRkQftfT5<H<c*1jjuqj3a3K6?`ZQ)3j?0Awr zu>><a-hq2a+5a`Xyjd;#$IrR~dW-k)mN<UBxK477<FezL10Wd7@M_Z8SAy}{7HYwG z)_~|UWuY?QRb0(Ud((sQY)&0TcNteIb}`P$NWwxmiBjR&T+pNR9IuIJ_~f%+UpAKN zz0Yh_meeU*4&`eErj&$pQt4`%{5k;+D8H?+aJpjQ5F~07xN@$vP(*tGj0pfaOkcz5 zDgBIxDvRPMAIxHPltqC&y~|Px+t?3DYnC$@e7x!3v(;8&hRx-RuB`b?PRyMW-D}!~ z9YGYRXLaYxrZ|!eVtK59!)0;xCsCnFnS(*1t7yPsUNM}mBP+j~CxaIIUnX}@%)#Ar zDw%`l{dde8N7uc5jkwPYJVi}_|K^E3IQaz+X~lJf%WMx`&Hb7oM{)o^kd(%W{WBN$ zBiJ(yUK<U(qe}myS~NKYrb0Nl1g*_=V5!b9v|bWFMj%`2i+FxI$wWb|U%LnYpTgCp zdrkXo$*?VwYg*U#MQ4<F{b)o`DbEQ??8Cc>u!!)5OL8;{5jm6$Y+bv2gJa%$J2(FX zJw&Av1qV)baEGK_h*`OWGJKeVW;wsZgjb^wOa=y26wJ1yATzbJ2{&+*#?La@gik^& zDL6%HF<Xj<?wS`y!7=;Aav<JwB4ihBcqUH<+ffzio)+=}p)x;y1(Qr?0Yn+=%$LYh z-!KV2%7H{6WJ#0)RGKJNOk;e3BVA|k1tzEJLV{}HP~G0^paC47llUU`#;#TnlvX8# zahZ~Xw{VDUr^q>}>)b2V6psLYqyr62{sTic)r>O8$Hv~t35}d9rxVq5BDhhcy`Cg% z0EeCdI&NeJ4qN0+WIF%AEQu}|!->daPA{403@*XP<V<em$`*gG&Twpg=+~%&OUbbl zTC(wUVp0;E=5RQPR!OE#-DT+r4#L|N^$6iUwK-u8yZ(_ugncq@A=I;-nsnDn=_;eJ zl#|huS3YNb|IRUcA2&=_*r+;xkajgiK&r+K1<1iDlyK}K4(|>g^Z=GCtZPe6J_zI= z?{N=aJXJftFX3Z;Qh4xVIe#qMXS_BM6tE7jHjt+hNxqNgSIgnKlTnYl@ns{P0DKi+ zc9<{04X4fLmuLCH2teq9lQa^4%?E;0i?M3MFF0$SXsp)=V~7U7ave{2lCmS*HKf6W z+cTWPW}?DskwAnWWCp#*o|JRm82e>U8v3PFE;ZwZTGpG27*!>zy~(CQ+sg4G<R}K0 zbP0P*0f))t`$~eWe|ug|47n$u(F9Iy!7B8l5y#72B%S7j1_NRRsv>5qLH=%`{YnwD z-#-I1nvW&(HXqbR-<{YHw+m4W;4z7Tzwcm(U-5Kc;!v|_Pv62mEZhj9x~mz5%m~K! zB-V9P9eWSrMWgz_iE>>5bmNh|-y?!vK#L2k=rb+iD1N`RAkeJ9%T}N-_g#Bma3FyV z>p1sH?xdA@HHVL&1jP(vrc!N)6*XlO5W^5Kr7x=}3=sXpEGIJ8K4ksfS?)onVQ&}V zh<$6>`#Zosfn!wl9XS!pLivvtE*i3a6?Yq4CSM}!^9Eos@!_{D$LlP3J(hz5tOXzV zpc@&mVRNh(l${hK+;=EyxvQNPa#UoJ6CoQ`@u1|UjbNa6farTL!YCg98w1JX@iEAz zQ37(B#YF4cpATF2DKRPU5R>x$3diQq@ZZ?}$FSh1ehvNXp<gvHBpYxA=@>qHmSn$3 z(T?Yww!dS%1TknF9V!xNtGIeuz?rOcJ>LEvhifybFIxse*wK(+*z&mM#QJKz;GoL` zhV~m|+cSxE>daVwTK=WqXc!zJ3OZ^SrrP+LLVwUfMnHTOIYOF5c2G~vKWag{>?ua* z59R;Nd8Re&cej(K2aIb0<7&=AI3MD1(5}q`lLevknEq#$e0#~ypq*C1%#0fL>NDjt zer`yJsk-4}qFr}ZTFgTf1dYdJ23_WripL!46t`%ooO(HUCe%<1>`b{Wd|V4R+*ZIk zji_Dd>wFGe$@z50faiXvT>?BW*%BZXSd9RwU3S1s`L@7J4%LB~CR77vDp(54ltYc? z1}j#(3{4^nraLf0;{od`5mKmo19A`H+Q?Nbv1D+<_!)@M(uK9`1N4-ARpog<(;dkk z5+h^GLRM`w+peuG-cd>N($M?nUi{7dMx0z=EHn8}5lnaoR1M?Tm?dpz?3UWLcqC`S zvx=6*9WarSec+}7WucD3ouF+i)FL;Y@Ek4D;gM|l2KL!|kymEiNeeza4$~cUALT+F zL+<{O$CWVB1?WUdT-0Lq4RP@^VEtU?XsBybL_ar3>4@Xo5_g(A2WQ&wLC6xOQBm6O ze@AhgGbT3^JrAZ+3<@`4RMvIDfAB))5WSW!q{NON%R_7cjW%r-fUzD#deB}=V7HPN z84O6$@h9^H>YREKd%vQ&%g|Xg*lYFH#lq$T)`d}ssoD_=-Y+KLXfbB#VyU)6vk_Ho zXU9xVEy>?Yi-vMg`*Tp;IH;i2d6J>>jhxCaSRvsSatao5d2mhPq~^{Nn_45E$7NXF zCMcB*UtY`5ueD=hCg7>D1~QmTL7U}q2R0bw<MEcJ;J!hqxm`$Uy2v>{%%iq(!*PV@ zEvO{8(?0~E>dTxZd1)Z1Q3<17z-U$AuhhiQ<i*u}|Kb;xJg5AFWpPQPg+lO?>O9sG z0^T`>j3yK`e}CSAlIhux9Etfn8XU!C#seN(*-MzJ{7eUAztNX>dpC?sOD`{j-_%aN zgr=ISBJ+)t>^aK#RsTg&FJByFeTB^)=Dii&gn~PLPkXu*VV#CfEL_^J8T14MEam|2 z<?`iFhFvEG@fHAJKMFIagCwQ%|0Oj^kRSkeecJu=?A_C-xRuDqE4#FX<C#K8s7n`W zi`d}6(dEG-AzkbUOW1cL3p|Qz2v^S9IvUKNnexAfwjP)qinvWd8Ogfp${pgoGa^X9 zX@6|S-W42bHBUWH(vrj*7J4yxGw!5EkaTJ^Fgc?m3u(k~ajFlpW;2M~EnFz3l*n{; znVi%8&@&u?A(eO{4|7n=Awc44x|(YWSCdA=O?8Z63A4{)Ys_Mhl6>}1Y*J4~))+ZT z7)vNAc`2S?3{)p~v2yda(rYD==PGRirvHxeks`RE2U^i1LKrJqhL3pf0Vckd_i5p3 zt!vK-;LL3WGrHp4X27}|&~XTtWEB^4?d7@yeRnU0p0{kZT1jaw^jb-EIh`Int7$(L zu`|=QW0RfZC3D!)Te*C>HWo{$5p|OF_^l@)RsldhU?^6=(_l@<E#Q%!KJaA1MUzeB zlK>!8J9D_&ZPAMw=;iMTC!2u%SMX6>UOB8j=mv)}PY&ZdTmk~Vg5gd=%k9qkilbLg z9z35dDE$OxV&XOTU<jRU?EPncg1Rk$1v4=T{d+Q9@xk!L3#L5^lJ(SmFyXKG<!RQT za*n~>_#`Rb!<I~Xmo$m@S(5P(*nkcH7@%jU_2UM-e4Z_x2dBb>ueCuhn(`J0kcF>+ z8(LTvuQQ#VPUYA9SC+qe|A(U#!LOdXu~B(Ocwzsu^&IbC|EOVZ4T>c#o(gc(nL<f) zW-A~^?QJ@<T_M)!B!Nd;mecO(JIR<B$s*n6teVY0I&=wMR@n?(6Dnrl%nz7Z9RS`J z{2j-vfWA`<Gq4@Xylw^-JRz?^)gG5@p2p+{i(A)QJS5hh!C)#Xwt9}=Bk=#kRJ+e( zC-K<7f$#R>mq3DjAaU*z7k(+qb7!(i2_Vis0u?uM?dAI7N1<Z>%(eYclf1zvMsR*F zL$D#l1P1v~pSTJmUh4jb7lyXyrzG<Qw`5uSNni@0xJEIZ)Z9x9X*1ViuAN+0hzo4T z7P-TfKe!{u^%-LklmabL^%7mh-$Pu|OLYD=9!?SGcYI(UX{f!9N2OyS2tz5FS5SAc z$^~=-##DU)*bsUaDCM;;?S17>sL}X|TE$m_xTap<l+NcEcO%yR9-d#->YY9o1R>Pu z<v^(CSQxN3@XPczNQSC~JH<1mv8{)*I`xsK^AJoY*v0;Y1}fz6B&*$o8}4(%*YFTj z2!$Mu(~fJC7_qoC5?=Pi95Yp5=l+@}QGPBWLasy8UQ{Wu$_nX3g799GEocr!|AfOj z?rlN31c$MrVCLF3P%<J7HgAeTXyBYs*bHEg&s67zYm=bdA*LW2Z(GEvr8#k7dky=? z^Bbe`VCWWtU#iXkV7$_~A^!acCRd-VCKK$0S?U98&)}_PD3E(Lv!hL+lx#ne2a5{p z(}I|aKS{@KNb<xSKNL+iP^C2NL?V77usl?eZfDN+(ai!Hg)h+v8u2#0o&2#)zk-lU zpllYDHQK$;jsksfz%HF71(`LkV4}$$jDg=J0kPy%OiiX=#rD|VCVMbAS<}v<Ot~Q} z)1dcE_MjF!=FM>v{@aYe-46s=FrZ({fI}N%#}<-z=HHZ8gZ6mxYO2#@-+>RSfWxCe z%O>2A=GR*#iI-(u%f9F%8NM4}qF)WjT>H#q59+vKpE|fn>mqzn-b~q_oG(FbM$BDK zY(0nNBELS&qo(QNR2{(Ei2hV`!BmurNQ44q=cIONY5@kAidXX;3jg&&9}&xD9G4x} z96hh8nmBvE;YG87b(iz9YvLvy$9aCtwz%|^L!g?yFy3Guc$>*&@Hd9Pdx9E5&vC=o zZOE-2)>bR9ZArd|KSEDWNZ6ReY1F}z6jF51VebVK9vs-nIk6J?7(>0)4C+$`rF;@V zfP<Zk?9V45$|PLPxJ<Aw1C54!;*)R(0(|ubv^V>7!>r;(eMFDJ^8B6&)vCn-t*#|} ztMtKOHag_Xo?|izEpiExBq^8zb*30DPMik&?wdAYBMf5$kJQ4|h(*8!lh9r#-&V0B zU<mh_(PXCAjq~Xb4f?UoUWl*vxK7Uic4m8S_?Q{J4I3nkEO5~v?&^wqWWy8%b|R?b zRB!0BmCu)c!LKjzi-S4@7|u;>_Xt};$BHlT4g|u|KYrwP^gnBHv6Uf@W}VGm3hum4 zP(<|9A(BBlrRjimm8rM14G!;=Wc+Pis7=>XO0Ya4hT){Mxa5CzT`bfKv!oucwe%<v z*qL<d9^}+iGyE?6LbC!jGvXh!nHMT=61>T?hlc1LWL<W0U-Sd4(Z7l{oUsJ!#ea|% zpMs#!qJ6Pmrt!eD9*oHnG>pJ{8N;%WPUZ4oBX_H4U+xS*IkE%|BSjt0!Ww;smavD} zv|x$rAe4z%9Cj271=uM(!fXUaO=yxC-Pq`8bX!8lIG7c(l-(8VB#z#TwVm7MG$VG| z3i7>cmj-lijupik?G7>P3o-XH>MtfSoz9Hf4sLLcZ8eJ3Il$o1{aj97=GH<9N$H`Q zJ#|OlZA|Ab2uBFl)Cn18;vG8-koz0QG!(Y$1E)Rx=SaM0&4#d9$?rDXfaVe;^XQ{s z;SOw(ZFUC+C;u#Iy_yYJ88duLa|!`;)zM?z-3dr(#kkk=z{EKm=p25m1))pvoqg{< z&_l<zNNl@CynUrU%+f0K0RK(W2&j1izKlRpCFo#-6rN3=e!C6%z!fpW`XP_P2JyC7 zn6*;WuqWnmb_cVbtH}oz|F2>)cSMk@DzATT4c_zOvEOKV31oQ>Ey>O5MM<$-HyS%` z|Gz}Xrt3TPq}X|<hmO0l);q2HJ~vB1D1W%_D8_U<o#*|PuaG*<Ya~*1roH5-MZ#V- z!JJGYg9Km0)nqDEIz~|aH&n1u(#ytgT@18!8Y-0ry-<IkEFGGbKE&DL*_PzsBa-EW zUwm;R^rGOpRKiCexmMpkAQcUxNk7rBrBogKX$}0T8OO{E8XV;ciyeU>^A+RQ;NP^X zR_6RDXoh*BN`NuOO-)Hr8;o00f`0Ew_rsP0lPiUdvQJYR$hNMH8RLMgvkdz6%PidA zMl5#0f6*kOShdFNjxUG`v~$Fqj}>s(WX`L|!;=YYBgJyiaW#Q~Svqg9K}(Br0TNt& z9loplglr)Z7>gS|37)~JUUpKX36p=wO-_6%<kKP#@5Vpg$cF+vJs@AAI#Seu8*0Iv zYcSQ9SNL)?>p;S)9=x_Kh#9sP@L=wi+Jq))jzSCS={!e*pEdge`*jmL$L9H9;9buZ zj*>UJ<|y3t77Z|O;c@9#2Y3OpF2O8aqE$X>H}pz*BBslH2J|+ji#>yqT0o{sGGbWY zVEKk{ZR9FOD+*`VpJkdQ0XFs?V=E%S{NN7PZmDfNTF>@2$Biayp@*Myhb@aCm1K<2 zLoA4^?_#gt*b2!)xuGLBco4HYkO7$z&QbAIm%P6b%7AjF`Z^fK{F`zTTRShn&16nE z=R_{RCQYT1ZIco?<XA!~`4h<U42lpHzdCM(aJH`q^$Z03nb}TbyjJpFS_qpZMu>ZN z*5Wf3D+_9-dSE3OEq;k>%f>JZHR47iVeO=z4ZenYpHEAS+5rQA2AQECI?3fC(k<mZ zzt-GLt!vMCdt>ig<;CL~l()G$65hM8eGN(hRa=ZF^d)EVC5QASO@fa2EP?5oYgYjT zz6%i82KGJ$iiUOP6_vt(46A89qsya<huds6K!08icDT<3{i+frj84^(;b7C7F*u{P z1{?)#64Ajf_zCvAgw=56*DZOPgdFx099FQW43MKJC;bF+Lw^>-pPZ`_F^kRElUD4L zR`otVCULiA>@T2dN(*WmN$7zjE=PelD7itj*#_x7EhkV^HaXTCgqL)LzHN!zwe&Sf z5y`K*qR)wwrK%{BYjg)UK~ESiI~ax_hDzv5x$Hn)(KXABHDZgzccnso^<Q#eaF&i< z6h9Smcn_+ZnGI6+s+_&n;DF#pu^i9`bLD_?F#F-$P6sPm!eL!P?7}M!?Bs<gZP{(m zizL%1cxBv96~ko^Z*C~xqUL0`=kn*Gs&w`^)Z7?9wCdBcogD}_LN%#ec+8s}*c7VS zEYn;tm}5F}7?u?yA$nCIhbN(CN>CdOI8rSGI74fe$K`pjK+k!igKE!<OprcJ-t>`+ z=>Z}sa18$sLf`-Nu0WP}yQQ3{Des(J6iamt*A1k0=;YI~Kd}yU<Z%7dDPUeEcayCa zRv*qI6>@0HCO46fRhUQ4OBC}4*^A#zR?@2Nj_g$EX(FG71IB+VLdJnzQwJOn_TkwL z959$F_=<c}Fy$~VR9(|~%+VAv%8yn)SXMg2!=bGBNFAv_X1DI~h|-rSSvJ?YY2{v@ zf(^|k4~?j?l&Qb)AG*m*r<+U!)wlcDI4`3idAq4QF=6g@rN(_=O-vZ#Q}x`l;9jgr zC&qh|9t%ca4*#PZRH+N8X=sb~wY~yZ(oDgM0SF*ZD{I&<j<z-h54gebR1naoVrW>} z62uxU0sf3e&TN-nyb<ExYCh1dybkB9Vg$k+av+{9WJy1V=zAHexfDs}+NS>zuue-p z)AUh68Ss=8$}ye)3A38S&RfORoNFP4aE=<LpqqdbuE6#-@S}U&d5Akq1-blX(5wf^ zXQ?zbOi$zg(ai>W=MF(-$l1&{m0~I3STRh~J=KNAPr}&x_0N30kSJ9ub!)Z97xLGa z>sgXKnSr!rje^;EJ}ctpG>HXf!22B}Fhl5o+JRJ&3qy3)2Wq&B*K`s`_yVSBMhdut zR`-ZLUVkIfz8<ovI+6Aw-jC3?z~tVAWFvT!$winaeZ1&fm4g(^uW#?si<2>diM58m zrcm9}T0Us*Z&G@qvPN^TlWL$J`M}e(Ad+-b;i@hYvqp?afjdiMO~PznXxwB^MT-KM zp_~rUDt&MrXp0^LB>j!rZ07ieBM4MMk_!y%8%a8p%DED*h2yBi2qH-V1@fmqajp%7 zyT`SQrM)h-jRr#n)efd|2#{b;XYx|S5K-6@=hd57kTkexG#Ho4J_{5STaadwv-GI7 z7I`Omc(E8Wz7X^onZ6YXXa=8-bmeyqB=o_p|LIQcuKujWGlWA(5<sVxd;?Xbmkf@j zsgxf3j?!aS2NPS?f%y8oUH?Q!+69jXydPdMxjdOYYbrg)Ss(#oU-AGcJw|5896RUW zWMo)n#~|3@LZNOwO`e)f!ekXkl0kY=g{ma!Znn<7!ojZ;{2N3Vsg4~c_*TRYAMj*M z!m)QMnS^w}#og;Q)|`J9tl~&ecuO&=f+D3F3ixmyqB<{<vya3i6rooM;xvBS`+UiV zNi+2-+p?(mzf}W{6j8O!*kL!-<u-yR#A3ntKO(+9m93qMvaaf^x6$HLROPCL0T2@G z@U+4XMWBv@&DpVi=5QV5dT^g}bCV6>E$A<sLXTOq`5{)7WzL(kP9rE*p=$2l9U6WH z4G9T!3lIcJS}AJ9k9^kc0NM@0g-q$Vow;fFNv(?m0LbvlADQbxG3G*nc6+dWqp%Vh z1MQB5$Tsk%GoNve752-2SQ+J*n5h}3+vgbYeO>!7b0i5qH14g-lmGdW-8u^-@bc># za%9GSGYjk9mYDO3g-DjgUE0dND(qzy2PD{U$VrpD_=(4=K29J<iP+y-(CEK6ZsVP6 z?=qV_rnUnMCY`^Ar{eFB^P&yUHi7qy@(D8%^5IF1&;KvsV=jCso{B5zyn6wqOxV3j z?0rp(P%*`f4#<2%N+R47Pw9h+gvwMwz4THHu_lWMk<#TwgB3QNhJKt|eRER{2V4(t zO<aW;ngazB_)je1DSb(CqT4$G2ut&3HRXJcp`7P6Fz@{8_5r5sPprgi6Gc8E0=|M` z>5TpprgR!1D$?c5Y*uRcfXvlBkq?Jim}x9X5;p|19aIZqrH1Miju6c{?t37J`#=3& zXaH9<rxW~pqa;gwEx^$%u|v$%%R9#q4l;zDydfH+S}R>eg(JJS2%F)HR*bDNEBj~& zUj~xpT`>S*Jj!nC&$Y%m0KXNbeR#xW;Wh^LbWY-p;D`qGc8L~?5U`LGb4|VD7E(uO zT`Lwuoju3$3)z>-m&Dl)8<yy{V)W3&f)%4jByL$XdU#@!7;mBywm0k0H8KaB*rAy~ z4JEI=(<`#DJ`uUO3dL{CFf<_XeD+i}kJ;^H^FyRpxhi;+N5P{63Le2}FK|k=8gjMW z#)<#bx{{U8y351`dZU+2UyM6<xTdI8&L*TPhcv!V?@^B!6&gk8F<s56>5Yq5gc%j8 zcCi_(f=P%`Q69p1qLXU0JWvnef0wNzHm?{l{}T6aPyX{<0`2=7C4uyWG}O1eai|Ii z4XbE`>EK8=`*EK1j%pSKNfxM_<^2)>iq4&*S%q$@%@LF61K*zhPy#@;xF9K4IWiFl zDw$2!fSs~w>oCv;7syqW&oEZ3;}&GX7^SS55~JdT3XWN;I-@@lqo6X5xM2n}T((4F z$;QDmuCu`uhR<nu5AKet5PxV6BR2ahsB_gpB92}<fAqh3Zw^=&bPhXa3<*qMLDeNt z)fL{`68VX?oA9ax%BDyx*%U0(V0Pv}oZ!QGvSbq`P2tI+G8);0(8-N+@Lbvu|12f} zT0D6@!O5C`*P^s24wxyxMi><7^K3OaYQ}(*lYW-WN<};-B7vhu<s+bm@foi>S*L<_ z#7o*94HZ=;tNY(z0)lM7pNi~A-e*&pYK=C4P^w-4PSR%_?T%32BrrA-hMk1fQ>DNs z$#<l?CH5r6jR@W=;3+wFf?6TntTWKMnM+mvOfj-u@PK*jg_X?gDO^L$zX`0}|7FWm z`CtK3RIn$hxVxx3x&njEdO6&Rc;aj_XPmF9Nj<?`b>hE@o@z%q{Gvg%JuPd<*-57n z4ANUDNc|`*myWTz#1{7p&F<Ep@pOhhP4JIaBp$<Yn8FIGDr7{yMUuLo{STC4{DtI% z1Q!sZ5jamOJGWu@*mj=gK!o5jA?6UKdJ%p6I?L+^$S{{Z`Ykhq3AmL1&Qxdd<5p1h z?_j*$(HB1B%VB(ZE{vB`D7(}Efw4tW@R;|Jh_xsTfcsjZN^{sRhmDkFuY}nnc%&th zX+i3~QK-^e4i}b?g{Ns`un~N?hC}7rRs)Wz6!*Q6Hq<%{>dV<uz6wBwgHA-n$jSSS z?XCfbAok3x4>M`T@#q1ndq;{ne}j_yK^Im}%P=rE`VD}A7+oK<h_w$L)7<;#V6)tV z%@$D4dAl2-ob3qdtj9$?*5`DpAThbdf_$94Q?;^31k_&;_X`8cCfEBVuUxa95x>v+ zKSJ?O<Zm#8^x?A%{+5xW7C0{gjaZ{z8gai;NX8<4kS(WIJvyJAt(z@aDSbGrxv^B_ zw8DMi-Qhf%RM+4=UwsA4kfUSvX5`SVT#Wg!iBPB}gy;hyBw~$VqZopRBcyCxFMR$M zv7=se%!!)7acj-!Q_=)KAmCwmb#^Rvy{A>Z05SAi6H;%99O{kPl)RT_z?I}Z&Tb_m zHnHD&lB4#$U&Z{8lInXW@Z}hYe3|ul3nNql4yOtBUX2vLSHVn2Fex^_sn94tI0*r^ z>}NFsCG}|nF}jKMscY2O>C{g6>gQZZbNLW+_ZX>z$4DJKM(W@(AFLT=?rz$Q!P47V zQa>|CRU#hTW=||;jH%=KC3K>?$dopW5zsK?N(_lBRn{B>7>@WUO;34|!^e%DbxC=F zd1<+WG0aH9h78#0Yp8j-y;g}KwHfklH0<juVEUJwgi*}1Coi?<*uGrF#0jCk)EhBt zg6;VdOT;Dn2bA35+)$sTe8h(YT!v0SD@tb%t{lV{l|jQ^kp^gZSi&>k)&qChMxNNu z*Wd=KSmhG2ga!AtBjJVfd`3{GTK0B*FhO%)$}fdL3N+MITodY)P{V$k*zyx=!9icK zelr=E#G$lcr_SX+CK1o3AHgvi>t__hj{W4#w=(8kJE}sB66$FkpT>a>aY$2ZfDTa> zdq+7fyi#Z-GlBkW1zNo$yYB{ZP8UMid$>tI-iWNc$ieB0YEUur>;v)mekRy1yz#$` zEF5h2C;lR9T^^ri<vVkOIc+KGT0^`q$}PARF{Jx+4_Ji&vG}dU;j2I=+}_XKfOQC9 zF$a)*1GsB80=2G%oYfRxLXBK@b3oo_xR2O@iTn*l+wuWlcnNnNc1Wyy@rX!`4&qo` z_cF_NY?3=%u?T@HO9Yn^*95N8!Y<6jhO0N%R+5<}@9zcF0gtXC0*E^B^GWzNMIh88 zL5=>Lg}7S^#X)miQl>uTLDji9(%Cn-?jcFHGU4o_LmPhhQ4p52YE4LdCB^@uN`Pxh z;4i5~+5C1h_bukyN!^q`KU3wf{j1~r9#T6##t*ZFAfsgILqhOwD-@-!oZSU5-{$B= z&aEWn`#Mzhaug!|>S`s|C3~VJbi&$K9q}-quQj5oku>Khmbih=oY!yp`#M9m%qd9k z1DTaePz&81#qc!XaJ>Io)zFs@cJSmmJQ-s(MbuBqms|~<BvgVzEjd;Fc=8iOX&z6P zl!6O{z3E*k#Sjd6W@QLwh=H%gkSr*`;IIM?C4v9eK~9Mm&lCnXj!TOnkpk2q>+90t z&|LJ$hMYsflTFpso=HMg1>n$q3R~kS*SMI?7^O|w=wg`P<FWz{K|BoL@Esok4x6Is z#sYV!CVq!G167vtCsZOY{+8fNBelXtdP);r^$y~Jp@7rU$x^f`ny8eqxJOAWSX!UV z@4J4;)8}wt<rT#J8}OIegNY3F8;C$GzMI)AxM-iU2F2sMi!bZKg8&3PQKys=S{Lo8 z*vc3T>AIc=f!k|=2zLC?Yz&6{c%r>U73x=tf*~c(puZV)(gG1;9np^FV3j`NbSA>6 z2eY_!x$$c<ngq`K!3KUeizl?<eeZ%X_;7Ouo23jHYg-EAv%n2UCR*Z#vBP!H=v|g| z5EsD?dH!5PKIWbF<C)YPaW_RGAWx%-Ay=t`F~WrvZm7Zb7A$8?VM=>`dPs_57dunu z07fwfZb<n?56U-sY%G=EA^R<Y)}Z|ssfvBjOM~hMt;H*P2^orVHuXo07o!tAX~AQE zAJ6$6DbZt6OpdfxPaA5p0-yC^a=BixB)vF*bxA|qFcIYd`+68x^9OKhE8O=edvZGi zR9*>PKQb&pDrF`AWyE18v0m!vi7<r3dBTyf=Cki0WVV-s$YBAR6PRqB#~y8nvmP}_ zB@dR%fHe!yt5-$XFo4{s;q%dtq!kbvl~u?g-rmhYmaw5z#U7-`aCwV%#p$<bSRmmC zsVdV|CH6`wxmTEe``M(#eq>_-XRD0ESQY|jh@Qbjd_5Gz<5vBbcJK=Sv$aaL1{anU zJ9XY3U6|We;w4-`h_W7#$+Z4+C&DG}_yw--lz+D7F#p7xudxdjx(I^wpvnJ)7tZO~ z+UZm@kP$%*3nW~nNb>nd!i@V7<v=#YW(*tZAlYs24*z}nstt~qrZ{4%@(|u*;~SAB z<($?FjBY-2=!R6?(wyUB85ZOTKh=zi^yx=%mVEBd3Dj~4r84z+b1tEzPsVe`t3x-@ zN_&xk=)y7qbGs}#9BsA<^A@5&3}&mZ<`<KBv1q|VUy$guw@RDv>b_+TjLI?|f%XNi zQk`!U@4GEUo~^@4!V5+Es(6HW-f<DszU@HE)N>t09KkR1l<??gYL7k!5NRtblI_Vp zH&e4hJ{q3i4GKl<-+8rUep#20OX9h`IS~>#V-8`%p6RaQkEY-Q|Jc2*)6mNF)9P65 z=M;|tE4(iG!T$sM)r`U?8`d-5#BiP}Dj6I{C5MpWtZGuDf<#b(zgt2R_B~KO(Imm) zR`m1c7g|x0sC;yv5jtXzuHb*SHBWWHIIYiu84$1$o4yWYJc-(3@6Kn<&q6UH6_oM} zu}DeRcm$7CI08t+QILi{h^QuMlo+rGKlJJ)lAmL;g>6tcnStUF89%%#oA4g4aBRYn z?_=c`v1@lQMk3yd`y%jiPsu?=-KrdZ*llC-I8p6*eoOMb^KpW%VQ~^TjxVA1h;dNX z%4LXt<ie~HF;U)}d>i5mjH#iBmFrk-@nAa55W5S9s=C+_1gQkAa5PnrBgdBta#hu_ z@>#d%Fr_j($bm~BqQPtu7DWK-WsQ*@1V#}uR&IpUPie_25(+oHOACrVT3Yltr-@+G zijdjLbamXwOuS^Rd4VMPTGug-n$Q~cNE~XaAdn>bUS|&sAw)$>46&$VjL-?}PKb&Z zHaig!$P6>_n$j&Z*<@4b<t)f2?Zb-ax`S4lLVqFL1>Q0rxL#R=;_p>5Ll5+{68cil z*%0~x_`hqQf1%*gqG8d{9U)F;wM}Ij=y@=VYuFUo-~?2r2x`~|7g<~KH{4jH1qgp7 z^n1giE1MZKm)I-;M+<%$NvpkGAPx25swhUAQH(&>waQhLbgnU0lGgZQ@$1Bo-KG{p zDiLbHF#%a)JSz|nRpK%{U<lJLNP>USy<pl*AhII<-4V3@TZ4Ei$rl3l;Df{L(ckz* zs3u3_e@Wm!8u7-f3UYYhQY^y|5+r<A<meDhj#?C<&h{9MAyO#}f$U&kF$lW|QXpzI z(!U<Bevc^Z+5A;u2-4A4g&~kCQG^z)P98%M{QYbp^l{}M-SLk4aBhs~!#7Fwo;4gZ zb|$X{9m~PG*klR$cA=AxDTsv3eFvH}Svz`{YZ;||S%z)AZV)F^B*e!89(<6*xe?UF z2>eCKCf_`L3udmZ^v=47nuqzZ^pAC_Aa*eYv3ohyz?iRgq;pq9Wz|*3YAhI(Cj}ov zKy>di_$eT|q}Q1$h{xbxuM|Xb0l8@dGjtmRHHVY9PvEbac#PNwsW<HsQ)mUpIijZr zn~4{u;tjvW;0$ErTE!a@wClBs2B-5Su5=_T*^g7##5utikcdh$TDti-F)*0&_rzfP zq7`jID+)J=Hw$cHJCN=HK6t@OUSJ5%7}FD^W}h$|SSD@Ff_N?HE^*@_lr;j@_UgVD zQ?URsTPy{9Gv~Xe_BQ|f1y;*(=yRAs&tUa{B2sE=j?q-MK$Bg9*S8{i3`^6YE!^`Q zyXqjXQ?TLu3i7=*Ptf8G8?1PGtHcA)wk4rP4F{|fLvtaQspc3ho~rG}T<J&Kmwq6- z>1=0eXpJaD!HrLUA2yr9ESGR~=i1D*lk0P?q-VTU#aT$XWQu|~z?8u2o8RE?^fc^L ztK30x+mq#zcf|2-L!y~oqj2@=pkZ<-x<(4Q57!V>r5v50NdihO;5rXzw9;7vjl||- z5dLMgsF%E(xzA=rwOF;^Ly=~Mlx}_DU7v+9)U#ODLBo6(6oB@`Ke){=Y<Yx)8_v;c z1e(;dFoA!}S;`|5EhR+DPI|@1ipe32soqEyf=Y)$_Zib<-f$jBx0zE#7q4EX${e5G zA`i<v>E~CH?^1Q0%BZX>lG|kx5hdq>bIKntY+Uwv={=9yGyc3&{_xeybJ-nZZ<o%c znOf70Cwlw8_VnK0YR{eNof*{9uG_{FerJ{pX{i18j(1#YkG3K1pRM}R|2L<*Ie(%V z`8T|qvxtw&mO5(xu=rj+H~!mBqIV}+JvZrz@myz%8@1<t-n;!7^?h{qUq3hY4Swf? znrmZU>D_;>TCNRpQC!KcxAo_v6_q#sA*kh@&ekuq9Oxt)HR+@$;`Sb3JVTqvoW`a_ zF%6y&m;#E*J(z<uKTHUpWR?ZDMOg|)0QvB5-KI@#@(*G7QV*vUfkrOe4#=!0mH{h) z;#6oanE8f^W~%RecJtnUw8Nl~5E-^l<%&k<*)xR8WWQ?oq-O4n#@o02r-#o+C39P> z(1soBrl$MIYnk<Qgp6J_m@YvK$*cb+v^GymUxhZNWz?Q!he}lcU2O|^)zoj&>8NcN z^@!5n`tvLiqAa(?=d!EH2Ufm68s&BfRQ&U-{I2r%-kGJNXKd8Bf)DDDojx~XD|V_d zPUCY}ZhoSzK4A8iC8_oQW`xQ65SLDbi;aVanxQ0mnNh?`Pe&5$vzy)y>-W6T*eSb@ z5c+Wwnc$6vn8tBWLu-si6qNE=P{}+Pg+z-jhcr(`F5bW#yT^adapjTL7<?L{OEda& z=tpz-w*)Nv%AKM8%3bn~Cp~%n%+?<rEmx$tjVw@l6_g|Z@R7b>|C~|9_xfzhuCa=o zT(^h%$u&->9K73AtiDdfJDvXe%)G2+Ix{Pu4YuB7vF=vC+u2tihY)ecJwNN4b*c%G zGNxGU0>Z8xKC#}QcYLj$s}U9~r4_ETXCFhw`>g&X_&2e&R>f~J#I0=$xxq*r8gdjT za}-VJk>v4yp-1S7#tLdi&GQzL!|ZbMm|#PBJX_2d5uArOc;~oO>7rT)9<#v;5&x_) z%$~#5@Ib*Jra8sd#5ptC8)GjGm|9ZyGNV255V_98Lj=zIfN4jsi^%fb-k#=0)88EE z9qI#MG2N?!OJqcYK&QySe+(7G;wz@NnCYqDWS-2yjKEgO>a8*SwDDnliC5ecCGZ+s zlNyD=g=tt5@j@&c`^7h@3~8=yn>jHe1MJo+{EP`+lF@KBC#({bPz*YDYd^lI1C-m8 zwRxR&dHM%SplK$;kH^1ifvsX>B>9T<so_WqtP>wu6SUhVF+DMtQN&az2rAVXc&DbA z0OYO(STaGLB#ri@`QSAUo3wT>TnhzvVaR^Ze`=xX6TajwmSba<=Fxd+;8TadLUZFw za~cboCq^Q~JI|R_$C|sgl=}G~`D1vN`(okDxJ{F&tCB<bjRQ>H4GUHUyq=Iv;L>RO zGGVg+n^bqey7PF^LcoT4gAI}2(xq=NlwHc|5}I7C)$4%tAE~JhOXT^spVg(5k>(__ z=xd@YCgR)uMsd!}@wLDpyR*`t0n2yduebPiD=8*Ic|hDwk~m;sfYf2lf;2`=gV|CP zL|Lvd-*y<DH6V}JbI6jc()ajsSlsv+12!@_Ga2)p;V48Q=;Q#bdPxx@c&W`1(JD8I z%A-nYsy*eu34R#PFwerzYIZ`6(@X-~?xZo@V|<e!&jsF?;VN}?sWPEXA&)wPq%?(| z%@ON#KxU9BcnN*zGRrZ9WoSK$=bvU58ubc0u+Oz73xhY!7xN@vj1_uBSE3xjdKGX7 zAfXQZJAdl`8$E*Eool$hpzzfAHc*ce^}VW*yM$8v5MaIx8*~qidTSRf;N((cDOYQM z<!!2A<cn%*(LPCUe+8=szAZdMNEtPZf+u2jK4TwQl`{~xZc~=!t~zQeAuX9L*?=it zyNyHCLZ!rRHHv7?ompBS4M*t(F_Yyp$CQVZEM}GJ;nX!JtZIk&#UR9wxWoi>m<~+g zKbtYPr=+eG=l~^;ZbfYNgwHKt8#QEo8=zhrK=n(iHROt?!C)}mHO)2x&vRBkz!~cr zMw0yy;;ujk$=wYkB)11xZxqurgARDNYqAVx(4j@1fDVK3Zl_TxD2qgtig9OV!?ig~ zqlv)0hwB8omK<wq=Qzt@X~XFh|2s&K^-J=(k1TkHBP!iLwsB>1z2v$grEZ2`b(XI7 zlVg`T>N-1gIiw&nBwKul#B=6-^EoTonbC?X#6uba<4Z_}h->{aSLeMDe}W}sWQjWX zH_{wtBY7n5d195un=79Sf{6b#$q098&cQTVU%e}-DIfA>+ktLJtBO_f9mc`D&cPhQ zDq)ydxS`v0`Cd>MEqBFeeU)HpeKiS|RsnVBIL9zt$Fh>!YieNp3#O|<Mq1gMdpr3+ zLmj@fsB*XHloOd&4`x_VPixs@u$Z*YwCowinEFc!D5e`l3eD6LFc9ihsBG|N!`ok| z6tsn)dk4Y>)Fy_Y22HGMJQonbhpQ(S<;52KbPv4m5ZC7d*7^hQ&2XZ87~W6S`085; zuS8&YW0R+GP||pJv{;GAji7z*oX*aUl6oYa%btXcf>J%9l!_t{SFV-qs$oJA2$ZZs zaf!PUd*a8uydVHD&;(YmfSGv4fT>2%MD*QfdhE%09vK3qdXoj=%=*vs<JWEYB}S*G zL@PBU_Czal7v=hWH!Jda^|Hhr=7`9Xj-%!>cV^rngD+t-Bi}~@Ei%~5@-OE|%ke(F zg{PV%gc&qy;e0oKwm;($2|-BUx<t5yf%u7pNb9Lp(@i2MCx_J}Byw92`fWjd%+3q3 z;^`0}jpjQKwl$cIVCh#l)te6v;LQHdG)mdGyV?cp{c-ymB}UPy_a<=?$!@vYp39$W zF&Dm-tB)nh@7Z&y=19~g<O`_Ow=84`!xsM^N{E=kc@I%*!(dzO`TRKvyv+$WtGe9z zVTm=rt04*bTJBMBLjTN(&l#<Q6e_!k%A|6SSj#jB8!Zm)_jO;{?~m9TeR&BDmdYx| zD?JzB`UcS_hlUWu1H+!n<}!twkz}wI*Me2c^&O6PGsbd?&WR6K)HfGan!u7x3=B>) z(nrG0u8Z{u)<08^4YLYQCc@DoJUPU@F|YiBP4{0=p-r)p^~p4PAY!%fWGyx<oe8WI zAMSA~Ej;7ZoQ9=;P^-YI&1E0rax@WdRLho_R)Q0PkcqafM{qu8*Y4kzc%fiExQ*8& zLjYTx*L%tcRwx+D^)8pt=@x*&6pq_b3L@|MQ@9_ep^!+lLiEx?B76%8@F?ug=_!%g zT@jqlN3iBZnCk5nam`<vA|)tylPv)#Od%U}BD)n=CmphVGL-*F1m7+6AW@toC05cz zA9KZWJ&?rRRKU~k-j)KL+*ysYsU@nqm0#b+iX4L9e-7z9`1_b^3I%k10ZVgz1u^6h z%!G~9LomDtIVJpC#hdjNkEm432A9|ipVR4wq#(~Y1_#_O7*G!g`beA$hNKV#zD!yI zo1r5MIZv@{s&WRI0+!H(PH>$4nU|uU6tg<6_X2TeD*s?A-Dn9c0ZWpB=3Y1nF`)^1 z%l5j#XZhjBF#=<<HNIbE&OnREYUg-#<DbQ$>+K?@=|xet+Bz>A@o}8vq_+mHdqoBs zmEv;y#?>Z#rpBhH^GHXt9T@#lPtv)sp`X*xB*2t+lqh~jAi*B+hA39FF$561VJSy- zQ<>~cnDIs013!SJtYJ+O;8BaYsYtxJCc!}K2y0(LNY{_gaYJQa!tZ(EaNe3{u~$aJ z1F!Q=EdqI8sVQV>3UfC+mLCy%@|YDh1%Q+ZQmQ$i7ZgOYoS<jqtwgE%r*Dd8^p_SO zO@22=Bd<+0Q|thS8e?9n_z#I87H(L~3<LPPmu=Aw)Gvc!=Db1_MEJpey+E~3Lfvs( zR(UHqc>tc-ZMdd^%BzqUX_B^=`+ZrjupAitO_szP$(AP4j{ir)7fRtCL0{9jW$=@4 z>jb)&9Gh56HSnI^5(NoYwinLMyfaWTfx>YFA0B%_I@)?-7cL10elzaN>6iTn0J0PR zXEy$f<l>_EKBHhGBHcwibR{&`Z2SegExF6ctZNb)1_T|EDReV|C!2ymIIodRPa>~W z!E-ToTJm&>SQ-jZ_cK)!4MP<TLrT8oriu|uUsKBWeix^zs!?3s*ZLag)zW~V;JNEo zZuaGg8$&q}76s4go|M_q0|F`2&z&zRc%F8pA2O18XFuRN$yLlK4~qv^^Ezh+nIc{! z_=JL#r5u5vjUsd!a3SIIh=9+-=E`fu6@Y@YG>D&H5;b-R5^N*0D(2eDb%&j>doN+5 zsd$SbaX#s}at&4-9kH$uubDT&C#7BdYGb_X1T5?HU8&?=s8+~S`s`DWN}pK?UXpfE zPtq=G;6970>AJDhucIS1LdU|88@zS8Q-J3^Ij>g2!XlStj0Edy#m`09Hzxuu-Hp{0 z?6Nr{brxmrA}5{j7mpt~vx%1WASu0JCR?5}FqdC+W$|WWGEAXtbE~m5AJki!>B%f1 zC7rnGW(fk*G67;D+V25K@Q#2oJ$bnnL?97pSN9F$k)2so<W~FvDchV6eLrJO+w#RC zwh}T%OMCnqyS4_kQkL-72!Ck=b&KJchX<IbX&FNxWpKV!wa@=Jzzqi^!4QW|8fQ+= zBhxaG{)3%mk-55U3-k|f5ZI?=RVn5}&}7Vpys=zWMld<^Wc)dA{rTS-!-n~Mmx0Q( zo^mOK6=4)kz4j>w_6y|gSDe#yTrr=ZEe%J)I+DN?n(BiF><>Syj|O~;#oNcM1DQ3& z5#oPY$p@CM=)Rm+;_g)gg4fB57^+pJsLHMgwrv`qmrH>fD;51hx|-~HVh^=sBsS|( zUU>$;OD{(~^|&|tL@R3$Qu2x+VEdS&TlY(IFTojhu<Di(gs`ybT^%Tw!v3)GX4ZC2 zND-rOG*pIuMS-YF`6lU++3_(_B<GI!%|$P51wpNg-f0Oe87}-<gPrbr8sSTI3Fnle zcmE^M?R;*iDtsxMVBKVaout6(lz|m$P`QboriqWJNWvrZ@+sAS*;XgespMG7M*r8| z@po9^I1<VQL%D$fM`RN&Xy{xmJJ1K{ftbL{{O3UfG9!MY_KiE%GQ9^zc~Uejy$P(y z<RxMiHLF4^XfV+UeQ8#Ez4ZXr%u{Ibkeg7Alm333b+^O}d+W975ke)Mp$|1F4t&qi zt;Nyp&JRE1hp=^*fLSaB2kzaj9HAIKL_yVSQY38c-jzEfk_)+0#Imad7F6GMu=SL& zs9DycKjh?C_KgiAIdh0#Y{2epN&as>;Urd~U!1z1atP)V%jv}cHCOcc>^+)G)c==n z<m~a728@SOY|%k!uIqTlq{3a?i4&X3=0>kH6)a5esv9%rVrkom^-AAT8(Qv7mMXTD zX{S|76R++DmY-^AOFwvAW7n6_Q|Hubcp!OTZ7f1)Cl&w9v|IWak~9IcR25G-WCJmY zeOR9iLnL)<=NeYJ88bV=O0Q;t&wDZD`z+4a%t~sf(ErNq2J&t$U;c|03#%`&Sl9W5 zAHPWD2H_sW62%_{qoMzm@`;*Tnq*E?VFdRXvkD{NM`iqI9&5D(TAqZKTNXkBvqiYC zG>aPy%<$nJ#^K46*P|ZwV;pt((w0}EtjDJcb~FrDTZ_M7B&O0S^ciqjlFqZM7WpGH zSm`FIh;tRI)J?BUk5Dy*5!^-%vPgJLJ;SCt$g+?hw<`Brae`UK4Zfu{?ol$LJ_|^~ z<A$ybJVp$e(U6|w8-dY~bzWG#xOlYG`1BFnJeEDQN+OOPq?gAJM~u$pVEV0ayoKuX zAqUfwgGsVW!al){Bmr2e)RRVfHB4}$cfgHqA%X^xOnCl;>{Z_THj7lz96TuUh=k7Z z*V`M!dlE7UdUR*;$|QGJHnXKCdX&ayb5rqQ>#1X5`5@3E*nF4S0iqoSjfCH-qA66o zez2Ty1&*)@HvFoleYOV{N)J}gGXH_x+h?0Lvjx@3V_D4t;_5zSPS`M>PkD!K4h9Z( zs$kA9XRrqtz*-`S%%14q^MWMtSA5nzS%<1%!!QTjE`}qz1=)nP$R@;|Rdw!S2xxO@ zs)Z|<vsW_T_?)-(Y4<j`QBakI?&xnKWHjT3Z#GO^r*NZT*rh%z933VRlJNg2TeNiY zosLB00tb9Ky%QUz2JRNi<fG^RWI8vPuRzZmxr({=l9#`wKMsgP0xs3E_qdGd=D<-q z!|L^7JPLU_fR8~TPfauw@B+Vl#$Nak)M(Fh?rO@T@3IM|aDwnhrSOnGjff;VIK)q@ z8Ha$^la2S4iZ$P#MarHg^W~Q-`DHQmoW|iy;!8<3_FKglntZ>y&uk59t&>`0-n??X z8@?9!p>^3J>9U8fWxilb${0kx*V0fxb@mu|^yg@H=CVanF1wpaM4W4kuO%KP{yhkT z88@WeC}TV;hNdh3=#G-xj;Try(KMQ4YZ<EeoC1k&oe4x&1c&R$l)EsA>ipntC((xE z>%=ESPc0^&(EF2yxjoTy+H+C<q@W$wi=BWC)Y>>kt&L;U+BoJT1ptA5hLvFe2HogM zFp-GBZCu%0FS)L8wd3k3uHE-JM{QASJuyW$afZT|fipnX)Nd9ugitu16IV?x@VdOZ zTzH`yKFf#68F3&URJ=CmhgvZGu|TXCj4H{aBQV1!I?N#S^A~qvAkH(P-$IrHJtYP8 z;~MKby@0s&XU8FE6kj&yOLM@I7oMdk*B6pjXaI*qO$f?hN<Zo+nupo5G%^vCA)MH( zv#e>!Vk7>fs)%F?72;V6aqkMHMNAX{8$Do#(|FriDb%ddPlI*M5v|+KJePVTo5bHz zRlW1AVlG+P5@eFjgkTv!^d&Y<r=Gp4Oub_nP_YbMch3X3?*f5k#=~njvMTf%aGe5k zie*Aq($McCm~kONk%jD{LckZ5;z5^*gx$enrD(9P2VE|U3h`i=lXO0U2A?udc3JjZ z4K`AzPpH?f1rhU@pAqCq6e3^?LDCBe#4VJJ-u(X&GsRY`vtWT678bKe4pTTlrYu#G ze<Qo%3k`v*7};Ze#aqBga){duuNboA)j_&Ppah$|y6g(nTGigfjt;V^1a#&YoJOx( zWZ~6CA>{zQV0|=B(@krUF%H^xCf|1^W{OEggU&xnfljH=e45qNJQUqdf5L*C7R%!` zg0~{2;h16BYrwC$vBF@bjG9rSLQo^$L=81sq@hL!scSvM$@$c>y|wK7U#2_S4L<M# zJ?aB`)C}~f2cS`2t4)A{S{LLe8!8&|{ZR3(+(~3|PcYhEt!aS8Ql(I*9@<{c@`eV^ z&nq|r4-_CoJ&8sy3IuoGg;br#2|2+M_!IZ{5+O6Jw|IUeeqCH;bpUvWauD&-q;RxU z>U&!`XEfn?H4XXSg%z{mQpsbi*U}FK;N>M|;OTt!T`bU}?MW^=3Tv<^K3r5tplqQF zIcR%%#24b=?aW59lP+nk$ykC@n-NjT-qnJ9B=w=2Irab>G^lU4%yRN6W8*hF<;8a@ z9)KyIxN>`kfZHEYc_F$Q5J1W6fv%AeS)2Ql<ItP5-cAaJQhx7XKO&Xb2^qY<43%L| zY!{~fHrIz-W4Q2g<V_L;>5f8>Y)1}9SE|3l@gYWx6Dm<_bfvnSR#5%y-gG%6D7nUE z{?n>9dT)2Q@%wKP*b2xH5rBGaon~w{1)n}-iqt=M)9Rm}&+b4*#28iv7VPriB46gP z!qYfIo$#BWJ4~=A&oBn${KEHq*@!QfAY8{mFAi>sQU83aP+Kzv!>?901+zU$(c7qK z`+E|Vsw_;wvE{1%x#&puxnUBI)nZ8&gbPH?VbAhv&#&P9QvdvPrTXVgT(60m*-=U* zfuI`o&x;R7OW9^|T96EvH-U=*m@D8EFN;ex#gcG(BQ5KnPZ#}aBv(H!GYr-3^kdHT zytz_*VG0$^Z^C-L0sqoqBGI@rqLBv*hw9y%S7|sDRg7Fz6{DNvcz3PcUsW)ofOECo zRFFFW7sec%+8vG9sDN|Mrax`)Cc=@MF@9gftJxl;x3#!`E8BznS`WY;JS*aWx>T2e zu<{w(2($&0Jy@6hr&T}K%E*}s7&fe2yuacV<Fw>}uRCzI-MD`N^~@J=WL?ulz1M7c zX>Fao6=7-$Luk(3Dhz?TRPAsjox$|#1()0jUDKp&^EYo1s>|cF5E6>ovZ|6bIxdFP z$g0i3%#Qc|6kcv{pEiID;Ou%T()sLAxJiY~$8M%(N*8h<Xeyy8<_bn+fU+p6g3%#2 zh@-Ke7I}>s$|>Q;et^hqz&rqwyu$%J{4b&mtN&6hyWEA0w6R@@P3bvc-BM2H2u`P@ z=~MGDd%rVfjEKmlozhZ55svMU48s?&U}X|^p^TB)B(!uAMrA#p2^Ace^e_ah*-4mo z^>t|ebOwCOh3!|1o7i4vlMv;1589r&9!2KFN<PB-km5Q&l(K*;ohsC$Ac?=EDx;ze zMIImD<L)v1dMpd|8n30wHb%vQ0?9pEJex;~#UUy26rc;W?1eR6D(jfDS4Jix&yrbJ zseUuzilHn4y5{4bSOY&#V9UH@f+OhCD^Vn=7y0loV97N2Z?sYH?j>0WI`uSdsRIMT zVNBNCHpzc(a(kVSvjOC+3<6WT{)82?Axiu0b+)7zx>6gZ!+>?(o6(p4s({gp&hXu8 zV1PaC@Wa@k&ep>Z1Ma9A)65nyrfQSWZPOv5hcuHgbM<^q#0jQl@-ThNiX3O+qLYg5 zi^@5HB`9FA+~3Na_$i%$t8fsie#k4EmUh%#rrhMIRj$vzgPNssk7kR71anfb6KN4! zNm~hrDZGt1P6aYCFvF8(n?jF8SPN?83XAIjN41V5K~Nm(pV@IEhuq|?(0hZtVgft9 zW;QBujQ^Mg#oZK1Upb1{OB#<4<_Nm4fC~R)R}ElSb<%QN0v9dhSDK($6G2QHrO)4N zSZ36^`(rZS{uO9=)DD1YcZZ?JbE_|YgQMv?U|l{(GYT8#O+bb)`oN5@2?6^cIGdCB z0+j#lQcM~8Uv=33kW?;+7ci5R)6!RrFd*E6OPG;`LFi^S2p8?E=d0ATsxiZEAb__7 zQc(e1%Da2u44e8OJN+KBA0S}BEVjZ!sQ)jj7X8#;vr7>Y9wiMxk1z=H4po5}p8K4% z2x&E7Z4e6auI}673q!VKGP&^D-K@AD%XisNX2bhV@Sgydz8cDrfjgB*my;|V12hva z>KglcyRTT1BIW5envdqchQT)@$K@I+NLs!smX?;Usuf>2!$wC%B>^I2L(R{b4Q1{c zthnK9_zTSyi;8J$Xi>39ir(1#(5lh)z`~`k8ohNf{=uT!{lQ|U{)C*&fT&I2w<Itv zr~$t%Bc@@z^m~?K=20Dq92<y1;6gn|Vl(6OuCUI5JRJqAQW!}hZMYJCMauT$%en*8 zu4=wrb0g$_lDlW5ujtiu#n=_R_vbl8Gnk0She0eRPL2o+h^+F(D7(8q)lefX_lVMA zGz1oRxi==YRh%J}&tDkLukPhD;3hnuSLfJZ#h9(Z^yyv#-gVTh(n<n8R@f#rsNM$y zG)1fF!72IW5Y8+i%z&>u&K7L%q*K>;EvZF*eH|;5r{H8>N#)CyEF!=nDROHfu&`2G zIGH{`0J*Q^P>YI&zE-IwYOG>1;JK@73>)e5-90jvb~x6UKyjirI9O6JV5_QFwDgsz zwHt$_O<ExI@dE=~$h$2~d1)3z@1!De#1|q23Q?I7j-w*HkAQF{mGHbY=Cwq8%|Qr7 z5wj16mANQZODz#SOf++%R>77wd-<ZZuyqa8Fj<@}dXh_|Ckw4%zBpT;XFkL?D%f@r zi~eIkhMzcZK73)Mj-h>IEg-0DS}1GTk(*HDLJ7{G_mu(}vbMOgjLgHLW>Ij$0Gusw zV9)6yT+lQx>b+yt*<*YX2~(Gc{nL&AXsBVgjlb~PXr4~7^L6`Kz5n_%n^~}Y(f*zE zwh;v1QnRQi{&5P4zN+YrK)SDSbTkRC!G>q6OmU<lj+?4mR2WV+q3h~~xwusd9Jt8$ zEf~c$ge#{2a9*ofG;nHwXhE%DwHuv~@_5c1JWy7xY<Ub|dag&6Fx3*yT&m9yiaA~c z1?<b*+EdK28B_3L3P-uZ=E6^`YGt?6K)@M%S(*yv2{)WrWw>D%zNGb4tILh_YL2XH zGF+K(!@{{LTUUaB_^^nT-@!Y>sOH#iF#2^~B@vIm1@>*jCUA@7vBMc@{pDZ2oCua; z<re&gQR%Q@t|e^fr6KfzxrTyPIovR{$!P<2Y6qyRRW&eYsOHtxKwXO@$2WR2CI#)? zEb+7U>q5>HCeeq*%T2=!*G&nVA1EkS<M~)1-JP}j$AI>^cWnrN?at-F7d^OYan<3f z&S%5^%Y0CkhTSI5(z_0kV-<;)L9u4*{!jq)3*arWEYX!<e1=4eTA+sO%JY+s#m4V- zqMw4V<IJq}VSCVBQoB+_z;5R9H#U1aP^raxQ%%>c-q&i_hn3VPPCsJIFVcwN3s!#> z;}QS(LM{)<FT@9&+gSvbnU;A0Sl*YR=MZixkYdfJS*K!*mdCKM5kNa8T3&%`ZCDo9 zCJdu)9$Q1)583=`2`NjSHya|+t140mVBegv{QJ1UcSz)J$v~_`{&6{ryjO{QKnBCp zG=jq#-5UrAkzc7uA#5T3o|KpA0mSPMpNL&|I?H!DF-<0Fx&eGt&Mi2f{qCvQ=kdS9 z9^L%+!g3bV=G6b=>rCK!OxOQEW2;G2vSn#AX^<M(*OV}Xj_iac;vhP*R^nuB?2~Qm zzZr~Ugptvl5N33Y#5j{JW9bZ)i7=9yg#PdAe!gp&|LZl+%k*8I@BQ4@eP7Gx`druD z(fw`gt(+y{wmq+1ujg{1A&ra>E0NOT0poFSlgyhKIX560%{ol@@{l$CV@GL_f_E_+ zCvrKH@`5oD1ZaKjq*INGBM^0sW*ivEWLzdox}Oi7l9tWiF!_i0!xV&ajn8_}Dg*a; zD6{5>5O%HL_)+HI29qQ?fhP2sGO|f<l2Vb@0v7OV)Nt@{!I0|1t{0pDDASvWV-$P0 z0I7Lz3dFE(M-dC%Nk(y#`>o@8M&HiNeSBXslXrL?)e6;`-q&<sEF`B@D1hSFWqd^x z&QDw;0PuZy>eDQuw+z#2C=wg@y$dupp2~|yf5s)er!zQjBSr{PS<f|3cL-KdA$6MT zy%@@P?$s)YM{3FQ+3?jXd?kXf?B??6mG+TWpp;HD;Lx;e@<`qAyiO6yFTjge9dJeq zqA`h!bVM$R``lWB8o4XfsF-Z&-ZSl&I{ydM=mc)jWc(yDre+;*hEg+euomXEDX3BH zUbM-Cm#w*Jw6_!Hq|sCu&&7bp5O8m*i#`^79$J;>a6s}BNLOR&l_m4SP=o*}Inzr^ zeH%mw>*lzY*{#?P6$VKk_UlO@rXY_ZX81f4k%6nEV!`%|r$4jw5~&^L=V;LJ(y5v5 zAi5c1LfGKCbFk)yvrlxfpyrWg(+s-ByPKa=J~6d=>7tEyr+>HR`t6=G>n{7-M^<0j zUcBA8(><%+E_MA({#)kv(bBK}R@d)K+m-yE-(bs^-O6Jxd&N#ED7_nz7;|Xa+U~2{ z7vK86Q;xt`;v`Av(lLJi;Uh>~*hSN5AFQ42!@~(%Zj_q3FUVE>?)FeZrg}@_dpq_t zP%*XT&y<D>S9T+_u#NQ+izhvV7l-+#E&C%7Unh4CyG9y7(OORH{Kvnv=~6BJx7<K0 z<25w+@uj^S^M0bb?eW#UErIQ{en_Z!tDBJbSq*V>K%)A<eOblIX)3fd9K(rkPqI9w z_DpLj%1XQnc<;KZ<>+)N09N%FBw`#IaiVDlv=J#3(v3Eo5Bf3@f~Et~tDHG<Rhd-= z-=r2rp2C>E%pVK6>(KZtl@=F1QLZp_^&ljh(3>U)-`3+v0rA`(q%u(wTh_2W`o@uO z3X2*)S;dywWH|Tz-S%i%7hIkOydeM=UYE4fp)a6)t80QM35EqgssJu)*W@H=;lUQm znI^VEN=K2CHM5=Pm*x_|JPzU)qn=6_-AL;g=|JRjiAnFkqWp<z*`e~p$fh;v9oZD( z4W4ig{k$2&NS?&kb9wP=renNDj8LUC!f?OS4P`D)-(cIBF0VgC@c^Y1wqew=tc%|A zHE|h)JJnUE*sPG{NqdgIJo~mbj@Rp+mcCOF+D^hEDUkwsk^{k2`<(ysM`CkgUFqXM zE@8tCVT#4Y50lt3iX($khw_+$p$p%kGlRw*$Q46#5^~7Vy)HZvZ^YR?4{6ItB(Dmd z;`WoIrw=eJsn4d}w0G<H6zMFaP#x97d3n4>MdfEUa05xJ3Vt<YJ9kOI$86tIi*cJX zfnrm;Bg>-cjAbQbnZq|^n~y|(ILl=_k-UT_|COlqIG+YcrZ-Ecqs#brE(7*pz~#U3 zMkC*};lDEIbNs*9R8f)CP9^LY%wSl2r<@MFXv=MZ{F8LVh=gOYyxE)kqqMxC;wwHe zLs?5{RMI@0QPn%Py4|WG9#LGugWP=y-^uH{SnK1^h;gOzB9Pt1di=s$=lgztX0Bx* zg6O>BqY}4(VyZ?0U`2Z$OGOtz4V`cs{5ZA_m4|Vu4Yd~9O_8Bs`#m4B3%8-aEf6S& zns(q2>D$1?Z{A03-|PWimv9}$l5BhQ;@`NtL}RS!&Mfqtg@Bv;Sj#FHL!n-x&2kb5 zuJZVPujAisq~LXUFN*KLql!bcf}tjk<&TThD$|WxvBV_qtm9g&YS^v`B*WUsWZkN` z69c%}!p<Vu0vG!6bDsYzo^&i9YULlk2$`T`qHm$N<RB5Nd8}u;BNUwGJW6lu;wZeT zaP0HX2)vYocio3e18xb!crlL&9kV$8&<;P+|3v~f2!4fzTh2hmqgZ1*^MX6S7#zss zsW40z<4RI)4k8%LYAX}gb_>P?A(Vb>mlVZVx;)kO_ee<LtV2~9gv*r4*4|o8!z+}} zP%J+F`*wT6@eGPAT|JlngtZZ<?k;yb(SzIe=EuA6hq;bv@MD8I91a#YwtOft?o`)m zoc|WLhRU`)HmJ1DQAbFZ!7NnA40E;&y&RlAp%8Dw9lRgXjKd;JM9=V4-=SY>@Jns^ z*(+SiXDAb&lp55`CUj4iT*s1li!rD!1wQr=h!EgG;a5!7IE2~bgHX@GIBf&2a7zU~ z`lV?Mac-H*L<yncoMdW4d74z``)5z+BHRF8W7|Nz$y)eZ90NJdH-6>?!AF?1q-OD1 zZ$^<7D*rz|DZoGsZ%CDtjq4!NR7H_Yb$VGiZ?tFrr`x`e>I=2=Gy{>E(}++$0VPC6 zwU;C7L8=p#fe^BOZJ>LtYqNH?JNm|8Aj1BR)2ufT^K6e^_>eoZeHG#KPsx^lpd+A( zHz+Br8g_eV(V4n;5yZ`9|FDCf!G_5shvLAi9_aYFtV0PN{3KaBmB-!5CZ0cZ@z4Q1 zzMV(iVzO(sQtI4J&YjQxJj6wt$gEjhx4E`(MQ~kj#@WJqFB0L7agiFg&`nzz^+PT% zu1#Jd1D5wwu3h}*J)XBmO)82xnIpZ6bk?zEZ`$*(9N3EGETp_wWyEj&i=k~t05O!D z59MJ6G++aBCU#8v$Fwk2wZCk!e5P}?$emlC<}|VbS5E)AA)I)l__E%*A}MA@ox${n z0AmBWLoZaV9MEKH-@9TDu<tuYk`+-k(8T0~Ua32*L+{<}LIY2I(`^NBu{j?zM!Mx* z=zN}yFJ#oqyzo{B4PR#xB*{pBVI%xVt|iQy%}F(mQZwz4kgFS-O>!JIya}%$$y$qV z`}y$oebizHHK4}|JZ*=@{=t@BeN4n>&%<lt(~j>IU>VC9S)X0};!L5B&|JR92jZmQ z9Mo*Vbglp{sXBc$0yZH<h#@pJ453*-2<V<gCc)2#i+st~?x^dZD9MZzn6ObS?kF@? zDaxtTq43DK!gBYN&`4TkZAjuNV|{}X#_zSEv^=N193JS71@-YGC%h%KzVyYLBrWl} zOM$s)u@PKSI^(oBzU|L{M5CCnvQ#BXAy~1uKp~hV1&M$mr+nI<AK1yY2Sd7sXRps} zN`xXL#<&B%X~ol+_oloc3`fC$03-|hBHdG0(WeU0LMUJIW)t4D_us*x8^61iH0Cy& z_?9Gj=*HHnEi!n?|0|2Xoi~jZze%B_BWp3Of@pQ2Mfa>t3`9}^soXl9Z}rFY3X5?{ zA4b)Wb4&$$m4tGe_>mJi1W>taKBAd5acbOR9M{dPqLaW;5=H+Q;r2;xP6O3Moo(5N zLDb}B0S(CIx|Js~T%+a*w!9LcdX)_W!icc+J-n-_u9X$c(U|&N__<}&8<*8%BTtng z<mv(!I|CPAW#Ko*luqW>(l?@>6i07lI8RwmyZG&K?Aadtz0ivNdaJ7oMF>1?Nzb$; z-AP?3W;*-gH3lOXr(ZkzMnK5t&Utmn<(NpYIP#qI4DZT=NN6k1S;F5DTxTdXY4x%G zR4w$D1NXkPBK}DPzx<XhE!EK)rJaqCo8lZ=G7BjUWWY*<i@67@BcK(|5zcqU06v6| zmW!3jy}0ZH*JPoOwc|+?e}xaX=R=<|laIf0zP~<$nIFiDf>=&Nq=)=*>3D7HJqbo} zEZSknqgh+_3^^AKoXSrv=Y+v=EAfu5_0}coc+-tLNKB5F3YtHYPfbV8ZNZF%Y4uV3 zzisb<h)6@LLN9z4Rjt6FmNTI*`2E&=o1oV18A<SE|2U47JdUFqRo~@;R53Q-I>I%~ z2{S4u7&vlKyLR>-p^OSPfuzPAZHJ2Y@K03yBAhLC^tJGdqyVTiiC-DR6~kD;$c~<( zVc7yrd^U5_3wcKz)sws{-u)IXsS%RA|04A7wRLPGb@CKXFm7qQRs)0`Q9Y5$d0y2> zy&3=3WQ$(zO9q5lQ+%q!T7gM&IdP7m91qo32)q~h@?tf+lSgm_D%<}1X@_5b$Ry%K zM&fZp>M1JhV|#Q{d)BQI;C}W-7=sp68U9~xd%WF1{&r%}8N*S=cbe$B-6KfBxg^sn z&u@KD1jx5v61xZsL&nd{yGnXaNYlSb>4#=L6xUFlh^|?WKBNA3jBjicImKX=H0y7~ zB@YvO!rV;#j)_{%6wGoizZI~2(V~vOEkX-6xNxSqf}t)Q^?cudYzs@@ZBUn_@a+K9 zB~Ak`1b*BKliF_L6fmha{?%?ZcI|Ptxf}*W4iispnD;^*$4IL41vfAT6r8aP2sn;1 zjtK{-DV&W%be`SX8oO(-^^N&}sj>Lc`TlA_b0+gp3skK|uQYnCRSqa7!v_htj<+<r znQ1652iS%CJlw)J>M^zTnMp~PcVX3g;w|BJxZNJXo5pBRIH^0b;9uoRqAE&MxE2i_ z-Q<qjHiEkdRu#*g_Tdq0tYMe?>rW!R2fQJi)Thq(Q{G~rX57JL;0!qFx2=)&dhoB1 zvmIUYg8q2SLy4JKi)_7|fvOOQ;`#CKO-T}`AT3q+gpG@`aP3nHd%rNoc4pjym&L4w zi~JN}kD(!K1O8tKRl~Y6u9oNto1SSMSMKgdR~3s6@FK$CMMy90%@L&2`(stt-~iua z=T0P`ky?!RNZb`o2WJ@S4bC8K{w@3yb>5nG#Ktp8SmF9#WBn)+08i{D7_zI*Sv$En z-r^vOdp1L;WF6)))9rQsl3+1X;caaf)0xlbl=fgVNfabZKk~hbu2RF!VlIw#y5i2G zyM)p}GVAtkNe-|})-qGKO3)K3uevz?Zb|P75usoc`<(Bm86!f)=jTYRqniR$g)q0e zhORqdBEK1I)!AhtTqbc25~4zQRw`=X6du0NiBw|ssQ?0a9QioPt2yW0gVnAOyT$Rn z4|fHQRy0khQ-$aVMZ^^GiR*J&_}#-WsfU=p9|ScL5{*H8k|-X^&CsLz8ekppbl<Pj z?H|fN=bZOe_F8aSQGByMB2xVjfI&)W;JOSHUT`iBQwa+!--deLx`^%(^EQ^>KFVsT z!+v0is<S~~%W{`$@|`TN!My1gKmS{UaTiXw(YQ-kK__($G>W1Dw8F?~9cvO3{*v(l zX5*$*SK*)R3$vXWB0akExic<uE{;aRn=Q_vWi9wwEha4T#)(wy4J+5VyGw8KX>o@I zM`n=T7^hM1+qoy>@TJekFP1tem725j4-exEKtnv=m4HYW&x@w%<!BmJNHntxrmTtd z)S1h-8E0F5?Q}LYw4p2trD+i7JvKAt-QyPW+Tl{kOIvBw2yfi2t%wWy#$ZR@jNH{9 z*eLjY`tRT&MzNNq)%_@zOcT^y(oP9u@nhN{gI9jYeWS|12Ffw-bh^)92f~oR4wYl1 z-9Z@WsxyW|x}HD{_I~Yv?_>>Z^r*Vsh5{)aS{6S{^UZW-p)IS*7*yzE!iE_tCX`Ha zBb?rMfrc@-1`0Input9y*b9wW9`?3Jw*+&rsG*i74#8QoUb?ehJb(ZTXk;}$or%Ft zc)j5l4geb&f{JClU=kCS^<$C4X;9~(J(uW~#j)>wVi`kF!Ge;Qu)Hg<(MlGq+I#$F zL%t;t9CJxm#}&c9@8;H{xq~}z4AmV=AqHEr{98Q7Goo*J2Fa{`%GZNQr|Xd?cSzs8 zzv13$@9`$kOjuP-nh9-taZe3-S{;eA?A;yLXq*slMS5cejYNV|P=G~9&<uJan_Kg@ zAl2pm=?CgGiVITW2CpR<UQ5P$IlzD<&TvxekMWb%5ZDkB+U$KM&Jli{)npot9{`G? zz;qm#uj(ezl<^6x;jC2swnrkh(Y4E)>AkY&A^Uml)D~9MyI{kKwzEFl*4Zp1G)DAH zO_Nc~lhl{y@zmwm&aZVy!wTN?7=?bN__??-W2qQJ<gdgp^1|e|Lq$cSB<=Y|7=v}h z&n>#eZB1drEMk{c*iH$N1UCGe98Ry7US0ntg~pIDI(>IDU2Hm+Ps49iM@~V0R7N62 zLh_ar)DY=-3$3cDzef_AtusnIhkh%nu|j4QEjBfQ4L>?2=Lq-vfRJ-LmMWHKM&+n- zS+Vk+M=$|m<qgmiAYdy69K9hSm*6tb(iev;<R#m42KKTOp=nhvsm6%lT8_si)fhH= z`;xs`t0KU(mSWmPpT?1?R>{T65n!9mr=tAy5#aqFG>^;}KFpK0n_BoFhcwOlj9s6I zmRZYc=!`2@oM2Tt!mIk*vO4uhyk<HDwTbesm9V+nsH&7bcLoxlm@2(3Huc#!a96wK z8v}L~2{*dAw0m#m5?W@#-3OF1xc-=fTFl8V<|K^}CIhY8osqwK%@6hFjT8Ja0?}5q z7r~r%FkJFaJGqr+FZ98Ebo!!LV2Ad+QOs@sfh5P-J`di`IvB#;b}i=C!?<+^-qZuY zcCLAmSori|Bn{jsBG}8xQQl?%Fy_7{t6fi{S_r;-fEzq=-n3zSjx*%_(&hYMWs9L@ z9`E6Fz<>8#+E^o`b;BoW;<w%gu|DHEgFDoim8~5o4YHd`f7etBsbZ^w38Du#c>GPG znCAY8nZ{7i7)sO^mrZKb2`QpHDKTz>2QJ}F9al$>l7T$1KANZDc9_&xP?D{VPYHWo z&2I7zvrsV9YZ^~-j;Xp)hi{rj635x9!&$~ker~c&mHa}>x-*}jF&&ZIUe!J4af?vj zw5N~xbY*)#DDe+T4x5^c!MH_FP}363FOs9{&Fy{dC_RigMj)=y2vp8Jci}g~`Ay;d zDER?W>2Ro7hCGvn-Kr*dXGvRdYX1sG+!u^M#bi7H>-%>Dq^}u#O?>JsUldLw6i#=> z_5nZZEwSqcs0kLufq)FP4!BfHu?JY-Xo485XAJ7LtOgfA!^zVN*t<`-nn@+2A1tO) z9(8#9$XpCi?ypwN#rMpl4gc!Xzp6V1e~%a;eO#r-G_)#?Z0ZKN*d&q{8h#<8dBb&; ztFiATH(0j{j2SJ8#oE7s1G0rW7OhAb=&n*g*ObIaK7Cp8FPH#hBrhm%*23j2`Q`s` z>u6>Km_dkEg}%T>V;QzssefGO&0l$QGH<pcY%zrq|0daiNyxL9Ps{crFiQeoRi|#G z3Ig27ze%Jij96ETN7GdY=y#?GLp?ixBioNzx=d#Dl?w+@vF7v^pTm;07CYw|lLjNM zjuaTt87cidvMqZ@@2>%)3_z5ddBPYTqDW}3nrBMndb8SrjSE7&00mF2u+3?VhV|ll zMObro2Hb5&X}SZ(a1XcWG#OG7|2BIcPjv$|qK+s7*z_WLR~<pLg?}Tst{-Qc03><= zBx+qpsi-L>v?ygpQVM@|zW>8T-j$xDfm{)+u-y#JhyNdO2e&;)=NY}?jU&9V8#i|$ zF}vqM+23us1R&<&3ZdK;k~$2DLD5;y;a4#ns;qPduF*_}B2_c<xU#uwy+r#ywRWAG z?Ld1ljK2qe&*e8BGAC8$S&)Rm<soO0x|+$#V>Dxykc7d&6yA{Zjaeiwc7r4g^0*^K z!LoP`>Dt`4<#u}Hu&?Cegc5-Aq1#fPIur-5t4VFw`stCRuMKU~!8W&AYe^V&nEPEk zte`sJypnHn0Ot+tX(GWj{HCeZmt-MJKB*@9)~h+*Psjs`8SkvM&9Ot6aDEHMa!un3 z<l=w=t(}<-ap@Hv^cl&~*L3-#jr#DESEm{CUxvE_MYeRPOQAc04hD8CAe_i$TjZ{s z#5{yCDP`PZKi5tEKaj4uL*b$)<?*HtHdLqejKj~9lAwi5x2F^$s}r+{=g*#S(VA&H zA)Rc#wFuWJVm^vo6%3KxQYZ2d8su_vT**VUVwKk1Xe#T?X!koEJ%rSy2=jPr2Ca_M zvT{xKt_y1&5rp%FL3|-)j6{I^K>@sr4gXH!MPZ_xkrQKLKgOlQ%qTJ(-oV$4#$YRM z&@|~HLsYOKxWWdO;U<3XeKfL`?A4ftie#+iEc&Dnho}FygJ4F3*`iWyB1k?#iwDy& zm)i>@`lAhlQcX^@GuYnF_^}+&+-rUIz}IC-=@uz&+F3wRj<sDECtBJ0Cdb7)ub^?# zF>2u`qsjRo-qL%-Nx-Cb@qfNYS@eKNs_nd+x(-)IGT~1reb1VHmudJLy7y93KMWmX zS;Jn9=HCs-vK~*SC<x7X!HpMcpm^4S8JVRA!B>otJl`;lCT#tijQnAc3umS<X-#>| z&-p-=_^h`bkR)7%gd^g@3A<gG{2pLNT~RUkiy6<j+6#YrD3dh0SK4Q_aNK3FHD(+S z_|nfmQPsS!3Jd}w34KYW>Zm03mX9e{iWJ`-3{-axW4D|8xpyG<&6Tw8I|w8x1-$P0 z1iC~}xA>7cGg!hi8D|(5XnrpFzFdJC&;P{7<NzwiCGmslFq3-9$v@b65ulp_M6+d; zN}Aq|3x`~tBQ=eG1G!E(`T`n71PEw!qk|?=B&Z6Zkf6tiD|kw}qrf`=GHj>O>!B4W z;0b^X$9(8N3g7KuI|lHIxiGa38It|gbKIW+GHhUzXcC<N?dnv9E0m&I%w8oDNmtFD z1_|k#$y*&4Z=NC~rZd8ZSku-hCI!WCvju^&nSkuSXH3f(!YrhGnMuYjy9H(ozzf){ zYBAVh$M{Aq-kgcIyW<VFZOPVa&5Q5zViAGNG&WQ-q?`PfTjlb`*ZeUaU1vogqlXPk zg)SZhXmpp@5hkWqi-tq4<QFSBJdjx$xa4KRZc%M^Yq{1hg%O}QwlitplQEWS0#^W+ zly85}6$Llt2TA>M@O^_H*EvIRW6I2M!&*XdGsg`*m!9dr9?Yn#1DMg<V=mQbmUwnF z*|e(2)d7D<sxhPy)`Wk6JxB>-6JUl{pt|CcCN7U3rg$XFSx6gM<L^u={T+77MrK{} z&F=qT2Kzo_9!*U{mX?Ciae&5Ib$7x&GUWhaS*03dGLm|Ij*T*M4thy8AW_^_^iufp z_$Rx$X`!`PK~pNilK8uF`r2B)-MKFV9?GpoGe=dy0Keu%!Cdzsv0`=L6pRLG%K8c! z58;hrOtCMk;>86KAI5YI|BmBDfPR{?z8EMrBXcnG|85$|tbQHEEv7O%hz^N4G#$uw zV@t(y;b-O2%suX=WPXjhrp?9b+&)?8DS>?Y#1<Y(mF6?gP%g*aL$?@!CkK3upz4^@ zG43?9imPR%!3+lJg&U+-<*^OWA5w-#60*YOe$^I_|BXHMfEU~jaYi!{8<<<YVYn*k zUpHP@&di_$!Z?#;a~QhFk;!=TCkoe8dPc(@odWb(m(CL^qn2NdV04)TqX`M!Mp^b7 zxGQ|c#=u=WmQjkEv%BHm(89enqz9KH1-ag&%D2L%%$nqXD<@rc;+0m6K??|vzNr{c zyqwCwXvR}U@udO42Z@p1bQ5>i1wz8@%4Bh<CK{NM;TCpdI>&SB`7V6sAhv{}F*3Q$ z`IT0r*2L3u7%yowJkfTRuDcG>hg8v2xn%*fpQ(zaHAavih$$!?)w-rDj_=RSAS&)> zdEMdLvsq$&SV1*eEYp#u15cBE4RrT9GdkC|rTdu+FBo=L-ZI#Ys|@8EmZcd8g-7KS zs5+bFHip69ueT+XpbDaN{WdWI_(<OeE0z;v@{hwjYK2;=YJ0T**ZCDhso8kpC8SRL zLO@XuIHR<FSDnA=yE=wzKAKLH(DqbWloS#%3H3SY0OpaF+vTuhh{U0aBmEl>V@69L zEFv778B#eMOx`^WD5nzb(8BJd587qoZWgtHA<Zugak-y19O0~BHa%3%S5yw-%ojR1 z(>9!GD`RF?;~}cH){T0mxs>3q8B`8>ci;BL(7}z;Q>E^!_?Cu2eG%|w6u)(x-x!3G z)QriKeW<tj5epfx-sWp6XU`p`WQP@-??_ZfW>40ew3OggGu~lMMyQz#$SOS-5B;Ra zw;f>~-Egi39upTfRv<v)(P`AVaq{_D7(v>Z!$R&KQ<o~nyG{HDB*Ayiw09l8mF?w$ z7AR(QIjEd3?#4CD*a-&zfWhM%9xd?0CEx?gvTa-)6XDURQsIiR#45ful@9nKO=B=v ztSCVzC66ibo^VE4{+C$k9XQi`t{kxZ($`FQw|BGR4H#4pLDkr9+mPlnn2f>@HwX_z zQ~<=!+9N<yjYA8}Rt{T`=0=2O9?Sn8W`kGsDwoIWjj#lEx~V%3C=|5>TOktQr3GDx zw0cC=4%D?g#V!T{+<_5IFPTXQV<tQ;gi)>Y6M<&17kk3-wygyYoa|!aux;XZ>+!qw zSqu6!p{8XT{CLZ!)Jb|@g+V>q=3Fgb4svHB#v(|{qT<F<CTy2=nX5aOJy$DzyQEac zvm9=4%Zi~q4R;DLYKql<PD)KsEk|ef(Zj#@e=tOX??Mncy+iQ8oHqd2I_VXA)91-7 zkhm%SDNAxR;_M*jHJM89Ms>T}fg(M&+Z!Hx3Xk0gJM|9~t;geDB0cTQ#e2Llk@<H6 zVvs=M>O&?<Z!fMOPJ28#4gSSmG%%4KpkdBYzO7F(3B~i#ay~s82?}@*6Tl!nhEf<| zO=eV2JhXAGzZC}xYp*eWS(GH1G>YeP)W9(Yy#~a{o|_%^vPXZ8@YkFB3R$LuOmAH# z3I&&GgWUHw|73JwT&$e#)XZ;vMh9t^#0I^KSfP)^r6Sf?kia+41;<iUXIY@yC3Ph& z%I*h<Nh~yz-VKo+qv^{f!II*SusL@yi&m;q*q+TPeHOsSwvt5*=V9Nn{tw^9?@_HW zboj2?e9WM`OQ=>1ti^#sUX$)aI`SGmZf=$xOfvDBjJ(k&N7%Zxk=m#;0B8ETXO6f$ zxtmJuL=2UpkDSIo)X_)mNfMf~52$7g-}e#Plc+EsZ9tkyM*)&F)65IYg!-<<ffOw2 zSf00e=3_|VE$IxcQh^sVBk@H>ebyB8h=h`|YIduJ_9m@{?0WGyw|JaB8ZXf8ru3GU zB%vFu6hL|JW|DeAr!?XBlb-Q7?}`kCoE{b-DYq`ZEorlzO3%nZ=W0>af&4fwuk3wb zznm3BEZezG;_m*$wS~(DrzpP+!?~y#2tYwiKn9SODE3bjxLg!&WhuF&QbBYVE@GHZ zxTr}U*~gjW3(t0lRGQ+CIBNV64fI7>M1h)=!mlqC3icaZKoj0?%vL6Q0gCE1K}>Mz z5GE{&xgmnh<?x2HU+W--72H430_}ORXIk-g<|>w{xyfaqkJNUH&x-BGz3I<_p@=pb zinPzdI*H4JVm<(*Hk-RZ{2Mch5T^jqC_^EAppBWPG#4-4FsPcobu<*vjQPuNUuCfO z_OLLo!%CUX2)|@TI1lynHCU7nPzr`DubVD4$}S$oN^e38n)fGuuv>d1Iz!s=FsQGw zSO>XFFK)YeJTI8*8brSpiNzw$Elq4(E(}DWN*}rhTyl=V3a%0^AFeg-;DRdJr4e(f zEAh4?+mj4Yp`^9nq%(L~o_+bZ0oOeK{|J{4$~L%667Pq25?T<4R04g~QNPmI8o(<` zhXD4#9xr5<9qv|-poPr7f&D{;raHx4(7^w2w4TNA8oGu_7#r0~y^7uKazT9ygj=|s zF$nbO&PB7LyIy^DhW;(GQ$@kd$_d}J&(`oSsY0zy4XSWPrwz_|s$-G{`*PqNc~cbo z4nAmw4Xm9)Zo!bDun9dac0zR?*u{FT3>voCvH>YPJ;O4fBj&2_(4jRDPg@4|lBq#w zS3U9q$&+c(6&S3J#9c^gjy!w7ikO(fHVncWQr*lLVRJN4D;}>ZU-()A9yb>w%_tO_ z(K@Z#tx02z#IO@|2tY9DzW{6NkAo1w1k8cR5a~h*TvOM@-D=u7g_M@V=1+fwG3^>Z zQkC*(^bze$oV^*668?rCY>ZVQ0`u-l0;UEr6@hj_+gQZ=Zp)rJ@ro#sI{rIm4q-!) zHt_}$9#tJ$3f|Ym)8ZRpq*QBb6rb`yk!>=k2&EKBr)Fa{NcbX_gMopNA;~83K<)ht z-c||)dGF&PwlhPGp`g}|oul|R`QVN|_7v4)9>+(Q(s{LX9@=7C2BKE+!;<)i(e;5n z`E)6!r4-;UrR6N9L2w;xb*=-s@9ju&H2+UC=?nEn`RPh5kxL-g5rnlHar^N9TPE|1 zw1Msu#XJ;FglY7evuX+n8w#;qk?HmLOh>MHd}ke(7nc*?&F%$eRIZ3d!#j=9*bEf( zRH0FFTx(ogg82|yVtxDi7XI#3V$vu4@f!|OJ1;0_qy9YOHP|j}gZqB?+1)xXCP(>= zP;;j{=WcNC<y<ep{g?|CrHx%EK(!Y_Z}14*n!O<SQ%FHuvo+}Evg8m`qWC~Z2=^-5 zibr6AHm)!yr9gQj3!TCg)gp2O64Wp#&drqOpLLkKC4%=hGxE7+puEODg{RV+4|L%J z&^HZ*Otk8K3-cuC59Pt}fwj!`Cwu^ALzX_Gc(#o<9`Q|xw5_gi>u0F-@yz5IX7FYX z*6jc$0T8N}qiIBebWgO5V96V$`Fk$ZaMj?GwUs`1I;>A}NC87wrV)tuG5Tyj15ha9 zO%|+lQ@TU&XM#fQxr1d0-sYu3(}8^9E?;=SmBF=wtAxvkYmGFZ*5QaXf7?<=%GK(V zl?m@_34Oat#&~C7{Tkp!j))qb%4MXRjCA)S-BUNEkm5S*hGbtU6G>~Sd25=n7$K#~ znzb+TM!PD%RF3ij2~Qs<>EG)3OPaH$wGu|HC=|+yu`3kHLJMXDn$ZdkiW8no@>c{{ zmDzw0>8%wSq!w^eq{rPgE)}ap!WS7yC8>2)VKVzDzpj75LJGf<$UNU-x$HpO7uI8A z9H?#QegoU-z>AmgN;)7rnnoN79^&y=5#jyyv+kii<OstlXlQGIhQ|YOAcX@c@*6H3 zChT>lG-yRi0{|KlS)R4oR9gc+1VpNj3LD4X?Z-8YYXZ+pi@wMyV%Id?(=ZI35Vim> z=(QBeLe4298x{HBvg}l@bzELt&lqnuH-6|sa`k_$%bRiZ@bI?({MWwje(Qh3kamNw zqVHxlM!M?IDgOp?ZcHltavTuvKp@^g9H5l`@W`}Y3tHD}Ykr@fjl^=L50>Pwq$eEx zSMQ_EijL4_GZ!nBP9E*|efWZz@TT&KQ3oK_;S9+_SiGov1Bh=!^<g#c$`Vk-^xeX} zVUpB&E10-&YXoGhBOGV7uZG=iX?{1G+3Ul@>S^h>$i|dj#E%35uD~4abW}XBT~>Tr z1D<}#SkLx6MtGt@z`wgqmY8iNpQ_1N-UH#C&A-HKkqjk$*JfQ$7TJ78!;#tqKigYM zjayW=n`Ho=u&mN9Ng=?8#6`nxKVYN9rmGp-W~SjJm8ALKfNRv1*z_5i8U%mbI3DR9 zpP)nJxSx?>^@A)xBk}}|Y;m;~yBCCvAv7J-tXldQIds@uc4s?~UUO$#-uYfg+ENrV z9AR3xikT1Hq?vi@2&Xd_Ml)Yzk{djquutkBrtqk3sEN_CyHbl5-I?^{#BT&z;*Tj9 z%_3{9#7Q3!#$E<B(#P{7m_XA~G;7z|iT{0q<P{i$(qZ$5xlperL`eXN^hJG{{#yJj z3(UJ437BB^kN8+jaQYCzom#S<YEa@NRv+*C7DL#9QHZ=g2xGdEL2JU3TvN0m*Ocu5 z(qM`j*3$eWCA@4&`Bp*=Lp{rIYF5ud9Q}!8uHmqqKpcA3?+o#i1eq~fiH5n7YnmxL zvo&-8XuK^(da;RXGit~Z-b~miW-lBe|BOK>eOeo_A9N?Jrn)7CedM>Erjc1>PYd95 zZa%pXgqL76u^!w&IVK!}XRP!~KLfaX=@(~}7aac1yx?-i6~<a_&SY|yhlepQIRD!L z!l2#AqHV+y?9L;8h8PSSl6$)9!?BE+x)tyGuEj~Hu3PLiRY%y7c``&3QhjKvdA*%c zXE_nF(5t#8XY=R|1U{E|QY?hmetzZDz&cbPLX$9~{4xZ0u=>cmIPbbrG|d}D(I)oN znfUE&03!!TYLz?XTxZZOsGfjhJZ7ejM5YJtH471)j*ioF5b`n!P_{Dr9yML--vSxm zdy;&w0`FCtN!ytoC@77c9=dUv#Ciwn0W-|QMXm_>j$g&^iiz)v$npJPH+wGa=q{bF z${=66&C9S|Oe}wPG&^w#vCUQl`;g0vYttd#fPfHEA`MxtvNQLyBc`!4&vC;WS}bT% z3&NwibFJeFJ7kZZ#a!vCKy4t6YP}ZF7T(_p48UX=Ktmn-T2J`B(;+@fR|`_)jR&tf zoUwO)X1P>%gv%PzUU!z45%CQ#SHZlL_fBPWWHwYGnmb#w55@`-M8ZLmS0;$Bdk14I zI4<%#$@12sT#cxtQYa`kejjvtQ`X@{otiyQ>zTjE5#}YFp1@C%hTjLz;*$ob2$Hu( z0|93ANbInfcNY8V#qonZS@6jgq|qj$?-%T3VSdAAe!^3I%CrXaRC*=z;_uvgm;|pH z(I_0E(SW7SB;-TR;O&g)Q6Eqj7w9Af!7+6IjFIE_thpRWqaFS|0hA$(-)IgzFWK4l zT=rajxsnd^ycz*PJ8t6$Jcd!!;uMJVW^*nBq|u@vW-K2mu4a&Ck>LDpT4K}$@=Yz! zi|+)U(ls8k3;V4Zk5vk2G+o!qtgu*?GPnG0S^N_lek+d;ZRbNO65Pe0HW8A3&oVcU z1ThgD%k<ekcIjod@LOgIFD`7LR!iz;mf|&<h}xxOz!MIT{ZM^%Kh+U-s~{mf21WUO zhEX-x_hn>T7}I9PL_I-oPiN3=KrHRlBgVEzM>7&oMwn{lLwwUdn#QM}2nqL7JX%xn zUG2!K&}@XUvOvh!pDCKrh?jCQMbuJfQbIIDqQ(%J?q-uh{s|dTWZDX=I;!>vY0=l! zNYvT^85KyL*DR3dZwc<5xB}!1sFW6@Te{;O!kwXT&=KC~@409Q)zNafoVq)Yxm?HP z#q~^=ZxLR=*|XeZ8w~8)Jf$U*OzlV#eicQp(J6DKk<TFndc61RgIgLa2B>G0w*{HE zTTse(?O00YEoWf|EJ;5%R8YTGz?~Cq_XZVC6y9MJ2rpfH1J?e)0L<<EAX>QTst6_Y zWfx_B7@yUjW4<X0HQM_|0026Bzv7N50#(EA%BHs|EcdUFw$Wxpk0K7y5U8|ZD<3>q zm1k<=@8M0C%u$%^a6Fu!nS;_5Se9!n;$PX0=U8M>AiS-4+<YN<et6{%?)?q-*2np# z7Jm(^n&h?|IJ)c)PA!g0bpYUX@LRtd*QeDuOeQDe#oYz$?M`HxO2`r`1^j$)Y!9f# zxtrOlQYaBfxN?N`<izy&@b8w@7`YS?C%+bj;}!)fRQfRp!#oz7Vsh=F@cZOnL5Od~ zjl8`izU|Y0!rSNB6qO5vS3!uU(M$>g28b|}ph>NS6dc{5&!)!Z;uetq-WV`orexCu z9u~XdRU!!(8bc1??;8wQL5L6dCJ^Fh?FnFB@!}DlW;g%()UX?qUKEM^2`b(JA-YU% zDDu%mh#cHI%>!@S)aVC_`Y@2y(}L@B>#huN7TL5?cQ8J40sdmdfQ14(6^SM@{QpWt zx3NJ<YECq|@tp<C>&pw=&Yd~4{p0-dexm`9!tBdWhZp*GsO|jd(K6eKw8=`T;=1^b zjh*kL9ZmeJjp7el1^5=zecK%hQU+<#@Ic_B*+<Ab)s2fE_K0~H%TU@d471cyG)qgE zlS4>>e~xggu=6;$K1*eFH}Va06R(}hY~}j%pW6<&NKwyMTW)a65W*MoGGT(6uw2qR z%PsW<OmL2}wsUKNWbj!No(Rn#644r|Bt=OqI0Zm0Yzu!kf)KiLFPXH@#&&_qqoa~U z=i^@iawMy6NjS?|5V)FqpXB<9YYU0*Y|}tua&x-j+-8+k0!P_*kMGH%uchmj1hiF% zKYd{f1CQVduOE|j$<i}0Dp>;Knbk9XX&)WgChFWJ{@*=M8##Hp(roS-I*3U|ap(5n zYQZ%}x+U#b-I8iU5}df8>r!Voe54xqyEa6nRj8uCpx!1svu}|*4lpO84sU>UJ;B*B zP2e@*rVZ2FG#UoXViQbdG&^}@GKCp_2tuNX4yfYOQAkN8=0OC{@qrXRpsx*?EO}po zY*k+Hp;imifk*m@+1T-{hF#17^wf83-x|Dll^5smWqb~|vc&@T)}~t$2@_*!2o!rh zbg3re(U@x*n}mbcN~Bv-89yJ;0Bu(nnLJ`D?~?mI&%XhD3rr^91nscLK}a8yQWJ=e z{TPJ`ilX+Zl)y;!WMANe=PMge4?6im$sW(W7okaSwg#+t2ZorZ6`>{YwU+Ex!Nsod z@d$$eA-%>5qzinaD`V<YirGl&fDiN*rfSN4nYkn$K9-9hS{(>yfSn}q3wf>PZ!xOD zQ8fLp2K2PV)N2A9FYXfj?1QM{IZ$}d!$b-|*ki#1XSX54_GK<Ig4D2yWuglQi;{@l zR76oue7Fy&JyRkIAcincRFhU8Vzc?-1IG1N#^KN>TE^5Uz)&L{NK(Hom~v>NbS5eC zrds#gVJvk;2Xg1lecZVZd$eLi@#hr2MceF>mu#b_40t}P4NhMYmZIPHEuoRQ@`0w@ z7V5k=Ii*oe{KIp{;3%`Bg8m^Zs3{-784UZ7Z@uSQI|^4p6*7G<Jh5mU?I?<E!d-F+ zcyob!a<^S!ZD<sdP|qbSm{HtmIr*6JjN{-9T)UwxR7b8|aazXo1~Qg?9{w2bcQZ2D zRs-)hkhwm>nlnJaM{qWQfTM*K8byE_B|b+(Vwn;*VI772+3o#HUjJ)W4J4+5`0TQJ zvo-%9{~K}~d;7ECyImk<`{6rurSe;%`7?xQ2Jux42pdZ%V+;swI+)t_>1ZR(w!`M) zc^z~ddqHB}0yP9!k&k&7VkpN0w`dB9teMu6ISeQ%39S5<jos}l{}xxPA}PJP-N|eT z2yYAMgxRAhkiJ~`GqZAK*x2Kyl3vS)YD5XBc@ZJU<q%S&xtQ?|b#dvmWVXFV9IaTc ze97&h)JLu4iB=&_iB3B5xW^GMd`-98Yjw`A(O9gG1g?nun9X_mwe-~+!`EZ@iaXZ` zE<?R?HmgF@HBfy^6lU~51M6XFS2+odq24{IGHeX%h-CO0xb+zJkgjabSqO7z2zjc0 zH+qU|mex{p%}gx2SedDe+87Wv%+Lpfk7+LYgJerK^B6r@>+IkpcCc!Il!dWKXrvXA zzTq=Cq%@YvQqg=y#m-}F^-(}KSql+nqOtRsbSBAqYl;|__hKx%fUwMyt!zsBCG4;J zYXf*=VwW`*iROf2KO<>uo&LRG0bNitW_WL!i((x%5$^|0|J?@~W^{?IXs{D_S0=2( zP*1&`_yu8x`v~ntwjO&i7SXiO^?g-pMlkUpT%$e={D@EjhoL3(cyIofylc!gnR3-? z{x*9>dEb^FI%U-&UwYhb@oclUaa#APvsaL0d$wh5@CHk|Y;1Fafn5_+s*&sP^ceB= zD^h^ada{J>P}C-g!3k4nDQ(RvpG4I@lwYk3Z7mDg&{hV)Y2l!vrc5j)>#IY1i!<5F zTgh!0NC*q{Bm_YKEi@{FAsqB^^bbGt5xcJ<34y3|JPXijr-*=`Hp0F4)5tPulu>ut zmYC=#OTH*Mj&+;GQ(R_jxEgL(#LQ`M@5~Fmm{W~}@O!R5iuPJ|FCNwJ?e&Z`<*}bx z_3O9G`k#B72Y%g)b470Ww)`+~tzXOLfl0fqD6;DpH?;q*cKp&Sklg{kl-MP*3>0u5 zC^-uLXv9yY@)P~|ZL9c(lIVAP;Pe5<VfJ2$jeg0nDq4(^$q1i)uIq+Gqbsdc&5Kes z3%~XBHyRm7ov(=`EyFn$KA8q8Wzr3)I9#mgG+f<emi*tyl$!P->jCZ)gb$%k8)bl# zScV)LF`+Xad(NMj7Jz%l#Lg^xoQ$n3<U~RT#V5HUkHjC_C{(*6haDS4nKsUQEW)VV zj^vk&d*snF$5UwCg3WS`i2ek>H^C*eEPzP?B2q<6e`GUD$C-+sadi8-7?FD%M7MGu z-fRyZXbc85jWZi)w_CmyZKf)R_6k8<KWm@hOvq<6KU$Sc+BRU7ME+jO-?!QVCzvCM zUl^KM<tBjcZuF}tKV9LnXfZ9v)G*8jP38x>dy2HxEyAI_hNQ2-Vo=D-v+d+ztD~Sj zH|8(;uyyI#8Jq-_|4-YA)y&$+#f^;_#qK=BWo%|esahD~+(5YYl(g@#mdwZ@#^B2> z&5F=2@kTDcRR*!4sIR^*<o*vze#Zpj75T9(V)?d#PC_NjwM1rJPv;6m@%r;vEP^C9 zU;00Kvmo2BASoZ?oa0X49%WtW>0CgKEq1h~RBbvR04_6w5V4|Hb_?{O_tp&NKJBxe zz^a9LvWHn@U{D;qW;bRlHa8soGKevz9LC)>NDn}8GA};n=>+Cmdr(hO;oFrU#2w7T zK9^9>HGKLWlSH5W&-J}34JqD=8N#^u!CzmIprsvBI&5f9Vk$lQ9bV_w#ykZil`ot( zCD;@^<`5Yl+r_~#LQ^r9o=Gb*T2a%>3Ve5oWL}u^wl1NYt}sZ|NRCs2E4LzJwJxmf zdOqRhub6djp4^^(3_W<JX<P;bSfzQ{kJ3-Ao1JDyGq`UmUs%3CieDJ^ON2gyZ*{_V z)MHT3*q>GpVKNv)d8s=OEt7~sNCa_J_-1=<Rhw_d<K(_z9D>D=26B7$k~gpO$z*s8 zz4%aP-oRze#g9!m83JCvmxpZ48*#j0mLjBAWX@2Qj9$~!*EmO=S)>zNNXnoRnIzQH zf?pcYQI@f_YyBzUC`I_T2F|b8(T+@EUDnbgHuzXFX%qNqnv*R1V-R)}urcUgpYTi- zEk1@!!A`5h8*VQRxBmgYJIm7d9#-@;<b{P~wGVqr(Bc5LYu>pky0kqG?xv1n*6Dup zl$#m)$cgY+=7&FG=LF&Vs&nyLf*DO?2Wi549<pT<n;-?JhE~tfQFx_L*R+P~1Yaq8 zCu(@TuJu^7gN0p;N#m;Ml;850m99KzU#<q68#rdEcDjM$0^Je+)t>AN_i`Zpe2L*D zGdT)%+RWj@WmC~AdVh@ps7`WA<LxuXN*x2=&ct_iV9se+nQUlS`4J9N0vf#?w|j-n zy$Y;wlkK^JF(j(K&{C$>+nn|LJ}YL3oLG>640_RiED$9l<a7#|CfZOn)I*#FgUQ!r zU(i@{S!E57=CUD7=u`phjm=4n#pdII63i8iI-~8)-KFK9_fH@1T)tVI(dIp3SvA`^ z!~88XL5P}w5Di)p?|c*1QD2JG3h4IhJOujDBpMv~P^7lK5iU|aTqIjuq#aN#E9V5i z+VY0yIWOV88+=b=PVoK@o0;j8Ov&s`416W?Gl!@5WGm=$g6FecB^NL4oiW86Z1m1b zg7LD$9)a|BCwVMK>6~Jh>&~~oedcT7(bnV9+oOE-y+|xw=a#o()YlI&s(O4~w$5a( zj^GQ1DDZo{C*_Kwd85E!qlmCe38qQ~<~#)qmLVHG6~<>E4|0Ud30cz>=i!OHeOSQ* zdG{{Y11@voNSiH<r?C}P2k-j+9)%huugFNrd&0QB=Vt4e6fdr4Kt^ZSDlp$X*B?o3 z#&#W!9wAiBB|OW;xa0<Kf#c^sB7NqyiAl3?x!?FdSDMqyuj+O?jYhTy=cxEsoTC=} zj~q+PL5dx4jK<JOxhcvw>5c;g`%SeuCWuon^Jy_ZfQcW@0Lr-G>UlCD=#)mh(4E=( zfCoz=ReF+udbT8eSK{|xXGNai0~7ebfB3*4#-vmWx;5aCRtVz&%hQ7!C8K&(T9=M3 zmFNd~=-!2WQ4gxOk+GcM_HI5L&bQYxL7gAtcBv93D7=e^OU$~-v=_IF8sQsAO-CM4 zr~8sFJQRG7Dp6Xnzl%K5q;Q{Pd=03RaL7P)O5x$iQCzA7?YXp`kcjRlE?V?>8ptD* zzZ{O>gs?~;HFXFjkFU=2V+j@tLw~G*Ft@3HvEd2u8yox>(F|yi1#|}4jp)ewQb$yR zr9tdVJ;n1bKsmjZHp(OJmiQzjEC@NEVGNY>#0>-@qNX53SiBws(Z&7w!`Qj%&z_^D zl+*_ea�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Ý()arzX(sz?eR3I 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 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/multidisk.zip b/3rdparty/libzip/regress/multidisk.zip new file mode 100644 index 0000000000000000000000000000000000000000..28dafb9ecc8f8ba1c7449166cae4e758c7f4766f GIT binary patch literal 122 zcmWIWW@h1H0D<K#?~T9=D8U1yOHzwV(lT>W^-3yA0=yZS<d|`*h3Wm<2x6h?WMyMy MfIustoEBIq0J3osjsO4v literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/name_locate.test b/3rdparty/libzip/regress/name_locate.test new file mode 100644 index 0000000000..1f792312bf --- /dev/null +++ b/3rdparty/libzip/regress/name_locate.test @@ -0,0 +1,27 @@ +# various tests for zip_name_locate +args test.zip name_locate nosuchfile 0 name_locate test 0 name_locate "" 0 name_locate TeSt 0 name_locate TeSt C name_locate testdir/test2 0 name_locate tesTdir/tESt2 C name_locate testdir/test2 d name_locate tesTdir/tESt2 dC name_locate test2 0 name_locate test2 d name_locate TeST2 dC delete 0 name_locate test 0 name_locate test u add new teststring name_locate new 0 name_locate new u add "" teststring name_locate "" 0 unchange_all name_locate test 0 name_locate new 0 +stderr can't find entry with name 'nosuchfile' using flags '0' +stdout name 'test' using flags '0' found at index 0 +stderr can't find entry with name '' using flags '0' +stderr can't find entry with name 'TeSt' using flags '0' +stdout name 'TeSt' using flags 'C' found at index 0 +stdout name 'testdir/test2' using flags '0' found at index 2 +stdout name 'tesTdir/tESt2' using flags 'C' found at index 2 +stderr can't find entry with name 'testdir/test2' using flags 'd' +stderr can't find entry with name 'tesTdir/tESt2' using flags 'dC' +stderr can't find entry with name 'test2' using flags '0' +stdout name 'test2' using flags 'd' found at index 2 +stdout name 'TeST2' using flags 'dC' found at index 2 +# delete 0 +stderr can't find entry with name 'test' using flags '0' +stdout name 'test' using flags 'u' found at index 0 +# add "new" +stdout name 'new' using flags '0' found at index 3 +stderr can't find entry with name 'new' using flags 'u' +# add "" +stdout name '' using flags '0' found at index 4 +# unchange all +stdout name 'test' using flags '0' found at index 0 +stderr can't find entry with name 'new' using flags '0' +return 0 +file test.zip test.zip test.zip diff --git a/3rdparty/libzip/regress/nihtest.conf.in b/3rdparty/libzip/regress/nihtest.conf.in new file mode 100644 index 0000000000..0a32f78d96 --- /dev/null +++ b/3rdparty/libzip/regress/nihtest.conf.in @@ -0,0 +1,4 @@ +default-program ziptool_regress +source-directory @srcdir@ +top-build-directory @top_builddir@ +file-compare zip zip ../src/zipcmp -pv diff --git a/3rdparty/libzip/regress/nonrandomopen.c b/3rdparty/libzip/regress/nonrandomopen.c new file mode 100644 index 0000000000..4523f032a4 --- /dev/null +++ b/3rdparty/libzip/regress/nonrandomopen.c @@ -0,0 +1,44 @@ +/* + nonrandomopen.c -- override zip_secure_random + + 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 <ckmame@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the 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 <string.h> + +#include "zipint.h" + +bool +zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { + memset(buffer, 0, length); + + return true; +} diff --git a/3rdparty/libzip/regress/nonrandomopentest.c b/3rdparty/libzip/regress/nonrandomopentest.c new file mode 100644 index 0000000000..e4585a4788 --- /dev/null +++ b/3rdparty/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 <ckmame@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the 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 <stdio.h> +#include <stdlib.h> + +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/3rdparty/libzip/regress/open_cons_extrabytes.test b/3rdparty/libzip/regress/open_cons_extrabytes.test new file mode 100644 index 0000000000..ab6b01872c --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_empty.test b/3rdparty/libzip/regress/open_empty.test new file mode 100644 index 0000000000..8f05d2921d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_empty_2.test b/3rdparty/libzip/regress/open_empty_2.test new file mode 100644 index 0000000000..bb35bc62f9 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_extrabytes.test b/3rdparty/libzip/regress/open_extrabytes.test new file mode 100644 index 0000000000..1cfce246cd --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_file_count.test b/3rdparty/libzip/regress/open_file_count.test new file mode 100644 index 0000000000..1f18deb97c --- /dev/null +++ b/3rdparty/libzip/regress/open_file_count.test @@ -0,0 +1,12 @@ +# zip_open: various inconsistent files +setenv LANG C +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/3rdparty/libzip/regress/open_filename_duplicate.test b/3rdparty/libzip/regress/open_filename_duplicate.test new file mode 100644 index 0000000000..5204db6e50 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_filename_duplicate_consistency.test b/3rdparty/libzip/regress/open_filename_duplicate_consistency.test new file mode 100644 index 0000000000..e82cf751b2 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_filename_duplicate_empty.test b/3rdparty/libzip/regress/open_filename_duplicate_empty.test new file mode 100644 index 0000000000..ea143b609a --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_filename_duplicate_empty_consistency.test b/3rdparty/libzip/regress/open_filename_duplicate_empty_consistency.test new file mode 100644 index 0000000000..6570195631 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_filename_empty.test b/3rdparty/libzip/regress/open_filename_empty.test new file mode 100644 index 0000000000..96f3efc0d4 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_incons.test b/3rdparty/libzip/regress/open_incons.test new file mode 100644 index 0000000000..c0e63a080b --- /dev/null +++ b/3rdparty/libzip/regress/open_incons.test @@ -0,0 +1,74 @@ +# zip_open: various inconsistent files +setenv LANG C +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/3rdparty/libzip/regress/open_many_fail.test b/3rdparty/libzip/regress/open_many_fail.test new file mode 100644 index 0000000000..2b57e15443 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_many_ok.test b/3rdparty/libzip/regress/open_many_ok.test new file mode 100644 index 0000000000..248868d909 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_multidisk.test b/3rdparty/libzip/regress/open_multidisk.test new file mode 100644 index 0000000000..1da4a5ca6b --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_new_but_exists.test b/3rdparty/libzip/regress/open_new_but_exists.test new file mode 100644 index 0000000000..002ccb4a0a --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_new_ok.test b/3rdparty/libzip/regress/open_new_ok.test new file mode 100644 index 0000000000..b1452c7c54 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_nonarchive.test b/3rdparty/libzip/regress/open_nonarchive.test new file mode 100644 index 0000000000..44c48367b8 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_nosuchfile.test b/3rdparty/libzip/regress/open_nosuchfile.test new file mode 100644 index 0000000000..6932164074 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_ok.test b/3rdparty/libzip/regress/open_ok.test new file mode 100644 index 0000000000..dd1f38e0e3 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_too_short.test b/3rdparty/libzip/regress/open_too_short.test new file mode 100644 index 0000000000..b7434bacaa --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_truncate.test b/3rdparty/libzip/regress/open_truncate.test new file mode 100644 index 0000000000..7ef753729d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_zip64_3mf.test b/3rdparty/libzip/regress/open_zip64_3mf.test new file mode 100644 index 0000000000..4a571549e7 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/open_zip64_ok.test b/3rdparty/libzip/regress/open_zip64_ok.test new file mode 100644 index 0000000000..ac33f9a47b --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/ossfuzz.sh b/3rdparty/libzip/regress/ossfuzz.sh new file mode 100755 index 0000000000..01e41708c6 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/preload.test b/3rdparty/libzip/regress/preload.test new file mode 100644 index 0000000000..5a62114c14 --- /dev/null +++ b/3rdparty/libzip/regress/preload.test @@ -0,0 +1,4 @@ +description test if preload works +program nonrandomopentest +return 0 +preload nonrandomopen.so diff --git a/3rdparty/libzip/regress/progress.test b/3rdparty/libzip/regress/progress.test new file mode 100644 index 0000000000..8604db2f07 --- /dev/null +++ b/3rdparty/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 compressable aaaaaaaaaaaaaa add uncompressable uncompressable add_nul large-compressable 8200 add_file large-uncompressable large-uncompressable 0 -1 +file-new test.zip cm-default.zip +file large-uncompressable large-uncompressable large-uncompressable +stdout 0.0% done +stdout 25.0% done +stdout 50.0% done +stdout 75.0% done +stdout 100.0% done diff --git a/3rdparty/libzip/regress/rename_ascii.test b/3rdparty/libzip/regress/rename_ascii.test new file mode 100644 index 0000000000..0010ca41f3 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/rename_cp437.test b/3rdparty/libzip/regress/rename_cp437.test new file mode 100644 index 0000000000..5a01250406 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/rename_deleted.test b/3rdparty/libzip/regress/rename_deleted.test new file mode 100644 index 0000000000..9dcc7c36c3 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/rename_fail.test b/3rdparty/libzip/regress/rename_fail.test new file mode 100644 index 0000000000..185f4e2197 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/rename_ok.test b/3rdparty/libzip/regress/rename_ok.test new file mode 100644 index 0000000000..b76df9c660 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/rename_ok.zip b/3rdparty/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{+o<ZINr?Uu|^GJ$8 zjoAb9eXIBJx5j+~d;m;m5l|&*R_6uawZ0~sRgKk}+lKcDmd+wxEH5*a%nEEQty%wR zbg_7%1~R?Ty;7=ONDanBerG<uuFW<2it#?i&m{s;2qZc+dmsg8NjP9avPh0b*dXsG zyROeAU3I~pmbF19z=cSnz7YrTFH&8civv@UK1&ibf>bCZ>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/3rdparty/libzip/regress/rename_utf8.test b/3rdparty/libzip/regress/rename_utf8.test new file mode 100644 index 0000000000..391ebeb26d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/rename_utf8_encmismatch.test b/3rdparty/libzip/regress/rename_utf8_encmismatch.test new file mode 100644 index 0000000000..075bca1894 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/runtest.in b/3rdparty/libzip/regress/runtest.in new file mode 100644 index 0000000000..a6eb1407a6 --- /dev/null +++ b/3rdparty/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 <ckmame@nih.at> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/regress/set_comment_all.test b/3rdparty/libzip/regress/set_comment_all.test new file mode 100644 index 0000000000..5902f98b31 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_comment_localonly.test b/3rdparty/libzip/regress/set_comment_localonly.test new file mode 100644 index 0000000000..08f7b8e5db --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_comment_removeglobal.test b/3rdparty/libzip/regress/set_comment_removeglobal.test new file mode 100644 index 0000000000..b469b37f43 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_comment_revert.test b/3rdparty/libzip/regress/set_comment_revert.test new file mode 100644 index 0000000000..da61c37e4d --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_bzip2_to_deflate.test b/3rdparty/libzip/regress/set_compression_bzip2_to_deflate.test new file mode 100644 index 0000000000..bdfacb56c0 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_deflate_to_bzip2.test b/3rdparty/libzip/regress/set_compression_deflate_to_bzip2.test new file mode 100644 index 0000000000..197b43547e --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_deflate_to_deflate.test b/3rdparty/libzip/regress/set_compression_deflate_to_deflate.test new file mode 100644 index 0000000000..e0b31218ae --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_deflate_to_store.test b/3rdparty/libzip/regress/set_compression_deflate_to_store.test new file mode 100644 index 0000000000..1678b9c32e --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_lzma_no_eos_to_store.test b/3rdparty/libzip/regress/set_compression_lzma_no_eos_to_store.test new file mode 100644 index 0000000000..793b843878 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_lzma_to_store.test b/3rdparty/libzip/regress/set_compression_lzma_to_store.test new file mode 100644 index 0000000000..67fc2907fa --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_store_to_bzip2.test b/3rdparty/libzip/regress/set_compression_store_to_bzip2.test new file mode 100644 index 0000000000..28bddd7a25 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_store_to_deflate.test b/3rdparty/libzip/regress/set_compression_store_to_deflate.test new file mode 100644 index 0000000000..1f83492839 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_store_to_lzma.test b/3rdparty/libzip/regress/set_compression_store_to_lzma.test new file mode 100644 index 0000000000..f5ff530ca5 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_store_to_store.test b/3rdparty/libzip/regress/set_compression_store_to_store.test new file mode 100644 index 0000000000..66cf3ddc34 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_store_to_xz.test b/3rdparty/libzip/regress/set_compression_store_to_xz.test new file mode 100644 index 0000000000..fe6d8db23b --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_store_to_zstd.test b/3rdparty/libzip/regress/set_compression_store_to_zstd.test new file mode 100644 index 0000000000..898a3d8546 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_unknown.test b/3rdparty/libzip/regress/set_compression_unknown.test new file mode 100644 index 0000000000..9ebf688b16 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_xz_to_store.test b/3rdparty/libzip/regress/set_compression_xz_to_store.test new file mode 100644 index 0000000000..6294ba26ad --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_compression_zstd_to_store.test b/3rdparty/libzip/regress/set_compression_zstd_to_store.test new file mode 100644 index 0000000000..6f8cd7e221 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_file_dostime.test b/3rdparty/libzip/regress/set_file_dostime.test new file mode 100644 index 0000000000..bd1af879b3 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/set_file_mtime.test b/3rdparty/libzip/regress/set_file_mtime.test new file mode 100644 index 0000000000..477fd06a5f --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/source_hole.c b/3rdparty/libzip/regress/source_hole.c new file mode 100644 index 0000000000..03521141a0 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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/3rdparty/libzip/regress/stat_index_cp437_guess.test b/3rdparty/libzip/regress/stat_index_cp437_guess.test new file mode 100644 index 0000000000..f1abd1ad05 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_cp437_raw.test b/3rdparty/libzip/regress/stat_index_cp437_raw.test new file mode 100644 index 0000000000..79104f0ef6 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_cp437_strict.test b/3rdparty/libzip/regress/stat_index_cp437_strict.test new file mode 100644 index 0000000000..a34a0e6365 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_fileorder.test b/3rdparty/libzip/regress/stat_index_fileorder.test new file mode 100644 index 0000000000..24b02b44e2 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_streamed.test b/3rdparty/libzip/regress/stat_index_streamed.test new file mode 100644 index 0000000000..a2b3048adb --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_streamed_zip64.test b/3rdparty/libzip/regress/stat_index_streamed_zip64.test new file mode 100644 index 0000000000..18a8694b02 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_utf8_guess.test b/3rdparty/libzip/regress/stat_index_utf8_guess.test new file mode 100644 index 0000000000..898db2dcd1 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_utf8_raw.test b/3rdparty/libzip/regress/stat_index_utf8_raw.test new file mode 100644 index 0000000000..881a18b740 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_utf8_strict.test b/3rdparty/libzip/regress/stat_index_utf8_strict.test new file mode 100644 index 0000000000..af1bb818b6 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_utf8_unmarked_strict.test b/3rdparty/libzip/regress/stat_index_utf8_unmarked_strict.test new file mode 100644 index 0000000000..07954dd24e --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stat_index_zip64.test b/3rdparty/libzip/regress/stat_index_zip64.test new file mode 100644 index 0000000000..c3f420c9fa --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/stored-no-eos.zip b/3rdparty/libzip/regress/stored-no-eos.zip new file mode 100644 index 0000000000000000000000000000000000000000..4a7745f73cda20294873712f5664f92d491b03e4 GIT binary patch literal 348 zcmWIWW@Zs#0D<dM{&+2n`yqD@$Od6CATCKQE=kMGN!2aSEXmMK%`etVNi0e14DfU3 z<&xq8D&Y0>a0vp^AT}!tGmz}_N{9wh%*9TgAsieWw;%dH0CG7CJR*x382FBWFymBh zK53w!WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)E`~f~8u0T39H8mwA zB`qxt$f(<S%O5DjQWE4B%urt6u-xch7?7{%>Eal|A)72v2n0z9ER(o+c$6H}m?to& z7#T<y8!#}~WidPD2k1`(DrWF>^>bP0l+YC5&B$cWfIAF8Y8e<5z$C5^3GilR11Vqx MLKh&-#0cU605}s>4FCWD literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/streamed-zip64.zip b/3rdparty/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/3rdparty/libzip/regress/streamed.zip b/3rdparty/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/3rdparty/libzip/regress/test-cp437-comment-utf-8.zip b/3rdparty/libzip/regress/test-cp437-comment-utf-8.zip new file mode 100644 index 0000000000000000000000000000000000000000..04fbaac95fd8360af4fc71d98c06ca9b3a7e5f11 GIT binary patch literal 2619 zcmaLZX;@5A9LMo9%~V>XBto(iQTAQ3Q)r^HuVvpOO6pMxNg@?3R3y7XvSsVq_bo)m zQV3Z>mQc?B>T!>Ajyv=G?sHz;`J8v(XVi{Ll|F)xPl~g>cqo4uBMYR^QmV9dboDCe z8yHqJs$}ftZGaT20wqE!5B!>|iyl&Dr`kEe)PE&kj$~5Vw2E2PYUb5z)U>E&S-TET z%E1aulKePQ-Fo#KG;Gw^s!3DpX3cGETks?eR$!78$dOvMYTc%7yY?MAcIw=vt6evH zo|K0bm?Q;pr0zX>_UhfIZ@>Nyjspe`a#Hi80<6F!X&Fay9z4Xw)otjo;Uh+l8a-z0 zIG$996__N2aHR1Q+&v~vnmlFdwCOWu&YC@kClz4@CP|?jX|CtI`CbbadiyN$UF_%Y zzl0|hV+AHjVH_zSaA{ERvgIp6R)($$TOGcJCzW6YCQ0EOX>G*1$f)S`8)9PP;x}$e zNaRVSSb<4W1V>8Ryd`;S%C_x0cJA7}XK!j6Pg17YIl&|;k|XWge<1x}#-YPUjvmWA ze&XaQo}`Nvm?TAWq|;f#nX~84U$}Vb@|COCuHWEEhFF0~QVd7BdF%F_?7R2w=RA0r z`$+Tn2~RS?3QUsXIMUN+dHK&@yexS2`c2{6cke&&Br~kQBq@m_6@C2lx%kW1Z{JIP z{QOl~R>qSou>w;&Dzq$>|0|R&GAgfCdH@`lUb&khMQ)U}MhFt3g?J%BNER}LOjj4} zKi#5k{`W2NYBp)+<rgEA9^in_bl}80pk~w^q{`-vR3ouU$4*qCY%(gFI#ShOl@6b% zLgi#sHhZLMr9g;|pr}IeWK=eRr0R)PI*6hQ^^;NA9Fl4#R_Qp3DwI%0Wz$HiI$8+P zp%hi9qKwLBl2p}LrK2gTP)He-O(v<vVwDc4s6s7eR5qWanvYdFrlJbvlu_A~lBx~< zvq6VdRH33WDw|bO^~Ne4Sy6?e%BXB&Ni_?rbZ|u#>MEnMxg}LY6+(1;MHNabqq6BG dRX42CAr@7rE~9GeK<<q3H&`2?MEqNXeght4K}7%n literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/test-cp437-fc-utf-8-filename.zip b/3rdparty/libzip/regress/test-cp437-fc-utf-8-filename.zip new file mode 100644 index 0000000000000000000000000000000000000000..7aeb8096b35588c0b4f54d83b7cca8033067704b GIT binary patch literal 236 zcmWIWW@h1H0D<K#?~T9=D8a{I%y78n@U+8o4$nWl<nXq`drAw085r+O)xL)&T*1x2 z$nt`jfq^9js5dl(lYv?4)ODxuNGJaQZ$>6LW?UBNGw?ty``ZX&pqY!^y3i0-i20?c h_A)Xtv#_$Ub8rd>3I%wxvVja_1j2G49S`C#006EKLmL19 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/test-cp437-fc.zip b/3rdparty/libzip/regress/test-cp437-fc.zip new file mode 100644 index 0000000000000000000000000000000000000000..0c4f04d53139f06a6fc4eb89eecb755ea37aca46 GIT binary patch literal 186 zcmWIWW@h1H0D<K#?~T9=D8a)Z!%&i1T#}ZVld4xzQ4$)$$-pdi>bg^Sq?3PX1vdjD z%L`@(29^|{`T%c6COKwY=14H`K+XKy2x6d`$_g<R%|u2fW)@a9b`DMfL7@O|RyL46 NMj(s>(rzFQ0{~}K9<2ZX literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/test-cp437.zip b/3rdparty/libzip/regress/test-cp437.zip new file mode 100644 index 0000000000000000000000000000000000000000..066531efb10cd09d803f455b1ae7c5e47ec764b9 GIT binary patch literal 2582 zcmaLZc~DMK7{~GR_P%dvK_No2lP&vBvQy}d%1+3>N4!aml1LIsRF<-2SIC|%`@V)O zSqdRb$P&tP4%0m|&pGa$-<|W%{mlLAJ6GqV)|e1_`6ReFu*1KHIk6@x1GPqLXk=W> z#MG>KiIV1SuEs>2mT2!x=dCv-DowVU5RE6iqbrhp1(HRn(q$~mma{5fp`vvqo61#~ zlnx4=RPqx@RjXC6QL|QU+d6gY)o)<euo06oK%tXLfdZ*<lcvp@w`kd_b(^;B+S_+< zU{WS1bW$luAa(52xl7k>-Fx(Obn4Z+kF$<R*`Ux#rC@>N(zl<hn|uEO0|yNrGIZE* z4<_Y+LMN3%1k#9+qdZ5C89Q$Lgo%?TPnkN6Nx7iVNu^MMG~H{)Oz&B<^*(ca=lc2k z&tp;^D0EUOOdtgW&JS7;yl_#-;?N~wOT(8jDIXL%sT3}dmPf3JTp6`$b#zSZnzifJ z$1$k@6gsICA&}xXY}~XtVawKS+js2TwL3A1N$MnfXF91ADUkN;-Iu)oz`;X@j~q=o zcKpOiCK-W3CzYZE(y7$bXU?8Gf8pY#%U7;myMBX7W}whXrD%b4^VaP<X?O44Pk-?6 z(c_FKPnl!^3Y}Dn6-dvXXJ);4`6~PMo3}ad-hcSWBuh}}q*A;<%Kh~DOWxOS-+$!) z{Pnw_u#ibMpwJ;nWniP070Rk8SjhqOh<l~|+pGVmxK_OC2r6zDsKRb3--^q{tC67M zj)5v{n4;o}@oEOBxM`pYd#0$kXuN8xA_VshRAJi`71xbdy+FmS169~LMa8A#)f7;1 z_dpdkPf>C8c-7E=5Zpjeh5b`hTtHscfr@(ws<4HMifhQLF`(i$f-3ByqT(|0Y8I%t zlb{M4si?S;ylMx(4!D`13VW%jxR|`E2Nm}dRAD<671xtjQ$fWo1y$HlMa3oMRWl7C lxT~NFo2sa|s=VqBDsC*O!oF$^AsfUTZVxRXaquo7e*kg%Dir_# literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/test-utf8-unmarked.zip b/3rdparty/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/3rdparty/libzip/regress/test-utf8.zip b/3rdparty/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/3rdparty/libzip/regress/test.zip b/3rdparty/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/3rdparty/libzip/regress/test2.zip b/3rdparty/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/3rdparty/libzip/regress/testbuffer.zip b/3rdparty/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{r<LaDaRqoYGKnzbwgYGl7;I|< WQK&Wsc(byBL>Yn521qA?I1B(&O)2OA literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testbzip2.zip b/3rdparty/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/3rdparty/libzip/regress/testchanged.zip b/3rdparty/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%<GzAw&3a`P+lKVG{Mbc%JoI?^n0mcvfqWP2%x@wVlyAsoy(? zeKlulkTI^aNJu7RLL-lQJWeF;0c)Ce;o0zB-(KcBu+)CNPU=0tQmgV3=0;+yfkS{F z`@_%W19nsJ5tv#PD19F5o&#^~d$zZHz+UPtV5wDkUNniNUmUQuvQ_`Dp+z?E?KSM_ z4mXk)ZDd8ADIw?RM%^e3k&}vuw(P+ls7EY=b`Bybz$~W@w#%R%u?#M95J>@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/3rdparty/libzip/regress/testchangedlocal.zip b/3rdparty/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?RRPmx<V{OO!&!J1U@a+xc z<pCQhjoO9LU`)t4ywOmMM$k!9LEFq<0!@ikAS;1T3Sgnr1a_)GQ=+SDl?`Vl5J~|o zbP`gXH>Fhz{gm@ii1|XFS;%9)y{=!{#PZ<g1UV-CILRn(6?1we!#KHHdWnS0pXWcB Q>$uK^NUvM-1D81d0g_CnD*ylh literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testcomment.zip b/3rdparty/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}k<iHlQ{Ci+eM z06Mxmx;VJ|y9270%JCx?$ot%T&*60p(<XJDKaJbFZ<jY4n5$T{MsYgedwzeFjC=p^ zRK*{e6k(i*tl(LZGZC{mm3e{ZfV;Lg<9Xn{yguJ;f~8XP_BHPTER{vPoQEQd8o(Za z?>oJZ`34U(Z~~ahB4ClEvdQzoTlpGq&o|iCyeU{Ji+HiPl0`CWu(h;q{O8cY&WT#c z<E@%iMy=AQKO*uvKlM##j&@hpdsRIQqQ108bf)c#jI$(&SSDB~hC>{U`y1SJ=a6c- z1Wzk4Oafe5B<gEx0RJI1tvNW_n)F$b;1HzJA5k~RRXf%)zLJTtg>{dSBeh7*a2E+@ efee%Mn%5g(v5@+`{<9q0vAZI>aO(+|n0^CjSE923 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testcomment13.zip b/3rdparty/libzip/regress/testcomment13.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd6e1c3277cfc2551406338d2c5f92db0401bb35 GIT binary patch literal 383 zcmWIWW@h1H00F<HohAl13o0dmY!GH;5M@Zq%t<v24dG;9o*ZiF0>YscEDR|?=$xNd zlA2ditdO6kkd|3gTmmF>QuVk3;N}Gb&3mF1{07}TW3YMifM$U(HuFj{GK*5+<}osf zGvjh0FUa8xj6l4k5yXPJmlfjP&<X~I0B?kTOc(JofJ}zy4}j_ix(}!y;x-0`5U^YF z^HTK!yjj^mb}#{97m!{6#P%ThVg(>7$w*a5EK1JEEK5~L&d<#ShK)j6ei2w495TFI Ryj(u{dFgsEMrsj|2>{KAS6=`C literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testcommentremoved.zip b/3rdparty/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=<ev^;O_I@rB!<|#}f|1`@1K<3p<Y6Bz`VullK1G)y)?69FI0APKWY9^w!C_7sqED zF?K1!I#pRIv$6<O9K>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*<WGapv-Fo=0$kLX<6SD6fweiURX7^u+*SJV0pw%z%}l?`}W vfngG0W09z*tpWUpWLxubwR6&EMS??+j6b4_e!+FTReU8EYX|3^@Y(bYdybCo literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testdeflated.zip b/3rdparty/libzip/regress/testdeflated.zip new file mode 100644 index 0000000000000000000000000000000000000000..7f6ab1cf579a37e2f0a0b9284de8844e7f9c671b GIT binary patch literal 145 zcmWIWW@Zs#U|`^22q|&3@o+HRAPD5y05LxhCnhB(>lURJq$ZZ=l~j~?`?#>hcxp6g v3x=9WvKBBh1b8zt$uZ;B4>W>-5s3dbf>>y#1$eWvfrJ@>&=yGBfjA5RzZV&5 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testdeflated2.zip b/3rdparty/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|<B|w~Zhcx?=*o5xTM24$=eC b{kPE`RX4~j0p6@^AO%c7SPi6WK^z7EUv4v0 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testdir.zip b/3rdparty/libzip/regress/testdir.zip new file mode 100644 index 0000000000000000000000000000000000000000..b1e13e184314636058d86e3d0ad1320805a77fe1 GIT binary patch literal 222 zcmWIWW@h1H0D;cV84h3ul;8l;C8@<FDVat30XS6&AXMq*<rn897H0reGcw6B<2Dsy pfdIo_M-U5P2X0*;TOa_WOAW|`>O!)Ul?|kV2?$GobO?yU007b<A^89R literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testempty.zip b/3rdparty/libzip/regress/testempty.zip new file mode 100644 index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7 GIT binary patch literal 22 NcmWIWW@Tf*000g10H*)| literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testextrabytes.zip b/3rdparty/libzip/regress/testextrabytes.zip new file mode 100644 index 0000000000000000000000000000000000000000..f2a3fb2a6d34871facb252d2ef086db496932682 GIT binary patch literal 160 zcmWIWW@h1H0D<K#?~T9=D8a)Z%21M8T#}ZVld4xzQ4$)$$-pdi>bld*r`MfAD_9s_ yFsCpCcr!AIGvhLV7jE8?Mi3L#I97;pp%n~3V_4Zh3K)UV9Z1`QI1GsyiCh3Uv>w<1 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile-UTF8.zip b/3rdparty/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/3rdparty/libzip/regress/testfile-cp437.zip b/3rdparty/libzip/regress/testfile-cp437.zip new file mode 100644 index 0000000000000000000000000000000000000000..169a90311aa235010b5e29c9479bf3dc81477b76 GIT binary patch literal 130 zcmWIWW@h1H0D<K#?~T9=C?No(8=IP2THD$?I=i}idi(k(1b8zt$uZ+r57Ym*5yZmO S&B_K6X9Pk!Agu@DFaQ9)>lx4h literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile-lzma.zip b/3rdparty/libzip/regress/testfile-lzma.zip new file mode 100644 index 0000000000000000000000000000000000000000..f855b2ac69af8cf6b6094d443cc3ec5779b01f7b GIT binary patch literal 161 zcmWIWW@fQxU}E57=<G7{*LZYqfg%F~g98xr194(fVzO>gYC&pZiC#%X38x4vLo5RW z3j>3}o4pGbOJ1Mz>CNQqf6W<c`v3nMi!d+*cr!BDGvGE4Xe0w8g93;G0yNVDyjj^m O!i+#@3#9!(90mXn&LpA$ literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile-plus-extra.zip b/3rdparty/libzip/regress/testfile-plus-extra.zip new file mode 100644 index 0000000000000000000000000000000000000000..09a6c039c3d6132c11bd266c68479addcccda42b GIT binary patch literal 164 zcmWIWW@h1H0D<K#?~T9=D8a)Z%21M8T#}ZVld4xzQKHGo#*kW3Qj}<@$;l338RZ0c pGcw6B<2C?h;NM0N3)MKNA%@9tlZ^trS=m4e8G+CrNZW%r3;^y09p?Z5 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile-stored-dos.zip b/3rdparty/libzip/regress/testfile-stored-dos.zip new file mode 100644 index 0000000000000000000000000000000000000000..1adf55403f420636cae422300f03ebecbe35616f GIT binary patch literal 192 zcmWIWW@Zs#0D;afGk=Xo_ZBz+*&xgh#ED6X$+|_U1*wT8dL<Pli70@VD+vYga-m2k u@^U4k0A8*DZ$>722He&GZDe3%PykUtfM$7sH!B-Rm=OqVfpjj2!vFwk9WA{8 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile-xz.zip b/3rdparty/libzip/regress/testfile-xz.zip new file mode 100644 index 0000000000000000000000000000000000000000..6be8f9c137882d2dffa709544f84d6b8c0f3f71b GIT binary patch literal 200 zcmWIWW@Zs#U|@)6=<G7{*LZYqfd`Q10L1)2oS2lDtXq^?keXPcS5i^(*Ssns3Ml+v z=%ynRgCZl4$zZNN{n`Ttdj`Qc27@<y7c7>%KIhY$$=UxJH&=nA85kH<9b!~g?qe&O rR|VF<5E&KV&B!FefZJNIHU<R{1q5i02=HcQ0|_$%p)HUu1#uVv0>LkH literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile-zstd.zip b/3rdparty/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/3rdparty/libzip/regress/testfile.txt b/3rdparty/libzip/regress/testfile.txt new file mode 100755 index 0000000000..e69de29bb2 diff --git a/3rdparty/libzip/regress/testfile.zip b/3rdparty/libzip/regress/testfile.zip new file mode 100644 index 0000000000000000000000000000000000000000..2fa5ba0859f6d7022ecc42226a48f806a2d6e785 GIT binary patch literal 122 zcmWIWW@h1H0D<K#?~T9=D8U1yOHzwV(lT>W^-3yA0=yZS<d|`*h3Wm<2x6h?WMu=1 NF#@3#kk$fm7yz<Q5{v)< literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile0.zip b/3rdparty/libzip/regress/testfile0.zip new file mode 100644 index 0000000000000000000000000000000000000000..5e565d14fb89415fa40dacb55f7fc389795ec33b GIT binary patch literal 122 zcmWIWW@h1H0E0a<6d?=<$pfTHQj1H{GILV(N-9bMycwC~m~pFx>HXUXVxj6}Wdn&Z M0-+U<)&g-D033A?-T(jq literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/testfile2014.zip b/3rdparty/libzip/regress/testfile2014.zip new file mode 100644 index 0000000000000000000000000000000000000000..1d75d46ecc76e534e984b36e723b64e094390ca3 GIT binary patch literal 122 zcmWIWW@h1H00EKZtgc`Nl;8o<C8@<FX_+~xdL<Pl0p5&Ea?H5Z!u0-a1hG(cva*51 N7=h3VNNa&O3;@qW5B>lE literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/teststdin.zip b/3rdparty/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<kaHgw9*_st^jXF iCJ|;__Cibsk=q(UB&sU{yjj^mqKrUj1EkA990mZSR4U~F literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/teststored.zip b/3rdparty/libzip/regress/teststored.zip new file mode 100644 index 0000000000000000000000000000000000000000..138c6adda3bb6a7bf4c63ba589094dc3381cc516 GIT binary patch literal 188 zcmWIWW@h1H0D+JaR~rup(+xI2HVE?rabi+pvTjjoL26=&UP(nsA`0M2LIGSTl8Ic& oD1a-#n~_P58MjqH+rZ#&BZxw?IKZ2g4J6D6gtkCB6U1Qv0KIf8%m4rY literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/tryopen.c b/3rdparty/libzip/regress/tryopen.c new file mode 100644 index 0000000000..54058f23c8 --- /dev/null +++ b/3rdparty/libzip/regress/tryopen.c @@ -0,0 +1,113 @@ +/* + tryopen.c -- tool for tests that try opening zip archives + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <stdio.h> + +#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/3rdparty/libzip/regress/utf-8-standardization-input.zip b/3rdparty/libzip/regress/utf-8-standardization-input.zip new file mode 100644 index 0000000000000000000000000000000000000000..67e3acf3ce999f23c1694ee994f332976b0df32f GIT binary patch literal 285 zcmWIWW@Zs#U|`^2I8glG<<p^{g|a}NG!Tn2XfR|Z<(e3q>oztux3spkcXW2?l~k0J z7N{^V&b||M87g~t&*7Da7ad-5c){VNhnF8-b$IpR6(Dt=wRH6YHO`&)4b?c|>En0y z#CcCo-5?FmwHg<h83Mc+ndBL8+3W+f9|RP@Bm;JLa6zRR86+68GtajlUUQxiMkhG; Y$%FXBx;4O?l?`MUBM|lj=?bvL0PGTDR{#J2 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/utf-8-standardization-output.zip b/3rdparty/libzip/regress/utf-8-standardization-output.zip new file mode 100644 index 0000000000000000000000000000000000000000..266027ff64b93c5261b6acd0bdaf29492bee2ed2 GIT binary patch literal 226 zcmWIWW@Zs#VBlb2aP($$l~ii%l4D?C0AYC`&P>WRF*esdyyx)B!;20tIlSQT(!<LS zuR6T?@Cv<>ijv^`+*F0U)N+O7{JfIXyb^`9{33;tj8uiR%$!uc0B=Sndj?#Fs{oA$ v0R=Eg&?+vdLPiD&hV0Dq?T6Q#XN1uS&VBMAet<VC8^|<9AS?vZ(O{ziEJ#C7 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/utf-8-standardization.test b/3rdparty/libzip/regress/utf-8-standardization.test new file mode 100644 index 0000000000..35d4808a8c --- /dev/null +++ b/3rdparty/libzip/regress/utf-8-standardization.test @@ -0,0 +1,4 @@ +# replace file contents and make UTF-8 name +return 0 +args testfile.zzip replace_file_contents 0 "Some new content for the file." set_file_mtime 0 1406885162 +file testfile.zzip utf-8-standardization-input.zip utf-8-standardization-output.zip diff --git a/3rdparty/libzip/regress/zip-in-archive-comment.test b/3rdparty/libzip/regress/zip-in-archive-comment.test new file mode 100644 index 0000000000..4838a8fb1a --- /dev/null +++ b/3rdparty/libzip/regress/zip-in-archive-comment.test @@ -0,0 +1,13 @@ +# stat file in zip that contains archive comment to find out if it detected the right one of the two +args zip-in-archive-comment.zip stat 0 +file zip-in-archive-comment.zip zip-in-archive-comment.zip zip-in-archive-comment.zip +return 0 +stdout name: 'testfile.txt' +stdout index: '0' +stdout size: '0' +stdout compressed size: '0' +stdout mtime: 'Fri Jul 15 2005 16:37:14' +stdout crc: '0' +stdout compression method: '0' +stdout encryption method: '0' +stdout diff --git a/3rdparty/libzip/regress/zip-in-archive-comment.zip b/3rdparty/libzip/regress/zip-in-archive-comment.zip new file mode 100644 index 0000000000000000000000000000000000000000..20a412bd105ac8a663d0f3aeacf3a5dd213da7d2 GIT binary patch literal 320 zcmWIWW@h1H0D<K#?~T9=D8U1yOHzwV(lT>W^-3yA0=yZS<d|`*h3Wm<2x6h?WMu=1 zF#@3#kk$g?V+;X6n{`3L4E{yY4(tnG-Te;*j0_?Sx{M403`}5Y1~{F_1#twbHjpY1 zW`wE+(G7wij&6WA8=DSPSdJN@4a7xO3gYX72p}+pP(Zh_v4fZ?P(Da~fH%SyAoUQn E0A}+k!2kdN literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/zip64-3mf.zip b/3rdparty/libzip/regress/zip64-3mf.zip new file mode 100644 index 0000000000000000000000000000000000000000..a2ccf240866c41ec492ed1e58439aeab76ca74ca GIT binary patch literal 198 zcmWIWW@gc400IA^Xb1L%ukQYb0!9WA23<x50R|?pGy|MY<O=X+WRhb>)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/3rdparty/libzip/regress/zip64.zip b/3rdparty/libzip/regress/zip64.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1ba76b7e76183b17d7b058a61ffcea94b3f3e35 GIT binary patch literal 198 zcmWIWW@gc400IA^Xb1L%ukQYb0!9WA23<x50R|?pGy|MY<O=X+WRhb>)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/3rdparty/libzip/regress/zip64_creation.test b/3rdparty/libzip/regress/zip64_creation.test new file mode 100644 index 0000000000..f21608867a --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/zip64_stored_creation.test b/3rdparty/libzip/regress/zip64_stored_creation.test new file mode 100644 index 0000000000..92ee02c142 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/zip_read_fuzzer.cc b/3rdparty/libzip/regress/zip_read_fuzzer.cc new file mode 100644 index 0000000000..6813807b4e --- /dev/null +++ b/3rdparty/libzip/regress/zip_read_fuzzer.cc @@ -0,0 +1,48 @@ +#include <zip.h> + +#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/3rdparty/libzip/regress/zip_read_fuzzer.dict b/3rdparty/libzip/regress/zip_read_fuzzer.dict new file mode 100644 index 0000000000..b54ac52359 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/zipcmp_zip_dir.test b/3rdparty/libzip/regress/zipcmp_zip_dir.test new file mode 100644 index 0000000000..c44d83b982 --- /dev/null +++ b/3rdparty/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/3rdparty/libzip/regress/zipcmp_zip_dir.zip b/3rdparty/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*TA8M<kiIjQ=IV1sIahJY}dL5T>H5)x5e z!wWRYz(5zxK}XaW5<nQuoB(e|COKwY-jaZNP=MjDBZ!G?CM(2~c+A7}BE&q9cegaU t07(oF0}aLES!73I`WD%deLzFe{0=k{tG`*<fNB|-f$#^Az6#<n004s~Pq_d9 literal 0 HcmV?d00001 diff --git a/3rdparty/libzip/regress/ziptool_regress.c b/3rdparty/libzip/regress/ziptool_regress.c new file mode 100644 index 0000000000..ee440d2385 --- /dev/null +++ b/3rdparty/libzip/regress/ziptool_regress.c @@ -0,0 +1,445 @@ +#include "zip.h" + +#include <sys/stat.h> + +#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; + +static int add_nul(int argc, char *argv[]); +static int cancel(int argc, char *argv[]); +static int unchange_one(int argc, char *argv[]); +static int unchange_all(int argc, char *argv[]); +static int zin_close(int argc, 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}, \ + {"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 } + +/* 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; + +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(int argc, 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 +unchange_all(int argc, 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(int argc, 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 +cancel_callback(zip_t *archive, void *ud) { + if (progress_userdata.percentage >= progress_userdata.limit) { + return -1; + } + return 0; +} + +static int +cancel(int argc, 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(argc, argv); + return 0; +} + +static int +zin_close(int argc, 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 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 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/3rdparty/libzip/src/CMakeLists.txt b/3rdparty/libzip/src/CMakeLists.txt new file mode 100644 index 0000000000..5d75b8a0cf --- /dev/null +++ b/3rdparty/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 RUNTIME 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/3rdparty/libzip/src/diff_output.c b/3rdparty/libzip/src/diff_output.c new file mode 100644 index 0000000000..2a53f037f9 --- /dev/null +++ b/3rdparty/libzip/src/diff_output.c @@ -0,0 +1,106 @@ +#include "diff_output.h" + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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) { + sprintf(hexdata + offset, "..."); + break; + } + sprintf(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/3rdparty/libzip/src/diff_output.h b/3rdparty/libzip/src/diff_output.h new file mode 100644 index 0000000000..8ac12b8bba --- /dev/null +++ b/3rdparty/libzip/src/diff_output.h @@ -0,0 +1,28 @@ +#ifndef HAD_DIFF_OUTPUT_H +#define HAD_DIFF_OUTPUT_H + +#include <zip.h> + +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/3rdparty/libzip/src/getopt.c b/3rdparty/libzip/src/getopt.c new file mode 100644 index 0000000000..a9879c4bc3 --- /dev/null +++ b/3rdparty/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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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/3rdparty/libzip/src/getopt.h b/3rdparty/libzip/src/getopt.h new file mode 100644 index 0000000000..bb09497e22 --- /dev/null +++ b/3rdparty/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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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/3rdparty/libzip/src/zipcmp.c b/3rdparty/libzip/src/zipcmp.c new file mode 100644 index 0000000000..6a1e7414fe --- /dev/null +++ b/3rdparty/libzip/src/zipcmp.c @@ -0,0 +1,866 @@ +/* + zipcmp.c -- compare zip files + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#ifdef HAVE_STRINGS_H +#include <strings.h> +#endif +#ifdef HAVE_FTS_H +#include <fts.h> +#endif +#include <zlib.h> + +#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 inofficial 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\ + -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 <libzip@nih.at>.\n"; + +char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\ +Copyright (C) 2003-2021 Dieter Baron and Thomas Klausner\n\ +" PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n"; + +#define OPTIONS "hVCipqtv" + + +#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; + +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; + + 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 '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"); + } + if (a[1].comment_length > 0) { + diff_output_data(&output, '+', (const zip_uint8_t *)a[1].comment, a[1].comment_length, "archive comment"); + } + 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); + } + + 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; + } + + dir_name = malloc(strlen(ent->fts_path + prefix_length) + 2); + if (dir_name == NULL) { + fprintf(stderr, "%s: malloc failure\n", progname); + exit(1); + } + sprintf(dir_name, "%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]); \ + 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/3rdparty/libzip/src/zipmerge.c b/3rdparty/libzip/src/zipmerge.c new file mode 100644 index 0000000000..536132124e --- /dev/null +++ b/3rdparty/libzip/src/zipmerge.c @@ -0,0 +1,279 @@ +/* + 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 <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "config.h" + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif + +#include "zip.h" + +char *progname; + +#define PROGRAM "zipmerge" + +#define USAGE "usage: %s [-DhIiSsV] 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\ + -S don't overwrite identical files\n\ + -s overwrite identical files without asking\n\ +\n\ +Report bugs to <libzip@nih.at>.\n"; + +char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\ +Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner\n\ +" PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n"; + +#define OPTIONS "hVDiIsS" + +#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; + +static int confirm_replace(zip_t *, const char *, zip_uint64_t, zip_t *, const char *, zip_uint64_t); +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; + + while ((c = getopt(argc, argv, OPTIONS)) != -1) { + switch (c) { + case 'D': + name_flags |= ZIP_FL_NODIR; + break; + case 'i': + confirm &= ~CONFIRM_ALL_YES; + break; + case 'I': + name_flags |= ZIP_FL_NOCASE; + break; + case 's': + confirm &= ~CONFIRM_SAME_NO; + confirm |= CONFIRM_SAME_YES; + break; + case 'S': + confirm &= ~CONFIRM_SAME_YES; + confirm |= CONFIRM_SAME_NO; + 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_source_t *source; + 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 ((source = zip_source_zip(za, zs, i, 0, 0, 0)) == NULL || zip_replace(za, (zip_uint64_t)idx, source) < 0) { + zip_source_free(source); + 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 ((source = zip_source_zip(za, zs, i, 0, 0, 0)) == NULL || zip_add(za, fname, source) < 0) { + zip_source_free(source); + fprintf(stderr, "%s: cannot add '%s' to `%s': %s\n", progname, fname, tname, zip_strerror(za)); + zip_close(zs); + return NULL; + } + } + } + + return zs; +} diff --git a/3rdparty/libzip/src/ziptool.c b/3rdparty/libzip/src/ziptool.c new file mode 100644 index 0000000000..149381babe --- /dev/null +++ b/3rdparty/libzip/src/ziptool.c @@ -0,0 +1,974 @@ +/* + ziptool.c -- tool for modifying zip archive in multiple ways + Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.at> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (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 <errno.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef _WIN32 +/* WIN32 needs <fcntl.h> for _O_BINARY */ +#include <fcntl.h> +#ifndef STDIN_FILENO +#define STDIN_FILENO _fileno(stdin) +#endif +#endif + +#ifndef HAVE_GETOPT +#include "getopt.h" +#endif +extern int optopt; + +#include "zip.h" + +#include "compat.h" + +typedef struct dispatch_table_s { + const char *cmdline_name; + int argument_count; + const char *arg_names; + const char *description; + int (*function)(int argc, 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 +add(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, char *argv[]) { + /* output file contents to stdout */ + zip_uint64_t idx; + zip_int64_t n; + zip_file_t *zf; + char buf[8192]; + int err; + idx = strtoull(argv[0], NULL, 10); + +#ifdef _WIN32 + /* Need to set stdout to binary mode for Windows */ + setmode(fileno(stdout), _O_BINARY); +#endif + 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; + } + while ((n = zip_fread(zf, buf, sizeof(buf))) > 0) { + if (fwrite(buf, (size_t)n, 1, stdout) != 1) { + zip_fclose(zf); + fprintf(stderr, "can't write file contents to stdout: %s\n", strerror(errno)); + return -1; + } + } + if (n == -1) { + fprintf(stderr, "can't read file at index '%" PRIu64 "': %s\n", idx, zip_file_strerror(zf)); + zip_fclose(zf); + return -1; + } + if ((err = zip_fclose(zf)) != 0) { + zip_error_t error; + + zip_error_init_with_code(&error, err); + fprintf(stderr, "can't close file at index '%" PRIu64 "': %s\n", idx, zip_error_strerror(&error)); + return -1; + } + + return 0; +} + +static int +count_extra(int argc, 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(int argc, 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 (int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, char *argv[]) { + zip_register_progress_callback_with_state(za, 0.001, progress_callback, NULL, NULL); + return 0; +} + +static int +zrename(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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(int argc, 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; +#ifdef HAVE_LOCALTIME_R + struct tm tm; + tpm = localtime_r(&sb.mtime, &tm); +#else + tpm = localtime(&sb.mtime); +#endif + if (tpm == NULL) { + printf("mtime: <not valid>\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; + 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]); + + return; +} + + +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}, + {"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(argc, 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" + "\tC\tZIP_FL_NOCASE\n" + "\tc\tZIP_FL_CENTRAL\n" + "\td\tZIP_FL_NODIR\n" + "\tl\tZIP_FL_LOCAL\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; + } + } + + 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/CMakeLists.txt b/CMakeLists.txt index 5f096702e1..2e71e87937 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,6 +92,11 @@ if (ANDROID) include_directories(cellframe-sdk/3rdparty/) endif() +if (BUILD_WITH_ZIP) + if(LINUX) + add_subdirectory(3rdparty/libzip) + endif() +endif() add_subdirectory(dap-sdk) add_subdirectory(3rdparty/monero_crypto) -- GitLab