libarchive-static 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. checksums.yaml +4 -4
  2. data/ext/extconf.rb +2 -9
  3. data/ext/libarchive-0.1.1/ext/archive_read_support_compression.c +6 -6
  4. data/ext/libarchive-0.1.1/ext/archive_read_support_compression.o +0 -0
  5. data/ext/libarchive-0.1.1/ext/archive_read_support_format.o +0 -0
  6. data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.c +1 -1
  7. data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.o +0 -0
  8. data/ext/libarchive-0.1.1/ext/archive_write_set_compression.c +5 -5
  9. data/ext/libarchive-0.1.1/ext/archive_write_set_compression.o +0 -0
  10. data/ext/libarchive-0.1.1/ext/config.h +23 -0
  11. data/ext/libarchive-0.1.1/ext/config.log +230 -0
  12. data/ext/libarchive-0.1.1/ext/config.status +671 -0
  13. data/ext/libarchive-0.1.1/ext/libarchive.c +1 -1
  14. data/ext/libarchive-0.1.1/ext/libarchive.o +0 -0
  15. data/ext/libarchive-0.1.1/ext/libarchive_archive.c +7 -7
  16. data/ext/libarchive-0.1.1/ext/libarchive_archive.o +0 -0
  17. data/ext/libarchive-0.1.1/ext/libarchive_entry.c +6 -0
  18. data/ext/libarchive-0.1.1/ext/libarchive_entry.o +0 -0
  19. data/ext/libarchive-0.1.1/ext/libarchive_reader.c +6 -4
  20. data/ext/libarchive-0.1.1/ext/libarchive_reader.o +0 -0
  21. data/ext/libarchive-0.1.1/ext/libarchive_ruby.so +0 -0
  22. data/ext/libarchive-0.1.1/ext/libarchive_win32.h +1 -1
  23. data/ext/libarchive-0.1.1/ext/libarchive_writer.c +2 -2
  24. data/ext/libarchive-0.1.1/ext/libarchive_writer.o +0 -0
  25. data/ext/libarchive-3.6.2/Makefile.in +16892 -0
  26. data/ext/libarchive-3.6.2/build/autoconf/ax_append_compile_flags.m4 +67 -0
  27. data/ext/libarchive-3.6.2/build/autoconf/ax_append_flag.m4 +71 -0
  28. data/ext/libarchive-3.6.2/build/autoconf/ax_check_compile_flag.m4 +74 -0
  29. data/ext/libarchive-3.6.2/build/autoconf/ax_require_defined.m4 +37 -0
  30. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/autoconf/check_stdcall_func.m4 +0 -0
  31. data/ext/libarchive-3.6.2/build/autoconf/compile +348 -0
  32. data/ext/libarchive-3.6.2/build/autoconf/config.guess +1754 -0
  33. data/ext/libarchive-3.6.2/build/autoconf/config.rpath +696 -0
  34. data/ext/libarchive-3.6.2/build/autoconf/config.sub +1890 -0
  35. data/ext/libarchive-3.6.2/build/autoconf/depcomp +791 -0
  36. data/ext/libarchive-3.6.2/build/autoconf/iconv.m4 +271 -0
  37. data/ext/libarchive-3.6.2/build/autoconf/install-sh +541 -0
  38. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/autoconf/la_uid_t.m4 +0 -0
  39. data/ext/libarchive-3.6.2/build/autoconf/lib-ld.m4 +109 -0
  40. data/ext/libarchive-3.6.2/build/autoconf/lib-link.m4 +777 -0
  41. data/ext/libarchive-3.6.2/build/autoconf/lib-prefix.m4 +224 -0
  42. data/ext/libarchive-3.6.2/build/autoconf/ltmain.sh +11251 -0
  43. data/ext/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 +115 -0
  44. data/ext/libarchive-3.6.2/build/autoconf/missing +215 -0
  45. data/ext/libarchive-3.6.2/build/autoconf/test-driver +153 -0
  46. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/pkgconfig/libarchive.pc.in +4 -1
  47. data/ext/libarchive-3.6.2/config.h.in +1504 -0
  48. data/ext/libarchive-3.6.2/configure +25558 -0
  49. data/ext/libarchive-3.6.2/libarchive/archive.h +1212 -0
  50. data/ext/libarchive-3.6.2/libarchive/archive_acl.c +2097 -0
  51. data/ext/libarchive-3.6.2/libarchive/archive_acl_private.h +83 -0
  52. data/ext/libarchive-3.6.2/libarchive/archive_blake2.h +197 -0
  53. data/ext/libarchive-3.6.2/libarchive/archive_blake2_impl.h +161 -0
  54. data/ext/libarchive-3.6.2/libarchive/archive_blake2s_ref.c +369 -0
  55. data/ext/libarchive-3.6.2/libarchive/archive_blake2sp_ref.c +361 -0
  56. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_check_magic.c +63 -22
  57. data/ext/libarchive-3.6.2/libarchive/archive_cmdline.c +227 -0
  58. data/ext/libarchive-3.6.2/libarchive/archive_cmdline_private.h +47 -0
  59. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_crc32.h +17 -0
  60. data/ext/libarchive-3.6.2/libarchive/archive_cryptor.c +534 -0
  61. data/ext/libarchive-3.6.2/libarchive/archive_cryptor_private.h +188 -0
  62. data/ext/libarchive-3.6.2/libarchive/archive_digest.c +1505 -0
  63. data/ext/libarchive-3.6.2/libarchive/archive_digest_private.h +416 -0
  64. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_darwin.c +559 -0
  65. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_freebsd.c +712 -0
  66. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_linux.c +760 -0
  67. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_sunos.c +824 -0
  68. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_endian.h +48 -15
  69. data/ext/libarchive-3.6.2/libarchive/archive_entry.c +2149 -0
  70. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry.h +305 -106
  71. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_copy_bhfi.c +5 -4
  72. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_copy_stat.c +9 -3
  73. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_link_resolver.c +104 -62
  74. data/ext/libarchive-3.6.2/libarchive/archive_entry_locale.h +92 -0
  75. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_private.h +65 -49
  76. data/ext/libarchive-3.6.2/libarchive/archive_entry_sparse.c +156 -0
  77. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_stat.c +6 -6
  78. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_strmode.c +1 -1
  79. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_xattr.c +4 -6
  80. data/ext/libarchive-3.6.2/libarchive/archive_getdate.c +1165 -0
  81. data/ext/libarchive-3.6.2/libarchive/archive_getdate.h +39 -0
  82. data/ext/libarchive-3.6.2/libarchive/archive_hmac.c +334 -0
  83. data/ext/libarchive-3.6.2/libarchive/archive_hmac_private.h +117 -0
  84. data/ext/libarchive-3.6.2/libarchive/archive_match.c +1875 -0
  85. data/ext/libarchive-3.6.2/libarchive/archive_openssl_evp_private.h +53 -0
  86. data/ext/libarchive-3.6.2/libarchive/archive_openssl_hmac_private.h +54 -0
  87. data/ext/libarchive-3.6.2/libarchive/archive_options.c +218 -0
  88. data/ext/libarchive-3.6.2/libarchive/archive_options_private.h +51 -0
  89. data/ext/libarchive-3.6.2/libarchive/archive_pack_dev.c +337 -0
  90. data/ext/libarchive-3.6.2/libarchive/archive_pack_dev.h +49 -0
  91. data/ext/libarchive-3.6.2/libarchive/archive_pathmatch.c +463 -0
  92. data/ext/libarchive-3.6.2/libarchive/archive_pathmatch.h +52 -0
  93. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_platform.h +77 -9
  94. data/ext/libarchive-3.6.2/libarchive/archive_platform_acl.h +55 -0
  95. data/ext/libarchive-3.6.2/libarchive/archive_platform_xattr.h +47 -0
  96. data/ext/libarchive-3.6.2/libarchive/archive_ppmd7.c +1168 -0
  97. data/ext/libarchive-3.6.2/libarchive/archive_ppmd7_private.h +119 -0
  98. data/ext/libarchive-3.6.2/libarchive/archive_ppmd8.c +1287 -0
  99. data/ext/libarchive-3.6.2/libarchive/archive_ppmd8_private.h +148 -0
  100. data/ext/libarchive-3.6.2/libarchive/archive_ppmd_private.h +151 -0
  101. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_private.h +74 -18
  102. data/ext/libarchive-3.6.2/libarchive/archive_random.c +272 -0
  103. data/ext/libarchive-3.6.2/libarchive/archive_random_private.h +36 -0
  104. data/ext/libarchive-3.6.2/libarchive/archive_rb.c +709 -0
  105. data/ext/libarchive-3.6.2/libarchive/archive_rb.h +113 -0
  106. data/ext/libarchive-3.6.2/libarchive/archive_read.c +1756 -0
  107. data/ext/libarchive-3.6.2/libarchive/archive_read_add_passphrase.c +190 -0
  108. data/ext/libarchive-3.6.2/libarchive/archive_read_append_filter.c +204 -0
  109. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_data_into_fd.c +64 -18
  110. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_entry_from_file.c +1086 -0
  111. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_posix.c +2732 -0
  112. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_disk_private.h +40 -4
  113. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_disk_set_standard_lookup.c +21 -11
  114. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_windows.c +2479 -0
  115. data/ext/libarchive-3.6.2/libarchive/archive_read_extract.c +60 -0
  116. data/ext/{libarchive-2.8.4/libarchive/archive_read_extract.c → libarchive-3.6.2/libarchive/archive_read_extract2.c} +34 -61
  117. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_fd.c +70 -49
  118. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_file.c +38 -23
  119. data/ext/libarchive-3.6.2/libarchive/archive_read_open_filename.c +586 -0
  120. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_memory.c +58 -28
  121. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_private.h +127 -59
  122. data/ext/libarchive-3.6.2/libarchive/archive_read_set_format.c +117 -0
  123. data/ext/libarchive-3.6.2/libarchive/archive_read_set_options.c +133 -0
  124. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_all.c → libarchive-3.6.2/libarchive/archive_read_support_filter_all.c} +35 -10
  125. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_by_code.c +83 -0
  126. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_bzip2.c → libarchive-3.6.2/libarchive/archive_read_support_filter_bzip2.c} +38 -26
  127. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_compress.c → libarchive-3.6.2/libarchive/archive_read_support_filter_compress.c} +52 -44
  128. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_grzip.c +112 -0
  129. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_gzip.c → libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c} +108 -37
  130. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lrzip.c +122 -0
  131. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lz4.c +742 -0
  132. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lzop.c +499 -0
  133. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_none.c → libarchive-3.6.2/libarchive/archive_read_support_filter_none.c} +15 -3
  134. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_program.c → libarchive-3.6.2/libarchive/archive_read_support_filter_program.c} +114 -77
  135. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_rpm.c → libarchive-3.6.2/libarchive/archive_read_support_filter_rpm.c} +31 -31
  136. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_uu.c → libarchive-3.6.2/libarchive/archive_read_support_filter_uu.c} +141 -85
  137. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_xz.c → libarchive-3.6.2/libarchive/archive_read_support_filter_xz.c} +369 -284
  138. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_zstd.c +297 -0
  139. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_7zip.c +3900 -0
  140. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_all.c +89 -0
  141. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_ar.c +126 -72
  142. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_by_code.c +92 -0
  143. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_cab.c +3228 -0
  144. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_cpio.c +1104 -0
  145. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_empty.c +14 -11
  146. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_iso9660.c +990 -541
  147. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_lha.c +2916 -0
  148. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_mtree.c +2150 -0
  149. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_rar.c +3797 -0
  150. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_rar5.c +4251 -0
  151. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_raw.c +38 -31
  152. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_tar.c +1157 -629
  153. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_warc.c +848 -0
  154. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_xar.c +439 -258
  155. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_zip.c +4270 -0
  156. data/ext/libarchive-3.6.2/libarchive/archive_string.c +4240 -0
  157. data/ext/libarchive-3.6.2/libarchive/archive_string.h +243 -0
  158. data/ext/libarchive-3.6.2/libarchive/archive_string_composition.h +2292 -0
  159. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_string_sprintf.c +44 -16
  160. data/ext/libarchive-3.6.2/libarchive/archive_util.c +655 -0
  161. data/ext/libarchive-3.6.2/libarchive/archive_version_details.c +151 -0
  162. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_virtual.c +85 -16
  163. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_windows.c +214 -541
  164. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_windows.h +74 -106
  165. data/ext/libarchive-3.6.2/libarchive/archive_write.c +828 -0
  166. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter.c +72 -0
  167. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_b64encode.c +304 -0
  168. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_by_name.c +77 -0
  169. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_bzip2.c +401 -0
  170. data/ext/{libarchive-2.8.4/libarchive/archive_write_set_compression_compress.c → libarchive-3.6.2/libarchive/archive_write_add_filter_compress.c} +86 -131
  171. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_grzip.c +135 -0
  172. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_gzip.c +442 -0
  173. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lrzip.c +197 -0
  174. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lz4.c +700 -0
  175. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lzop.c +478 -0
  176. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_format_all.c → libarchive-3.6.2/libarchive/archive_write_add_filter_none.c} +11 -11
  177. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_program.c +391 -0
  178. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_uuencode.c +295 -0
  179. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_xz.c +545 -0
  180. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_zstd.c +418 -0
  181. data/ext/libarchive-3.6.2/libarchive/archive_write_disk_posix.c +4711 -0
  182. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_disk_private.h +9 -2
  183. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_disk_set_standard_lookup.c +30 -29
  184. data/ext/libarchive-3.6.2/libarchive/archive_write_disk_windows.c +2842 -0
  185. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_fd.c +15 -10
  186. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_file.c +15 -9
  187. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_filename.c +128 -20
  188. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_memory.c +7 -18
  189. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_private.h +72 -29
  190. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format.c +56 -3
  191. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_7zip.c +2322 -0
  192. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_ar.c +54 -34
  193. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_by_name.c +20 -2
  194. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio.c +11 -0
  195. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_binary.c +610 -0
  196. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_newc.c +457 -0
  197. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_odc.c +500 -0
  198. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_filter_by_ext.c +142 -0
  199. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_gnutar.c +755 -0
  200. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_iso9660.c +8165 -0
  201. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_mtree.c +2217 -0
  202. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_pax.c +1049 -387
  203. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_private.h +42 -0
  204. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_raw.c +125 -0
  205. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_shar.c +62 -47
  206. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_ustar.c +279 -108
  207. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_v7tar.c +638 -0
  208. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_warc.c +453 -0
  209. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_xar.c +3259 -0
  210. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_zip.c +1704 -0
  211. data/ext/libarchive-3.6.2/libarchive/archive_write_set_options.c +130 -0
  212. data/ext/libarchive-3.6.2/libarchive/archive_write_set_passphrase.c +95 -0
  213. data/ext/libarchive-3.6.2/libarchive/archive_xxhash.h +48 -0
  214. data/ext/libarchive-3.6.2/libarchive/config_freebsd.h +271 -0
  215. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/filter_fork.h +10 -5
  216. data/ext/{libarchive-2.8.4/libarchive/filter_fork.c → libarchive-3.6.2/libarchive/filter_fork_posix.c} +98 -19
  217. data/ext/libarchive-3.6.2/libarchive/filter_fork_windows.c +236 -0
  218. data/ext/libarchive-3.6.2/libarchive/xxhash.c +525 -0
  219. data/ext/libarchive-static-makefile +144 -80
  220. data/ext/libarchive-static-wrapper-makefile +1 -1
  221. data/ext/zlib-1.2.13/Makefile.in +404 -0
  222. data/ext/{zlib-1.2.5 → zlib-1.2.13}/adler32.c +51 -34
  223. data/ext/{zlib-1.2.5 → zlib-1.2.13}/compress.c +27 -21
  224. data/ext/zlib-1.2.13/configure +922 -0
  225. data/ext/zlib-1.2.13/crc32.c +1125 -0
  226. data/ext/zlib-1.2.13/crc32.h +9446 -0
  227. data/ext/{zlib-1.2.5 → zlib-1.2.13}/deflate.c +842 -459
  228. data/ext/{zlib-1.2.5 → zlib-1.2.13}/deflate.h +37 -33
  229. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzclose.c +0 -0
  230. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzguts.h +103 -16
  231. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzlib.c +155 -53
  232. data/ext/zlib-1.2.13/gzread.c +650 -0
  233. data/ext/zlib-1.2.13/gzwrite.c +677 -0
  234. data/ext/{zlib-1.2.5 → zlib-1.2.13}/infback.c +24 -12
  235. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffast.c +49 -66
  236. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffast.h +0 -0
  237. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffixed.h +3 -3
  238. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inflate.c +209 -94
  239. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inflate.h +9 -5
  240. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inftrees.c +24 -50
  241. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inftrees.h +1 -1
  242. data/ext/{zlib-1.2.5 → zlib-1.2.13}/trees.c +135 -198
  243. data/ext/{zlib-1.2.5 → zlib-1.2.13}/trees.h +0 -0
  244. data/ext/zlib-1.2.13/uncompr.c +93 -0
  245. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zconf.h +182 -63
  246. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zlib.h +617 -295
  247. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zutil.c +50 -41
  248. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zutil.h +83 -82
  249. metadata +241 -133
  250. data/ext/libarchive-0.1.1/libarchive.c +0 -1762
  251. data/ext/libarchive-2.8.4/Makefile.in +0 -7076
  252. data/ext/libarchive-2.8.4/build/autoconf/compile +0 -143
  253. data/ext/libarchive-2.8.4/build/autoconf/config.guess +0 -1502
  254. data/ext/libarchive-2.8.4/build/autoconf/config.sub +0 -1708
  255. data/ext/libarchive-2.8.4/build/autoconf/depcomp +0 -630
  256. data/ext/libarchive-2.8.4/build/autoconf/install-sh +0 -291
  257. data/ext/libarchive-2.8.4/build/autoconf/ltmain.sh +0 -8406
  258. data/ext/libarchive-2.8.4/build/autoconf/missing +0 -376
  259. data/ext/libarchive-2.8.4/config.h.in +0 -772
  260. data/ext/libarchive-2.8.4/configure +0 -17916
  261. data/ext/libarchive-2.8.4/libarchive/archive.h +0 -741
  262. data/ext/libarchive-2.8.4/libarchive/archive_entry.c +0 -2202
  263. data/ext/libarchive-2.8.4/libarchive/archive_hash.h +0 -281
  264. data/ext/libarchive-2.8.4/libarchive/archive_read.c +0 -1249
  265. data/ext/libarchive-2.8.4/libarchive/archive_read_disk.c +0 -198
  266. data/ext/libarchive-2.8.4/libarchive/archive_read_disk_entry_from_file.c +0 -570
  267. data/ext/libarchive-2.8.4/libarchive/archive_read_open_filename.c +0 -272
  268. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_cpio.c +0 -777
  269. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_mtree.c +0 -1304
  270. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_zip.c +0 -903
  271. data/ext/libarchive-2.8.4/libarchive/archive_string.c +0 -453
  272. data/ext/libarchive-2.8.4/libarchive/archive_string.h +0 -148
  273. data/ext/libarchive-2.8.4/libarchive/archive_util.c +0 -391
  274. data/ext/libarchive-2.8.4/libarchive/archive_write.c +0 -466
  275. data/ext/libarchive-2.8.4/libarchive/archive_write_disk.c +0 -2628
  276. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_bzip2.c +0 -408
  277. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_gzip.c +0 -477
  278. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_none.c +0 -257
  279. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_program.c +0 -347
  280. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_xz.c +0 -438
  281. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio.c +0 -344
  282. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio_newc.c +0 -295
  283. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_mtree.c +0 -1050
  284. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_zip.c +0 -667
  285. data/ext/libarchive-2.8.4/libarchive/config_freebsd.h +0 -154
  286. data/ext/libarchive-2.8.4/libarchive/filter_fork_windows.c +0 -113
  287. data/ext/zlib-1.2.5/Makefile.in +0 -257
  288. data/ext/zlib-1.2.5/configure +0 -596
  289. data/ext/zlib-1.2.5/crc32.c +0 -442
  290. data/ext/zlib-1.2.5/crc32.h +0 -441
  291. data/ext/zlib-1.2.5/example.c +0 -565
  292. data/ext/zlib-1.2.5/gzread.c +0 -653
  293. data/ext/zlib-1.2.5/gzwrite.c +0 -531
  294. data/ext/zlib-1.2.5/minigzip.c +0 -440
  295. data/ext/zlib-1.2.5/uncompr.c +0 -59
