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,1875 @@
1
+ /*-
2
+ * Copyright (c) 2003-2007 Tim Kientzle
3
+ * Copyright (c) 2012 Michihiro NAKAJIMA
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions
8
+ * are met:
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * 2. Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ *
15
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ */
26
+
27
+ #include "archive_platform.h"
28
+ __FBSDID("$FreeBSD$");
29
+
30
+ #ifdef HAVE_ERRNO_H
31
+ #include <errno.h>
32
+ #endif
33
+ #ifdef HAVE_STDLIB_H
34
+ #include <stdlib.h>
35
+ #endif
36
+ #ifdef HAVE_STRING_H
37
+ #include <string.h>
38
+ #endif
39
+
40
+ #include "archive.h"
41
+ #include "archive_private.h"
42
+ #include "archive_entry.h"
43
+ #include "archive_getdate.h"
44
+ #include "archive_pathmatch.h"
45
+ #include "archive_rb.h"
46
+ #include "archive_string.h"
47
+
48
+ struct match {
49
+ struct match *next;
50
+ int matches;
51
+ struct archive_mstring pattern;
52
+ };
53
+
54
+ struct match_list {
55
+ struct match *first;
56
+ struct match **last;
57
+ int count;
58
+ int unmatched_count;
59
+ struct match *unmatched_next;
60
+ int unmatched_eof;
61
+ };
62
+
63
+ struct match_file {
64
+ struct archive_rb_node node;
65
+ struct match_file *next;
66
+ struct archive_mstring pathname;
67
+ int flag;
68
+ time_t mtime_sec;
69
+ long mtime_nsec;
70
+ time_t ctime_sec;
71
+ long ctime_nsec;
72
+ };
73
+
74
+ struct entry_list {
75
+ struct match_file *first;
76
+ struct match_file **last;
77
+ int count;
78
+ };
79
+
80
+ struct id_array {
81
+ size_t size;/* Allocated size */
82
+ size_t count;
83
+ int64_t *ids;
84
+ };
85
+
86
+ #define PATTERN_IS_SET 1
87
+ #define TIME_IS_SET 2
88
+ #define ID_IS_SET 4
89
+
90
+ struct archive_match {
91
+ struct archive archive;
92
+
93
+ /* exclusion/inclusion set flag. */
94
+ int setflag;
95
+
96
+ /* Recursively include directory content? */
97
+ int recursive_include;
98
+
99
+ /*
100
+ * Matching filename patterns.
101
+ */
102
+ struct match_list exclusions;
103
+ struct match_list inclusions;
104
+
105
+ /*
106
+ * Matching time stamps.
107
+ */
108
+ time_t now;
109
+ int newer_mtime_filter;
110
+ time_t newer_mtime_sec;
111
+ long newer_mtime_nsec;
112
+ int newer_ctime_filter;
113
+ time_t newer_ctime_sec;
114
+ long newer_ctime_nsec;
115
+ int older_mtime_filter;
116
+ time_t older_mtime_sec;
117
+ long older_mtime_nsec;
118
+ int older_ctime_filter;
119
+ time_t older_ctime_sec;
120
+ long older_ctime_nsec;
121
+ /*
122
+ * Matching time stamps with its filename.
123
+ */
124
+ struct archive_rb_tree exclusion_tree;
125
+ struct entry_list exclusion_entry_list;
126
+
127
+ /*
128
+ * Matching file owners.
129
+ */
130
+ struct id_array inclusion_uids;
131
+ struct id_array inclusion_gids;
132
+ struct match_list inclusion_unames;
133
+ struct match_list inclusion_gnames;
134
+ };
135
+
136
+ static int add_pattern_from_file(struct archive_match *,
137
+ struct match_list *, int, const void *, int);
138
+ static int add_entry(struct archive_match *, int,
139
+ struct archive_entry *);
140
+ static int add_owner_id(struct archive_match *, struct id_array *,
141
+ int64_t);
142
+ static int add_owner_name(struct archive_match *, struct match_list *,
143
+ int, const void *);
144
+ static int add_pattern_mbs(struct archive_match *, struct match_list *,
145
+ const char *);
146
+ static int add_pattern_wcs(struct archive_match *, struct match_list *,
147
+ const wchar_t *);
148
+ static int cmp_key_mbs(const struct archive_rb_node *, const void *);
149
+ static int cmp_key_wcs(const struct archive_rb_node *, const void *);
150
+ static int cmp_node_mbs(const struct archive_rb_node *,
151
+ const struct archive_rb_node *);
152
+ static int cmp_node_wcs(const struct archive_rb_node *,
153
+ const struct archive_rb_node *);
154
+ static void entry_list_add(struct entry_list *, struct match_file *);
155
+ static void entry_list_free(struct entry_list *);
156
+ static void entry_list_init(struct entry_list *);
157
+ static int error_nomem(struct archive_match *);
158
+ static void match_list_add(struct match_list *, struct match *);
159
+ static void match_list_free(struct match_list *);
160
+ static void match_list_init(struct match_list *);
161
+ static int match_list_unmatched_inclusions_next(struct archive_match *,
162
+ struct match_list *, int, const void **);
163
+ static int match_owner_id(struct id_array *, int64_t);
164
+ #if !defined(_WIN32) || defined(__CYGWIN__)
165
+ static int match_owner_name_mbs(struct archive_match *,
166
+ struct match_list *, const char *);
167
+ #else
168
+ static int match_owner_name_wcs(struct archive_match *,
169
+ struct match_list *, const wchar_t *);
170
+ #endif
171
+ static int match_path_exclusion(struct archive_match *,
172
+ struct match *, int, const void *);
173
+ static int match_path_inclusion(struct archive_match *,
174
+ struct match *, int, const void *);
175
+ static int owner_excluded(struct archive_match *,
176
+ struct archive_entry *);
177
+ static int path_excluded(struct archive_match *, int, const void *);
178
+ static int set_timefilter(struct archive_match *, int, time_t, long,
179
+ time_t, long);
180
+ static int set_timefilter_pathname_mbs(struct archive_match *,
181
+ int, const char *);
182
+ static int set_timefilter_pathname_wcs(struct archive_match *,
183
+ int, const wchar_t *);
184
+ static int set_timefilter_date(struct archive_match *, int, const char *);
185
+ static int set_timefilter_date_w(struct archive_match *, int,
186
+ const wchar_t *);
187
+ static int time_excluded(struct archive_match *,
188
+ struct archive_entry *);
189
+ static int validate_time_flag(struct archive *, int, const char *);
190
+
191
+ #define get_date __archive_get_date
192
+
193
+ static const struct archive_rb_tree_ops rb_ops_mbs = {
194
+ cmp_node_mbs, cmp_key_mbs
195
+ };
196
+
197
+ static const struct archive_rb_tree_ops rb_ops_wcs = {
198
+ cmp_node_wcs, cmp_key_wcs
199
+ };
200
+
201
+ /*
202
+ * The matching logic here needs to be re-thought. I started out to
203
+ * try to mimic gtar's matching logic, but it's not entirely
204
+ * consistent. In particular 'tar -t' and 'tar -x' interpret patterns
205
+ * on the command line as anchored, but --exclude doesn't.
206
+ */
207
+
208
+ static int
209
+ error_nomem(struct archive_match *a)
210
+ {
211
+ archive_set_error(&(a->archive), ENOMEM, "No memory");
212
+ a->archive.state = ARCHIVE_STATE_FATAL;
213
+ return (ARCHIVE_FATAL);
214
+ }
215
+
216
+ /*
217
+ * Create an ARCHIVE_MATCH object.
218
+ */
219
+ struct archive *
220
+ archive_match_new(void)
221
+ {
222
+ struct archive_match *a;
223
+
224
+ a = (struct archive_match *)calloc(1, sizeof(*a));
225
+ if (a == NULL)
226
+ return (NULL);
227
+ a->archive.magic = ARCHIVE_MATCH_MAGIC;
228
+ a->archive.state = ARCHIVE_STATE_NEW;
229
+ a->recursive_include = 1;
230
+ match_list_init(&(a->inclusions));
231
+ match_list_init(&(a->exclusions));
232
+ __archive_rb_tree_init(&(a->exclusion_tree), &rb_ops_mbs);
233
+ entry_list_init(&(a->exclusion_entry_list));
234
+ match_list_init(&(a->inclusion_unames));
235
+ match_list_init(&(a->inclusion_gnames));
236
+ time(&a->now);
237
+ return (&(a->archive));
238
+ }
239
+
240
+ /*
241
+ * Free an ARCHIVE_MATCH object.
242
+ */
243
+ int
244
+ archive_match_free(struct archive *_a)
245
+ {
246
+ struct archive_match *a;
247
+
248
+ if (_a == NULL)
249
+ return (ARCHIVE_OK);
250
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
251
+ ARCHIVE_STATE_ANY | ARCHIVE_STATE_FATAL, "archive_match_free");
252
+ a = (struct archive_match *)_a;
253
+ match_list_free(&(a->inclusions));
254
+ match_list_free(&(a->exclusions));
255
+ entry_list_free(&(a->exclusion_entry_list));
256
+ free(a->inclusion_uids.ids);
257
+ free(a->inclusion_gids.ids);
258
+ match_list_free(&(a->inclusion_unames));
259
+ match_list_free(&(a->inclusion_gnames));
260
+ free(a);
261
+ return (ARCHIVE_OK);
262
+ }
263
+
264
+ /*
265
+ * Convenience function to perform all exclusion tests.
266
+ *
267
+ * Returns 1 if archive entry is excluded.
268
+ * Returns 0 if archive entry is not excluded.
269
+ * Returns <0 if something error happened.
270
+ */
271
+ int
272
+ archive_match_excluded(struct archive *_a, struct archive_entry *entry)
273
+ {
274
+ struct archive_match *a;
275
+ int r;
276
+
277
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
278
+ ARCHIVE_STATE_NEW, "archive_match_excluded_ae");
279
+
280
+ a = (struct archive_match *)_a;
281
+ if (entry == NULL) {
282
+ archive_set_error(&(a->archive), EINVAL, "entry is NULL");
283
+ return (ARCHIVE_FAILED);
284
+ }
285
+
286
+ r = 0;
287
+ if (a->setflag & PATTERN_IS_SET) {
288
+ #if defined(_WIN32) && !defined(__CYGWIN__)
289
+ r = path_excluded(a, 0, archive_entry_pathname_w(entry));
290
+ #else
291
+ r = path_excluded(a, 1, archive_entry_pathname(entry));
292
+ #endif
293
+ if (r != 0)
294
+ return (r);
295
+ }
296
+
297
+ if (a->setflag & TIME_IS_SET) {
298
+ r = time_excluded(a, entry);
299
+ if (r != 0)
300
+ return (r);
301
+ }
302
+
303
+ if (a->setflag & ID_IS_SET)
304
+ r = owner_excluded(a, entry);
305
+ return (r);
306
+ }
307
+
308
+ /*
309
+ * Utility functions to manage exclusion/inclusion patterns
310
+ */
311
+
312
+ int
313
+ archive_match_exclude_pattern(struct archive *_a, const char *pattern)
314
+ {
315
+ struct archive_match *a;
316
+ int r;
317
+
318
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
319
+ ARCHIVE_STATE_NEW, "archive_match_exclude_pattern");
320
+ a = (struct archive_match *)_a;
321
+
322
+ if (pattern == NULL || *pattern == '\0') {
323
+ archive_set_error(&(a->archive), EINVAL, "pattern is empty");
324
+ return (ARCHIVE_FAILED);
325
+ }
326
+ if ((r = add_pattern_mbs(a, &(a->exclusions), pattern)) != ARCHIVE_OK)
327
+ return (r);
328
+ return (ARCHIVE_OK);
329
+ }
330
+
331
+ int
332
+ archive_match_exclude_pattern_w(struct archive *_a, const wchar_t *pattern)
333
+ {
334
+ struct archive_match *a;
335
+ int r;
336
+
337
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
338
+ ARCHIVE_STATE_NEW, "archive_match_exclude_pattern_w");
339
+ a = (struct archive_match *)_a;
340
+
341
+ if (pattern == NULL || *pattern == L'\0') {
342
+ archive_set_error(&(a->archive), EINVAL, "pattern is empty");
343
+ return (ARCHIVE_FAILED);
344
+ }
345
+ if ((r = add_pattern_wcs(a, &(a->exclusions), pattern)) != ARCHIVE_OK)
346
+ return (r);
347
+ return (ARCHIVE_OK);
348
+ }
349
+
350
+ int
351
+ archive_match_exclude_pattern_from_file(struct archive *_a,
352
+ const char *pathname, int nullSeparator)
353
+ {
354
+ struct archive_match *a;
355
+
356
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
357
+ ARCHIVE_STATE_NEW, "archive_match_exclude_pattern_from_file");
358
+ a = (struct archive_match *)_a;
359
+
360
+ return add_pattern_from_file(a, &(a->exclusions), 1, pathname,
361
+ nullSeparator);
362
+ }
363
+
364
+ int
365
+ archive_match_exclude_pattern_from_file_w(struct archive *_a,
366
+ const wchar_t *pathname, int nullSeparator)
367
+ {
368
+ struct archive_match *a;
369
+
370
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
371
+ ARCHIVE_STATE_NEW, "archive_match_exclude_pattern_from_file_w");
372
+ a = (struct archive_match *)_a;
373
+
374
+ return add_pattern_from_file(a, &(a->exclusions), 0, pathname,
375
+ nullSeparator);
376
+ }
377
+
378
+ int
379
+ archive_match_include_pattern(struct archive *_a, const char *pattern)
380
+ {
381
+ struct archive_match *a;
382
+ int r;
383
+
384
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
385
+ ARCHIVE_STATE_NEW, "archive_match_include_pattern");
386
+ a = (struct archive_match *)_a;
387
+
388
+ if (pattern == NULL || *pattern == '\0') {
389
+ archive_set_error(&(a->archive), EINVAL, "pattern is empty");
390
+ return (ARCHIVE_FAILED);
391
+ }
392
+ if ((r = add_pattern_mbs(a, &(a->inclusions), pattern)) != ARCHIVE_OK)
393
+ return (r);
394
+ return (ARCHIVE_OK);
395
+ }
396
+
397
+ int
398
+ archive_match_include_pattern_w(struct archive *_a, const wchar_t *pattern)
399
+ {
400
+ struct archive_match *a;
401
+ int r;
402
+
403
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
404
+ ARCHIVE_STATE_NEW, "archive_match_include_pattern_w");
405
+ a = (struct archive_match *)_a;
406
+
407
+ if (pattern == NULL || *pattern == L'\0') {
408
+ archive_set_error(&(a->archive), EINVAL, "pattern is empty");
409
+ return (ARCHIVE_FAILED);
410
+ }
411
+ if ((r = add_pattern_wcs(a, &(a->inclusions), pattern)) != ARCHIVE_OK)
412
+ return (r);
413
+ return (ARCHIVE_OK);
414
+ }
415
+
416
+ int
417
+ archive_match_include_pattern_from_file(struct archive *_a,
418
+ const char *pathname, int nullSeparator)
419
+ {
420
+ struct archive_match *a;
421
+
422
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
423
+ ARCHIVE_STATE_NEW, "archive_match_include_pattern_from_file");
424
+ a = (struct archive_match *)_a;
425
+
426
+ return add_pattern_from_file(a, &(a->inclusions), 1, pathname,
427
+ nullSeparator);
428
+ }
429
+
430
+ int
431
+ archive_match_include_pattern_from_file_w(struct archive *_a,
432
+ const wchar_t *pathname, int nullSeparator)
433
+ {
434
+ struct archive_match *a;
435
+
436
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
437
+ ARCHIVE_STATE_NEW, "archive_match_include_pattern_from_file_w");
438
+ a = (struct archive_match *)_a;
439
+
440
+ return add_pattern_from_file(a, &(a->inclusions), 0, pathname,
441
+ nullSeparator);
442
+ }
443
+
444
+ /*
445
+ * Test functions for pathname patterns.
446
+ *
447
+ * Returns 1 if archive entry is excluded.
448
+ * Returns 0 if archive entry is not excluded.
449
+ * Returns <0 if something error happened.
450
+ */
451
+ int
452
+ archive_match_path_excluded(struct archive *_a,
453
+ struct archive_entry *entry)
454
+ {
455
+ struct archive_match *a;
456
+
457
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
458
+ ARCHIVE_STATE_NEW, "archive_match_path_excluded");
459
+
460
+ a = (struct archive_match *)_a;
461
+ if (entry == NULL) {
462
+ archive_set_error(&(a->archive), EINVAL, "entry is NULL");
463
+ return (ARCHIVE_FAILED);
464
+ }
465
+
466
+ /* If we don't have exclusion/inclusion pattern set at all,
467
+ * the entry is always not excluded. */
468
+ if ((a->setflag & PATTERN_IS_SET) == 0)
469
+ return (0);
470
+ #if defined(_WIN32) && !defined(__CYGWIN__)
471
+ return (path_excluded(a, 0, archive_entry_pathname_w(entry)));
472
+ #else
473
+ return (path_excluded(a, 1, archive_entry_pathname(entry)));
474
+ #endif
475
+ }
476
+
477
+ /*
478
+ * When recursive inclusion of directory content is enabled,
479
+ * an inclusion pattern that matches a directory will also
480
+ * include everything beneath that directory. Enabled by default.
481
+ *
482
+ * For compatibility with GNU tar, exclusion patterns always
483
+ * match if a subset of the full patch matches (i.e., they are
484
+ * are not rooted at the beginning of the path) and thus there
485
+ * is no corresponding non-recursive exclusion mode.
486
+ */
487
+ int
488
+ archive_match_set_inclusion_recursion(struct archive *_a, int enabled)
489
+ {
490
+ struct archive_match *a;
491
+
492
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
493
+ ARCHIVE_STATE_NEW, "archive_match_set_inclusion_recursion");
494
+ a = (struct archive_match *)_a;
495
+ a->recursive_include = enabled;
496
+ return (ARCHIVE_OK);
497
+ }
498
+
499
+ /*
500
+ * Utility functions to get statistic information for inclusion patterns.
501
+ */
502
+ int
503
+ archive_match_path_unmatched_inclusions(struct archive *_a)
504
+ {
505
+ struct archive_match *a;
506
+
507
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
508
+ ARCHIVE_STATE_NEW, "archive_match_unmatched_inclusions");
509
+ a = (struct archive_match *)_a;
510
+
511
+ return (a->inclusions.unmatched_count);
512
+ }
513
+
514
+ int
515
+ archive_match_path_unmatched_inclusions_next(struct archive *_a,
516
+ const char **_p)
517
+ {
518
+ struct archive_match *a;
519
+ const void *v;
520
+ int r;
521
+
522
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
523
+ ARCHIVE_STATE_NEW, "archive_match_unmatched_inclusions_next");
524
+ a = (struct archive_match *)_a;
525
+
526
+ r = match_list_unmatched_inclusions_next(a, &(a->inclusions), 1, &v);
527
+ *_p = (const char *)v;
528
+ return (r);
529
+ }
530
+
531
+ int
532
+ archive_match_path_unmatched_inclusions_next_w(struct archive *_a,
533
+ const wchar_t **_p)
534
+ {
535
+ struct archive_match *a;
536
+ const void *v;
537
+ int r;
538
+
539
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
540
+ ARCHIVE_STATE_NEW, "archive_match_unmatched_inclusions_next_w");
541
+ a = (struct archive_match *)_a;
542
+
543
+ r = match_list_unmatched_inclusions_next(a, &(a->inclusions), 0, &v);
544
+ *_p = (const wchar_t *)v;
545
+ return (r);
546
+ }
547
+
548
+ /*
549
+ * Add inclusion/exclusion patterns.
550
+ */
551
+ static int
552
+ add_pattern_mbs(struct archive_match *a, struct match_list *list,
553
+ const char *pattern)
554
+ {
555
+ struct match *match;
556
+ size_t len;
557
+
558
+ match = calloc(1, sizeof(*match));
559
+ if (match == NULL)
560
+ return (error_nomem(a));
561
+ /* Both "foo/" and "foo" should match "foo/bar". */
562
+ len = strlen(pattern);
563
+ if (len && pattern[len - 1] == '/')
564
+ --len;
565
+ archive_mstring_copy_mbs_len(&(match->pattern), pattern, len);
566
+ match_list_add(list, match);
567
+ a->setflag |= PATTERN_IS_SET;
568
+ return (ARCHIVE_OK);
569
+ }
570
+
571
+ static int
572
+ add_pattern_wcs(struct archive_match *a, struct match_list *list,
573
+ const wchar_t *pattern)
574
+ {
575
+ struct match *match;
576
+ size_t len;
577
+
578
+ match = calloc(1, sizeof(*match));
579
+ if (match == NULL)
580
+ return (error_nomem(a));
581
+ /* Both "foo/" and "foo" should match "foo/bar". */
582
+ len = wcslen(pattern);
583
+ if (len && pattern[len - 1] == L'/')
584
+ --len;
585
+ archive_mstring_copy_wcs_len(&(match->pattern), pattern, len);
586
+ match_list_add(list, match);
587
+ a->setflag |= PATTERN_IS_SET;
588
+ return (ARCHIVE_OK);
589
+ }
590
+
591
+ static int
592
+ add_pattern_from_file(struct archive_match *a, struct match_list *mlist,
593
+ int mbs, const void *pathname, int nullSeparator)
594
+ {
595
+ struct archive *ar;
596
+ struct archive_entry *ae;
597
+ struct archive_string as;
598
+ const void *buff;
599
+ size_t size;
600
+ int64_t offset;
601
+ int r;
602
+
603
+ ar = archive_read_new();
604
+ if (ar == NULL) {
605
+ archive_set_error(&(a->archive), ENOMEM, "No memory");
606
+ return (ARCHIVE_FATAL);
607
+ }
608
+ r = archive_read_support_format_raw(ar);
609
+ r = archive_read_support_format_empty(ar);
610
+ if (r != ARCHIVE_OK) {
611
+ archive_copy_error(&(a->archive), ar);
612
+ archive_read_free(ar);
613
+ return (r);
614
+ }
615
+ if (mbs)
616
+ r = archive_read_open_filename(ar, pathname, 512*20);
617
+ else
618
+ r = archive_read_open_filename_w(ar, pathname, 512*20);
619
+ if (r != ARCHIVE_OK) {
620
+ archive_copy_error(&(a->archive), ar);
621
+ archive_read_free(ar);
622
+ return (r);
623
+ }
624
+ r = archive_read_next_header(ar, &ae);
625
+ if (r != ARCHIVE_OK) {
626
+ archive_read_free(ar);
627
+ if (r == ARCHIVE_EOF) {
628
+ return (ARCHIVE_OK);
629
+ } else {
630
+ archive_copy_error(&(a->archive), ar);
631
+ return (r);
632
+ }
633
+ }
634
+
635
+ archive_string_init(&as);
636
+
637
+ while ((r = archive_read_data_block(ar, &buff, &size, &offset))
638
+ == ARCHIVE_OK) {
639
+ const char *b = (const char *)buff;
640
+
641
+ while (size) {
642
+ const char *s = (const char *)b;
643
+ size_t length = 0;
644
+ int found_separator = 0;
645
+
646
+ while (length < size) {
647
+ if (nullSeparator) {
648
+ if (*b == '\0') {
649
+ found_separator = 1;
650
+ break;
651
+ }
652
+ } else {
653
+ if (*b == 0x0d || *b == 0x0a) {
654
+ found_separator = 1;
655
+ break;
656
+ }
657
+ }
658
+ b++;
659
+ length++;
660
+ }
661
+ if (!found_separator) {
662
+ archive_strncat(&as, s, length);
663
+ /* Read next data block. */
664
+ break;
665
+ }
666
+ b++;
667
+ size -= length + 1;
668
+ archive_strncat(&as, s, length);
669
+
670
+ /* If the line is not empty, add the pattern. */
671
+ if (archive_strlen(&as) > 0) {
672
+ /* Add pattern. */
673
+ r = add_pattern_mbs(a, mlist, as.s);
674
+ if (r != ARCHIVE_OK) {
675
+ archive_read_free(ar);
676
+ archive_string_free(&as);
677
+ return (r);
678
+ }
679
+ archive_string_empty(&as);
680
+ }
681
+ }
682
+ }
683
+
684
+ /* If an error occurred, report it immediately. */
685
+ if (r < ARCHIVE_OK) {
686
+ archive_copy_error(&(a->archive), ar);
687
+ archive_read_free(ar);
688
+ archive_string_free(&as);
689
+ return (r);
690
+ }
691
+
692
+ /* If the line is not empty, add the pattern. */
693
+ if (r == ARCHIVE_EOF && archive_strlen(&as) > 0) {
694
+ /* Add pattern. */
695
+ r = add_pattern_mbs(a, mlist, as.s);
696
+ if (r != ARCHIVE_OK) {
697
+ archive_read_free(ar);
698
+ archive_string_free(&as);
699
+ return (r);
700
+ }
701
+ }
702
+ archive_read_free(ar);
703
+ archive_string_free(&as);
704
+ return (ARCHIVE_OK);
705
+ }
706
+
707
+ /*
708
+ * Test if pathname is excluded by inclusion/exclusion patterns.
709
+ */
710
+ static int
711
+ path_excluded(struct archive_match *a, int mbs, const void *pathname)
712
+ {
713
+ struct match *match;
714
+ struct match *matched;
715
+ int r;
716
+
717
+ if (a == NULL)
718
+ return (0);
719
+
720
+ /* Mark off any unmatched inclusions. */
721
+ /* In particular, if a filename does appear in the archive and
722
+ * is explicitly included and excluded, then we don't report
723
+ * it as missing even though we don't extract it.
724
+ */
725
+ matched = NULL;
726
+ for (match = a->inclusions.first; match != NULL;
727
+ match = match->next){
728
+ if (match->matches == 0 &&
729
+ (r = match_path_inclusion(a, match, mbs, pathname)) != 0) {
730
+ if (r < 0)
731
+ return (r);
732
+ a->inclusions.unmatched_count--;
733
+ match->matches++;
734
+ matched = match;
735
+ }
736
+ }
737
+
738
+ /* Exclusions take priority */
739
+ for (match = a->exclusions.first; match != NULL;
740
+ match = match->next){
741
+ r = match_path_exclusion(a, match, mbs, pathname);
742
+ if (r)
743
+ return (r);
744
+ }
745
+
746
+ /* It's not excluded and we found an inclusion above, so it's
747
+ * included. */
748
+ if (matched != NULL)
749
+ return (0);
750
+
751
+
752
+ /* We didn't find an unmatched inclusion, check the remaining ones. */
753
+ for (match = a->inclusions.first; match != NULL;
754
+ match = match->next){
755
+ /* We looked at previously-unmatched inclusions already. */
756
+ if (match->matches > 0 &&
757
+ (r = match_path_inclusion(a, match, mbs, pathname)) != 0) {
758
+ if (r < 0)
759
+ return (r);
760
+ match->matches++;
761
+ return (0);
762
+ }
763
+ }
764
+
765
+ /* If there were inclusions, default is to exclude. */
766
+ if (a->inclusions.first != NULL)
767
+ return (1);
768
+
769
+ /* No explicit inclusions, default is to match. */
770
+ return (0);
771
+ }
772
+
773
+ /*
774
+ * This is a little odd, but it matches the default behavior of
775
+ * gtar. In particular, 'a*b' will match 'foo/a1111/222b/bar'
776
+ *
777
+ */
778
+ static int
779
+ match_path_exclusion(struct archive_match *a, struct match *m,
780
+ int mbs, const void *pn)
781
+ {
782
+ int flag = PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END;
783
+ int r;
784
+
785
+ if (mbs) {
786
+ const char *p;
787
+ r = archive_mstring_get_mbs(&(a->archive), &(m->pattern), &p);
788
+ if (r == 0)
789
+ return (archive_pathmatch(p, (const char *)pn, flag));
790
+ } else {
791
+ const wchar_t *p;
792
+ r = archive_mstring_get_wcs(&(a->archive), &(m->pattern), &p);
793
+ if (r == 0)
794
+ return (archive_pathmatch_w(p, (const wchar_t *)pn,
795
+ flag));
796
+ }
797
+ if (errno == ENOMEM)
798
+ return (error_nomem(a));
799
+ return (0);
800
+ }
801
+
802
+ /*
803
+ * Again, mimic gtar: inclusions are always anchored (have to match
804
+ * the beginning of the path) even though exclusions are not anchored.
805
+ */
806
+ static int
807
+ match_path_inclusion(struct archive_match *a, struct match *m,
808
+ int mbs, const void *pn)
809
+ {
810
+ /* Recursive operation requires only a prefix match. */
811
+ int flag = a->recursive_include ?
812
+ PATHMATCH_NO_ANCHOR_END :
813
+ 0;
814
+ int r;
815
+
816
+ if (mbs) {
817
+ const char *p;
818
+ r = archive_mstring_get_mbs(&(a->archive), &(m->pattern), &p);
819
+ if (r == 0)
820
+ return (archive_pathmatch(p, (const char *)pn, flag));
821
+ } else {
822
+ const wchar_t *p;
823
+ r = archive_mstring_get_wcs(&(a->archive), &(m->pattern), &p);
824
+ if (r == 0)
825
+ return (archive_pathmatch_w(p, (const wchar_t *)pn,
826
+ flag));
827
+ }
828
+ if (errno == ENOMEM)
829
+ return (error_nomem(a));
830
+ return (0);
831
+ }
832
+
833
+ static void
834
+ match_list_init(struct match_list *list)
835
+ {
836
+ list->first = NULL;
837
+ list->last = &(list->first);
838
+ list->count = 0;
839
+ }
840
+
841
+ static void
842
+ match_list_free(struct match_list *list)
843
+ {
844
+ struct match *p, *q;
845
+
846
+ for (p = list->first; p != NULL; ) {
847
+ q = p;
848
+ p = p->next;
849
+ archive_mstring_clean(&(q->pattern));
850
+ free(q);
851
+ }
852
+ }
853
+
854
+ static void
855
+ match_list_add(struct match_list *list, struct match *m)
856
+ {
857
+ *list->last = m;
858
+ list->last = &(m->next);
859
+ list->count++;
860
+ list->unmatched_count++;
861
+ }
862
+
863
+ static int
864
+ match_list_unmatched_inclusions_next(struct archive_match *a,
865
+ struct match_list *list, int mbs, const void **vp)
866
+ {
867
+ struct match *m;
868
+
869
+ *vp = NULL;
870
+ if (list->unmatched_eof) {
871
+ list->unmatched_eof = 0;
872
+ return (ARCHIVE_EOF);
873
+ }
874
+ if (list->unmatched_next == NULL) {
875
+ if (list->unmatched_count == 0)
876
+ return (ARCHIVE_EOF);
877
+ list->unmatched_next = list->first;
878
+ }
879
+
880
+ for (m = list->unmatched_next; m != NULL; m = m->next) {
881
+ int r;
882
+
883
+ if (m->matches)
884
+ continue;
885
+ if (mbs) {
886
+ const char *p;
887
+ r = archive_mstring_get_mbs(&(a->archive),
888
+ &(m->pattern), &p);
889
+ if (r < 0 && errno == ENOMEM)
890
+ return (error_nomem(a));
891
+ if (p == NULL)
892
+ p = "";
893
+ *vp = p;
894
+ } else {
895
+ const wchar_t *p;
896
+ r = archive_mstring_get_wcs(&(a->archive),
897
+ &(m->pattern), &p);
898
+ if (r < 0 && errno == ENOMEM)
899
+ return (error_nomem(a));
900
+ if (p == NULL)
901
+ p = L"";
902
+ *vp = p;
903
+ }
904
+ list->unmatched_next = m->next;
905
+ if (list->unmatched_next == NULL)
906
+ /* To return EOF next time. */
907
+ list->unmatched_eof = 1;
908
+ return (ARCHIVE_OK);
909
+ }
910
+ list->unmatched_next = NULL;
911
+ return (ARCHIVE_EOF);
912
+ }
913
+
914
+ /*
915
+ * Utility functions to manage inclusion timestamps.
916
+ */
917
+ int
918
+ archive_match_include_time(struct archive *_a, int flag, time_t sec,
919
+ long nsec)
920
+ {
921
+ int r;
922
+
923
+ r = validate_time_flag(_a, flag, "archive_match_include_time");
924
+ if (r != ARCHIVE_OK)
925
+ return (r);
926
+ return set_timefilter((struct archive_match *)_a, flag,
927
+ sec, nsec, sec, nsec);
928
+ }
929
+
930
+ int
931
+ archive_match_include_date(struct archive *_a, int flag,
932
+ const char *datestr)
933
+ {
934
+ int r;
935
+
936
+ r = validate_time_flag(_a, flag, "archive_match_include_date");
937
+ if (r != ARCHIVE_OK)
938
+ return (r);
939
+ return set_timefilter_date((struct archive_match *)_a, flag, datestr);
940
+ }
941
+
942
+ int
943
+ archive_match_include_date_w(struct archive *_a, int flag,
944
+ const wchar_t *datestr)
945
+ {
946
+ int r;
947
+
948
+ r = validate_time_flag(_a, flag, "archive_match_include_date_w");
949
+ if (r != ARCHIVE_OK)
950
+ return (r);
951
+
952
+ return set_timefilter_date_w((struct archive_match *)_a, flag, datestr);
953
+ }
954
+
955
+ int
956
+ archive_match_include_file_time(struct archive *_a, int flag,
957
+ const char *pathname)
958
+ {
959
+ int r;
960
+
961
+ r = validate_time_flag(_a, flag, "archive_match_include_file_time");
962
+ if (r != ARCHIVE_OK)
963
+ return (r);
964
+ return set_timefilter_pathname_mbs((struct archive_match *)_a,
965
+ flag, pathname);
966
+ }
967
+
968
+ int
969
+ archive_match_include_file_time_w(struct archive *_a, int flag,
970
+ const wchar_t *pathname)
971
+ {
972
+ int r;
973
+
974
+ r = validate_time_flag(_a, flag, "archive_match_include_file_time_w");
975
+ if (r != ARCHIVE_OK)
976
+ return (r);
977
+ return set_timefilter_pathname_wcs((struct archive_match *)_a,
978
+ flag, pathname);
979
+ }
980
+
981
+ int
982
+ archive_match_exclude_entry(struct archive *_a, int flag,
983
+ struct archive_entry *entry)
984
+ {
985
+ struct archive_match *a;
986
+ int r;
987
+
988
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
989
+ ARCHIVE_STATE_NEW, "archive_match_time_include_entry");
990
+ a = (struct archive_match *)_a;
991
+
992
+ if (entry == NULL) {
993
+ archive_set_error(&(a->archive), EINVAL, "entry is NULL");
994
+ return (ARCHIVE_FAILED);
995
+ }
996
+ r = validate_time_flag(_a, flag, "archive_match_exclude_entry");
997
+ if (r != ARCHIVE_OK)
998
+ return (r);
999
+ return (add_entry(a, flag, entry));
1000
+ }
1001
+
1002
+ /*
1003
+ * Test function for time stamps.
1004
+ *
1005
+ * Returns 1 if archive entry is excluded.
1006
+ * Returns 0 if archive entry is not excluded.
1007
+ * Returns <0 if something error happened.
1008
+ */
1009
+ int
1010
+ archive_match_time_excluded(struct archive *_a,
1011
+ struct archive_entry *entry)
1012
+ {
1013
+ struct archive_match *a;
1014
+
1015
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1016
+ ARCHIVE_STATE_NEW, "archive_match_time_excluded_ae");
1017
+
1018
+ a = (struct archive_match *)_a;
1019
+ if (entry == NULL) {
1020
+ archive_set_error(&(a->archive), EINVAL, "entry is NULL");
1021
+ return (ARCHIVE_FAILED);
1022
+ }
1023
+
1024
+ /* If we don't have inclusion time set at all, the entry is always
1025
+ * not excluded. */
1026
+ if ((a->setflag & TIME_IS_SET) == 0)
1027
+ return (0);
1028
+ return (time_excluded(a, entry));
1029
+ }
1030
+
1031
+ static int
1032
+ validate_time_flag(struct archive *_a, int flag, const char *_fn)
1033
+ {
1034
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1035
+ ARCHIVE_STATE_NEW, _fn);
1036
+
1037
+ /* Check a type of time. */
1038
+ if (flag &
1039
+ ((~(ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME)) & 0xff00)) {
1040
+ archive_set_error(_a, EINVAL, "Invalid time flag");
1041
+ return (ARCHIVE_FAILED);
1042
+ }
1043
+ if ((flag & (ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME)) == 0) {
1044
+ archive_set_error(_a, EINVAL, "No time flag");
1045
+ return (ARCHIVE_FAILED);
1046
+ }
1047
+
1048
+ /* Check a type of comparison. */
1049
+ if (flag &
1050
+ ((~(ARCHIVE_MATCH_NEWER | ARCHIVE_MATCH_OLDER
1051
+ | ARCHIVE_MATCH_EQUAL)) & 0x00ff)) {
1052
+ archive_set_error(_a, EINVAL, "Invalid comparison flag");
1053
+ return (ARCHIVE_FAILED);
1054
+ }
1055
+ if ((flag & (ARCHIVE_MATCH_NEWER | ARCHIVE_MATCH_OLDER
1056
+ | ARCHIVE_MATCH_EQUAL)) == 0) {
1057
+ archive_set_error(_a, EINVAL, "No comparison flag");
1058
+ return (ARCHIVE_FAILED);
1059
+ }
1060
+
1061
+ return (ARCHIVE_OK);
1062
+ }
1063
+
1064
+ #define JUST_EQUAL(t) (((t) & (ARCHIVE_MATCH_EQUAL |\
1065
+ ARCHIVE_MATCH_NEWER | ARCHIVE_MATCH_OLDER)) == ARCHIVE_MATCH_EQUAL)
1066
+ static int
1067
+ set_timefilter(struct archive_match *a, int timetype,
1068
+ time_t mtime_sec, long mtime_nsec, time_t ctime_sec, long ctime_nsec)
1069
+ {
1070
+ if (timetype & ARCHIVE_MATCH_MTIME) {
1071
+ if ((timetype & ARCHIVE_MATCH_NEWER) || JUST_EQUAL(timetype)) {
1072
+ a->newer_mtime_filter = timetype;
1073
+ a->newer_mtime_sec = mtime_sec;
1074
+ a->newer_mtime_nsec = mtime_nsec;
1075
+ a->setflag |= TIME_IS_SET;
1076
+ }
1077
+ if ((timetype & ARCHIVE_MATCH_OLDER) || JUST_EQUAL(timetype)) {
1078
+ a->older_mtime_filter = timetype;
1079
+ a->older_mtime_sec = mtime_sec;
1080
+ a->older_mtime_nsec = mtime_nsec;
1081
+ a->setflag |= TIME_IS_SET;
1082
+ }
1083
+ }
1084
+ if (timetype & ARCHIVE_MATCH_CTIME) {
1085
+ if ((timetype & ARCHIVE_MATCH_NEWER) || JUST_EQUAL(timetype)) {
1086
+ a->newer_ctime_filter = timetype;
1087
+ a->newer_ctime_sec = ctime_sec;
1088
+ a->newer_ctime_nsec = ctime_nsec;
1089
+ a->setflag |= TIME_IS_SET;
1090
+ }
1091
+ if ((timetype & ARCHIVE_MATCH_OLDER) || JUST_EQUAL(timetype)) {
1092
+ a->older_ctime_filter = timetype;
1093
+ a->older_ctime_sec = ctime_sec;
1094
+ a->older_ctime_nsec = ctime_nsec;
1095
+ a->setflag |= TIME_IS_SET;
1096
+ }
1097
+ }
1098
+ return (ARCHIVE_OK);
1099
+ }
1100
+
1101
+ static int
1102
+ set_timefilter_date(struct archive_match *a, int timetype, const char *datestr)
1103
+ {
1104
+ time_t t;
1105
+
1106
+ if (datestr == NULL || *datestr == '\0') {
1107
+ archive_set_error(&(a->archive), EINVAL, "date is empty");
1108
+ return (ARCHIVE_FAILED);
1109
+ }
1110
+ t = get_date(a->now, datestr);
1111
+ if (t == (time_t)-1) {
1112
+ archive_set_error(&(a->archive), EINVAL, "invalid date string");
1113
+ return (ARCHIVE_FAILED);
1114
+ }
1115
+ return set_timefilter(a, timetype, t, 0, t, 0);
1116
+ }
1117
+
1118
+ static int
1119
+ set_timefilter_date_w(struct archive_match *a, int timetype,
1120
+ const wchar_t *datestr)
1121
+ {
1122
+ struct archive_string as;
1123
+ time_t t;
1124
+
1125
+ if (datestr == NULL || *datestr == L'\0') {
1126
+ archive_set_error(&(a->archive), EINVAL, "date is empty");
1127
+ return (ARCHIVE_FAILED);
1128
+ }
1129
+
1130
+ archive_string_init(&as);
1131
+ if (archive_string_append_from_wcs(&as, datestr, wcslen(datestr)) < 0) {
1132
+ archive_string_free(&as);
1133
+ if (errno == ENOMEM)
1134
+ return (error_nomem(a));
1135
+ archive_set_error(&(a->archive), -1,
1136
+ "Failed to convert WCS to MBS");
1137
+ return (ARCHIVE_FAILED);
1138
+ }
1139
+ t = get_date(a->now, as.s);
1140
+ archive_string_free(&as);
1141
+ if (t == (time_t)-1) {
1142
+ archive_set_error(&(a->archive), EINVAL, "invalid date string");
1143
+ return (ARCHIVE_FAILED);
1144
+ }
1145
+ return set_timefilter(a, timetype, t, 0, t, 0);
1146
+ }
1147
+
1148
+ #if defined(_WIN32) && !defined(__CYGWIN__)
1149
+ #define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000)
1150
+ static int
1151
+ set_timefilter_find_data(struct archive_match *a, int timetype,
1152
+ DWORD ftLastWriteTime_dwHighDateTime, DWORD ftLastWriteTime_dwLowDateTime,
1153
+ DWORD ftCreationTime_dwHighDateTime, DWORD ftCreationTime_dwLowDateTime)
1154
+ {
1155
+ ULARGE_INTEGER utc;
1156
+ time_t ctime_sec, mtime_sec;
1157
+ long ctime_ns, mtime_ns;
1158
+
1159
+ utc.HighPart = ftCreationTime_dwHighDateTime;
1160
+ utc.LowPart = ftCreationTime_dwLowDateTime;
1161
+ if (utc.QuadPart >= EPOC_TIME) {
1162
+ utc.QuadPart -= EPOC_TIME;
1163
+ ctime_sec = (time_t)(utc.QuadPart / 10000000);
1164
+ ctime_ns = (long)(utc.QuadPart % 10000000) * 100;
1165
+ } else {
1166
+ ctime_sec = 0;
1167
+ ctime_ns = 0;
1168
+ }
1169
+ utc.HighPart = ftLastWriteTime_dwHighDateTime;
1170
+ utc.LowPart = ftLastWriteTime_dwLowDateTime;
1171
+ if (utc.QuadPart >= EPOC_TIME) {
1172
+ utc.QuadPart -= EPOC_TIME;
1173
+ mtime_sec = (time_t)(utc.QuadPart / 10000000);
1174
+ mtime_ns = (long)(utc.QuadPart % 10000000) * 100;
1175
+ } else {
1176
+ mtime_sec = 0;
1177
+ mtime_ns = 0;
1178
+ }
1179
+ return set_timefilter(a, timetype,
1180
+ mtime_sec, mtime_ns, ctime_sec, ctime_ns);
1181
+ }
1182
+
1183
+ static int
1184
+ set_timefilter_pathname_mbs(struct archive_match *a, int timetype,
1185
+ const char *path)
1186
+ {
1187
+ /* NOTE: stat() on Windows cannot handle nano seconds. */
1188
+ HANDLE h;
1189
+ WIN32_FIND_DATAA d;
1190
+
1191
+ if (path == NULL || *path == '\0') {
1192
+ archive_set_error(&(a->archive), EINVAL, "pathname is empty");
1193
+ return (ARCHIVE_FAILED);
1194
+ }
1195
+ h = FindFirstFileA(path, &d);
1196
+ if (h == INVALID_HANDLE_VALUE) {
1197
+ la_dosmaperr(GetLastError());
1198
+ archive_set_error(&(a->archive), errno,
1199
+ "Failed to FindFirstFileA");
1200
+ return (ARCHIVE_FAILED);
1201
+ }
1202
+ FindClose(h);
1203
+ return set_timefilter_find_data(a, timetype,
1204
+ d.ftLastWriteTime.dwHighDateTime, d.ftLastWriteTime.dwLowDateTime,
1205
+ d.ftCreationTime.dwHighDateTime, d.ftCreationTime.dwLowDateTime);
1206
+ }
1207
+
1208
+ static int
1209
+ set_timefilter_pathname_wcs(struct archive_match *a, int timetype,
1210
+ const wchar_t *path)
1211
+ {
1212
+ HANDLE h;
1213
+ WIN32_FIND_DATAW d;
1214
+
1215
+ if (path == NULL || *path == L'\0') {
1216
+ archive_set_error(&(a->archive), EINVAL, "pathname is empty");
1217
+ return (ARCHIVE_FAILED);
1218
+ }
1219
+ h = FindFirstFileW(path, &d);
1220
+ if (h == INVALID_HANDLE_VALUE) {
1221
+ la_dosmaperr(GetLastError());
1222
+ archive_set_error(&(a->archive), errno,
1223
+ "Failed to FindFirstFile");
1224
+ return (ARCHIVE_FAILED);
1225
+ }
1226
+ FindClose(h);
1227
+ return set_timefilter_find_data(a, timetype,
1228
+ d.ftLastWriteTime.dwHighDateTime, d.ftLastWriteTime.dwLowDateTime,
1229
+ d.ftCreationTime.dwHighDateTime, d.ftCreationTime.dwLowDateTime);
1230
+ }
1231
+
1232
+ #else /* _WIN32 && !__CYGWIN__ */
1233
+
1234
+ static int
1235
+ set_timefilter_stat(struct archive_match *a, int timetype, struct stat *st)
1236
+ {
1237
+ struct archive_entry *ae;
1238
+ time_t ctime_sec, mtime_sec;
1239
+ long ctime_ns, mtime_ns;
1240
+
1241
+ ae = archive_entry_new();
1242
+ if (ae == NULL)
1243
+ return (error_nomem(a));
1244
+ archive_entry_copy_stat(ae, st);
1245
+ ctime_sec = archive_entry_ctime(ae);
1246
+ ctime_ns = archive_entry_ctime_nsec(ae);
1247
+ mtime_sec = archive_entry_mtime(ae);
1248
+ mtime_ns = archive_entry_mtime_nsec(ae);
1249
+ archive_entry_free(ae);
1250
+ return set_timefilter(a, timetype, mtime_sec, mtime_ns,
1251
+ ctime_sec, ctime_ns);
1252
+ }
1253
+
1254
+ static int
1255
+ set_timefilter_pathname_mbs(struct archive_match *a, int timetype,
1256
+ const char *path)
1257
+ {
1258
+ struct stat st;
1259
+
1260
+ if (path == NULL || *path == '\0') {
1261
+ archive_set_error(&(a->archive), EINVAL, "pathname is empty");
1262
+ return (ARCHIVE_FAILED);
1263
+ }
1264
+ if (la_stat(path, &st) != 0) {
1265
+ archive_set_error(&(a->archive), errno, "Failed to stat()");
1266
+ return (ARCHIVE_FAILED);
1267
+ }
1268
+ return (set_timefilter_stat(a, timetype, &st));
1269
+ }
1270
+
1271
+ static int
1272
+ set_timefilter_pathname_wcs(struct archive_match *a, int timetype,
1273
+ const wchar_t *path)
1274
+ {
1275
+ struct archive_string as;
1276
+ int r;
1277
+
1278
+ if (path == NULL || *path == L'\0') {
1279
+ archive_set_error(&(a->archive), EINVAL, "pathname is empty");
1280
+ return (ARCHIVE_FAILED);
1281
+ }
1282
+
1283
+ /* Convert WCS filename to MBS filename. */
1284
+ archive_string_init(&as);
1285
+ if (archive_string_append_from_wcs(&as, path, wcslen(path)) < 0) {
1286
+ archive_string_free(&as);
1287
+ if (errno == ENOMEM)
1288
+ return (error_nomem(a));
1289
+ archive_set_error(&(a->archive), -1,
1290
+ "Failed to convert WCS to MBS");
1291
+ return (ARCHIVE_FAILED);
1292
+ }
1293
+
1294
+ r = set_timefilter_pathname_mbs(a, timetype, as.s);
1295
+ archive_string_free(&as);
1296
+
1297
+ return (r);
1298
+ }
1299
+ #endif /* _WIN32 && !__CYGWIN__ */
1300
+
1301
+ /*
1302
+ * Call back functions for archive_rb.
1303
+ */
1304
+ static int
1305
+ cmp_node_mbs(const struct archive_rb_node *n1,
1306
+ const struct archive_rb_node *n2)
1307
+ {
1308
+ struct match_file *f1 = (struct match_file *)(uintptr_t)n1;
1309
+ struct match_file *f2 = (struct match_file *)(uintptr_t)n2;
1310
+ const char *p1, *p2;
1311
+
1312
+ archive_mstring_get_mbs(NULL, &(f1->pathname), &p1);
1313
+ archive_mstring_get_mbs(NULL, &(f2->pathname), &p2);
1314
+ if (p1 == NULL)
1315
+ return (1);
1316
+ if (p2 == NULL)
1317
+ return (-1);
1318
+ return (strcmp(p1, p2));
1319
+ }
1320
+
1321
+ static int
1322
+ cmp_key_mbs(const struct archive_rb_node *n, const void *key)
1323
+ {
1324
+ struct match_file *f = (struct match_file *)(uintptr_t)n;
1325
+ const char *p;
1326
+
1327
+ archive_mstring_get_mbs(NULL, &(f->pathname), &p);
1328
+ if (p == NULL)
1329
+ return (-1);
1330
+ return (strcmp(p, (const char *)key));
1331
+ }
1332
+
1333
+ static int
1334
+ cmp_node_wcs(const struct archive_rb_node *n1,
1335
+ const struct archive_rb_node *n2)
1336
+ {
1337
+ struct match_file *f1 = (struct match_file *)(uintptr_t)n1;
1338
+ struct match_file *f2 = (struct match_file *)(uintptr_t)n2;
1339
+ const wchar_t *p1, *p2;
1340
+
1341
+ archive_mstring_get_wcs(NULL, &(f1->pathname), &p1);
1342
+ archive_mstring_get_wcs(NULL, &(f2->pathname), &p2);
1343
+ if (p1 == NULL)
1344
+ return (1);
1345
+ if (p2 == NULL)
1346
+ return (-1);
1347
+ return (wcscmp(p1, p2));
1348
+ }
1349
+
1350
+ static int
1351
+ cmp_key_wcs(const struct archive_rb_node *n, const void *key)
1352
+ {
1353
+ struct match_file *f = (struct match_file *)(uintptr_t)n;
1354
+ const wchar_t *p;
1355
+
1356
+ archive_mstring_get_wcs(NULL, &(f->pathname), &p);
1357
+ if (p == NULL)
1358
+ return (-1);
1359
+ return (wcscmp(p, (const wchar_t *)key));
1360
+ }
1361
+
1362
+ static void
1363
+ entry_list_init(struct entry_list *list)
1364
+ {
1365
+ list->first = NULL;
1366
+ list->last = &(list->first);
1367
+ list->count = 0;
1368
+ }
1369
+
1370
+ static void
1371
+ entry_list_free(struct entry_list *list)
1372
+ {
1373
+ struct match_file *p, *q;
1374
+
1375
+ for (p = list->first; p != NULL; ) {
1376
+ q = p;
1377
+ p = p->next;
1378
+ archive_mstring_clean(&(q->pathname));
1379
+ free(q);
1380
+ }
1381
+ }
1382
+
1383
+ static void
1384
+ entry_list_add(struct entry_list *list, struct match_file *file)
1385
+ {
1386
+ *list->last = file;
1387
+ list->last = &(file->next);
1388
+ list->count++;
1389
+ }
1390
+
1391
+ static int
1392
+ add_entry(struct archive_match *a, int flag,
1393
+ struct archive_entry *entry)
1394
+ {
1395
+ struct match_file *f;
1396
+ const void *pathname;
1397
+ int r;
1398
+
1399
+ f = calloc(1, sizeof(*f));
1400
+ if (f == NULL)
1401
+ return (error_nomem(a));
1402
+
1403
+ #if defined(_WIN32) && !defined(__CYGWIN__)
1404
+ pathname = archive_entry_pathname_w(entry);
1405
+ if (pathname == NULL) {
1406
+ free(f);
1407
+ archive_set_error(&(a->archive), EINVAL, "pathname is NULL");
1408
+ return (ARCHIVE_FAILED);
1409
+ }
1410
+ archive_mstring_copy_wcs(&(f->pathname), pathname);
1411
+ a->exclusion_tree.rbt_ops = &rb_ops_wcs;
1412
+ #else
1413
+ (void)rb_ops_wcs;
1414
+ pathname = archive_entry_pathname(entry);
1415
+ if (pathname == NULL) {
1416
+ free(f);
1417
+ archive_set_error(&(a->archive), EINVAL, "pathname is NULL");
1418
+ return (ARCHIVE_FAILED);
1419
+ }
1420
+ archive_mstring_copy_mbs(&(f->pathname), pathname);
1421
+ a->exclusion_tree.rbt_ops = &rb_ops_mbs;
1422
+ #endif
1423
+ f->flag = flag;
1424
+ f->mtime_sec = archive_entry_mtime(entry);
1425
+ f->mtime_nsec = archive_entry_mtime_nsec(entry);
1426
+ f->ctime_sec = archive_entry_ctime(entry);
1427
+ f->ctime_nsec = archive_entry_ctime_nsec(entry);
1428
+ r = __archive_rb_tree_insert_node(&(a->exclusion_tree), &(f->node));
1429
+ if (!r) {
1430
+ struct match_file *f2;
1431
+
1432
+ /* Get the duplicated file. */
1433
+ f2 = (struct match_file *)__archive_rb_tree_find_node(
1434
+ &(a->exclusion_tree), pathname);
1435
+
1436
+ /*
1437
+ * We always overwrite comparison condition.
1438
+ * If you do not want to overwrite it, you should not
1439
+ * call archive_match_exclude_entry(). We cannot know
1440
+ * what behavior you really expect since overwriting
1441
+ * condition might be different with the flag.
1442
+ */
1443
+ if (f2 != NULL) {
1444
+ f2->flag = f->flag;
1445
+ f2->mtime_sec = f->mtime_sec;
1446
+ f2->mtime_nsec = f->mtime_nsec;
1447
+ f2->ctime_sec = f->ctime_sec;
1448
+ f2->ctime_nsec = f->ctime_nsec;
1449
+ }
1450
+ /* Release the duplicated file. */
1451
+ archive_mstring_clean(&(f->pathname));
1452
+ free(f);
1453
+ return (ARCHIVE_OK);
1454
+ }
1455
+ entry_list_add(&(a->exclusion_entry_list), f);
1456
+ a->setflag |= TIME_IS_SET;
1457
+ return (ARCHIVE_OK);
1458
+ }
1459
+
1460
+ /*
1461
+ * Test if entry is excluded by its timestamp.
1462
+ */
1463
+ static int
1464
+ time_excluded(struct archive_match *a, struct archive_entry *entry)
1465
+ {
1466
+ struct match_file *f;
1467
+ const void *pathname;
1468
+ time_t sec;
1469
+ long nsec;
1470
+
1471
+ /*
1472
+ * If this file/dir is excluded by a time comparison, skip it.
1473
+ */
1474
+ if (a->newer_ctime_filter) {
1475
+ /* If ctime is not set, use mtime instead. */
1476
+ if (archive_entry_ctime_is_set(entry))
1477
+ sec = archive_entry_ctime(entry);
1478
+ else
1479
+ sec = archive_entry_mtime(entry);
1480
+ if (sec < a->newer_ctime_sec)
1481
+ return (1); /* Too old, skip it. */
1482
+ if (sec == a->newer_ctime_sec) {
1483
+ if (archive_entry_ctime_is_set(entry))
1484
+ nsec = archive_entry_ctime_nsec(entry);
1485
+ else
1486
+ nsec = archive_entry_mtime_nsec(entry);
1487
+ if (nsec < a->newer_ctime_nsec)
1488
+ return (1); /* Too old, skip it. */
1489
+ if (nsec == a->newer_ctime_nsec &&
1490
+ (a->newer_ctime_filter & ARCHIVE_MATCH_EQUAL)
1491
+ == 0)
1492
+ return (1); /* Equal, skip it. */
1493
+ }
1494
+ }
1495
+ if (a->older_ctime_filter) {
1496
+ /* If ctime is not set, use mtime instead. */
1497
+ if (archive_entry_ctime_is_set(entry))
1498
+ sec = archive_entry_ctime(entry);
1499
+ else
1500
+ sec = archive_entry_mtime(entry);
1501
+ if (sec > a->older_ctime_sec)
1502
+ return (1); /* Too new, skip it. */
1503
+ if (sec == a->older_ctime_sec) {
1504
+ if (archive_entry_ctime_is_set(entry))
1505
+ nsec = archive_entry_ctime_nsec(entry);
1506
+ else
1507
+ nsec = archive_entry_mtime_nsec(entry);
1508
+ if (nsec > a->older_ctime_nsec)
1509
+ return (1); /* Too new, skip it. */
1510
+ if (nsec == a->older_ctime_nsec &&
1511
+ (a->older_ctime_filter & ARCHIVE_MATCH_EQUAL)
1512
+ == 0)
1513
+ return (1); /* Equal, skip it. */
1514
+ }
1515
+ }
1516
+ if (a->newer_mtime_filter) {
1517
+ sec = archive_entry_mtime(entry);
1518
+ if (sec < a->newer_mtime_sec)
1519
+ return (1); /* Too old, skip it. */
1520
+ if (sec == a->newer_mtime_sec) {
1521
+ nsec = archive_entry_mtime_nsec(entry);
1522
+ if (nsec < a->newer_mtime_nsec)
1523
+ return (1); /* Too old, skip it. */
1524
+ if (nsec == a->newer_mtime_nsec &&
1525
+ (a->newer_mtime_filter & ARCHIVE_MATCH_EQUAL)
1526
+ == 0)
1527
+ return (1); /* Equal, skip it. */
1528
+ }
1529
+ }
1530
+ if (a->older_mtime_filter) {
1531
+ sec = archive_entry_mtime(entry);
1532
+ if (sec > a->older_mtime_sec)
1533
+ return (1); /* Too new, skip it. */
1534
+ nsec = archive_entry_mtime_nsec(entry);
1535
+ if (sec == a->older_mtime_sec) {
1536
+ if (nsec > a->older_mtime_nsec)
1537
+ return (1); /* Too new, skip it. */
1538
+ if (nsec == a->older_mtime_nsec &&
1539
+ (a->older_mtime_filter & ARCHIVE_MATCH_EQUAL)
1540
+ == 0)
1541
+ return (1); /* Equal, skip it. */
1542
+ }
1543
+ }
1544
+
1545
+ /* If there is no exclusion list, include the file. */
1546
+ if (a->exclusion_entry_list.count == 0)
1547
+ return (0);
1548
+
1549
+ #if defined(_WIN32) && !defined(__CYGWIN__)
1550
+ pathname = archive_entry_pathname_w(entry);
1551
+ a->exclusion_tree.rbt_ops = &rb_ops_wcs;
1552
+ #else
1553
+ (void)rb_ops_wcs;
1554
+ pathname = archive_entry_pathname(entry);
1555
+ a->exclusion_tree.rbt_ops = &rb_ops_mbs;
1556
+ #endif
1557
+ if (pathname == NULL)
1558
+ return (0);
1559
+
1560
+ f = (struct match_file *)__archive_rb_tree_find_node(
1561
+ &(a->exclusion_tree), pathname);
1562
+ /* If the file wasn't rejected, include it. */
1563
+ if (f == NULL)
1564
+ return (0);
1565
+
1566
+ if (f->flag & ARCHIVE_MATCH_CTIME) {
1567
+ sec = archive_entry_ctime(entry);
1568
+ if (f->ctime_sec > sec) {
1569
+ if (f->flag & ARCHIVE_MATCH_OLDER)
1570
+ return (1);
1571
+ } else if (f->ctime_sec < sec) {
1572
+ if (f->flag & ARCHIVE_MATCH_NEWER)
1573
+ return (1);
1574
+ } else {
1575
+ nsec = archive_entry_ctime_nsec(entry);
1576
+ if (f->ctime_nsec > nsec) {
1577
+ if (f->flag & ARCHIVE_MATCH_OLDER)
1578
+ return (1);
1579
+ } else if (f->ctime_nsec < nsec) {
1580
+ if (f->flag & ARCHIVE_MATCH_NEWER)
1581
+ return (1);
1582
+ } else if (f->flag & ARCHIVE_MATCH_EQUAL)
1583
+ return (1);
1584
+ }
1585
+ }
1586
+ if (f->flag & ARCHIVE_MATCH_MTIME) {
1587
+ sec = archive_entry_mtime(entry);
1588
+ if (f->mtime_sec > sec) {
1589
+ if (f->flag & ARCHIVE_MATCH_OLDER)
1590
+ return (1);
1591
+ } else if (f->mtime_sec < sec) {
1592
+ if (f->flag & ARCHIVE_MATCH_NEWER)
1593
+ return (1);
1594
+ } else {
1595
+ nsec = archive_entry_mtime_nsec(entry);
1596
+ if (f->mtime_nsec > nsec) {
1597
+ if (f->flag & ARCHIVE_MATCH_OLDER)
1598
+ return (1);
1599
+ } else if (f->mtime_nsec < nsec) {
1600
+ if (f->flag & ARCHIVE_MATCH_NEWER)
1601
+ return (1);
1602
+ } else if (f->flag & ARCHIVE_MATCH_EQUAL)
1603
+ return (1);
1604
+ }
1605
+ }
1606
+ return (0);
1607
+ }
1608
+
1609
+ /*
1610
+ * Utility functions to manage inclusion owners
1611
+ */
1612
+
1613
+ int
1614
+ archive_match_include_uid(struct archive *_a, la_int64_t uid)
1615
+ {
1616
+ struct archive_match *a;
1617
+
1618
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1619
+ ARCHIVE_STATE_NEW, "archive_match_include_uid");
1620
+ a = (struct archive_match *)_a;
1621
+ return (add_owner_id(a, &(a->inclusion_uids), uid));
1622
+ }
1623
+
1624
+ int
1625
+ archive_match_include_gid(struct archive *_a, la_int64_t gid)
1626
+ {
1627
+ struct archive_match *a;
1628
+
1629
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1630
+ ARCHIVE_STATE_NEW, "archive_match_include_gid");
1631
+ a = (struct archive_match *)_a;
1632
+ return (add_owner_id(a, &(a->inclusion_gids), gid));
1633
+ }
1634
+
1635
+ int
1636
+ archive_match_include_uname(struct archive *_a, const char *uname)
1637
+ {
1638
+ struct archive_match *a;
1639
+
1640
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1641
+ ARCHIVE_STATE_NEW, "archive_match_include_uname");
1642
+ a = (struct archive_match *)_a;
1643
+ return (add_owner_name(a, &(a->inclusion_unames), 1, uname));
1644
+ }
1645
+
1646
+ int
1647
+ archive_match_include_uname_w(struct archive *_a, const wchar_t *uname)
1648
+ {
1649
+ struct archive_match *a;
1650
+
1651
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1652
+ ARCHIVE_STATE_NEW, "archive_match_include_uname_w");
1653
+ a = (struct archive_match *)_a;
1654
+ return (add_owner_name(a, &(a->inclusion_unames), 0, uname));
1655
+ }
1656
+
1657
+ int
1658
+ archive_match_include_gname(struct archive *_a, const char *gname)
1659
+ {
1660
+ struct archive_match *a;
1661
+
1662
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1663
+ ARCHIVE_STATE_NEW, "archive_match_include_gname");
1664
+ a = (struct archive_match *)_a;
1665
+ return (add_owner_name(a, &(a->inclusion_gnames), 1, gname));
1666
+ }
1667
+
1668
+ int
1669
+ archive_match_include_gname_w(struct archive *_a, const wchar_t *gname)
1670
+ {
1671
+ struct archive_match *a;
1672
+
1673
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1674
+ ARCHIVE_STATE_NEW, "archive_match_include_gname_w");
1675
+ a = (struct archive_match *)_a;
1676
+ return (add_owner_name(a, &(a->inclusion_gnames), 0, gname));
1677
+ }
1678
+
1679
+ /*
1680
+ * Test function for owner(uid, gid, uname, gname).
1681
+ *
1682
+ * Returns 1 if archive entry is excluded.
1683
+ * Returns 0 if archive entry is not excluded.
1684
+ * Returns <0 if something error happened.
1685
+ */
1686
+ int
1687
+ archive_match_owner_excluded(struct archive *_a,
1688
+ struct archive_entry *entry)
1689
+ {
1690
+ struct archive_match *a;
1691
+
1692
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
1693
+ ARCHIVE_STATE_NEW, "archive_match_id_excluded_ae");
1694
+
1695
+ a = (struct archive_match *)_a;
1696
+ if (entry == NULL) {
1697
+ archive_set_error(&(a->archive), EINVAL, "entry is NULL");
1698
+ return (ARCHIVE_FAILED);
1699
+ }
1700
+
1701
+ /* If we don't have inclusion id set at all, the entry is always
1702
+ * not excluded. */
1703
+ if ((a->setflag & ID_IS_SET) == 0)
1704
+ return (0);
1705
+ return (owner_excluded(a, entry));
1706
+ }
1707
+
1708
+ static int
1709
+ add_owner_id(struct archive_match *a, struct id_array *ids, int64_t id)
1710
+ {
1711
+ unsigned i;
1712
+
1713
+ if (ids->count + 1 >= ids->size) {
1714
+ void *p;
1715
+
1716
+ if (ids->size == 0)
1717
+ ids->size = 8;
1718
+ else
1719
+ ids->size *= 2;
1720
+ p = realloc(ids->ids, sizeof(*ids->ids) * ids->size);
1721
+ if (p == NULL)
1722
+ return (error_nomem(a));
1723
+ ids->ids = (int64_t *)p;
1724
+ }
1725
+
1726
+ /* Find an insert point. */
1727
+ for (i = 0; i < ids->count; i++) {
1728
+ if (ids->ids[i] >= id)
1729
+ break;
1730
+ }
1731
+
1732
+ /* Add owner id. */
1733
+ if (i == ids->count)
1734
+ ids->ids[ids->count++] = id;
1735
+ else if (ids->ids[i] != id) {
1736
+ memmove(&(ids->ids[i+1]), &(ids->ids[i]),
1737
+ (ids->count - i) * sizeof(ids->ids[0]));
1738
+ ids->ids[i] = id;
1739
+ ids->count++;
1740
+ }
1741
+ a->setflag |= ID_IS_SET;
1742
+ return (ARCHIVE_OK);
1743
+ }
1744
+
1745
+ static int
1746
+ match_owner_id(struct id_array *ids, int64_t id)
1747
+ {
1748
+ unsigned b, m, t;
1749
+
1750
+ t = 0;
1751
+ b = (unsigned)ids->count;
1752
+ while (t < b) {
1753
+ m = (t + b)>>1;
1754
+ if (ids->ids[m] == id)
1755
+ return (1);
1756
+ if (ids->ids[m] < id)
1757
+ t = m + 1;
1758
+ else
1759
+ b = m;
1760
+ }
1761
+ return (0);
1762
+ }
1763
+
1764
+ static int
1765
+ add_owner_name(struct archive_match *a, struct match_list *list,
1766
+ int mbs, const void *name)
1767
+ {
1768
+ struct match *match;
1769
+
1770
+ match = calloc(1, sizeof(*match));
1771
+ if (match == NULL)
1772
+ return (error_nomem(a));
1773
+ if (mbs)
1774
+ archive_mstring_copy_mbs(&(match->pattern), name);
1775
+ else
1776
+ archive_mstring_copy_wcs(&(match->pattern), name);
1777
+ match_list_add(list, match);
1778
+ a->setflag |= ID_IS_SET;
1779
+ return (ARCHIVE_OK);
1780
+ }
1781
+
1782
+ #if !defined(_WIN32) || defined(__CYGWIN__)
1783
+ static int
1784
+ match_owner_name_mbs(struct archive_match *a, struct match_list *list,
1785
+ const char *name)
1786
+ {
1787
+ struct match *m;
1788
+ const char *p;
1789
+
1790
+ if (name == NULL || *name == '\0')
1791
+ return (0);
1792
+ for (m = list->first; m; m = m->next) {
1793
+ if (archive_mstring_get_mbs(&(a->archive), &(m->pattern), &p)
1794
+ < 0 && errno == ENOMEM)
1795
+ return (error_nomem(a));
1796
+ if (p != NULL && strcmp(p, name) == 0) {
1797
+ m->matches++;
1798
+ return (1);
1799
+ }
1800
+ }
1801
+ return (0);
1802
+ }
1803
+ #else
1804
+ static int
1805
+ match_owner_name_wcs(struct archive_match *a, struct match_list *list,
1806
+ const wchar_t *name)
1807
+ {
1808
+ struct match *m;
1809
+ const wchar_t *p;
1810
+
1811
+ if (name == NULL || *name == L'\0')
1812
+ return (0);
1813
+ for (m = list->first; m; m = m->next) {
1814
+ if (archive_mstring_get_wcs(&(a->archive), &(m->pattern), &p)
1815
+ < 0 && errno == ENOMEM)
1816
+ return (error_nomem(a));
1817
+ if (p != NULL && wcscmp(p, name) == 0) {
1818
+ m->matches++;
1819
+ return (1);
1820
+ }
1821
+ }
1822
+ return (0);
1823
+ }
1824
+ #endif
1825
+
1826
+ /*
1827
+ * Test if entry is excluded by uid, gid, uname or gname.
1828
+ */
1829
+ static int
1830
+ owner_excluded(struct archive_match *a, struct archive_entry *entry)
1831
+ {
1832
+ int r;
1833
+
1834
+ if (a->inclusion_uids.count) {
1835
+ if (!match_owner_id(&(a->inclusion_uids),
1836
+ archive_entry_uid(entry)))
1837
+ return (1);
1838
+ }
1839
+
1840
+ if (a->inclusion_gids.count) {
1841
+ if (!match_owner_id(&(a->inclusion_gids),
1842
+ archive_entry_gid(entry)))
1843
+ return (1);
1844
+ }
1845
+
1846
+ if (a->inclusion_unames.count) {
1847
+ #if defined(_WIN32) && !defined(__CYGWIN__)
1848
+ r = match_owner_name_wcs(a, &(a->inclusion_unames),
1849
+ archive_entry_uname_w(entry));
1850
+ #else
1851
+ r = match_owner_name_mbs(a, &(a->inclusion_unames),
1852
+ archive_entry_uname(entry));
1853
+ #endif
1854
+ if (!r)
1855
+ return (1);
1856
+ else if (r < 0)
1857
+ return (r);
1858
+ }
1859
+
1860
+ if (a->inclusion_gnames.count) {
1861
+ #if defined(_WIN32) && !defined(__CYGWIN__)
1862
+ r = match_owner_name_wcs(a, &(a->inclusion_gnames),
1863
+ archive_entry_gname_w(entry));
1864
+ #else
1865
+ r = match_owner_name_mbs(a, &(a->inclusion_gnames),
1866
+ archive_entry_gname(entry));
1867
+ #endif
1868
+ if (!r)
1869
+ return (1);
1870
+ else if (r < 0)
1871
+ return (r);
1872
+ }
1873
+ return (0);
1874
+ }
1875
+