libarchive-static 1.0.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,1086 @@
1
+ /*-
2
+ * Copyright (c) 2003-2009 Tim Kientzle
3
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
4
+ * Copyright (c) 2016 Martin Matuska
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions
9
+ * are met:
10
+ * 1. Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #include "archive_platform.h"
29
+ __FBSDID("$FreeBSD");
30
+
31
+ /* This is the tree-walking code for POSIX systems. */
32
+ #if !defined(_WIN32) || defined(__CYGWIN__)
33
+
34
+ #ifdef HAVE_SYS_TYPES_H
35
+ #include <sys/types.h>
36
+ #endif
37
+ #ifdef HAVE_SYS_EXTATTR_H
38
+ #include <sys/extattr.h>
39
+ #endif
40
+ #ifdef HAVE_SYS_IOCTL_H
41
+ #include <sys/ioctl.h>
42
+ #endif
43
+ #ifdef HAVE_SYS_PARAM_H
44
+ #include <sys/param.h>
45
+ #endif
46
+ #ifdef HAVE_SYS_STAT_H
47
+ #include <sys/stat.h>
48
+ #endif
49
+ #if defined(HAVE_SYS_XATTR_H)
50
+ #include <sys/xattr.h>
51
+ #elif defined(HAVE_ATTR_XATTR_H)
52
+ #include <attr/xattr.h>
53
+ #endif
54
+ #ifdef HAVE_SYS_EA_H
55
+ #include <sys/ea.h>
56
+ #endif
57
+ #ifdef HAVE_COPYFILE_H
58
+ #include <copyfile.h>
59
+ #endif
60
+ #ifdef HAVE_ERRNO_H
61
+ #include <errno.h>
62
+ #endif
63
+ #ifdef HAVE_FCNTL_H
64
+ #include <fcntl.h>
65
+ #endif
66
+ #ifdef HAVE_LIMITS_H
67
+ #include <limits.h>
68
+ #endif
69
+ #ifdef HAVE_LINUX_TYPES_H
70
+ #include <linux/types.h>
71
+ #endif
72
+ #ifdef HAVE_LINUX_FIEMAP_H
73
+ #include <linux/fiemap.h>
74
+ #endif
75
+ #ifdef HAVE_LINUX_FS_H
76
+ #include <linux/fs.h>
77
+ #endif
78
+ /*
79
+ * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h.
80
+ * As the include guards don't agree, the order of include is important.
81
+ */
82
+ #ifdef HAVE_LINUX_EXT2_FS_H
83
+ #include <linux/ext2_fs.h> /* for Linux file flags */
84
+ #endif
85
+ #if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__)
86
+ #include <ext2fs/ext2_fs.h> /* Linux file flags, broken on Cygwin */
87
+ #endif
88
+ #ifdef HAVE_PATHS_H
89
+ #include <paths.h>
90
+ #endif
91
+ #ifdef HAVE_UNISTD_H
92
+ #include <unistd.h>
93
+ #endif
94
+
95
+ #include "archive.h"
96
+ #include "archive_entry.h"
97
+ #include "archive_private.h"
98
+ #include "archive_read_disk_private.h"
99
+
100
+ #ifndef O_CLOEXEC
101
+ #define O_CLOEXEC 0
102
+ #endif
103
+
104
+ static int setup_mac_metadata(struct archive_read_disk *,
105
+ struct archive_entry *, int *fd);
106
+ #ifdef ARCHIVE_XATTR_FREEBSD
107
+ static int setup_xattrs_namespace(struct archive_read_disk *,
108
+ struct archive_entry *, int *, int);
109
+ #endif
110
+ static int setup_xattrs(struct archive_read_disk *,
111
+ struct archive_entry *, int *fd);
112
+ static int setup_sparse(struct archive_read_disk *,
113
+ struct archive_entry *, int *fd);
114
+ #if defined(HAVE_LINUX_FIEMAP_H)
115
+ static int setup_sparse_fiemap(struct archive_read_disk *,
116
+ struct archive_entry *, int *fd);
117
+ #endif
118
+
119
+ #if !ARCHIVE_ACL_SUPPORT
120
+ int
121
+ archive_read_disk_entry_setup_acls(struct archive_read_disk *a,
122
+ struct archive_entry *entry, int *fd)
123
+ {
124
+ (void)a; /* UNUSED */
125
+ (void)entry; /* UNUSED */
126
+ (void)fd; /* UNUSED */
127
+ return (ARCHIVE_OK);
128
+ }
129
+ #endif
130
+
131
+ /*
132
+ * Enter working directory and return working pathname of archive_entry.
133
+ * If a pointer to an integer is provided and its value is below zero
134
+ * open a file descriptor on this pathname.
135
+ */
136
+ const char *
137
+ archive_read_disk_entry_setup_path(struct archive_read_disk *a,
138
+ struct archive_entry *entry, int *fd)
139
+ {
140
+ const char *path;
141
+
142
+ path = archive_entry_sourcepath(entry);
143
+
144
+ if (path == NULL || (a->tree != NULL &&
145
+ a->tree_enter_working_dir(a->tree) != 0))
146
+ path = archive_entry_pathname(entry);
147
+ if (path == NULL) {
148
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
149
+ "Couldn't determine path");
150
+ } else if (fd != NULL && *fd < 0 && a->tree != NULL &&
151
+ (a->follow_symlinks || archive_entry_filetype(entry) != AE_IFLNK)) {
152
+ *fd = a->open_on_current_dir(a->tree, path,
153
+ O_RDONLY | O_NONBLOCK);
154
+ }
155
+ return (path);
156
+ }
157
+
158
+ int
159
+ archive_read_disk_entry_from_file(struct archive *_a,
160
+ struct archive_entry *entry,
161
+ int fd,
162
+ const struct stat *st)
163
+ {
164
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
165
+ const char *path, *name;
166
+ struct stat s;
167
+ int initial_fd = fd;
168
+ int r, r1;
169
+
170
+ archive_check_magic(_a, ARCHIVE_READ_DISK_MAGIC, ARCHIVE_STATE_ANY,
171
+ "archive_read_disk_entry_from_file");
172
+
173
+ archive_clear_error(_a);
174
+ path = archive_entry_sourcepath(entry);
175
+ if (path == NULL)
176
+ path = archive_entry_pathname(entry);
177
+
178
+ if (a->tree == NULL) {
179
+ if (st == NULL) {
180
+ #if HAVE_FSTAT
181
+ if (fd >= 0) {
182
+ if (fstat(fd, &s) != 0) {
183
+ archive_set_error(&a->archive, errno,
184
+ "Can't fstat");
185
+ return (ARCHIVE_FAILED);
186
+ }
187
+ } else
188
+ #endif
189
+ #if HAVE_LSTAT
190
+ if (!a->follow_symlinks) {
191
+ if (lstat(path, &s) != 0) {
192
+ archive_set_error(&a->archive, errno,
193
+ "Can't lstat %s", path);
194
+ return (ARCHIVE_FAILED);
195
+ }
196
+ } else
197
+ #endif
198
+ if (la_stat(path, &s) != 0) {
199
+ archive_set_error(&a->archive, errno,
200
+ "Can't stat %s", path);
201
+ return (ARCHIVE_FAILED);
202
+ }
203
+ st = &s;
204
+ }
205
+ archive_entry_copy_stat(entry, st);
206
+ }
207
+
208
+ /* Lookup uname/gname */
209
+ name = archive_read_disk_uname(_a, archive_entry_uid(entry));
210
+ if (name != NULL)
211
+ archive_entry_copy_uname(entry, name);
212
+ name = archive_read_disk_gname(_a, archive_entry_gid(entry));
213
+ if (name != NULL)
214
+ archive_entry_copy_gname(entry, name);
215
+
216
+ #ifdef HAVE_STRUCT_STAT_ST_FLAGS
217
+ /* On FreeBSD, we get flags for free with the stat. */
218
+ /* TODO: Does this belong in copy_stat()? */
219
+ if ((a->flags & ARCHIVE_READDISK_NO_FFLAGS) == 0 && st->st_flags != 0)
220
+ archive_entry_set_fflags(entry, st->st_flags, 0);
221
+ #endif
222
+
223
+ #if (defined(FS_IOC_GETFLAGS) && defined(HAVE_WORKING_FS_IOC_GETFLAGS)) || \
224
+ (defined(EXT2_IOC_GETFLAGS) && defined(HAVE_WORKING_EXT2_IOC_GETFLAGS))
225
+ /* Linux requires an extra ioctl to pull the flags. Although
226
+ * this is an extra step, it has a nice side-effect: We get an
227
+ * open file descriptor which we can use in the subsequent lookups. */
228
+ if ((a->flags & ARCHIVE_READDISK_NO_FFLAGS) == 0 &&
229
+ (S_ISREG(st->st_mode) || S_ISDIR(st->st_mode))) {
230
+ if (fd < 0) {
231
+ if (a->tree != NULL)
232
+ fd = a->open_on_current_dir(a->tree, path,
233
+ O_RDONLY | O_NONBLOCK | O_CLOEXEC);
234
+ else
235
+ fd = open(path, O_RDONLY | O_NONBLOCK |
236
+ O_CLOEXEC);
237
+ __archive_ensure_cloexec_flag(fd);
238
+ }
239
+ if (fd >= 0) {
240
+ int stflags;
241
+ r = ioctl(fd,
242
+ #if defined(FS_IOC_GETFLAGS)
243
+ FS_IOC_GETFLAGS,
244
+ #else
245
+ EXT2_IOC_GETFLAGS,
246
+ #endif
247
+ &stflags);
248
+ if (r == 0 && stflags != 0)
249
+ archive_entry_set_fflags(entry, stflags, 0);
250
+ }
251
+ }
252
+ #endif
253
+
254
+ #if defined(HAVE_READLINK) || defined(HAVE_READLINKAT)
255
+ if (S_ISLNK(st->st_mode)) {
256
+ size_t linkbuffer_len = st->st_size;
257
+ char *linkbuffer;
258
+ int lnklen;
259
+
260
+ linkbuffer = malloc(linkbuffer_len + 1);
261
+ if (linkbuffer == NULL) {
262
+ archive_set_error(&a->archive, ENOMEM,
263
+ "Couldn't read link data");
264
+ return (ARCHIVE_FAILED);
265
+ }
266
+ if (a->tree != NULL) {
267
+ #ifdef HAVE_READLINKAT
268
+ lnklen = readlinkat(a->tree_current_dir_fd(a->tree),
269
+ path, linkbuffer, linkbuffer_len);
270
+ #else
271
+ if (a->tree_enter_working_dir(a->tree) != 0) {
272
+ archive_set_error(&a->archive, errno,
273
+ "Couldn't read link data");
274
+ free(linkbuffer);
275
+ return (ARCHIVE_FAILED);
276
+ }
277
+ lnklen = readlink(path, linkbuffer, linkbuffer_len);
278
+ #endif /* HAVE_READLINKAT */
279
+ } else
280
+ lnklen = readlink(path, linkbuffer, linkbuffer_len);
281
+ if (lnklen < 0) {
282
+ archive_set_error(&a->archive, errno,
283
+ "Couldn't read link data");
284
+ free(linkbuffer);
285
+ return (ARCHIVE_FAILED);
286
+ }
287
+ linkbuffer[lnklen] = '\0';
288
+ archive_entry_set_symlink(entry, linkbuffer);
289
+ free(linkbuffer);
290
+ }
291
+ #endif /* HAVE_READLINK || HAVE_READLINKAT */
292
+
293
+ r = 0;
294
+ if ((a->flags & ARCHIVE_READDISK_NO_ACL) == 0)
295
+ r = archive_read_disk_entry_setup_acls(a, entry, &fd);
296
+ if ((a->flags & ARCHIVE_READDISK_NO_XATTR) == 0) {
297
+ r1 = setup_xattrs(a, entry, &fd);
298
+ if (r1 < r)
299
+ r = r1;
300
+ }
301
+ if (a->flags & ARCHIVE_READDISK_MAC_COPYFILE) {
302
+ r1 = setup_mac_metadata(a, entry, &fd);
303
+ if (r1 < r)
304
+ r = r1;
305
+ }
306
+ if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) {
307
+ r1 = setup_sparse(a, entry, &fd);
308
+ if (r1 < r)
309
+ r = r1;
310
+ }
311
+
312
+ /* If we opened the file earlier in this function, close it. */
313
+ if (initial_fd != fd)
314
+ close(fd);
315
+ return (r);
316
+ }
317
+
318
+ #if defined(__APPLE__) && defined(HAVE_COPYFILE_H)
319
+ /*
320
+ * The Mac OS "copyfile()" API copies the extended metadata for a
321
+ * file into a separate file in AppleDouble format (see RFC 1740).
322
+ *
323
+ * Mac OS tar and cpio implementations store this extended
324
+ * metadata as a separate entry just before the regular entry
325
+ * with a "._" prefix added to the filename.
326
+ *
327
+ * Note that this is currently done unconditionally; the tar program has
328
+ * an option to discard this information before the archive is written.
329
+ *
330
+ * TODO: If there's a failure, report it and return ARCHIVE_WARN.
331
+ */
332
+ static int
333
+ setup_mac_metadata(struct archive_read_disk *a,
334
+ struct archive_entry *entry, int *fd)
335
+ {
336
+ int tempfd = -1;
337
+ int copyfile_flags = COPYFILE_NOFOLLOW | COPYFILE_ACL | COPYFILE_XATTR;
338
+ struct stat copyfile_stat;
339
+ int ret = ARCHIVE_OK;
340
+ void *buff = NULL;
341
+ int have_attrs;
342
+ const char *name, *tempdir;
343
+ struct archive_string tempfile;
344
+
345
+ (void)fd; /* UNUSED */
346
+
347
+ name = archive_read_disk_entry_setup_path(a, entry, NULL);
348
+ if (name == NULL)
349
+ return (ARCHIVE_WARN);
350
+
351
+ /* Short-circuit if there's nothing to do. */
352
+ have_attrs = copyfile(name, NULL, 0, copyfile_flags | COPYFILE_CHECK);
353
+ if (have_attrs == -1) {
354
+ archive_set_error(&a->archive, errno,
355
+ "Could not check extended attributes");
356
+ return (ARCHIVE_WARN);
357
+ }
358
+ if (have_attrs == 0)
359
+ return (ARCHIVE_OK);
360
+
361
+ tempdir = NULL;
362
+ if (issetugid() == 0)
363
+ tempdir = getenv("TMPDIR");
364
+ if (tempdir == NULL)
365
+ tempdir = _PATH_TMP;
366
+ archive_string_init(&tempfile);
367
+ archive_strcpy(&tempfile, tempdir);
368
+ archive_strcat(&tempfile, "tar.md.XXXXXX");
369
+ tempfd = mkstemp(tempfile.s);
370
+ if (tempfd < 0) {
371
+ archive_set_error(&a->archive, errno,
372
+ "Could not open extended attribute file");
373
+ ret = ARCHIVE_WARN;
374
+ goto cleanup;
375
+ }
376
+ __archive_ensure_cloexec_flag(tempfd);
377
+
378
+ /* XXX I wish copyfile() could pack directly to a memory
379
+ * buffer; that would avoid the temp file here. For that
380
+ * matter, it would be nice if fcopyfile() actually worked,
381
+ * that would reduce the many open/close races here. */
382
+ if (copyfile(name, tempfile.s, 0, copyfile_flags | COPYFILE_PACK)) {
383
+ archive_set_error(&a->archive, errno,
384
+ "Could not pack extended attributes");
385
+ ret = ARCHIVE_WARN;
386
+ goto cleanup;
387
+ }
388
+ if (fstat(tempfd, &copyfile_stat)) {
389
+ archive_set_error(&a->archive, errno,
390
+ "Could not check size of extended attributes");
391
+ ret = ARCHIVE_WARN;
392
+ goto cleanup;
393
+ }
394
+ buff = malloc(copyfile_stat.st_size);
395
+ if (buff == NULL) {
396
+ archive_set_error(&a->archive, errno,
397
+ "Could not allocate memory for extended attributes");
398
+ ret = ARCHIVE_WARN;
399
+ goto cleanup;
400
+ }
401
+ if (copyfile_stat.st_size != read(tempfd, buff, copyfile_stat.st_size)) {
402
+ archive_set_error(&a->archive, errno,
403
+ "Could not read extended attributes into memory");
404
+ ret = ARCHIVE_WARN;
405
+ goto cleanup;
406
+ }
407
+ archive_entry_copy_mac_metadata(entry, buff, copyfile_stat.st_size);
408
+
409
+ cleanup:
410
+ if (tempfd >= 0) {
411
+ close(tempfd);
412
+ unlink(tempfile.s);
413
+ }
414
+ archive_string_free(&tempfile);
415
+ free(buff);
416
+ return (ret);
417
+ }
418
+
419
+ #else
420
+
421
+ /*
422
+ * Stub implementation for non-Mac systems.
423
+ */
424
+ static int
425
+ setup_mac_metadata(struct archive_read_disk *a,
426
+ struct archive_entry *entry, int *fd)
427
+ {
428
+ (void)a; /* UNUSED */
429
+ (void)entry; /* UNUSED */
430
+ (void)fd; /* UNUSED */
431
+ return (ARCHIVE_OK);
432
+ }
433
+ #endif
434
+
435
+ #if ARCHIVE_XATTR_LINUX || ARCHIVE_XATTR_DARWIN || ARCHIVE_XATTR_AIX
436
+
437
+ /*
438
+ * Linux, Darwin and AIX extended attribute support.
439
+ *
440
+ * TODO: By using a stack-allocated buffer for the first
441
+ * call to getxattr(), we might be able to avoid the second
442
+ * call entirely. We only need the second call if the
443
+ * stack-allocated buffer is too small. But a modest buffer
444
+ * of 1024 bytes or so will often be big enough. Same applies
445
+ * to listxattr().
446
+ */
447
+
448
+
449
+ static int
450
+ setup_xattr(struct archive_read_disk *a,
451
+ struct archive_entry *entry, const char *name, int fd, const char *accpath)
452
+ {
453
+ ssize_t size;
454
+ void *value = NULL;
455
+
456
+
457
+ if (fd >= 0) {
458
+ #if ARCHIVE_XATTR_LINUX
459
+ size = fgetxattr(fd, name, NULL, 0);
460
+ #elif ARCHIVE_XATTR_DARWIN
461
+ size = fgetxattr(fd, name, NULL, 0, 0, 0);
462
+ #elif ARCHIVE_XATTR_AIX
463
+ size = fgetea(fd, name, NULL, 0);
464
+ #endif
465
+ } else if (!a->follow_symlinks) {
466
+ #if ARCHIVE_XATTR_LINUX
467
+ size = lgetxattr(accpath, name, NULL, 0);
468
+ #elif ARCHIVE_XATTR_DARWIN
469
+ size = getxattr(accpath, name, NULL, 0, 0, XATTR_NOFOLLOW);
470
+ #elif ARCHIVE_XATTR_AIX
471
+ size = lgetea(accpath, name, NULL, 0);
472
+ #endif
473
+ } else {
474
+ #if ARCHIVE_XATTR_LINUX
475
+ size = getxattr(accpath, name, NULL, 0);
476
+ #elif ARCHIVE_XATTR_DARWIN
477
+ size = getxattr(accpath, name, NULL, 0, 0, 0);
478
+ #elif ARCHIVE_XATTR_AIX
479
+ size = getea(accpath, name, NULL, 0);
480
+ #endif
481
+ }
482
+
483
+ if (size == -1) {
484
+ archive_set_error(&a->archive, errno,
485
+ "Couldn't query extended attribute");
486
+ return (ARCHIVE_WARN);
487
+ }
488
+
489
+ if (size > 0 && (value = malloc(size)) == NULL) {
490
+ archive_set_error(&a->archive, errno, "Out of memory");
491
+ return (ARCHIVE_FATAL);
492
+ }
493
+
494
+
495
+ if (fd >= 0) {
496
+ #if ARCHIVE_XATTR_LINUX
497
+ size = fgetxattr(fd, name, value, size);
498
+ #elif ARCHIVE_XATTR_DARWIN
499
+ size = fgetxattr(fd, name, value, size, 0, 0);
500
+ #elif ARCHIVE_XATTR_AIX
501
+ size = fgetea(fd, name, value, size);
502
+ #endif
503
+ } else if (!a->follow_symlinks) {
504
+ #if ARCHIVE_XATTR_LINUX
505
+ size = lgetxattr(accpath, name, value, size);
506
+ #elif ARCHIVE_XATTR_DARWIN
507
+ size = getxattr(accpath, name, value, size, 0, XATTR_NOFOLLOW);
508
+ #elif ARCHIVE_XATTR_AIX
509
+ size = lgetea(accpath, name, value, size);
510
+ #endif
511
+ } else {
512
+ #if ARCHIVE_XATTR_LINUX
513
+ size = getxattr(accpath, name, value, size);
514
+ #elif ARCHIVE_XATTR_DARWIN
515
+ size = getxattr(accpath, name, value, size, 0, 0);
516
+ #elif ARCHIVE_XATTR_AIX
517
+ size = getea(accpath, name, value, size);
518
+ #endif
519
+ }
520
+
521
+ if (size == -1) {
522
+ archive_set_error(&a->archive, errno,
523
+ "Couldn't read extended attribute");
524
+ return (ARCHIVE_WARN);
525
+ }
526
+
527
+ archive_entry_xattr_add_entry(entry, name, value, size);
528
+
529
+ free(value);
530
+ return (ARCHIVE_OK);
531
+ }
532
+
533
+ static int
534
+ setup_xattrs(struct archive_read_disk *a,
535
+ struct archive_entry *entry, int *fd)
536
+ {
537
+ char *list, *p;
538
+ const char *path;
539
+ ssize_t list_size;
540
+
541
+ path = NULL;
542
+
543
+ if (*fd < 0) {
544
+ path = archive_read_disk_entry_setup_path(a, entry, fd);
545
+ if (path == NULL)
546
+ return (ARCHIVE_WARN);
547
+ }
548
+
549
+ if (*fd >= 0) {
550
+ #if ARCHIVE_XATTR_LINUX
551
+ list_size = flistxattr(*fd, NULL, 0);
552
+ #elif ARCHIVE_XATTR_DARWIN
553
+ list_size = flistxattr(*fd, NULL, 0, 0);
554
+ #elif ARCHIVE_XATTR_AIX
555
+ list_size = flistea(*fd, NULL, 0);
556
+ #endif
557
+ } else if (!a->follow_symlinks) {
558
+ #if ARCHIVE_XATTR_LINUX
559
+ list_size = llistxattr(path, NULL, 0);
560
+ #elif ARCHIVE_XATTR_DARWIN
561
+ list_size = listxattr(path, NULL, 0, XATTR_NOFOLLOW);
562
+ #elif ARCHIVE_XATTR_AIX
563
+ list_size = llistea(path, NULL, 0);
564
+ #endif
565
+ } else {
566
+ #if ARCHIVE_XATTR_LINUX
567
+ list_size = listxattr(path, NULL, 0);
568
+ #elif ARCHIVE_XATTR_DARWIN
569
+ list_size = listxattr(path, NULL, 0, 0);
570
+ #elif ARCHIVE_XATTR_AIX
571
+ list_size = listea(path, NULL, 0);
572
+ #endif
573
+ }
574
+
575
+ if (list_size == -1) {
576
+ if (errno == ENOTSUP || errno == ENOSYS)
577
+ return (ARCHIVE_OK);
578
+ archive_set_error(&a->archive, errno,
579
+ "Couldn't list extended attributes");
580
+ return (ARCHIVE_WARN);
581
+ }
582
+
583
+ if (list_size == 0)
584
+ return (ARCHIVE_OK);
585
+
586
+ if ((list = malloc(list_size)) == NULL) {
587
+ archive_set_error(&a->archive, errno, "Out of memory");
588
+ return (ARCHIVE_FATAL);
589
+ }
590
+
591
+ if (*fd >= 0) {
592
+ #if ARCHIVE_XATTR_LINUX
593
+ list_size = flistxattr(*fd, list, list_size);
594
+ #elif ARCHIVE_XATTR_DARWIN
595
+ list_size = flistxattr(*fd, list, list_size, 0);
596
+ #elif ARCHIVE_XATTR_AIX
597
+ list_size = flistea(*fd, list, list_size);
598
+ #endif
599
+ } else if (!a->follow_symlinks) {
600
+ #if ARCHIVE_XATTR_LINUX
601
+ list_size = llistxattr(path, list, list_size);
602
+ #elif ARCHIVE_XATTR_DARWIN
603
+ list_size = listxattr(path, list, list_size, XATTR_NOFOLLOW);
604
+ #elif ARCHIVE_XATTR_AIX
605
+ list_size = llistea(path, list, list_size);
606
+ #endif
607
+ } else {
608
+ #if ARCHIVE_XATTR_LINUX
609
+ list_size = listxattr(path, list, list_size);
610
+ #elif ARCHIVE_XATTR_DARWIN
611
+ list_size = listxattr(path, list, list_size, 0);
612
+ #elif ARCHIVE_XATTR_AIX
613
+ list_size = listea(path, list, list_size);
614
+ #endif
615
+ }
616
+
617
+ if (list_size == -1) {
618
+ archive_set_error(&a->archive, errno,
619
+ "Couldn't retrieve extended attributes");
620
+ free(list);
621
+ return (ARCHIVE_WARN);
622
+ }
623
+
624
+ for (p = list; (p - list) < list_size; p += strlen(p) + 1) {
625
+ #if ARCHIVE_XATTR_LINUX
626
+ /* Linux: skip POSIX.1e ACL extended attributes */
627
+ if (strncmp(p, "system.", 7) == 0 &&
628
+ (strcmp(p + 7, "posix_acl_access") == 0 ||
629
+ strcmp(p + 7, "posix_acl_default") == 0))
630
+ continue;
631
+ if (strncmp(p, "trusted.SGI_", 12) == 0 &&
632
+ (strcmp(p + 12, "ACL_DEFAULT") == 0 ||
633
+ strcmp(p + 12, "ACL_FILE") == 0))
634
+ continue;
635
+
636
+ /* Linux: xfsroot namespace is obsolete and unsupported */
637
+ if (strncmp(p, "xfsroot.", 8) == 0)
638
+ continue;
639
+ #endif
640
+ setup_xattr(a, entry, p, *fd, path);
641
+ }
642
+
643
+ free(list);
644
+ return (ARCHIVE_OK);
645
+ }
646
+
647
+ #elif ARCHIVE_XATTR_FREEBSD
648
+
649
+ /*
650
+ * FreeBSD extattr interface.
651
+ */
652
+
653
+ /* TODO: Implement this. Follow the Linux model above, but
654
+ * with FreeBSD-specific system calls, of course. Be careful
655
+ * to not include the system extattrs that hold ACLs; we handle
656
+ * those separately.
657
+ */
658
+ static int
659
+ setup_xattr(struct archive_read_disk *a, struct archive_entry *entry,
660
+ int namespace, const char *name, const char *fullname, int fd,
661
+ const char *path);
662
+
663
+ static int
664
+ setup_xattr(struct archive_read_disk *a, struct archive_entry *entry,
665
+ int namespace, const char *name, const char *fullname, int fd,
666
+ const char *accpath)
667
+ {
668
+ ssize_t size;
669
+ void *value = NULL;
670
+
671
+ if (fd >= 0)
672
+ size = extattr_get_fd(fd, namespace, name, NULL, 0);
673
+ else if (!a->follow_symlinks)
674
+ size = extattr_get_link(accpath, namespace, name, NULL, 0);
675
+ else
676
+ size = extattr_get_file(accpath, namespace, name, NULL, 0);
677
+
678
+ if (size == -1) {
679
+ archive_set_error(&a->archive, errno,
680
+ "Couldn't query extended attribute");
681
+ return (ARCHIVE_WARN);
682
+ }
683
+
684
+ if (size > 0 && (value = malloc(size)) == NULL) {
685
+ archive_set_error(&a->archive, errno, "Out of memory");
686
+ return (ARCHIVE_FATAL);
687
+ }
688
+
689
+ if (fd >= 0)
690
+ size = extattr_get_fd(fd, namespace, name, value, size);
691
+ else if (!a->follow_symlinks)
692
+ size = extattr_get_link(accpath, namespace, name, value, size);
693
+ else
694
+ size = extattr_get_file(accpath, namespace, name, value, size);
695
+
696
+ if (size == -1) {
697
+ free(value);
698
+ archive_set_error(&a->archive, errno,
699
+ "Couldn't read extended attribute");
700
+ return (ARCHIVE_WARN);
701
+ }
702
+
703
+ archive_entry_xattr_add_entry(entry, fullname, value, size);
704
+
705
+ free(value);
706
+ return (ARCHIVE_OK);
707
+ }
708
+
709
+ static int
710
+ setup_xattrs_namespace(struct archive_read_disk *a,
711
+ struct archive_entry *entry, int *fd, int namespace)
712
+ {
713
+ char buff[512];
714
+ char *list, *p;
715
+ ssize_t list_size;
716
+ const char *path;
717
+
718
+ path = NULL;
719
+
720
+ if (*fd < 0) {
721
+ path = archive_read_disk_entry_setup_path(a, entry, fd);
722
+ if (path == NULL)
723
+ return (ARCHIVE_WARN);
724
+ }
725
+
726
+ if (*fd >= 0)
727
+ list_size = extattr_list_fd(*fd, namespace, NULL, 0);
728
+ else if (!a->follow_symlinks)
729
+ list_size = extattr_list_link(path, namespace, NULL, 0);
730
+ else
731
+ list_size = extattr_list_file(path, namespace, NULL, 0);
732
+
733
+ if (list_size == -1 && errno == EOPNOTSUPP)
734
+ return (ARCHIVE_OK);
735
+ if (list_size == -1 && errno == EPERM)
736
+ return (ARCHIVE_OK);
737
+ if (list_size == -1) {
738
+ archive_set_error(&a->archive, errno,
739
+ "Couldn't list extended attributes");
740
+ return (ARCHIVE_WARN);
741
+ }
742
+
743
+ if (list_size == 0)
744
+ return (ARCHIVE_OK);
745
+
746
+ if ((list = malloc(list_size)) == NULL) {
747
+ archive_set_error(&a->archive, errno, "Out of memory");
748
+ return (ARCHIVE_FATAL);
749
+ }
750
+
751
+ if (*fd >= 0)
752
+ list_size = extattr_list_fd(*fd, namespace, list, list_size);
753
+ else if (!a->follow_symlinks)
754
+ list_size = extattr_list_link(path, namespace, list, list_size);
755
+ else
756
+ list_size = extattr_list_file(path, namespace, list, list_size);
757
+
758
+ if (list_size == -1) {
759
+ archive_set_error(&a->archive, errno,
760
+ "Couldn't retrieve extended attributes");
761
+ free(list);
762
+ return (ARCHIVE_WARN);
763
+ }
764
+
765
+ p = list;
766
+ while ((p - list) < list_size) {
767
+ size_t len = 255 & (int)*p;
768
+ char *name;
769
+
770
+ if (namespace == EXTATTR_NAMESPACE_SYSTEM) {
771
+ if (!strcmp(p + 1, "nfs4.acl") ||
772
+ !strcmp(p + 1, "posix1e.acl_access") ||
773
+ !strcmp(p + 1, "posix1e.acl_default")) {
774
+ p += 1 + len;
775
+ continue;
776
+ }
777
+ strcpy(buff, "system.");
778
+ } else {
779
+ strcpy(buff, "user.");
780
+ }
781
+ name = buff + strlen(buff);
782
+ memcpy(name, p + 1, len);
783
+ name[len] = '\0';
784
+ setup_xattr(a, entry, namespace, name, buff, *fd, path);
785
+ p += 1 + len;
786
+ }
787
+
788
+ free(list);
789
+ return (ARCHIVE_OK);
790
+ }
791
+
792
+ static int
793
+ setup_xattrs(struct archive_read_disk *a,
794
+ struct archive_entry *entry, int *fd)
795
+ {
796
+ int namespaces[2];
797
+ int i, res;
798
+
799
+ namespaces[0] = EXTATTR_NAMESPACE_USER;
800
+ namespaces[1] = EXTATTR_NAMESPACE_SYSTEM;
801
+
802
+ for (i = 0; i < 2; i++) {
803
+ res = setup_xattrs_namespace(a, entry, fd,
804
+ namespaces[i]);
805
+ switch (res) {
806
+ case (ARCHIVE_OK):
807
+ case (ARCHIVE_WARN):
808
+ break;
809
+ default:
810
+ return (res);
811
+ }
812
+ }
813
+
814
+ return (ARCHIVE_OK);
815
+ }
816
+
817
+ #else
818
+
819
+ /*
820
+ * Generic (stub) extended attribute support.
821
+ */
822
+ static int
823
+ setup_xattrs(struct archive_read_disk *a,
824
+ struct archive_entry *entry, int *fd)
825
+ {
826
+ (void)a; /* UNUSED */
827
+ (void)entry; /* UNUSED */
828
+ (void)fd; /* UNUSED */
829
+ return (ARCHIVE_OK);
830
+ }
831
+
832
+ #endif
833
+
834
+ #if defined(HAVE_LINUX_FIEMAP_H)
835
+
836
+ /*
837
+ * Linux FIEMAP sparse interface.
838
+ *
839
+ * The FIEMAP ioctl returns an "extent" for each physical allocation
840
+ * on disk. We need to process those to generate a more compact list
841
+ * of logical file blocks. We also need to be very careful to use
842
+ * FIEMAP_FLAG_SYNC here, since there are reports that Linux sometimes
843
+ * does not report allocations for newly-written data that hasn't
844
+ * been synced to disk.
845
+ *
846
+ * It's important to return a minimal sparse file list because we want
847
+ * to not trigger sparse file extensions if we don't have to, since
848
+ * not all readers support them.
849
+ */
850
+
851
+ static int
852
+ setup_sparse_fiemap(struct archive_read_disk *a,
853
+ struct archive_entry *entry, int *fd)
854
+ {
855
+ char buff[4096];
856
+ struct fiemap *fm;
857
+ struct fiemap_extent *fe;
858
+ int64_t size;
859
+ int count, do_fiemap, iters;
860
+ int exit_sts = ARCHIVE_OK;
861
+ const char *path;
862
+
863
+ if (archive_entry_filetype(entry) != AE_IFREG
864
+ || archive_entry_size(entry) <= 0
865
+ || archive_entry_hardlink(entry) != NULL)
866
+ return (ARCHIVE_OK);
867
+
868
+ if (*fd < 0) {
869
+ path = archive_read_disk_entry_setup_path(a, entry, NULL);
870
+ if (path == NULL)
871
+ return (ARCHIVE_FAILED);
872
+
873
+ if (a->tree != NULL)
874
+ *fd = a->open_on_current_dir(a->tree, path,
875
+ O_RDONLY | O_NONBLOCK | O_CLOEXEC);
876
+ else
877
+ *fd = open(path, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
878
+ if (*fd < 0) {
879
+ archive_set_error(&a->archive, errno,
880
+ "Can't open `%s'", path);
881
+ return (ARCHIVE_FAILED);
882
+ }
883
+ __archive_ensure_cloexec_flag(*fd);
884
+ }
885
+
886
+ /* Initialize buffer to avoid the error valgrind complains about. */
887
+ memset(buff, 0, sizeof(buff));
888
+ count = (sizeof(buff) - sizeof(*fm))/sizeof(*fe);
889
+ fm = (struct fiemap *)buff;
890
+ fm->fm_start = 0;
891
+ fm->fm_length = ~0ULL;;
892
+ fm->fm_flags = FIEMAP_FLAG_SYNC;
893
+ fm->fm_extent_count = count;
894
+ do_fiemap = 1;
895
+ size = archive_entry_size(entry);
896
+ for (iters = 0; ; ++iters) {
897
+ int i, r;
898
+
899
+ r = ioctl(*fd, FS_IOC_FIEMAP, fm);
900
+ if (r < 0) {
901
+ /* When something error happens, it is better we
902
+ * should return ARCHIVE_OK because an earlier
903
+ * version(<2.6.28) cannot perform FS_IOC_FIEMAP. */
904
+ goto exit_setup_sparse_fiemap;
905
+ }
906
+ if (fm->fm_mapped_extents == 0) {
907
+ if (iters == 0) {
908
+ /* Fully sparse file; insert a zero-length "data" entry */
909
+ archive_entry_sparse_add_entry(entry, 0, 0);
910
+ }
911
+ break;
912
+ }
913
+ fe = fm->fm_extents;
914
+ for (i = 0; i < (int)fm->fm_mapped_extents; i++, fe++) {
915
+ if (!(fe->fe_flags & FIEMAP_EXTENT_UNWRITTEN)) {
916
+ /* The fe_length of the last block does not
917
+ * adjust itself to its size files. */
918
+ int64_t length = fe->fe_length;
919
+ if (fe->fe_logical + length > (uint64_t)size)
920
+ length -= fe->fe_logical + length - size;
921
+ if (fe->fe_logical == 0 && length == size) {
922
+ /* This is not sparse. */
923
+ do_fiemap = 0;
924
+ break;
925
+ }
926
+ if (length > 0)
927
+ archive_entry_sparse_add_entry(entry,
928
+ fe->fe_logical, length);
929
+ }
930
+ if (fe->fe_flags & FIEMAP_EXTENT_LAST)
931
+ do_fiemap = 0;
932
+ }
933
+ if (do_fiemap) {
934
+ fe = fm->fm_extents + fm->fm_mapped_extents -1;
935
+ fm->fm_start = fe->fe_logical + fe->fe_length;
936
+ } else
937
+ break;
938
+ }
939
+ exit_setup_sparse_fiemap:
940
+ return (exit_sts);
941
+ }
942
+
943
+ #if !defined(SEEK_HOLE) || !defined(SEEK_DATA)
944
+ static int
945
+ setup_sparse(struct archive_read_disk *a,
946
+ struct archive_entry *entry, int *fd)
947
+ {
948
+ return setup_sparse_fiemap(a, entry, fd);
949
+ }
950
+ #endif
951
+ #endif /* defined(HAVE_LINUX_FIEMAP_H) */
952
+
953
+ #if defined(SEEK_HOLE) && defined(SEEK_DATA)
954
+
955
+ /*
956
+ * SEEK_HOLE sparse interface (FreeBSD, Linux, Solaris)
957
+ */
958
+
959
+ static int
960
+ setup_sparse(struct archive_read_disk *a,
961
+ struct archive_entry *entry, int *fd)
962
+ {
963
+ int64_t size;
964
+ off_t initial_off;
965
+ off_t off_s, off_e;
966
+ int exit_sts = ARCHIVE_OK;
967
+ int check_fully_sparse = 0;
968
+ const char *path;
969
+
970
+ if (archive_entry_filetype(entry) != AE_IFREG
971
+ || archive_entry_size(entry) <= 0
972
+ || archive_entry_hardlink(entry) != NULL)
973
+ return (ARCHIVE_OK);
974
+
975
+ /* Does filesystem support the reporting of hole ? */
976
+ if (*fd < 0)
977
+ path = archive_read_disk_entry_setup_path(a, entry, fd);
978
+ else
979
+ path = NULL;
980
+
981
+ if (*fd >= 0) {
982
+ #ifdef _PC_MIN_HOLE_SIZE
983
+ if (fpathconf(*fd, _PC_MIN_HOLE_SIZE) <= 0)
984
+ return (ARCHIVE_OK);
985
+ #endif
986
+ initial_off = lseek(*fd, 0, SEEK_CUR);
987
+ if (initial_off != 0)
988
+ lseek(*fd, 0, SEEK_SET);
989
+ } else {
990
+ if (path == NULL)
991
+ return (ARCHIVE_FAILED);
992
+ #ifdef _PC_MIN_HOLE_SIZE
993
+ if (pathconf(path, _PC_MIN_HOLE_SIZE) <= 0)
994
+ return (ARCHIVE_OK);
995
+ #endif
996
+ *fd = open(path, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
997
+ if (*fd < 0) {
998
+ archive_set_error(&a->archive, errno,
999
+ "Can't open `%s'", path);
1000
+ return (ARCHIVE_FAILED);
1001
+ }
1002
+ __archive_ensure_cloexec_flag(*fd);
1003
+ initial_off = 0;
1004
+ }
1005
+
1006
+ #ifndef _PC_MIN_HOLE_SIZE
1007
+ /* Check if the underlying filesystem supports seek hole */
1008
+ off_s = lseek(*fd, 0, SEEK_HOLE);
1009
+ if (off_s < 0)
1010
+ #if defined(HAVE_LINUX_FIEMAP_H)
1011
+ return setup_sparse_fiemap(a, entry, fd);
1012
+ #else
1013
+ goto exit_setup_sparse;
1014
+ #endif
1015
+ else if (off_s > 0)
1016
+ lseek(*fd, 0, SEEK_SET);
1017
+ #endif
1018
+
1019
+ off_s = 0;
1020
+ size = archive_entry_size(entry);
1021
+ while (off_s < size) {
1022
+ off_s = lseek(*fd, off_s, SEEK_DATA);
1023
+ if (off_s == (off_t)-1) {
1024
+ if (errno == ENXIO) {
1025
+ /* no more hole */
1026
+ if (archive_entry_sparse_count(entry) == 0) {
1027
+ /* Potentially a fully-sparse file. */
1028
+ check_fully_sparse = 1;
1029
+ }
1030
+ break;
1031
+ }
1032
+ archive_set_error(&a->archive, errno,
1033
+ "lseek(SEEK_HOLE) failed");
1034
+ exit_sts = ARCHIVE_FAILED;
1035
+ goto exit_setup_sparse;
1036
+ }
1037
+ off_e = lseek(*fd, off_s, SEEK_HOLE);
1038
+ if (off_e == (off_t)-1) {
1039
+ if (errno == ENXIO) {
1040
+ off_e = lseek(*fd, 0, SEEK_END);
1041
+ if (off_e != (off_t)-1)
1042
+ break;/* no more data */
1043
+ }
1044
+ archive_set_error(&a->archive, errno,
1045
+ "lseek(SEEK_DATA) failed");
1046
+ exit_sts = ARCHIVE_FAILED;
1047
+ goto exit_setup_sparse;
1048
+ }
1049
+ if (off_s == 0 && off_e == size)
1050
+ break;/* This is not sparse. */
1051
+ archive_entry_sparse_add_entry(entry, off_s,
1052
+ off_e - off_s);
1053
+ off_s = off_e;
1054
+ }
1055
+
1056
+ if (check_fully_sparse) {
1057
+ if (lseek(*fd, 0, SEEK_HOLE) == 0 &&
1058
+ lseek(*fd, 0, SEEK_END) == size) {
1059
+ /* Fully sparse file; insert a zero-length "data" entry */
1060
+ archive_entry_sparse_add_entry(entry, 0, 0);
1061
+ }
1062
+ }
1063
+ exit_setup_sparse:
1064
+ lseek(*fd, initial_off, SEEK_SET);
1065
+ return (exit_sts);
1066
+ }
1067
+
1068
+ #elif !defined(HAVE_LINUX_FIEMAP_H)
1069
+
1070
+ /*
1071
+ * Generic (stub) sparse support.
1072
+ */
1073
+ static int
1074
+ setup_sparse(struct archive_read_disk *a,
1075
+ struct archive_entry *entry, int *fd)
1076
+ {
1077
+ (void)a; /* UNUSED */
1078
+ (void)entry; /* UNUSED */
1079
+ (void)fd; /* UNUSED */
1080
+ return (ARCHIVE_OK);
1081
+ }
1082
+
1083
+ #endif
1084
+
1085
+ #endif /* !defined(_WIN32) || defined(__CYGWIN__) */
1086
+