@@ -0,0 +1,2322 @@
1
+ /*-
2
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ */
25
+
26
+ #include "archive_platform.h"
27
+ __FBSDID("$FreeBSD$");
28
+
29
+ #ifdef HAVE_ERRNO_H
30
+ #include <errno.h>
31
+ #endif
32
+ #include <stdlib.h>
33
+ #ifdef HAVE_BZLIB_H
34
+ #include <bzlib.h>
35
+ #endif
36
+ #if HAVE_LZMA_H
37
+ #include <lzma.h>
38
+ #endif
39
+ #ifdef HAVE_ZLIB_H
40
+ #include <zlib.h>
41
+ #endif
42
+
43
+ #include "archive.h"
44
+ #ifndef HAVE_ZLIB_H
45
+ #include "archive_crc32.h"
46
+ #endif
47
+ #include "archive_endian.h"
48
+ #include "archive_entry.h"
49
+ #include "archive_entry_locale.h"
50
+ #include "archive_ppmd7_private.h"
51
+ #include "archive_private.h"
52
+ #include "archive_rb.h"
53
+ #include "archive_string.h"
54
+ #include "archive_write_private.h"
55
+ #include "archive_write_set_format_private.h"
56
+
57
+ /*
58
+ * Codec ID
59
+ */
60
+ #define _7Z_COPY 0
61
+ #define _7Z_LZMA1 0x030101
62
+ #define _7Z_LZMA2 0x21
63
+ #define _7Z_DEFLATE 0x040108
64
+ #define _7Z_BZIP2 0x040202
65
+ #define _7Z_PPMD 0x030401
66
+
67
+ /*
68
+ * 7-Zip header property IDs.
69
+ */
70
+ #define kEnd 0x00
71
+ #define kHeader 0x01
72
+ #define kArchiveProperties 0x02
73
+ #define kAdditionalStreamsInfo 0x03
74
+ #define kMainStreamsInfo 0x04
75
+ #define kFilesInfo 0x05
76
+ #define kPackInfo 0x06
77
+ #define kUnPackInfo 0x07
78
+ #define kSubStreamsInfo 0x08
79
+ #define kSize 0x09
80
+ #define kCRC 0x0A
81
+ #define kFolder 0x0B
82
+ #define kCodersUnPackSize 0x0C
83
+ #define kNumUnPackStream 0x0D
84
+ #define kEmptyStream 0x0E
85
+ #define kEmptyFile 0x0F
86
+ #define kAnti 0x10
87
+ #define kName 0x11
88
+ #define kCTime 0x12
89
+ #define kATime 0x13
90
+ #define kMTime 0x14
91
+ #define kAttributes 0x15
92
+ #define kEncodedHeader 0x17
93
+
94
+ enum la_zaction {
95
+ ARCHIVE_Z_FINISH,
96
+ ARCHIVE_Z_RUN
97
+ };
98
+
99
+ /*
100
+ * A stream object of universal compressor.
101
+ */
102
+ struct la_zstream {
103
+ const uint8_t *next_in;
104
+ size_t avail_in;
105
+ uint64_t total_in;
106
+
107
+ uint8_t *next_out;
108
+ size_t avail_out;
109
+ uint64_t total_out;
110
+
111
+ uint32_t prop_size;
112
+ uint8_t *props;
113
+
114
+ int valid;
115
+ void *real_stream;
116
+ int (*code) (struct archive *a,
117
+ struct la_zstream *lastrm,
118
+ enum la_zaction action);
119
+ int (*end)(struct archive *a,
120
+ struct la_zstream *lastrm);
121
+ };
122
+
123
+ #define PPMD7_DEFAULT_ORDER 6
124
+ #define PPMD7_DEFAULT_MEM_SIZE (1 << 24)
125
+
126
+ struct ppmd_stream {
127
+ int stat;
128
+ CPpmd7 ppmd7_context;
129
+ CPpmd7z_RangeEnc range_enc;
130
+ IByteOut byteout;
131
+ uint8_t *buff;
132
+ uint8_t *buff_ptr;
133
+ uint8_t *buff_end;
134
+ size_t buff_bytes;
135
+ };
136
+
137
+ struct coder {
138
+ unsigned codec;
139
+ size_t prop_size;
140
+ uint8_t *props;
141
+ };
142
+
143
+ struct file {
144
+ struct archive_rb_node rbnode;
145
+
146
+ struct file *next;
147
+ unsigned name_len;
148
+ uint8_t *utf16name;/* UTF16-LE name. */
149
+ uint64_t size;
150
+ unsigned flg;
151
+ #define MTIME_IS_SET (1<<0)
152
+ #define ATIME_IS_SET (1<<1)
153
+ #define CTIME_IS_SET (1<<2)
154
+ #define CRC32_IS_SET (1<<3)
155
+ #define HAS_STREAM (1<<4)
156
+
157
+ struct {
158
+ time_t time;
159
+ long time_ns;
160
+ } times[3];
161
+ #define MTIME 0
162
+ #define ATIME 1
163
+ #define CTIME 2
164
+
165
+ mode_t mode;
166
+ uint32_t crc32;
167
+
168
+ signed int dir:1;
169
+ };
170
+
171
+ struct _7zip {
172
+ int temp_fd;
173
+ uint64_t temp_offset;
174
+
175
+ struct file *cur_file;
176
+ size_t total_number_entry;
177
+ size_t total_number_nonempty_entry;
178
+ size_t total_number_empty_entry;
179
+ size_t total_number_dir_entry;
180
+ size_t total_bytes_entry_name;
181
+ size_t total_number_time_defined[3];
182
+ uint64_t total_bytes_compressed;
183
+ uint64_t total_bytes_uncompressed;
184
+ uint64_t entry_bytes_remaining;
185
+ uint32_t entry_crc32;
186
+ uint32_t precode_crc32;
187
+ uint32_t encoded_crc32;
188
+ int crc32flg;
189
+ #define PRECODE_CRC32 1
190
+ #define ENCODED_CRC32 2
191
+
192
+ unsigned opt_compression;
193
+ int opt_compression_level;
194
+
195
+ struct la_zstream stream;
196
+ struct coder coder;
197
+
198
+ struct archive_string_conv *sconv;
199
+
200
+ /*
201
+ * Compressed data buffer.
202
+ */
203
+ unsigned char wbuff[512 * 20 * 6];
204
+ size_t wbuff_remaining;
205
+
206
+ /*
207
+ * The list of the file entries which has its contents is used to
208
+ * manage struct file objects.
209
+ * We use 'next' (a member of struct file) to chain.
210
+ */
211
+ struct {
212
+ struct file *first;
213
+ struct file **last;
214
+ } file_list, empty_list;
215
+ struct archive_rb_tree rbtree;/* for empty files */
216
+ };
217
+
218
+ static int _7z_options(struct archive_write *,
219
+ const char *, const char *);
220
+ static int _7z_write_header(struct archive_write *,
221
+ struct archive_entry *);
222
+ static ssize_t _7z_write_data(struct archive_write *,
223
+ const void *, size_t);
224
+ static int _7z_finish_entry(struct archive_write *);
225
+ static int _7z_close(struct archive_write *);
226
+ static int _7z_free(struct archive_write *);
227
+ static int file_cmp_node(const struct archive_rb_node *,
228
+ const struct archive_rb_node *);
229
+ static int file_cmp_key(const struct archive_rb_node *, const void *);
230
+ static int file_new(struct archive_write *a, struct archive_entry *,
231
+ struct file **);
232
+ static void file_free(struct file *);
233
+ static void file_register(struct _7zip *, struct file *);
234
+ static void file_register_empty(struct _7zip *, struct file *);
235
+ static void file_init_register(struct _7zip *);
236
+ static void file_init_register_empty(struct _7zip *);
237
+ static void file_free_register(struct _7zip *);
238
+ static ssize_t compress_out(struct archive_write *, const void *, size_t ,
239
+ enum la_zaction);
240
+ static int compression_init_encoder_copy(struct archive *,
241
+ struct la_zstream *);
242
+ static int compression_code_copy(struct archive *,
243
+ struct la_zstream *, enum la_zaction);
244
+ static int compression_end_copy(struct archive *, struct la_zstream *);
245
+ static int compression_init_encoder_deflate(struct archive *,
246
+ struct la_zstream *, int, int);
247
+ #ifdef HAVE_ZLIB_H
248
+ static int compression_code_deflate(struct archive *,
249
+ struct la_zstream *, enum la_zaction);
250
+ static int compression_end_deflate(struct archive *, struct la_zstream *);
251
+ #endif
252
+ static int compression_init_encoder_bzip2(struct archive *,
253
+ struct la_zstream *, int);
254
+ #if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
255
+ static int compression_code_bzip2(struct archive *,
256
+ struct la_zstream *, enum la_zaction);
257
+ static int compression_end_bzip2(struct archive *, struct la_zstream *);
258
+ #endif
259
+ static int compression_init_encoder_lzma1(struct archive *,
260
+ struct la_zstream *, int);
261
+ static int compression_init_encoder_lzma2(struct archive *,
262
+ struct la_zstream *, int);
263
+ #if defined(HAVE_LZMA_H)
264
+ static int compression_code_lzma(struct archive *,
265
+ struct la_zstream *, enum la_zaction);
266
+ static int compression_end_lzma(struct archive *, struct la_zstream *);
267
+ #endif
268
+ static int compression_init_encoder_ppmd(struct archive *,
269
+ struct la_zstream *, unsigned, uint32_t);
270
+ static int compression_code_ppmd(struct archive *,
271
+ struct la_zstream *, enum la_zaction);
272
+ static int compression_end_ppmd(struct archive *, struct la_zstream *);
273
+ static int _7z_compression_init_encoder(struct archive_write *, unsigned,
274
+ int);
275
+ static int compression_code(struct archive *,
276
+ struct la_zstream *, enum la_zaction);
277
+ static int compression_end(struct archive *,
278
+ struct la_zstream *);
279
+ static int enc_uint64(struct archive_write *, uint64_t);
280
+ static int make_header(struct archive_write *, uint64_t, uint64_t,
281
+ uint64_t, int, struct coder *);
282
+ static int make_streamsInfo(struct archive_write *, uint64_t, uint64_t,
283
+ uint64_t, int, struct coder *, int, uint32_t);
284
+
285
+ int
286
+ archive_write_set_format_7zip(struct archive *_a)
287
+ {
288
+ static const struct archive_rb_tree_ops rb_ops = {
289
+ file_cmp_node, file_cmp_key
290
+ };
291
+ struct archive_write *a = (struct archive_write *)_a;
292
+ struct _7zip *zip;
293
+
294
+ archive_check_magic(_a, ARCHIVE_WRITE_MAGIC,
295
+ ARCHIVE_STATE_NEW, "archive_write_set_format_7zip");
296
+
297
+ /* If another format was already registered, unregister it. */
298
+ if (a->format_free != NULL)
299
+ (a->format_free)(a);
300
+
301
+ zip = calloc(1, sizeof(*zip));
302
+ if (zip == NULL) {
303
+ archive_set_error(&a->archive, ENOMEM,
304
+ "Can't allocate 7-Zip data");
305
+ return (ARCHIVE_FATAL);
306
+ }
307
+ zip->temp_fd = -1;
308
+ __archive_rb_tree_init(&(zip->rbtree), &rb_ops);
309
+ file_init_register(zip);
310
+ file_init_register_empty(zip);
311
+
312
+ /* Set default compression type and its level. */
313
+ #if HAVE_LZMA_H
314
+ zip->opt_compression = _7Z_LZMA1;
315
+ #elif defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
316
+ zip->opt_compression = _7Z_BZIP2;
317
+ #elif defined(HAVE_ZLIB_H)
318
+ zip->opt_compression = _7Z_DEFLATE;
319
+ #else
320
+ zip->opt_compression = _7Z_COPY;
321
+ #endif
322
+ zip->opt_compression_level = 6;
323
+
324
+ a->format_data = zip;
325
+
326
+ a->format_name = "7zip";
327
+ a->format_options = _7z_options;
328
+ a->format_write_header = _7z_write_header;
329
+ a->format_write_data = _7z_write_data;
330
+ a->format_finish_entry = _7z_finish_entry;
331
+ a->format_close = _7z_close;
332
+ a->format_free = _7z_free;
333
+ a->archive.archive_format = ARCHIVE_FORMAT_7ZIP;
334
+ a->archive.archive_format_name = "7zip";
335
+
336
+ return (ARCHIVE_OK);
337
+ }
338
+
339
+ static int
340
+ _7z_options(struct archive_write *a, const char *key, const char *value)
341
+ {
342
+ struct _7zip *zip;
343
+
344
+ zip = (struct _7zip *)a->format_data;
345
+
346
+ if (strcmp(key, "compression") == 0) {
347
+ const char *name = NULL;
348
+
349
+ if (value == NULL || strcmp(value, "copy") == 0 ||
350
+ strcmp(value, "COPY") == 0 ||
351
+ strcmp(value, "store") == 0 ||
352
+ strcmp(value, "STORE") == 0)
353
+ zip->opt_compression = _7Z_COPY;
354
+ else if (strcmp(value, "deflate") == 0 ||
355
+ strcmp(value, "DEFLATE") == 0)
356
+ #if HAVE_ZLIB_H
357
+ zip->opt_compression = _7Z_DEFLATE;
358
+ #else
359
+ name = "deflate";
360
+ #endif
361
+ else if (strcmp(value, "bzip2") == 0 ||
362
+ strcmp(value, "BZIP2") == 0)
363
+ #if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
364
+ zip->opt_compression = _7Z_BZIP2;
365
+ #else
366
+ name = "bzip2";
367
+ #endif
368
+ else if (strcmp(value, "lzma1") == 0 ||
369
+ strcmp(value, "LZMA1") == 0)
370
+ #if HAVE_LZMA_H
371
+ zip->opt_compression = _7Z_LZMA1;
372
+ #else
373
+ name = "lzma1";
374
+ #endif
375
+ else if (strcmp(value, "lzma2") == 0 ||
376
+ strcmp(value, "LZMA2") == 0)
377
+ #if HAVE_LZMA_H
378
+ zip->opt_compression = _7Z_LZMA2;
379
+ #else
380
+ name = "lzma2";
381
+ #endif
382
+ else if (strcmp(value, "ppmd") == 0 ||
383
+ strcmp(value, "PPMD") == 0 ||
384
+ strcmp(value, "PPMd") == 0)
385
+ zip->opt_compression = _7Z_PPMD;
386
+ else {
387
+ archive_set_error(&(a->archive),
388
+ ARCHIVE_ERRNO_MISC,
389
+ "Unknown compression name: `%s'",
390
+ value);
391
+ return (ARCHIVE_FAILED);
392
+ }
393
+ if (name != NULL) {
394
+ archive_set_error(&(a->archive),
395
+ ARCHIVE_ERRNO_MISC,
396
+ "`%s' compression not supported "
397
+ "on this platform",
398
+ name);
399
+ return (ARCHIVE_FAILED);
400
+ }
401
+ return (ARCHIVE_OK);
402
+ }
403
+ if (strcmp(key, "compression-level") == 0) {
404
+ if (value == NULL ||
405
+ !(value[0] >= '0' && value[0] <= '9') ||
406
+ value[1] != '\0') {
407
+ archive_set_error(&(a->archive),
408
+ ARCHIVE_ERRNO_MISC,
409
+ "Illegal value `%s'",
410
+ value);
411
+ return (ARCHIVE_FAILED);
412
+ }
413
+ zip->opt_compression_level = value[0] - '0';
414
+ return (ARCHIVE_OK);
415
+ }
416
+
417
+ /* Note: The "warn" return is just to inform the options
418
+ * supervisor that we didn't handle it. It will generate
419
+ * a suitable error if no one used this option. */
420
+ return (ARCHIVE_WARN);
421
+ }
422
+
423
+ static int
424
+ _7z_write_header(struct archive_write *a, struct archive_entry *entry)
425
+ {
426
+ struct _7zip *zip;
427
+ struct file *file;
428
+ int r;
429
+
430
+ zip = (struct _7zip *)a->format_data;
431
+ zip->cur_file = NULL;
432
+ zip->entry_bytes_remaining = 0;
433
+
434
+ if (zip->sconv == NULL) {
435
+ zip->sconv = archive_string_conversion_to_charset(
436
+ &a->archive, "UTF-16LE", 1);
437
+ if (zip->sconv == NULL)
438
+ return (ARCHIVE_FATAL);
439
+ }
440
+
441
+ r = file_new(a, entry, &file);
442
+ if (r < ARCHIVE_WARN) {
443
+ if (file != NULL)
444
+ file_free(file);
445
+ return (r);
446
+ }
447
+ if (file->size == 0 && file->dir) {
448
+ if (!__archive_rb_tree_insert_node(&(zip->rbtree),
449
+ (struct archive_rb_node *)file)) {
450
+ /* We have already had the same file. */
451
+ file_free(file);
452
+ return (ARCHIVE_OK);
453
+ }
454
+ }
455
+
456
+ if (file->flg & MTIME_IS_SET)
457
+ zip->total_number_time_defined[MTIME]++;
458
+ if (file->flg & CTIME_IS_SET)
459
+ zip->total_number_time_defined[CTIME]++;
460
+ if (file->flg & ATIME_IS_SET)
461
+ zip->total_number_time_defined[ATIME]++;
462
+
463
+ zip->total_number_entry++;
464
+ zip->total_bytes_entry_name += file->name_len + 2;
465
+ if (file->size == 0) {
466
+ /* Count up the number of empty files. */
467
+ zip->total_number_empty_entry++;
468
+ if (file->dir)
469
+ zip->total_number_dir_entry++;
470
+ else
471
+ file_register_empty(zip, file);
472
+ return (r);
473
+ }
474
+
475
+ /*
476
+ * Init compression.
477
+ */
478
+ if ((zip->total_number_entry - zip->total_number_empty_entry) == 1) {
479
+ r = _7z_compression_init_encoder(a, zip->opt_compression,
480
+ zip->opt_compression_level);
481
+ if (r < 0) {
482
+ file_free(file);
483
+ return (ARCHIVE_FATAL);
484
+ }
485
+ }
486
+
487
+ /* Register a non-empty file. */
488
+ file_register(zip, file);
489
+
490
+ /*
491
+ * Set the current file to cur_file to read its contents.
492
+ */
493
+ zip->cur_file = file;
494
+
495
+
496
+ /* Save a offset of current file in temporary file. */
497
+ zip->entry_bytes_remaining = file->size;
498
+ zip->entry_crc32 = 0;
499
+
500
+ /*
501
+ * Store a symbolic link name as file contents.
502
+ */
503
+ if (archive_entry_filetype(entry) == AE_IFLNK) {
504
+ ssize_t bytes;
505
+ const void *p = (const void *)archive_entry_symlink(entry);
506
+ bytes = compress_out(a, p, (size_t)file->size, ARCHIVE_Z_RUN);
507
+ if (bytes < 0)
508
+ return ((int)bytes);
509
+ zip->entry_crc32 = crc32(zip->entry_crc32, p, (unsigned)bytes);
510
+ zip->entry_bytes_remaining -= bytes;
511
+ }
512
+
513
+ return (r);
514
+ }
515
+
516
+ /*
517
+ * Write data to a temporary file.
518
+ */
519
+ static int
520
+ write_to_temp(struct archive_write *a, const void *buff, size_t s)
521
+ {
522
+ struct _7zip *zip;
523
+ const unsigned char *p;
524
+ ssize_t ws;
525
+
526
+ zip = (struct _7zip *)a->format_data;
527
+
528
+ /*
529
+ * Open a temporary file.
530
+ */
531
+ if (zip->temp_fd == -1) {
532
+ zip->temp_offset = 0;
533
+ zip->temp_fd = __archive_mktemp(NULL);
534
+ if (zip->temp_fd < 0) {
535
+ archive_set_error(&a->archive, errno,
536
+ "Couldn't create temporary file");
537
+ return (ARCHIVE_FATAL);
538
+ }
539
+ }
540
+
541
+ p = (const unsigned char *)buff;
542
+ while (s) {
543
+ ws = write(zip->temp_fd, p, s);
544
+ if (ws < 0) {
545
+ archive_set_error(&(a->archive), errno,
546
+ "fwrite function failed");
547
+ return (ARCHIVE_FATAL);
548
+ }
549
+ s -= ws;
550
+ p += ws;
551
+ zip->temp_offset += ws;
552
+ }
553
+ return (ARCHIVE_OK);
554
+ }
555
+
556
+ static ssize_t
557
+ compress_out(struct archive_write *a, const void *buff, size_t s,
558
+ enum la_zaction run)
559
+ {
560
+ struct _7zip *zip = (struct _7zip *)a->format_data;
561
+ int r;
562
+
563
+ if (run == ARCHIVE_Z_FINISH && zip->stream.total_in == 0 && s == 0)
564
+ return (0);
565
+
566
+ if ((zip->crc32flg & PRECODE_CRC32) && s)
567
+ zip->precode_crc32 = crc32(zip->precode_crc32, buff,
568
+ (unsigned)s);
569
+ zip->stream.next_in = (const unsigned char *)buff;
570
+ zip->stream.avail_in = s;
571
+ for (;;) {
572
+ /* Compress file data. */
573
+ r = compression_code(&(a->archive), &(zip->stream), run);
574
+ if (r != ARCHIVE_OK && r != ARCHIVE_EOF)
575
+ return (ARCHIVE_FATAL);
576
+ if (zip->stream.avail_out == 0) {
577
+ if (write_to_temp(a, zip->wbuff, sizeof(zip->wbuff))
578
+ != ARCHIVE_OK)
579
+ return (ARCHIVE_FATAL);
580
+ zip->stream.next_out = zip->wbuff;
581
+ zip->stream.avail_out = sizeof(zip->wbuff);
582
+ if (zip->crc32flg & ENCODED_CRC32)
583
+ zip->encoded_crc32 = crc32(zip->encoded_crc32,
584
+ zip->wbuff, sizeof(zip->wbuff));
585
+ if (run == ARCHIVE_Z_FINISH && r != ARCHIVE_EOF)
586
+ continue;
587
+ }
588
+ if (zip->stream.avail_in == 0)
589
+ break;
590
+ }
591
+ if (run == ARCHIVE_Z_FINISH) {
592
+ uint64_t bytes = sizeof(zip->wbuff) - zip->stream.avail_out;
593
+ if (write_to_temp(a, zip->wbuff, (size_t)bytes) != ARCHIVE_OK)
594
+ return (ARCHIVE_FATAL);
595
+ if ((zip->crc32flg & ENCODED_CRC32) && bytes)
596
+ zip->encoded_crc32 = crc32(zip->encoded_crc32,
597
+ zip->wbuff, (unsigned)bytes);
598
+ }
599
+
600
+ return (s);
601
+ }
602
+
603
+ static ssize_t
604
+ _7z_write_data(struct archive_write *a, const void *buff, size_t s)
605
+ {
606
+ struct _7zip *zip;
607
+ ssize_t bytes;
608
+
609
+ zip = (struct _7zip *)a->format_data;
610
+
611
+ if (s > zip->entry_bytes_remaining)
612
+ s = (size_t)zip->entry_bytes_remaining;
613
+ if (s == 0 || zip->cur_file == NULL)
614
+ return (0);
615
+ bytes = compress_out(a, buff, s, ARCHIVE_Z_RUN);
616
+ if (bytes < 0)
617
+ return (bytes);
618
+ zip->entry_crc32 = crc32(zip->entry_crc32, buff, (unsigned)bytes);
619
+ zip->entry_bytes_remaining -= bytes;
620
+ return (bytes);
621
+ }
622
+
623
+ static int
624
+ _7z_finish_entry(struct archive_write *a)
625
+ {
626
+ struct _7zip *zip;
627
+ size_t s;
628
+ ssize_t r;
629
+
630
+ zip = (struct _7zip *)a->format_data;
631
+ if (zip->cur_file == NULL)
632
+ return (ARCHIVE_OK);
633
+
634
+ while (zip->entry_bytes_remaining > 0) {
635
+ s = (size_t)zip->entry_bytes_remaining;
636
+ if (s > a->null_length)
637
+ s = a->null_length;
638
+ r = _7z_write_data(a, a->nulls, s);
639
+ if (r < 0)
640
+ return ((int)r);
641
+ }
642
+ zip->total_bytes_compressed += zip->stream.total_in;
643
+ zip->total_bytes_uncompressed += zip->stream.total_out;
644
+ zip->cur_file->crc32 = zip->entry_crc32;
645
+ zip->cur_file = NULL;
646
+
647
+ return (ARCHIVE_OK);
648
+ }
649
+
650
+ static int
651
+ flush_wbuff(struct archive_write *a)
652
+ {
653
+ struct _7zip *zip;
654
+ int r;
655
+ size_t s;
656
+
657
+ zip = (struct _7zip *)a->format_data;
658
+ s = sizeof(zip->wbuff) - zip->wbuff_remaining;
659
+ r = __archive_write_output(a, zip->wbuff, s);
660
+ if (r != ARCHIVE_OK)
661
+ return (r);
662
+ zip->wbuff_remaining = sizeof(zip->wbuff);
663
+ return (r);
664
+ }
665
+
666
+ static int
667
+ copy_out(struct archive_write *a, uint64_t offset, uint64_t length)
668
+ {
669
+ struct _7zip *zip;
670
+ int r;
671
+
672
+ zip = (struct _7zip *)a->format_data;
673
+ if (zip->temp_offset > 0 &&
674
+ lseek(zip->temp_fd, offset, SEEK_SET) < 0) {
675
+ archive_set_error(&(a->archive), errno, "lseek failed");
676
+ return (ARCHIVE_FATAL);
677
+ }
678
+ while (length) {
679
+ size_t rsize;
680
+ ssize_t rs;
681
+ unsigned char *wb;
682
+
683
+ if (length > zip->wbuff_remaining)
684
+ rsize = zip->wbuff_remaining;
685
+ else
686
+ rsize = (size_t)length;
687
+ wb = zip->wbuff + (sizeof(zip->wbuff) - zip->wbuff_remaining);
688
+ rs = read(zip->temp_fd, wb, rsize);
689
+ if (rs < 0) {
690
+ archive_set_error(&(a->archive), errno,
691
+ "Can't read temporary file(%jd)",
692
+ (intmax_t)rs);
693
+ return (ARCHIVE_FATAL);
694
+ }
695
+ if (rs == 0) {
696
+ archive_set_error(&(a->archive), 0,
697
+ "Truncated 7-Zip archive");
698
+ return (ARCHIVE_FATAL);
699
+ }
700
+ zip->wbuff_remaining -= rs;
701
+ length -= rs;
702
+ if (zip->wbuff_remaining == 0) {
703
+ r = flush_wbuff(a);
704
+ if (r != ARCHIVE_OK)
705
+ return (r);
706
+ }
707
+ }
708
+ return (ARCHIVE_OK);
709
+ }
710
+
711
+ static int
712
+ _7z_close(struct archive_write *a)
713
+ {
714
+ struct _7zip *zip;
715
+ unsigned char *wb;
716
+ uint64_t header_offset, header_size, header_unpacksize;
717
+ uint64_t length;
718
+ uint32_t header_crc32;
719
+ int r;
720
+
721
+ zip = (struct _7zip *)a->format_data;
722
+
723
+ if (zip->total_number_entry > 0) {
724
+ struct archive_rb_node *n;
725
+ uint64_t data_offset, data_size, data_unpacksize;
726
+ unsigned header_compression;
727
+
728
+ r = (int)compress_out(a, NULL, 0, ARCHIVE_Z_FINISH);
729
+ if (r < 0)
730
+ return (r);
731
+ data_offset = 0;
732
+ data_size = zip->stream.total_out;
733
+ data_unpacksize = zip->stream.total_in;
734
+ zip->coder.codec = zip->opt_compression;
735
+ zip->coder.prop_size = zip->stream.prop_size;
736
+ zip->coder.props = zip->stream.props;
737
+ zip->stream.prop_size = 0;
738
+ zip->stream.props = NULL;
739
+ zip->total_number_nonempty_entry =
740
+ zip->total_number_entry - zip->total_number_empty_entry;
741
+
742
+ /* Connect an empty file list. */
743
+ if (zip->empty_list.first != NULL) {
744
+ *zip->file_list.last = zip->empty_list.first;
745
+ zip->file_list.last = zip->empty_list.last;
746
+ }
747
+ /* Connect a directory file list. */
748
+ ARCHIVE_RB_TREE_FOREACH(n, &(zip->rbtree)) {
749
+ file_register(zip, (struct file *)n);
750
+ }
751
+
752
+ /*
753
+ * NOTE: 7z command supports just LZMA1, LZMA2 and COPY for
754
+ * the compression type for encoding the header.
755
+ */
756
+ #if HAVE_LZMA_H
757
+ header_compression = _7Z_LZMA1;
758
+ if(zip->opt_compression == _7Z_LZMA2 ||
759
+ zip->opt_compression == _7Z_COPY)
760
+ header_compression = zip->opt_compression;
761
+
762
+ /* If the stored file is only one, do not encode the header.
763
+ * This is the same way 7z command does. */
764
+ if (zip->total_number_entry == 1)
765
+ header_compression = _7Z_COPY;
766
+ #else
767
+ header_compression = _7Z_COPY;
768
+ #endif
769
+ r = _7z_compression_init_encoder(a, header_compression,
770
+ zip->opt_compression_level);
771
+ if (r < 0)
772
+ return (r);
773
+ zip->crc32flg = PRECODE_CRC32;
774
+ zip->precode_crc32 = 0;
775
+ r = make_header(a, data_offset, data_size, data_unpacksize,
776
+ 1, &(zip->coder));
777
+ if (r < 0)
778
+ return (r);
779
+ r = (int)compress_out(a, NULL, 0, ARCHIVE_Z_FINISH);
780
+ if (r < 0)
781
+ return (r);
782
+ header_offset = data_offset + data_size;
783
+ header_size = zip->stream.total_out;
784
+ header_crc32 = zip->precode_crc32;
785
+ header_unpacksize = zip->stream.total_in;
786
+
787
+ if (header_compression != _7Z_COPY) {
788
+ /*
789
+ * Encode the header in order to reduce the size
790
+ * of the archive.
791
+ */
792
+ free(zip->coder.props);
793
+ zip->coder.codec = header_compression;
794
+ zip->coder.prop_size = zip->stream.prop_size;
795
+ zip->coder.props = zip->stream.props;
796
+ zip->stream.prop_size = 0;
797
+ zip->stream.props = NULL;
798
+
799
+ r = _7z_compression_init_encoder(a, _7Z_COPY, 0);
800
+ if (r < 0)
801
+ return (r);
802
+ zip->crc32flg = ENCODED_CRC32;
803
+ zip->encoded_crc32 = 0;
804
+
805
+ /*
806
+ * Make EncodedHeader.
807
+ */
808
+ r = enc_uint64(a, kEncodedHeader);
809
+ if (r < 0)
810
+ return (r);
811
+ r = make_streamsInfo(a, header_offset, header_size,
812
+ header_unpacksize, 1, &(zip->coder), 0,
813
+ header_crc32);
814
+ if (r < 0)
815
+ return (r);
816
+ r = (int)compress_out(a, NULL, 0, ARCHIVE_Z_FINISH);
817
+ if (r < 0)
818
+ return (r);
819
+ header_offset = header_offset + header_size;
820
+ header_size = zip->stream.total_out;
821
+ header_crc32 = zip->encoded_crc32;
822
+ }
823
+ zip->crc32flg = 0;
824
+ } else {
825
+ header_offset = header_size = 0;
826
+ header_crc32 = 0;
827
+ }
828
+
829
+ length = zip->temp_offset;
830
+
831
+ /*
832
+ * Make the zip header on wbuff(write buffer).
833
+ */
834
+ wb = zip->wbuff;
835
+ zip->wbuff_remaining = sizeof(zip->wbuff);
836
+ memcpy(&wb[0], "7z\xBC\xAF\x27\x1C", 6);
837
+ wb[6] = 0;/* Major version. */
838
+ wb[7] = 3;/* Minor version. */
839
+ archive_le64enc(&wb[12], header_offset);/* Next Header Offset */
840
+ archive_le64enc(&wb[20], header_size);/* Next Header Size */
841
+ archive_le32enc(&wb[28], header_crc32);/* Next Header CRC */
842
+ archive_le32enc(&wb[8], crc32(0, &wb[12], 20));/* Start Header CRC */
843
+ zip->wbuff_remaining -= 32;
844
+
845
+ /*
846
+ * Read all file contents and an encoded header from the temporary
847
+ * file and write out it.
848
+ */
849
+ r = copy_out(a, 0, length);
850
+ if (r != ARCHIVE_OK)
851
+ return (r);
852
+ r = flush_wbuff(a);
853
+ return (r);
854
+ }
855
+
856
+ /*
857
+ * Encode 64 bits value into 7-Zip's encoded UINT64 value.
858
+ */
859
+ static int
860
+ enc_uint64(struct archive_write *a, uint64_t val)
861
+ {
862
+ unsigned mask = 0x80;
863
+ uint8_t numdata[9];
864
+ int i;
865
+
866
+ numdata[0] = 0;
867
+ for (i = 1; i < (int)sizeof(numdata); i++) {
868
+ if (val < mask) {
869
+ numdata[0] |= (uint8_t)val;
870
+ break;
871
+ }
872
+ numdata[i] = (uint8_t)val;
873
+ val >>= 8;
874
+ numdata[0] |= mask;
875
+ mask >>= 1;
876
+ }
877
+ return ((int)compress_out(a, numdata, i, ARCHIVE_Z_RUN));
878
+ }
879
+
880
+ static int
881
+ make_substreamsInfo(struct archive_write *a, struct coder *coders)
882
+ {
883
+ struct _7zip *zip = (struct _7zip *)a->format_data;
884
+ struct file *file;
885
+ int r;
886
+
887
+ /*
888
+ * Make SubStreamsInfo.
889
+ */
890
+ r = enc_uint64(a, kSubStreamsInfo);
891
+ if (r < 0)
892
+ return (r);
893
+
894
+ if (zip->total_number_nonempty_entry > 1 && coders->codec != _7Z_COPY) {
895
+ /*
896
+ * Make NumUnPackStream.
897
+ */
898
+ r = enc_uint64(a, kNumUnPackStream);
899
+ if (r < 0)
900
+ return (r);
901
+
902
+ /* Write numUnpackStreams */
903
+ r = enc_uint64(a, zip->total_number_nonempty_entry);
904
+ if (r < 0)
905
+ return (r);
906
+
907
+ /*
908
+ * Make kSize.
909
+ */
910
+ r = enc_uint64(a, kSize);
911
+ if (r < 0)
912
+ return (r);
913
+ file = zip->file_list.first;
914
+ for (;file != NULL; file = file->next) {
915
+ if (file->next == NULL ||
916
+ file->next->size == 0)
917
+ break;
918
+ r = enc_uint64(a, file->size);
919
+ if (r < 0)
920
+ return (r);
921
+ }
922
+ }
923
+
924
+ /*
925
+ * Make CRC.
926
+ */
927
+ r = enc_uint64(a, kCRC);
928
+ if (r < 0)
929
+ return (r);
930
+
931
+
932
+ /* All are defined */
933
+ r = enc_uint64(a, 1);
934
+ if (r < 0)
935
+ return (r);
936
+ file = zip->file_list.first;
937
+ for (;file != NULL; file = file->next) {
938
+ uint8_t crc[4];
939
+ if (file->size == 0)
940
+ break;
941
+ archive_le32enc(crc, file->crc32);
942
+ r = (int)compress_out(a, crc, 4, ARCHIVE_Z_RUN);
943
+ if (r < 0)
944
+ return (r);
945
+ }
946
+
947
+ /* Write End. */
948
+ r = enc_uint64(a, kEnd);
949
+ if (r < 0)
950
+ return (r);
951
+ return (ARCHIVE_OK);
952
+ }
953
+
954
+ static int
955
+ make_streamsInfo(struct archive_write *a, uint64_t offset, uint64_t pack_size,
956
+ uint64_t unpack_size, int num_coder, struct coder *coders, int substrm,
957
+ uint32_t header_crc)
958
+ {
959
+ struct _7zip *zip = (struct _7zip *)a->format_data;
960
+ uint8_t codec_buff[8];
961
+ int numFolders, fi;
962
+ int codec_size;
963
+ int i, r;
964
+
965
+ if (coders->codec == _7Z_COPY)
966
+ numFolders = (int)zip->total_number_nonempty_entry;
967
+ else
968
+ numFolders = 1;
969
+
970
+ /*
971
+ * Make PackInfo.
972
+ */
973
+ r = enc_uint64(a, kPackInfo);
974
+ if (r < 0)
975
+ return (r);
976
+
977
+ /* Write PackPos. */
978
+ r = enc_uint64(a, offset);
979
+ if (r < 0)
980
+ return (r);
981
+
982
+ /* Write NumPackStreams. */
983
+ r = enc_uint64(a, numFolders);
984
+ if (r < 0)
985
+ return (r);
986
+
987
+ /* Make Size. */
988
+ r = enc_uint64(a, kSize);
989
+ if (r < 0)
990
+ return (r);
991
+
992
+ if (numFolders > 1) {
993
+ struct file *file = zip->file_list.first;
994
+ for (;file != NULL; file = file->next) {
995
+ if (file->size == 0)
996
+ break;
997
+ r = enc_uint64(a, file->size);
998
+ if (r < 0)
999
+ return (r);
1000
+ }
1001
+ } else {
1002
+ /* Write size. */
1003
+ r = enc_uint64(a, pack_size);
1004
+ if (r < 0)
1005
+ return (r);
1006
+ }
1007
+
1008
+ r = enc_uint64(a, kEnd);
1009
+ if (r < 0)
1010
+ return (r);
1011
+
1012
+ /*
1013
+ * Make UnPackInfo.
1014
+ */
1015
+ r = enc_uint64(a, kUnPackInfo);
1016
+ if (r < 0)
1017
+ return (r);
1018
+
1019
+ /*
1020
+ * Make Folder.
1021
+ */
1022
+ r = enc_uint64(a, kFolder);
1023
+ if (r < 0)
1024
+ return (r);
1025
+
1026
+ /* Write NumFolders. */
1027
+ r = enc_uint64(a, numFolders);
1028
+ if (r < 0)
1029
+ return (r);
1030
+
1031
+ /* Write External. */
1032
+ r = enc_uint64(a, 0);
1033
+ if (r < 0)
1034
+ return (r);
1035
+
1036
+ for (fi = 0; fi < numFolders; fi++) {
1037
+ /* Write NumCoders. */
1038
+ r = enc_uint64(a, num_coder);
1039
+ if (r < 0)
1040
+ return (r);
1041
+
1042
+ for (i = 0; i < num_coder; i++) {
1043
+ unsigned codec_id = coders[i].codec;
1044
+
1045
+ /* Write Codec flag. */
1046
+ archive_be64enc(codec_buff, codec_id);
1047
+ for (codec_size = 8; codec_size > 0; codec_size--) {
1048
+ if (codec_buff[8 - codec_size])
1049
+ break;
1050
+ }
1051
+ if (codec_size == 0)
1052
+ codec_size = 1;
1053
+ if (coders[i].prop_size)
1054
+ r = enc_uint64(a, codec_size | 0x20);
1055
+ else
1056
+ r = enc_uint64(a, codec_size);
1057
+ if (r < 0)
1058
+ return (r);
1059
+
1060
+ /* Write Codec ID. */
1061
+ codec_size &= 0x0f;
1062
+ r = (int)compress_out(a, &codec_buff[8-codec_size],
1063
+ codec_size, ARCHIVE_Z_RUN);
1064
+ if (r < 0)
1065
+ return (r);
1066
+
1067
+ if (coders[i].prop_size) {
1068
+ /* Write Codec property size. */
1069
+ r = enc_uint64(a, coders[i].prop_size);
1070
+ if (r < 0)
1071
+ return (r);
1072
+
1073
+ /* Write Codec properties. */
1074
+ r = (int)compress_out(a, coders[i].props,
1075
+ coders[i].prop_size, ARCHIVE_Z_RUN);
1076
+ if (r < 0)
1077
+ return (r);
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ /*
1083
+ * Make CodersUnPackSize.
1084
+ */
1085
+ r = enc_uint64(a, kCodersUnPackSize);
1086
+ if (r < 0)
1087
+ return (r);
1088
+
1089
+ if (numFolders > 1) {
1090
+ struct file *file = zip->file_list.first;
1091
+ for (;file != NULL; file = file->next) {
1092
+ if (file->size == 0)
1093
+ break;
1094
+ r = enc_uint64(a, file->size);
1095
+ if (r < 0)
1096
+ return (r);
1097
+ }
1098
+
1099
+ } else {
1100
+ /* Write UnPackSize. */
1101
+ r = enc_uint64(a, unpack_size);
1102
+ if (r < 0)
1103
+ return (r);
1104
+ }
1105
+
1106
+ if (!substrm) {
1107
+ uint8_t crc[4];
1108
+ /*
1109
+ * Make CRC.
1110
+ */
1111
+ r = enc_uint64(a, kCRC);
1112
+ if (r < 0)
1113
+ return (r);
1114
+
1115
+ /* All are defined */
1116
+ r = enc_uint64(a, 1);
1117
+ if (r < 0)
1118
+ return (r);
1119
+ archive_le32enc(crc, header_crc);
1120
+ r = (int)compress_out(a, crc, 4, ARCHIVE_Z_RUN);
1121
+ if (r < 0)
1122
+ return (r);
1123
+ }
1124
+
1125
+ /* Write End. */
1126
+ r = enc_uint64(a, kEnd);
1127
+ if (r < 0)
1128
+ return (r);
1129
+
1130
+ if (substrm) {
1131
+ /*
1132
+ * Make SubStreamsInfo.
1133
+ */
1134
+ r = make_substreamsInfo(a, coders);
1135
+ if (r < 0)
1136
+ return (r);
1137
+ }
1138
+
1139
+
1140
+ /* Write End. */
1141
+ r = enc_uint64(a, kEnd);
1142
+ if (r < 0)
1143
+ return (r);
1144
+
1145
+ return (ARCHIVE_OK);
1146
+ }
1147
+
1148
+
1149
+ #define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000)
1150
+ static uint64_t
1151
+ utcToFiletime(time_t t, long ns)
1152
+ {
1153
+ uint64_t fileTime;
1154
+
1155
+ fileTime = t;
1156
+ fileTime *= 10000000;
1157
+ fileTime += ns / 100;
1158
+ fileTime += EPOC_TIME;
1159
+ return (fileTime);
1160
+ }
1161
+
1162
+ static int
1163
+ make_time(struct archive_write *a, uint8_t type, unsigned flg, int ti)
1164
+ {
1165
+ uint8_t filetime[8];
1166
+ struct _7zip *zip = (struct _7zip *)a->format_data;
1167
+ struct file *file;
1168
+ int r;
1169
+ uint8_t b, mask;
1170
+
1171
+ /*
1172
+ * Make Time Bools.
1173
+ */
1174
+ if (zip->total_number_time_defined[ti] == zip->total_number_entry) {
1175
+ /* Write Time Type. */
1176
+ r = enc_uint64(a, type);
1177
+ if (r < 0)
1178
+ return (r);
1179
+ /* Write EmptyStream Size. */
1180
+ r = enc_uint64(a, 2 + zip->total_number_entry * 8);
1181
+ if (r < 0)
1182
+ return (r);
1183
+ /* All are defined. */
1184
+ r = enc_uint64(a, 1);
1185
+ if (r < 0)
1186
+ return (r);
1187
+ } else {
1188
+ if (zip->total_number_time_defined[ti] == 0)
1189
+ return (ARCHIVE_OK);
1190
+
1191
+ /* Write Time Type. */
1192
+ r = enc_uint64(a, type);
1193
+ if (r < 0)
1194
+ return (r);
1195
+ /* Write EmptyStream Size. */
1196
+ r = enc_uint64(a, 2 + ((zip->total_number_entry + 7) >> 3)
1197
+ + zip->total_number_time_defined[ti] * 8);
1198
+ if (r < 0)
1199
+ return (r);
1200
+
1201
+ /* All are not defined. */
1202
+ r = enc_uint64(a, 0);
1203
+ if (r < 0)
1204
+ return (r);
1205
+
1206
+ b = 0;
1207
+ mask = 0x80;
1208
+ file = zip->file_list.first;
1209
+ for (;file != NULL; file = file->next) {
1210
+ if (file->flg & flg)
1211
+ b |= mask;
1212
+ mask >>= 1;
1213
+ if (mask == 0) {
1214
+ r = (int)compress_out(a, &b, 1, ARCHIVE_Z_RUN);
1215
+ if (r < 0)
1216
+ return (r);
1217
+ mask = 0x80;
1218
+ b = 0;
1219
+ }
1220
+ }
1221
+ if (mask != 0x80) {
1222
+ r = (int)compress_out(a, &b, 1, ARCHIVE_Z_RUN);
1223
+ if (r < 0)
1224
+ return (r);
1225
+ }
1226
+ }
1227
+
1228
+ /* External. */
1229
+ r = enc_uint64(a, 0);
1230
+ if (r < 0)
1231
+ return (r);
1232
+
1233
+
1234
+ /*
1235
+ * Make Times.
1236
+ */
1237
+ file = zip->file_list.first;
1238
+ for (;file != NULL; file = file->next) {
1239
+ if ((file->flg & flg) == 0)
1240
+ continue;
1241
+ archive_le64enc(filetime, utcToFiletime(file->times[ti].time,
1242
+ file->times[ti].time_ns));
1243
+ r = (int)compress_out(a, filetime, 8, ARCHIVE_Z_RUN);
1244
+ if (r < 0)
1245
+ return (r);
1246
+ }
1247
+
1248
+ return (ARCHIVE_OK);
1249
+ }
1250
+
1251
+ static int
1252
+ make_header(struct archive_write *a, uint64_t offset, uint64_t pack_size,
1253
+ uint64_t unpack_size, int codernum, struct coder *coders)
1254
+ {
1255
+ struct _7zip *zip = (struct _7zip *)a->format_data;
1256
+ struct file *file;
1257
+ int r;
1258
+ uint8_t b, mask;
1259
+
1260
+ /*
1261
+ * Make FilesInfo.
1262
+ */
1263
+ r = enc_uint64(a, kHeader);
1264
+ if (r < 0)
1265
+ return (r);
1266
+
1267
+ /*
1268
+ * If there are empty files only, do not write MainStreamInfo.
1269
+ */
1270
+ if (zip->total_number_nonempty_entry) {
1271
+ /*
1272
+ * Make MainStreamInfo.
1273
+ */
1274
+ r = enc_uint64(a, kMainStreamsInfo);
1275
+ if (r < 0)
1276
+ return (r);
1277
+ r = make_streamsInfo(a, offset, pack_size, unpack_size,
1278
+ codernum, coders, 1, 0);
1279
+ if (r < 0)
1280
+ return (r);
1281
+ }
1282
+
1283
+ /*
1284
+ * Make FilesInfo.
1285
+ */
1286
+ r = enc_uint64(a, kFilesInfo);
1287
+ if (r < 0)
1288
+ return (r);
1289
+
1290
+ /* Write numFiles. */
1291
+ r = enc_uint64(a, zip->total_number_entry);
1292
+ if (r < 0)
1293
+ return (r);
1294
+
1295
+ if (zip->total_number_empty_entry > 0) {
1296
+ /* Make EmptyStream. */
1297
+ r = enc_uint64(a, kEmptyStream);
1298
+ if (r < 0)
1299
+ return (r);
1300
+
1301
+ /* Write EmptyStream Size. */
1302
+ r = enc_uint64(a, (zip->total_number_entry+7)>>3);
1303
+ if (r < 0)
1304
+ return (r);
1305
+
1306
+ b = 0;
1307
+ mask = 0x80;
1308
+ file = zip->file_list.first;
1309
+ for (;file != NULL; file = file->next) {
1310
+ if (file->size == 0)
1311
+ b |= mask;
1312
+ mask >>= 1;
1313
+ if (mask == 0) {
1314
+ r = (int)compress_out(a, &b, 1, ARCHIVE_Z_RUN);
1315
+ if (r < 0)
1316
+ return (r);
1317
+ mask = 0x80;
1318
+ b = 0;
1319
+ }
1320
+ }
1321
+ if (mask != 0x80) {
1322
+ r = (int)compress_out(a, &b, 1, ARCHIVE_Z_RUN);
1323
+ if (r < 0)
1324
+ return (r);
1325
+ }
1326
+ }
1327
+
1328
+ if (zip->total_number_empty_entry > zip->total_number_dir_entry) {
1329
+ /* Make EmptyFile. */
1330
+ r = enc_uint64(a, kEmptyFile);
1331
+ if (r < 0)
1332
+ return (r);
1333
+
1334
+ /* Write EmptyFile Size. */
1335
+ r = enc_uint64(a, (zip->total_number_empty_entry + 7) >> 3);
1336
+ if (r < 0)
1337
+ return (r);
1338
+
1339
+ b = 0;
1340
+ mask = 0x80;
1341
+ file = zip->file_list.first;
1342
+ for (;file != NULL; file = file->next) {
1343
+ if (file->size)
1344
+ continue;
1345
+ if (!file->dir)
1346
+ b |= mask;
1347
+ mask >>= 1;
1348
+ if (mask == 0) {
1349
+ r = (int)compress_out(a, &b, 1, ARCHIVE_Z_RUN);
1350
+ if (r < 0)
1351
+ return (r);
1352
+ mask = 0x80;
1353
+ b = 0;
1354
+ }
1355
+ }
1356
+ if (mask != 0x80) {
1357
+ r = (int)compress_out(a, &b, 1, ARCHIVE_Z_RUN);
1358
+ if (r < 0)
1359
+ return (r);
1360
+ }
1361
+ }
1362
+
1363
+ /* Make Name. */
1364
+ r = enc_uint64(a, kName);
1365
+ if (r < 0)
1366
+ return (r);
1367
+
1368
+ /* Write Name size. */
1369
+ r = enc_uint64(a, zip->total_bytes_entry_name+1);
1370
+ if (r < 0)
1371
+ return (r);
1372
+
1373
+ /* Write dmy byte. */
1374
+ r = enc_uint64(a, 0);
1375
+ if (r < 0)
1376
+ return (r);
1377
+
1378
+ file = zip->file_list.first;
1379
+ for (;file != NULL; file = file->next) {
1380
+ r = (int)compress_out(a, file->utf16name, file->name_len+2,
1381
+ ARCHIVE_Z_RUN);
1382
+ if (r < 0)
1383
+ return (r);
1384
+ }
1385
+
1386
+ /* Make MTime. */
1387
+ r = make_time(a, kMTime, MTIME_IS_SET, MTIME);
1388
+ if (r < 0)
1389
+ return (r);
1390
+
1391
+ /* Make CTime. */
1392
+ r = make_time(a, kCTime, CTIME_IS_SET, CTIME);
1393
+ if (r < 0)
1394
+ return (r);
1395
+
1396
+ /* Make ATime. */
1397
+ r = make_time(a, kATime, ATIME_IS_SET, ATIME);
1398
+ if (r < 0)
1399
+ return (r);
1400
+
1401
+ /* Make Attributes. */
1402
+ r = enc_uint64(a, kAttributes);
1403
+ if (r < 0)
1404
+ return (r);
1405
+
1406
+ /* Write Attributes size. */
1407
+ r = enc_uint64(a, 2 + zip->total_number_entry * 4);
1408
+ if (r < 0)
1409
+ return (r);
1410
+
1411
+ /* Write "All Are Defined". */
1412
+ r = enc_uint64(a, 1);
1413
+ if (r < 0)
1414
+ return (r);
1415
+
1416
+ /* Write dmy byte. */
1417
+ r = enc_uint64(a, 0);
1418
+ if (r < 0)
1419
+ return (r);
1420
+
1421
+ file = zip->file_list.first;
1422
+ for (;file != NULL; file = file->next) {
1423
+ /*
1424
+ * High 16bits is unix mode.
1425
+ * Low 16bits is Windows attributes.
1426
+ */
1427
+ uint32_t encattr, attr;
1428
+ if (file->dir)
1429
+ attr = 0x8010;
1430
+ else
1431
+ attr = 0x8020;
1432
+ if ((file->mode & 0222) == 0)
1433
+ attr |= 1;/* Read Only. */
1434
+ attr |= ((uint32_t)file->mode) << 16;
1435
+ archive_le32enc(&encattr, attr);
1436
+ r = (int)compress_out(a, &encattr, 4, ARCHIVE_Z_RUN);
1437
+ if (r < 0)
1438
+ return (r);
1439
+ }
1440
+
1441
+ /* Write End. */
1442
+ r = enc_uint64(a, kEnd);
1443
+ if (r < 0)
1444
+ return (r);
1445
+
1446
+ /* Write End. */
1447
+ r = enc_uint64(a, kEnd);
1448
+ if (r < 0)
1449
+ return (r);
1450
+
1451
+ return (ARCHIVE_OK);
1452
+ }
1453
+
1454
+
1455
+ static int
1456
+ _7z_free(struct archive_write *a)
1457
+ {
1458
+ struct _7zip *zip = (struct _7zip *)a->format_data;
1459
+
1460
+ /* Close the temporary file. */
1461
+ if (zip->temp_fd >= 0)
1462
+ close(zip->temp_fd);
1463
+
1464
+ file_free_register(zip);
1465
+ compression_end(&(a->archive), &(zip->stream));
1466
+ free(zip->coder.props);
1467
+ free(zip);
1468
+
1469
+ return (ARCHIVE_OK);
1470
+ }
1471
+
1472
+ static int
1473
+ file_cmp_node(const struct archive_rb_node *n1,
1474
+ const struct archive_rb_node *n2)
1475
+ {
1476
+ const struct file *f1 = (const struct file *)n1;
1477
+ const struct file *f2 = (const struct file *)n2;
1478
+
1479
+ if (f1->name_len == f2->name_len)
1480
+ return (memcmp(f1->utf16name, f2->utf16name, f1->name_len));
1481
+ return (f1->name_len > f2->name_len)?1:-1;
1482
+ }
1483
+
1484
+ static int
1485
+ file_cmp_key(const struct archive_rb_node *n, const void *key)
1486
+ {
1487
+ const struct file *f = (const struct file *)n;
1488
+
1489
+ return (f->name_len - *(const char *)key);
1490
+ }
1491
+
1492
+ static int
1493
+ file_new(struct archive_write *a, struct archive_entry *entry,
1494
+ struct file **newfile)
1495
+ {
1496
+ struct _7zip *zip;
1497
+ struct file *file;
1498
+ const char *u16;
1499
+ size_t u16len;
1500
+ int ret = ARCHIVE_OK;
1501
+
1502
+ zip = (struct _7zip *)a->format_data;
1503
+ *newfile = NULL;
1504
+
1505
+ file = calloc(1, sizeof(*file));
1506
+ if (file == NULL) {
1507
+ archive_set_error(&a->archive, ENOMEM,
1508
+ "Can't allocate memory");
1509
+ return (ARCHIVE_FATAL);
1510
+ }
1511
+
1512
+ if (0 > archive_entry_pathname_l(entry, &u16, &u16len, zip->sconv)) {
1513
+ if (errno == ENOMEM) {
1514
+ free(file);
1515
+ archive_set_error(&a->archive, ENOMEM,
1516
+ "Can't allocate memory for UTF-16LE");
1517
+ return (ARCHIVE_FATAL);
1518
+ }
1519
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1520
+ "A filename cannot be converted to UTF-16LE;"
1521
+ "You should disable making Joliet extension");
1522
+ ret = ARCHIVE_WARN;
1523
+ }
1524
+ file->utf16name = malloc(u16len + 2);
1525
+ if (file->utf16name == NULL) {
1526
+ free(file);
1527
+ archive_set_error(&a->archive, ENOMEM,
1528
+ "Can't allocate memory for Name");
1529
+ return (ARCHIVE_FATAL);
1530
+ }
1531
+ memcpy(file->utf16name, u16, u16len);
1532
+ file->utf16name[u16len+0] = 0;
1533
+ file->utf16name[u16len+1] = 0;
1534
+ file->name_len = (unsigned)u16len;
1535
+ file->mode = archive_entry_mode(entry);
1536
+ if (archive_entry_filetype(entry) == AE_IFREG)
1537
+ file->size = archive_entry_size(entry);
1538
+ else
1539
+ archive_entry_set_size(entry, 0);
1540
+ if (archive_entry_filetype(entry) == AE_IFDIR)
1541
+ file->dir = 1;
1542
+ else if (archive_entry_filetype(entry) == AE_IFLNK)
1543
+ file->size = strlen(archive_entry_symlink(entry));
1544
+ if (archive_entry_mtime_is_set(entry)) {
1545
+ file->flg |= MTIME_IS_SET;
1546
+ file->times[MTIME].time = archive_entry_mtime(entry);
1547
+ file->times[MTIME].time_ns = archive_entry_mtime_nsec(entry);
1548
+ }
1549
+ if (archive_entry_atime_is_set(entry)) {
1550
+ file->flg |= ATIME_IS_SET;
1551
+ file->times[ATIME].time = archive_entry_atime(entry);
1552
+ file->times[ATIME].time_ns = archive_entry_atime_nsec(entry);
1553
+ }
1554
+ if (archive_entry_ctime_is_set(entry)) {
1555
+ file->flg |= CTIME_IS_SET;
1556
+ file->times[CTIME].time = archive_entry_ctime(entry);
1557
+ file->times[CTIME].time_ns = archive_entry_ctime_nsec(entry);
1558
+ }
1559
+
1560
+ *newfile = file;
1561
+ return (ret);
1562
+ }
1563
+
1564
+ static void
1565
+ file_free(struct file *file)
1566
+ {
1567
+ free(file->utf16name);
1568
+ free(file);
1569
+ }
1570
+
1571
+ static void
1572
+ file_register(struct _7zip *zip, struct file *file)
1573
+ {
1574
+ file->next = NULL;
1575
+ *zip->file_list.last = file;
1576
+ zip->file_list.last = &(file->next);
1577
+ }
1578
+
1579
+ static void
1580
+ file_init_register(struct _7zip *zip)
1581
+ {
1582
+ zip->file_list.first = NULL;
1583
+ zip->file_list.last = &(zip->file_list.first);
1584
+ }
1585
+
1586
+ static void
1587
+ file_free_register(struct _7zip *zip)
1588
+ {
1589
+ struct file *file, *file_next;
1590
+
1591
+ file = zip->file_list.first;
1592
+ while (file != NULL) {
1593
+ file_next = file->next;
1594
+ file_free(file);
1595
+ file = file_next;
1596
+ }
1597
+ }
1598
+
1599
+ static void
1600
+ file_register_empty(struct _7zip *zip, struct file *file)
1601
+ {
1602
+ file->next = NULL;
1603
+ *zip->empty_list.last = file;
1604
+ zip->empty_list.last = &(file->next);
1605
+ }
1606
+
1607
+ static void
1608
+ file_init_register_empty(struct _7zip *zip)
1609
+ {
1610
+ zip->empty_list.first = NULL;
1611
+ zip->empty_list.last = &(zip->empty_list.first);
1612
+ }
1613
+
1614
+ #if !defined(HAVE_ZLIB_H) || !defined(HAVE_BZLIB_H) ||\
1615
+ !defined(BZ_CONFIG_ERROR) || !defined(HAVE_LZMA_H)
1616
+ static int
1617
+ compression_unsupported_encoder(struct archive *a,
1618
+ struct la_zstream *lastrm, const char *name)
1619
+ {
1620
+
1621
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1622
+ "%s compression not supported on this platform", name);
1623
+ lastrm->valid = 0;
1624
+ lastrm->real_stream = NULL;
1625
+ return (ARCHIVE_FAILED);
1626
+ }
1627
+ #endif
1628
+
1629
+ /*
1630
+ * _7_COPY compressor.
1631
+ */
1632
+ static int
1633
+ compression_init_encoder_copy(struct archive *a, struct la_zstream *lastrm)
1634
+ {
1635
+
1636
+ if (lastrm->valid)
1637
+ compression_end(a, lastrm);
1638
+ lastrm->valid = 1;
1639
+ lastrm->code = compression_code_copy;
1640
+ lastrm->end = compression_end_copy;
1641
+ return (ARCHIVE_OK);
1642
+ }
1643
+
1644
+ static int
1645
+ compression_code_copy(struct archive *a,
1646
+ struct la_zstream *lastrm, enum la_zaction action)
1647
+ {
1648
+ size_t bytes;
1649
+
1650
+ (void)a; /* UNUSED */
1651
+ if (lastrm->avail_out > lastrm->avail_in)
1652
+ bytes = lastrm->avail_in;
1653
+ else
1654
+ bytes = lastrm->avail_out;
1655
+ if (bytes) {
1656
+ memcpy(lastrm->next_out, lastrm->next_in, bytes);
1657
+ lastrm->next_in += bytes;
1658
+ lastrm->avail_in -= bytes;
1659
+ lastrm->total_in += bytes;
1660
+ lastrm->next_out += bytes;
1661
+ lastrm->avail_out -= bytes;
1662
+ lastrm->total_out += bytes;
1663
+ }
1664
+ if (action == ARCHIVE_Z_FINISH && lastrm->avail_in == 0)
1665
+ return (ARCHIVE_EOF);
1666
+ return (ARCHIVE_OK);
1667
+ }
1668
+
1669
+ static int
1670
+ compression_end_copy(struct archive *a, struct la_zstream *lastrm)
1671
+ {
1672
+ (void)a; /* UNUSED */
1673
+ lastrm->valid = 0;
1674
+ return (ARCHIVE_OK);
1675
+ }
1676
+
1677
+ /*
1678
+ * _7_DEFLATE compressor.
1679
+ */
1680
+ #ifdef HAVE_ZLIB_H
1681
+ static int
1682
+ compression_init_encoder_deflate(struct archive *a,
1683
+ struct la_zstream *lastrm, int level, int withheader)
1684
+ {
1685
+ z_stream *strm;
1686
+
1687
+ if (lastrm->valid)
1688
+ compression_end(a, lastrm);
1689
+ strm = calloc(1, sizeof(*strm));
1690
+ if (strm == NULL) {
1691
+ archive_set_error(a, ENOMEM,
1692
+ "Can't allocate memory for gzip stream");
1693
+ return (ARCHIVE_FATAL);
1694
+ }
1695
+ /* zlib.h is not const-correct, so we need this one bit
1696
+ * of ugly hackery to convert a const * pointer to
1697
+ * a non-const pointer. */
1698
+ strm->next_in = (Bytef *)(uintptr_t)(const void *)lastrm->next_in;
1699
+ strm->avail_in = (uInt)lastrm->avail_in;
1700
+ strm->total_in = (uLong)lastrm->total_in;
1701
+ strm->next_out = lastrm->next_out;
1702
+ strm->avail_out = (uInt)lastrm->avail_out;
1703
+ strm->total_out = (uLong)lastrm->total_out;
1704
+ if (deflateInit2(strm, level, Z_DEFLATED,
1705
+ (withheader)?15:-15,
1706
+ 8, Z_DEFAULT_STRATEGY) != Z_OK) {
1707
+ free(strm);
1708
+ lastrm->real_stream = NULL;
1709
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1710
+ "Internal error initializing compression library");
1711
+ return (ARCHIVE_FATAL);
1712
+ }
1713
+ lastrm->real_stream = strm;
1714
+ lastrm->valid = 1;
1715
+ lastrm->code = compression_code_deflate;
1716
+ lastrm->end = compression_end_deflate;
1717
+ return (ARCHIVE_OK);
1718
+ }
1719
+
1720
+ static int
1721
+ compression_code_deflate(struct archive *a,
1722
+ struct la_zstream *lastrm, enum la_zaction action)
1723
+ {
1724
+ z_stream *strm;
1725
+ int r;
1726
+
1727
+ strm = (z_stream *)lastrm->real_stream;
1728
+ /* zlib.h is not const-correct, so we need this one bit
1729
+ * of ugly hackery to convert a const * pointer to
1730
+ * a non-const pointer. */
1731
+ strm->next_in = (Bytef *)(uintptr_t)(const void *)lastrm->next_in;
1732
+ strm->avail_in = (uInt)lastrm->avail_in;
1733
+ strm->total_in = (uLong)lastrm->total_in;
1734
+ strm->next_out = lastrm->next_out;
1735
+ strm->avail_out = (uInt)lastrm->avail_out;
1736
+ strm->total_out = (uLong)lastrm->total_out;
1737
+ r = deflate(strm,
1738
+ (action == ARCHIVE_Z_FINISH)? Z_FINISH: Z_NO_FLUSH);
1739
+ lastrm->next_in = strm->next_in;
1740
+ lastrm->avail_in = strm->avail_in;
1741
+ lastrm->total_in = strm->total_in;
1742
+ lastrm->next_out = strm->next_out;
1743
+ lastrm->avail_out = strm->avail_out;
1744
+ lastrm->total_out = strm->total_out;
1745
+ switch (r) {
1746
+ case Z_OK:
1747
+ return (ARCHIVE_OK);
1748
+ case Z_STREAM_END:
1749
+ return (ARCHIVE_EOF);
1750
+ default:
1751
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1752
+ "GZip compression failed:"
1753
+ " deflate() call returned status %d", r);
1754
+ return (ARCHIVE_FATAL);
1755
+ }
1756
+ }
1757
+
1758
+ static int
1759
+ compression_end_deflate(struct archive *a, struct la_zstream *lastrm)
1760
+ {
1761
+ z_stream *strm;
1762
+ int r;
1763
+
1764
+ strm = (z_stream *)lastrm->real_stream;
1765
+ r = deflateEnd(strm);
1766
+ free(strm);
1767
+ lastrm->real_stream = NULL;
1768
+ lastrm->valid = 0;
1769
+ if (r != Z_OK) {
1770
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1771
+ "Failed to clean up compressor");
1772
+ return (ARCHIVE_FATAL);
1773
+ }
1774
+ return (ARCHIVE_OK);
1775
+ }
1776
+ #else
1777
+ static int
1778
+ compression_init_encoder_deflate(struct archive *a,
1779
+ struct la_zstream *lastrm, int level, int withheader)
1780
+ {
1781
+
1782
+ (void) level; /* UNUSED */
1783
+ (void) withheader; /* UNUSED */
1784
+ if (lastrm->valid)
1785
+ compression_end(a, lastrm);
1786
+ return (compression_unsupported_encoder(a, lastrm, "deflate"));
1787
+ }
1788
+ #endif
1789
+
1790
+ /*
1791
+ * _7_BZIP2 compressor.
1792
+ */
1793
+ #if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
1794
+ static int
1795
+ compression_init_encoder_bzip2(struct archive *a,
1796
+ struct la_zstream *lastrm, int level)
1797
+ {
1798
+ bz_stream *strm;
1799
+
1800
+ if (lastrm->valid)
1801
+ compression_end(a, lastrm);
1802
+ strm = calloc(1, sizeof(*strm));
1803
+ if (strm == NULL) {
1804
+ archive_set_error(a, ENOMEM,
1805
+ "Can't allocate memory for bzip2 stream");
1806
+ return (ARCHIVE_FATAL);
1807
+ }
1808
+ /* bzlib.h is not const-correct, so we need this one bit
1809
+ * of ugly hackery to convert a const * pointer to
1810
+ * a non-const pointer. */
1811
+ strm->next_in = (char *)(uintptr_t)(const void *)lastrm->next_in;
1812
+ strm->avail_in = lastrm->avail_in;
1813
+ strm->total_in_lo32 = (uint32_t)(lastrm->total_in & 0xffffffff);
1814
+ strm->total_in_hi32 = (uint32_t)(lastrm->total_in >> 32);
1815
+ strm->next_out = (char *)lastrm->next_out;
1816
+ strm->avail_out = lastrm->avail_out;
1817
+ strm->total_out_lo32 = (uint32_t)(lastrm->total_out & 0xffffffff);
1818
+ strm->total_out_hi32 = (uint32_t)(lastrm->total_out >> 32);
1819
+ if (BZ2_bzCompressInit(strm, level, 0, 30) != BZ_OK) {
1820
+ free(strm);
1821
+ lastrm->real_stream = NULL;
1822
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1823
+ "Internal error initializing compression library");
1824
+ return (ARCHIVE_FATAL);
1825
+ }
1826
+ lastrm->real_stream = strm;
1827
+ lastrm->valid = 1;
1828
+ lastrm->code = compression_code_bzip2;
1829
+ lastrm->end = compression_end_bzip2;
1830
+ return (ARCHIVE_OK);
1831
+ }
1832
+
1833
+ static int
1834
+ compression_code_bzip2(struct archive *a,
1835
+ struct la_zstream *lastrm, enum la_zaction action)
1836
+ {
1837
+ bz_stream *strm;
1838
+ int r;
1839
+
1840
+ strm = (bz_stream *)lastrm->real_stream;
1841
+ /* bzlib.h is not const-correct, so we need this one bit
1842
+ * of ugly hackery to convert a const * pointer to
1843
+ * a non-const pointer. */
1844
+ strm->next_in = (char *)(uintptr_t)(const void *)lastrm->next_in;
1845
+ strm->avail_in = lastrm->avail_in;
1846
+ strm->total_in_lo32 = (uint32_t)(lastrm->total_in & 0xffffffff);
1847
+ strm->total_in_hi32 = (uint32_t)(lastrm->total_in >> 32);
1848
+ strm->next_out = (char *)lastrm->next_out;
1849
+ strm->avail_out = lastrm->avail_out;
1850
+ strm->total_out_lo32 = (uint32_t)(lastrm->total_out & 0xffffffff);
1851
+ strm->total_out_hi32 = (uint32_t)(lastrm->total_out >> 32);
1852
+ r = BZ2_bzCompress(strm,
1853
+ (action == ARCHIVE_Z_FINISH)? BZ_FINISH: BZ_RUN);
1854
+ lastrm->next_in = (const unsigned char *)strm->next_in;
1855
+ lastrm->avail_in = strm->avail_in;
1856
+ lastrm->total_in =
1857
+ (((uint64_t)(uint32_t)strm->total_in_hi32) << 32)
1858
+ + (uint64_t)(uint32_t)strm->total_in_lo32;
1859
+ lastrm->next_out = (unsigned char *)strm->next_out;
1860
+ lastrm->avail_out = strm->avail_out;
1861
+ lastrm->total_out =
1862
+ (((uint64_t)(uint32_t)strm->total_out_hi32) << 32)
1863
+ + (uint64_t)(uint32_t)strm->total_out_lo32;
1864
+ switch (r) {
1865
+ case BZ_RUN_OK: /* Non-finishing */
1866
+ case BZ_FINISH_OK: /* Finishing: There's more work to do */
1867
+ return (ARCHIVE_OK);
1868
+ case BZ_STREAM_END: /* Finishing: all done */
1869
+ /* Only occurs in finishing case */
1870
+ return (ARCHIVE_EOF);
1871
+ default:
1872
+ /* Any other return value indicates an error */
1873
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1874
+ "Bzip2 compression failed:"
1875
+ " BZ2_bzCompress() call returned status %d", r);
1876
+ return (ARCHIVE_FATAL);
1877
+ }
1878
+ }
1879
+
1880
+ static int
1881
+ compression_end_bzip2(struct archive *a, struct la_zstream *lastrm)
1882
+ {
1883
+ bz_stream *strm;
1884
+ int r;
1885
+
1886
+ strm = (bz_stream *)lastrm->real_stream;
1887
+ r = BZ2_bzCompressEnd(strm);
1888
+ free(strm);
1889
+ lastrm->real_stream = NULL;
1890
+ lastrm->valid = 0;
1891
+ if (r != BZ_OK) {
1892
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1893
+ "Failed to clean up compressor");
1894
+ return (ARCHIVE_FATAL);
1895
+ }
1896
+ return (ARCHIVE_OK);
1897
+ }
1898
+
1899
+ #else
1900
+ static int
1901
+ compression_init_encoder_bzip2(struct archive *a,
1902
+ struct la_zstream *lastrm, int level)
1903
+ {
1904
+
1905
+ (void) level; /* UNUSED */
1906
+ if (lastrm->valid)
1907
+ compression_end(a, lastrm);
1908
+ return (compression_unsupported_encoder(a, lastrm, "bzip2"));
1909
+ }
1910
+ #endif
1911
+
1912
+ /*
1913
+ * _7_LZMA1, _7_LZMA2 compressor.
1914
+ */
1915
+ #if defined(HAVE_LZMA_H)
1916
+ static int
1917
+ compression_init_encoder_lzma(struct archive *a,
1918
+ struct la_zstream *lastrm, int level, uint64_t filter_id)
1919
+ {
1920
+ static const lzma_stream lzma_init_data = LZMA_STREAM_INIT;
1921
+ lzma_stream *strm;
1922
+ lzma_filter *lzmafilters;
1923
+ lzma_options_lzma lzma_opt;
1924
+ int r;
1925
+
1926
+ if (lastrm->valid)
1927
+ compression_end(a, lastrm);
1928
+ strm = calloc(1, sizeof(*strm) + sizeof(*lzmafilters) * 2);
1929
+ if (strm == NULL) {
1930
+ archive_set_error(a, ENOMEM,
1931
+ "Can't allocate memory for lzma stream");
1932
+ return (ARCHIVE_FATAL);
1933
+ }
1934
+ lzmafilters = (lzma_filter *)(strm+1);
1935
+ if (level > 9)
1936
+ level = 9;
1937
+ if (lzma_lzma_preset(&lzma_opt, level)) {
1938
+ free(strm);
1939
+ lastrm->real_stream = NULL;
1940
+ archive_set_error(a, ENOMEM,
1941
+ "Internal error initializing compression library");
1942
+ return (ARCHIVE_FATAL);
1943
+ }
1944
+ lzmafilters[0].id = filter_id;
1945
+ lzmafilters[0].options = &lzma_opt;
1946
+ lzmafilters[1].id = LZMA_VLI_UNKNOWN;/* Terminate */
1947
+
1948
+ r = lzma_properties_size(&(lastrm->prop_size), lzmafilters);
1949
+ if (r != LZMA_OK) {
1950
+ free(strm);
1951
+ lastrm->real_stream = NULL;
1952
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1953
+ "lzma_properties_size failed");
1954
+ return (ARCHIVE_FATAL);
1955
+ }
1956
+ if (lastrm->prop_size) {
1957
+ lastrm->props = malloc(lastrm->prop_size);
1958
+ if (lastrm->props == NULL) {
1959
+ free(strm);
1960
+ lastrm->real_stream = NULL;
1961
+ archive_set_error(a, ENOMEM,
1962
+ "Cannot allocate memory");
1963
+ return (ARCHIVE_FATAL);
1964
+ }
1965
+ r = lzma_properties_encode(lzmafilters, lastrm->props);
1966
+ if (r != LZMA_OK) {
1967
+ free(strm);
1968
+ lastrm->real_stream = NULL;
1969
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1970
+ "lzma_properties_encode failed");
1971
+ return (ARCHIVE_FATAL);
1972
+ }
1973
+ }
1974
+
1975
+ *strm = lzma_init_data;
1976
+ r = lzma_raw_encoder(strm, lzmafilters);
1977
+ switch (r) {
1978
+ case LZMA_OK:
1979
+ lastrm->real_stream = strm;
1980
+ lastrm->valid = 1;
1981
+ lastrm->code = compression_code_lzma;
1982
+ lastrm->end = compression_end_lzma;
1983
+ r = ARCHIVE_OK;
1984
+ break;
1985
+ case LZMA_MEM_ERROR:
1986
+ free(strm);
1987
+ lastrm->real_stream = NULL;
1988
+ archive_set_error(a, ENOMEM,
1989
+ "Internal error initializing compression library: "
1990
+ "Cannot allocate memory");
1991
+ r = ARCHIVE_FATAL;
1992
+ break;
1993
+ default:
1994
+ free(strm);
1995
+ lastrm->real_stream = NULL;
1996
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
1997
+ "Internal error initializing compression library: "
1998
+ "It's a bug in liblzma");
1999
+ r = ARCHIVE_FATAL;
2000
+ break;
2001
+ }
2002
+ return (r);
2003
+ }
2004
+
2005
+ static int
2006
+ compression_init_encoder_lzma1(struct archive *a,
2007
+ struct la_zstream *lastrm, int level)
2008
+ {
2009
+ return compression_init_encoder_lzma(a, lastrm, level,
2010
+ LZMA_FILTER_LZMA1);
2011
+ }
2012
+
2013
+ static int
2014
+ compression_init_encoder_lzma2(struct archive *a,
2015
+ struct la_zstream *lastrm, int level)
2016
+ {
2017
+ return compression_init_encoder_lzma(a, lastrm, level,
2018
+ LZMA_FILTER_LZMA2);
2019
+ }
2020
+
2021
+ static int
2022
+ compression_code_lzma(struct archive *a,
2023
+ struct la_zstream *lastrm, enum la_zaction action)
2024
+ {
2025
+ lzma_stream *strm;
2026
+ int r;
2027
+
2028
+ strm = (lzma_stream *)lastrm->real_stream;
2029
+ strm->next_in = lastrm->next_in;
2030
+ strm->avail_in = lastrm->avail_in;
2031
+ strm->total_in = lastrm->total_in;
2032
+ strm->next_out = lastrm->next_out;
2033
+ strm->avail_out = lastrm->avail_out;
2034
+ strm->total_out = lastrm->total_out;
2035
+ r = lzma_code(strm,
2036
+ (action == ARCHIVE_Z_FINISH)? LZMA_FINISH: LZMA_RUN);
2037
+ lastrm->next_in = strm->next_in;
2038
+ lastrm->avail_in = strm->avail_in;
2039
+ lastrm->total_in = strm->total_in;
2040
+ lastrm->next_out = strm->next_out;
2041
+ lastrm->avail_out = strm->avail_out;
2042
+ lastrm->total_out = strm->total_out;
2043
+ switch (r) {
2044
+ case LZMA_OK:
2045
+ /* Non-finishing case */
2046
+ return (ARCHIVE_OK);
2047
+ case LZMA_STREAM_END:
2048
+ /* This return can only occur in finishing case. */
2049
+ return (ARCHIVE_EOF);
2050
+ case LZMA_MEMLIMIT_ERROR:
2051
+ archive_set_error(a, ENOMEM,
2052
+ "lzma compression error:"
2053
+ " %ju MiB would have been needed",
2054
+ (uintmax_t)((lzma_memusage(strm) + 1024 * 1024 -1)
2055
+ / (1024 * 1024)));
2056
+ return (ARCHIVE_FATAL);
2057
+ default:
2058
+ /* Any other return value indicates an error */
2059
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
2060
+ "lzma compression failed:"
2061
+ " lzma_code() call returned status %d", r);
2062
+ return (ARCHIVE_FATAL);
2063
+ }
2064
+ }
2065
+
2066
+ static int
2067
+ compression_end_lzma(struct archive *a, struct la_zstream *lastrm)
2068
+ {
2069
+ lzma_stream *strm;
2070
+
2071
+ (void)a; /* UNUSED */
2072
+ strm = (lzma_stream *)lastrm->real_stream;
2073
+ lzma_end(strm);
2074
+ free(strm);
2075
+ lastrm->valid = 0;
2076
+ lastrm->real_stream = NULL;
2077
+ return (ARCHIVE_OK);
2078
+ }
2079
+ #else
2080
+ static int
2081
+ compression_init_encoder_lzma1(struct archive *a,
2082
+ struct la_zstream *lastrm, int level)
2083
+ {
2084
+
2085
+ (void) level; /* UNUSED */
2086
+ if (lastrm->valid)
2087
+ compression_end(a, lastrm);
2088
+ return (compression_unsupported_encoder(a, lastrm, "lzma"));
2089
+ }
2090
+ static int
2091
+ compression_init_encoder_lzma2(struct archive *a,
2092
+ struct la_zstream *lastrm, int level)
2093
+ {
2094
+
2095
+ (void) level; /* UNUSED */
2096
+ if (lastrm->valid)
2097
+ compression_end(a, lastrm);
2098
+ return (compression_unsupported_encoder(a, lastrm, "lzma"));
2099
+ }
2100
+ #endif
2101
+
2102
+ /*
2103
+ * _7_PPMD compressor.
2104
+ */
2105
+ static void
2106
+ ppmd_write(void *p, Byte b)
2107
+ {
2108
+ struct archive_write *a = ((IByteOut *)p)->a;
2109
+ struct _7zip *zip = (struct _7zip *)(a->format_data);
2110
+ struct la_zstream *lastrm = &(zip->stream);
2111
+ struct ppmd_stream *strm;
2112
+
2113
+ if (lastrm->avail_out) {
2114
+ *lastrm->next_out++ = b;
2115
+ lastrm->avail_out--;
2116
+ lastrm->total_out++;
2117
+ return;
2118
+ }
2119
+ strm = (struct ppmd_stream *)lastrm->real_stream;
2120
+ if (strm->buff_ptr < strm->buff_end) {
2121
+ *strm->buff_ptr++ = b;
2122
+ strm->buff_bytes++;
2123
+ }
2124
+ }
2125
+
2126
+ static int
2127
+ compression_init_encoder_ppmd(struct archive *a,
2128
+ struct la_zstream *lastrm, unsigned maxOrder, uint32_t msize)
2129
+ {
2130
+ struct ppmd_stream *strm;
2131
+ uint8_t *props;
2132
+ int r;
2133
+
2134
+ if (lastrm->valid)
2135
+ compression_end(a, lastrm);
2136
+ strm = calloc(1, sizeof(*strm));
2137
+ if (strm == NULL) {
2138
+ archive_set_error(a, ENOMEM,
2139
+ "Can't allocate memory for PPMd");
2140
+ return (ARCHIVE_FATAL);
2141
+ }
2142
+ strm->buff = malloc(32);
2143
+ if (strm->buff == NULL) {
2144
+ free(strm);
2145
+ archive_set_error(a, ENOMEM,
2146
+ "Can't allocate memory for PPMd");
2147
+ return (ARCHIVE_FATAL);
2148
+ }
2149
+ strm->buff_ptr = strm->buff;
2150
+ strm->buff_end = strm->buff + 32;
2151
+
2152
+ props = malloc(1+4);
2153
+ if (props == NULL) {
2154
+ free(strm->buff);
2155
+ free(strm);
2156
+ archive_set_error(a, ENOMEM,
2157
+ "Coludn't allocate memory for PPMd");
2158
+ return (ARCHIVE_FATAL);
2159
+ }
2160
+ props[0] = maxOrder;
2161
+ archive_le32enc(props+1, msize);
2162
+ __archive_ppmd7_functions.Ppmd7_Construct(&strm->ppmd7_context);
2163
+ r = __archive_ppmd7_functions.Ppmd7_Alloc(
2164
+ &strm->ppmd7_context, msize);
2165
+ if (r == 0) {
2166
+ free(strm->buff);
2167
+ free(strm);
2168
+ free(props);
2169
+ archive_set_error(a, ENOMEM,
2170
+ "Coludn't allocate memory for PPMd");
2171
+ return (ARCHIVE_FATAL);
2172
+ }
2173
+ __archive_ppmd7_functions.Ppmd7_Init(&(strm->ppmd7_context), maxOrder);
2174
+ strm->byteout.a = (struct archive_write *)a;
2175
+ strm->byteout.Write = ppmd_write;
2176
+ strm->range_enc.Stream = &(strm->byteout);
2177
+ __archive_ppmd7_functions.Ppmd7z_RangeEnc_Init(&(strm->range_enc));
2178
+ strm->stat = 0;
2179
+
2180
+ lastrm->real_stream = strm;
2181
+ lastrm->valid = 1;
2182
+ lastrm->code = compression_code_ppmd;
2183
+ lastrm->end = compression_end_ppmd;
2184
+ lastrm->prop_size = 5;
2185
+ lastrm->props = props;
2186
+ return (ARCHIVE_OK);
2187
+ }
2188
+
2189
+ static int
2190
+ compression_code_ppmd(struct archive *a,
2191
+ struct la_zstream *lastrm, enum la_zaction action)
2192
+ {
2193
+ struct ppmd_stream *strm;
2194
+
2195
+ (void)a; /* UNUSED */
2196
+
2197
+ strm = (struct ppmd_stream *)lastrm->real_stream;
2198
+
2199
+ /* Copy encoded data if there are remaining bytes from previous call. */
2200
+ if (strm->buff_bytes) {
2201
+ uint8_t *p = strm->buff_ptr - strm->buff_bytes;
2202
+ while (lastrm->avail_out && strm->buff_bytes) {
2203
+ *lastrm->next_out++ = *p++;
2204
+ lastrm->avail_out--;
2205
+ lastrm->total_out++;
2206
+ strm->buff_bytes--;
2207
+ }
2208
+ if (strm->buff_bytes)
2209
+ return (ARCHIVE_OK);
2210
+ if (strm->stat == 1)
2211
+ return (ARCHIVE_EOF);
2212
+ strm->buff_ptr = strm->buff;
2213
+ }
2214
+ while (lastrm->avail_in && lastrm->avail_out) {
2215
+ __archive_ppmd7_functions.Ppmd7_EncodeSymbol(
2216
+ &(strm->ppmd7_context), &(strm->range_enc),
2217
+ *lastrm->next_in++);
2218
+ lastrm->avail_in--;
2219
+ lastrm->total_in++;
2220
+ }
2221
+ if (lastrm->avail_in == 0 && action == ARCHIVE_Z_FINISH) {
2222
+ __archive_ppmd7_functions.Ppmd7z_RangeEnc_FlushData(
2223
+ &(strm->range_enc));
2224
+ strm->stat = 1;
2225
+ /* Return EOF if there are no remaining bytes. */
2226
+ if (strm->buff_bytes == 0)
2227
+ return (ARCHIVE_EOF);
2228
+ }
2229
+ return (ARCHIVE_OK);
2230
+ }
2231
+
2232
+ static int
2233
+ compression_end_ppmd(struct archive *a, struct la_zstream *lastrm)
2234
+ {
2235
+ struct ppmd_stream *strm;
2236
+
2237
+ (void)a; /* UNUSED */
2238
+
2239
+ strm = (struct ppmd_stream *)lastrm->real_stream;
2240
+ __archive_ppmd7_functions.Ppmd7_Free(&strm->ppmd7_context);
2241
+ free(strm->buff);
2242
+ free(strm);
2243
+ lastrm->real_stream = NULL;
2244
+ lastrm->valid = 0;
2245
+ return (ARCHIVE_OK);
2246
+ }
2247
+
2248
+ /*
2249
+ * Universal compressor initializer.
2250
+ */
2251
+ static int
2252
+ _7z_compression_init_encoder(struct archive_write *a, unsigned compression,
2253
+ int compression_level)
2254
+ {
2255
+ struct _7zip *zip;
2256
+ int r;
2257
+
2258
+ zip = (struct _7zip *)a->format_data;
2259
+ switch (compression) {
2260
+ case _7Z_DEFLATE:
2261
+ r = compression_init_encoder_deflate(
2262
+ &(a->archive), &(zip->stream),
2263
+ compression_level, 0);
2264
+ break;
2265
+ case _7Z_BZIP2:
2266
+ r = compression_init_encoder_bzip2(
2267
+ &(a->archive), &(zip->stream),
2268
+ compression_level);
2269
+ break;
2270
+ case _7Z_LZMA1:
2271
+ r = compression_init_encoder_lzma1(
2272
+ &(a->archive), &(zip->stream),
2273
+ compression_level);
2274
+ break;
2275
+ case _7Z_LZMA2:
2276
+ r = compression_init_encoder_lzma2(
2277
+ &(a->archive), &(zip->stream),
2278
+ compression_level);
2279
+ break;
2280
+ case _7Z_PPMD:
2281
+ r = compression_init_encoder_ppmd(
2282
+ &(a->archive), &(zip->stream),
2283
+ PPMD7_DEFAULT_ORDER, PPMD7_DEFAULT_MEM_SIZE);
2284
+ break;
2285
+ case _7Z_COPY:
2286
+ default:
2287
+ r = compression_init_encoder_copy(
2288
+ &(a->archive), &(zip->stream));
2289
+ break;
2290
+ }
2291
+ if (r == ARCHIVE_OK) {
2292
+ zip->stream.total_in = 0;
2293
+ zip->stream.next_out = zip->wbuff;
2294
+ zip->stream.avail_out = sizeof(zip->wbuff);
2295
+ zip->stream.total_out = 0;
2296
+ }
2297
+
2298
+ return (r);
2299
+ }
2300
+
2301
+ static int
2302
+ compression_code(struct archive *a, struct la_zstream *lastrm,
2303
+ enum la_zaction action)
2304
+ {
2305
+ if (lastrm->valid)
2306
+ return (lastrm->code(a, lastrm, action));
2307
+ return (ARCHIVE_OK);
2308
+ }
2309
+
2310
+ static int
2311
+ compression_end(struct archive *a, struct la_zstream *lastrm)
2312
+ {
2313
+ if (lastrm->valid) {
2314
+ lastrm->prop_size = 0;
2315
+ free(lastrm->props);
2316
+ lastrm->props = NULL;
2317
+ return (lastrm->end(a, lastrm));
2318
+ }
2319
+ return (ARCHIVE_OK);
2320
+ }
2321
+
2322
+