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,2149 @@
1
+ /*-
2
+ * Copyright (c) 2003-2007 Tim Kientzle
3
+ * Copyright (c) 2016 Martin Matuska
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: head/lib/libarchive/archive_entry.c 201096 2009-12-28 02:41:27Z kientzle $");
29
+
30
+ #ifdef HAVE_SYS_STAT_H
31
+ #include <sys/stat.h>
32
+ #endif
33
+ #ifdef HAVE_SYS_TYPES_H
34
+ #include <sys/types.h>
35
+ #endif
36
+ #if MAJOR_IN_MKDEV
37
+ #include <sys/mkdev.h>
38
+ #define HAVE_MAJOR
39
+ #elif MAJOR_IN_SYSMACROS
40
+ #include <sys/sysmacros.h>
41
+ #define HAVE_MAJOR
42
+ #endif
43
+ #ifdef HAVE_ERRNO_H
44
+ #include <errno.h>
45
+ #endif
46
+ #ifdef HAVE_LIMITS_H
47
+ #include <limits.h>
48
+ #endif
49
+ #ifdef HAVE_LINUX_FS_H
50
+ #include <linux/fs.h> /* for Linux file flags */
51
+ #endif
52
+ /*
53
+ * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h.
54
+ * As the include guards don't agree, the order of include is important.
55
+ */
56
+ #ifdef HAVE_LINUX_EXT2_FS_H
57
+ #include <linux/ext2_fs.h> /* for Linux file flags */
58
+ #endif
59
+ #if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__)
60
+ #include <ext2fs/ext2_fs.h> /* for Linux file flags */
61
+ #endif
62
+ #include <stddef.h>
63
+ #include <stdio.h>
64
+ #ifdef HAVE_STDLIB_H
65
+ #include <stdlib.h>
66
+ #endif
67
+ #ifdef HAVE_STRING_H
68
+ #include <string.h>
69
+ #endif
70
+ #ifdef HAVE_WCHAR_H
71
+ #include <wchar.h>
72
+ #endif
73
+
74
+ #include "archive.h"
75
+ #include "archive_acl_private.h"
76
+ #include "archive_entry.h"
77
+ #include "archive_entry_locale.h"
78
+ #include "archive_private.h"
79
+ #include "archive_entry_private.h"
80
+
81
+ #if !defined(HAVE_MAJOR) && !defined(major)
82
+ /* Replacement for major/minor/makedev. */
83
+ #define major(x) ((int)(0x00ff & ((x) >> 8)))
84
+ #define minor(x) ((int)(0xffff00ff & (x)))
85
+ #define makedev(maj,min) ((0xff00 & ((maj)<<8)) | (0xffff00ff & (min)))
86
+ #endif
87
+
88
+ /* Play games to come up with a suitable makedev() definition. */
89
+ #ifdef __QNXNTO__
90
+ /* QNX. <sigh> */
91
+ #include <sys/netmgr.h>
92
+ #define ae_makedev(maj, min) makedev(ND_LOCAL_NODE, (maj), (min))
93
+ #elif defined makedev
94
+ /* There's a "makedev" macro. */
95
+ #define ae_makedev(maj, min) makedev((maj), (min))
96
+ #elif defined mkdev || ((defined _WIN32 || defined __WIN32__) && !defined(__CYGWIN__))
97
+ /* Windows. <sigh> */
98
+ #define ae_makedev(maj, min) mkdev((maj), (min))
99
+ #else
100
+ /* There's a "makedev" function. */
101
+ #define ae_makedev(maj, min) makedev((maj), (min))
102
+ #endif
103
+
104
+ /*
105
+ * This adjustment is needed to support the following idiom for adding
106
+ * 1000ns to the stored time:
107
+ * archive_entry_set_atime(archive_entry_atime(),
108
+ * archive_entry_atime_nsec() + 1000)
109
+ * The additional if() here compensates for ambiguity in the C standard,
110
+ * which permits two possible interpretations of a % b when a is negative.
111
+ */
112
+ #define FIX_NS(t,ns) \
113
+ do { \
114
+ t += ns / 1000000000; \
115
+ ns %= 1000000000; \
116
+ if (ns < 0) { --t; ns += 1000000000; } \
117
+ } while (0)
118
+
119
+ static char * ae_fflagstostr(unsigned long bitset, unsigned long bitclear);
120
+ static const wchar_t *ae_wcstofflags(const wchar_t *stringp,
121
+ unsigned long *setp, unsigned long *clrp);
122
+ static const char *ae_strtofflags(const char *stringp,
123
+ unsigned long *setp, unsigned long *clrp);
124
+
125
+ #ifndef HAVE_WCSCPY
126
+ static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2)
127
+ {
128
+ wchar_t *dest = s1;
129
+ while ((*s1 = *s2) != L'\0')
130
+ ++s1, ++s2;
131
+ return dest;
132
+ }
133
+ #endif
134
+ #ifndef HAVE_WCSLEN
135
+ static size_t wcslen(const wchar_t *s)
136
+ {
137
+ const wchar_t *p = s;
138
+ while (*p != L'\0')
139
+ ++p;
140
+ return p - s;
141
+ }
142
+ #endif
143
+ #ifndef HAVE_WMEMCMP
144
+ /* Good enough for simple equality testing, but not for sorting. */
145
+ #define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(wchar_t))
146
+ #endif
147
+
148
+ /****************************************************************************
149
+ *
150
+ * Public Interface
151
+ *
152
+ ****************************************************************************/
153
+
154
+ struct archive_entry *
155
+ archive_entry_clear(struct archive_entry *entry)
156
+ {
157
+ if (entry == NULL)
158
+ return (NULL);
159
+ archive_mstring_clean(&entry->ae_fflags_text);
160
+ archive_mstring_clean(&entry->ae_gname);
161
+ archive_mstring_clean(&entry->ae_hardlink);
162
+ archive_mstring_clean(&entry->ae_pathname);
163
+ archive_mstring_clean(&entry->ae_sourcepath);
164
+ archive_mstring_clean(&entry->ae_symlink);
165
+ archive_mstring_clean(&entry->ae_uname);
166
+ archive_entry_copy_mac_metadata(entry, NULL, 0);
167
+ archive_acl_clear(&entry->acl);
168
+ archive_entry_xattr_clear(entry);
169
+ archive_entry_sparse_clear(entry);
170
+ free(entry->stat);
171
+ entry->ae_symlink_type = AE_SYMLINK_TYPE_UNDEFINED;
172
+ memset(entry, 0, sizeof(*entry));
173
+ return entry;
174
+ }
175
+
176
+ struct archive_entry *
177
+ archive_entry_clone(struct archive_entry *entry)
178
+ {
179
+ struct archive_entry *entry2;
180
+ struct ae_xattr *xp;
181
+ struct ae_sparse *sp;
182
+ size_t s;
183
+ const void *p;
184
+
185
+ /* Allocate new structure and copy over all of the fields. */
186
+ /* TODO: Should we copy the archive over? Or require a new archive
187
+ * as an argument? */
188
+ entry2 = archive_entry_new2(entry->archive);
189
+ if (entry2 == NULL)
190
+ return (NULL);
191
+ entry2->ae_stat = entry->ae_stat;
192
+ entry2->ae_fflags_set = entry->ae_fflags_set;
193
+ entry2->ae_fflags_clear = entry->ae_fflags_clear;
194
+
195
+ /* TODO: XXX If clone can have a different archive, what do we do here if
196
+ * character sets are different? XXX */
197
+ archive_mstring_copy(&entry2->ae_fflags_text, &entry->ae_fflags_text);
198
+ archive_mstring_copy(&entry2->ae_gname, &entry->ae_gname);
199
+ archive_mstring_copy(&entry2->ae_hardlink, &entry->ae_hardlink);
200
+ archive_mstring_copy(&entry2->ae_pathname, &entry->ae_pathname);
201
+ archive_mstring_copy(&entry2->ae_sourcepath, &entry->ae_sourcepath);
202
+ archive_mstring_copy(&entry2->ae_symlink, &entry->ae_symlink);
203
+ entry2->ae_set = entry->ae_set;
204
+ archive_mstring_copy(&entry2->ae_uname, &entry->ae_uname);
205
+
206
+ /* Copy symlink type */
207
+ entry2->ae_symlink_type = entry->ae_symlink_type;
208
+
209
+ /* Copy encryption status */
210
+ entry2->encryption = entry->encryption;
211
+
212
+ /* Copy digests */
213
+ #define copy_digest(_e2, _e, _t) \
214
+ memcpy(_e2->digest._t, _e->digest._t, sizeof(_e2->digest._t))
215
+
216
+ copy_digest(entry2, entry, md5);
217
+ copy_digest(entry2, entry, rmd160);
218
+ copy_digest(entry2, entry, sha1);
219
+ copy_digest(entry2, entry, sha256);
220
+ copy_digest(entry2, entry, sha384);
221
+ copy_digest(entry2, entry, sha512);
222
+
223
+ #undef copy_digest
224
+
225
+ /* Copy ACL data over. */
226
+ archive_acl_copy(&entry2->acl, &entry->acl);
227
+
228
+ /* Copy Mac OS metadata. */
229
+ p = archive_entry_mac_metadata(entry, &s);
230
+ archive_entry_copy_mac_metadata(entry2, p, s);
231
+
232
+ /* Copy xattr data over. */
233
+ xp = entry->xattr_head;
234
+ while (xp != NULL) {
235
+ archive_entry_xattr_add_entry(entry2,
236
+ xp->name, xp->value, xp->size);
237
+ xp = xp->next;
238
+ }
239
+
240
+ /* Copy sparse data over. */
241
+ sp = entry->sparse_head;
242
+ while (sp != NULL) {
243
+ archive_entry_sparse_add_entry(entry2,
244
+ sp->offset, sp->length);
245
+ sp = sp->next;
246
+ }
247
+
248
+ return (entry2);
249
+ }
250
+
251
+ void
252
+ archive_entry_free(struct archive_entry *entry)
253
+ {
254
+ archive_entry_clear(entry);
255
+ free(entry);
256
+ }
257
+
258
+ struct archive_entry *
259
+ archive_entry_new(void)
260
+ {
261
+ return archive_entry_new2(NULL);
262
+ }
263
+
264
+ struct archive_entry *
265
+ archive_entry_new2(struct archive *a)
266
+ {
267
+ struct archive_entry *entry;
268
+
269
+ entry = (struct archive_entry *)calloc(1, sizeof(*entry));
270
+ if (entry == NULL)
271
+ return (NULL);
272
+ entry->archive = a;
273
+ entry->ae_symlink_type = AE_SYMLINK_TYPE_UNDEFINED;
274
+ return (entry);
275
+ }
276
+
277
+ /*
278
+ * Functions for reading fields from an archive_entry.
279
+ */
280
+
281
+ time_t
282
+ archive_entry_atime(struct archive_entry *entry)
283
+ {
284
+ return (entry->ae_stat.aest_atime);
285
+ }
286
+
287
+ long
288
+ archive_entry_atime_nsec(struct archive_entry *entry)
289
+ {
290
+ return (entry->ae_stat.aest_atime_nsec);
291
+ }
292
+
293
+ int
294
+ archive_entry_atime_is_set(struct archive_entry *entry)
295
+ {
296
+ return (entry->ae_set & AE_SET_ATIME);
297
+ }
298
+
299
+ time_t
300
+ archive_entry_birthtime(struct archive_entry *entry)
301
+ {
302
+ return (entry->ae_stat.aest_birthtime);
303
+ }
304
+
305
+ long
306
+ archive_entry_birthtime_nsec(struct archive_entry *entry)
307
+ {
308
+ return (entry->ae_stat.aest_birthtime_nsec);
309
+ }
310
+
311
+ int
312
+ archive_entry_birthtime_is_set(struct archive_entry *entry)
313
+ {
314
+ return (entry->ae_set & AE_SET_BIRTHTIME);
315
+ }
316
+
317
+ time_t
318
+ archive_entry_ctime(struct archive_entry *entry)
319
+ {
320
+ return (entry->ae_stat.aest_ctime);
321
+ }
322
+
323
+ int
324
+ archive_entry_ctime_is_set(struct archive_entry *entry)
325
+ {
326
+ return (entry->ae_set & AE_SET_CTIME);
327
+ }
328
+
329
+ long
330
+ archive_entry_ctime_nsec(struct archive_entry *entry)
331
+ {
332
+ return (entry->ae_stat.aest_ctime_nsec);
333
+ }
334
+
335
+ dev_t
336
+ archive_entry_dev(struct archive_entry *entry)
337
+ {
338
+ if (entry->ae_stat.aest_dev_is_broken_down)
339
+ return ae_makedev(entry->ae_stat.aest_devmajor,
340
+ entry->ae_stat.aest_devminor);
341
+ else
342
+ return (entry->ae_stat.aest_dev);
343
+ }
344
+
345
+ int
346
+ archive_entry_dev_is_set(struct archive_entry *entry)
347
+ {
348
+ return (entry->ae_set & AE_SET_DEV);
349
+ }
350
+
351
+ dev_t
352
+ archive_entry_devmajor(struct archive_entry *entry)
353
+ {
354
+ if (entry->ae_stat.aest_dev_is_broken_down)
355
+ return (entry->ae_stat.aest_devmajor);
356
+ else
357
+ return major(entry->ae_stat.aest_dev);
358
+ }
359
+
360
+ dev_t
361
+ archive_entry_devminor(struct archive_entry *entry)
362
+ {
363
+ if (entry->ae_stat.aest_dev_is_broken_down)
364
+ return (entry->ae_stat.aest_devminor);
365
+ else
366
+ return minor(entry->ae_stat.aest_dev);
367
+ }
368
+
369
+ __LA_MODE_T
370
+ archive_entry_filetype(struct archive_entry *entry)
371
+ {
372
+ return (AE_IFMT & entry->acl.mode);
373
+ }
374
+
375
+ void
376
+ archive_entry_fflags(struct archive_entry *entry,
377
+ unsigned long *set, unsigned long *clear)
378
+ {
379
+ *set = entry->ae_fflags_set;
380
+ *clear = entry->ae_fflags_clear;
381
+ }
382
+
383
+ /*
384
+ * Note: if text was provided, this just returns that text. If you
385
+ * really need the text to be rebuilt in a canonical form, set the
386
+ * text, ask for the bitmaps, then set the bitmaps. (Setting the
387
+ * bitmaps clears any stored text.) This design is deliberate: if
388
+ * we're editing archives, we don't want to discard flags just because
389
+ * they aren't supported on the current system. The bitmap<->text
390
+ * conversions are platform-specific (see below).
391
+ */
392
+ const char *
393
+ archive_entry_fflags_text(struct archive_entry *entry)
394
+ {
395
+ const char *f;
396
+ char *p;
397
+
398
+ if (archive_mstring_get_mbs(entry->archive,
399
+ &entry->ae_fflags_text, &f) == 0) {
400
+ if (f != NULL)
401
+ return (f);
402
+ } else if (errno == ENOMEM)
403
+ __archive_errx(1, "No memory");
404
+
405
+ if (entry->ae_fflags_set == 0 && entry->ae_fflags_clear == 0)
406
+ return (NULL);
407
+
408
+ p = ae_fflagstostr(entry->ae_fflags_set, entry->ae_fflags_clear);
409
+ if (p == NULL)
410
+ return (NULL);
411
+
412
+ archive_mstring_copy_mbs(&entry->ae_fflags_text, p);
413
+ free(p);
414
+ if (archive_mstring_get_mbs(entry->archive,
415
+ &entry->ae_fflags_text, &f) == 0)
416
+ return (f);
417
+ if (errno == ENOMEM)
418
+ __archive_errx(1, "No memory");
419
+ return (NULL);
420
+ }
421
+
422
+ la_int64_t
423
+ archive_entry_gid(struct archive_entry *entry)
424
+ {
425
+ return (entry->ae_stat.aest_gid);
426
+ }
427
+
428
+ const char *
429
+ archive_entry_gname(struct archive_entry *entry)
430
+ {
431
+ const char *p;
432
+ if (archive_mstring_get_mbs(entry->archive, &entry->ae_gname, &p) == 0)
433
+ return (p);
434
+ if (errno == ENOMEM)
435
+ __archive_errx(1, "No memory");
436
+ return (NULL);
437
+ }
438
+
439
+ const char *
440
+ archive_entry_gname_utf8(struct archive_entry *entry)
441
+ {
442
+ const char *p;
443
+ if (archive_mstring_get_utf8(entry->archive, &entry->ae_gname, &p) == 0)
444
+ return (p);
445
+ if (errno == ENOMEM)
446
+ __archive_errx(1, "No memory");
447
+ return (NULL);
448
+ }
449
+
450
+
451
+ const wchar_t *
452
+ archive_entry_gname_w(struct archive_entry *entry)
453
+ {
454
+ const wchar_t *p;
455
+ if (archive_mstring_get_wcs(entry->archive, &entry->ae_gname, &p) == 0)
456
+ return (p);
457
+ if (errno == ENOMEM)
458
+ __archive_errx(1, "No memory");
459
+ return (NULL);
460
+ }
461
+
462
+ int
463
+ _archive_entry_gname_l(struct archive_entry *entry,
464
+ const char **p, size_t *len, struct archive_string_conv *sc)
465
+ {
466
+ return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_gname, p, len, sc));
467
+ }
468
+
469
+ const char *
470
+ archive_entry_hardlink(struct archive_entry *entry)
471
+ {
472
+ const char *p;
473
+ if ((entry->ae_set & AE_SET_HARDLINK) == 0)
474
+ return (NULL);
475
+ if (archive_mstring_get_mbs(
476
+ entry->archive, &entry->ae_hardlink, &p) == 0)
477
+ return (p);
478
+ if (errno == ENOMEM)
479
+ __archive_errx(1, "No memory");
480
+ return (NULL);
481
+ }
482
+
483
+ const char *
484
+ archive_entry_hardlink_utf8(struct archive_entry *entry)
485
+ {
486
+ const char *p;
487
+ if ((entry->ae_set & AE_SET_HARDLINK) == 0)
488
+ return (NULL);
489
+ if (archive_mstring_get_utf8(
490
+ entry->archive, &entry->ae_hardlink, &p) == 0)
491
+ return (p);
492
+ if (errno == ENOMEM)
493
+ __archive_errx(1, "No memory");
494
+ return (NULL);
495
+ }
496
+
497
+ const wchar_t *
498
+ archive_entry_hardlink_w(struct archive_entry *entry)
499
+ {
500
+ const wchar_t *p;
501
+ if ((entry->ae_set & AE_SET_HARDLINK) == 0)
502
+ return (NULL);
503
+ if (archive_mstring_get_wcs(
504
+ entry->archive, &entry->ae_hardlink, &p) == 0)
505
+ return (p);
506
+ if (errno == ENOMEM)
507
+ __archive_errx(1, "No memory");
508
+ return (NULL);
509
+ }
510
+
511
+ int
512
+ _archive_entry_hardlink_l(struct archive_entry *entry,
513
+ const char **p, size_t *len, struct archive_string_conv *sc)
514
+ {
515
+ if ((entry->ae_set & AE_SET_HARDLINK) == 0) {
516
+ *p = NULL;
517
+ *len = 0;
518
+ return (0);
519
+ }
520
+ return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_hardlink, p, len, sc));
521
+ }
522
+
523
+ la_int64_t
524
+ archive_entry_ino(struct archive_entry *entry)
525
+ {
526
+ return (entry->ae_stat.aest_ino);
527
+ }
528
+
529
+ int
530
+ archive_entry_ino_is_set(struct archive_entry *entry)
531
+ {
532
+ return (entry->ae_set & AE_SET_INO);
533
+ }
534
+
535
+ la_int64_t
536
+ archive_entry_ino64(struct archive_entry *entry)
537
+ {
538
+ return (entry->ae_stat.aest_ino);
539
+ }
540
+
541
+ __LA_MODE_T
542
+ archive_entry_mode(struct archive_entry *entry)
543
+ {
544
+ return (entry->acl.mode);
545
+ }
546
+
547
+ time_t
548
+ archive_entry_mtime(struct archive_entry *entry)
549
+ {
550
+ return (entry->ae_stat.aest_mtime);
551
+ }
552
+
553
+ long
554
+ archive_entry_mtime_nsec(struct archive_entry *entry)
555
+ {
556
+ return (entry->ae_stat.aest_mtime_nsec);
557
+ }
558
+
559
+ int
560
+ archive_entry_mtime_is_set(struct archive_entry *entry)
561
+ {
562
+ return (entry->ae_set & AE_SET_MTIME);
563
+ }
564
+
565
+ unsigned int
566
+ archive_entry_nlink(struct archive_entry *entry)
567
+ {
568
+ return (entry->ae_stat.aest_nlink);
569
+ }
570
+
571
+ /* Instead, our caller could have chosen a specific encoding
572
+ * (archive_mstring_get_mbs, archive_mstring_get_utf8,
573
+ * archive_mstring_get_wcs). So we should try multiple
574
+ * encodings. Try mbs first because of history, even though
575
+ * utf8 might be better for pathname portability.
576
+ * Also omit wcs because of type mismatch (char * versus wchar *)
577
+ */
578
+ const char *
579
+ archive_entry_pathname(struct archive_entry *entry)
580
+ {
581
+ const char *p;
582
+ if (archive_mstring_get_mbs(
583
+ entry->archive, &entry->ae_pathname, &p) == 0)
584
+ return (p);
585
+ #if HAVE_EILSEQ /*{*/
586
+ if (errno == EILSEQ) {
587
+ if (archive_mstring_get_utf8(
588
+ entry->archive, &entry->ae_pathname, &p) == 0)
589
+ return (p);
590
+ }
591
+ #endif /*}*/
592
+ if (errno == ENOMEM)
593
+ __archive_errx(1, "No memory");
594
+ return (NULL);
595
+ }
596
+
597
+ const char *
598
+ archive_entry_pathname_utf8(struct archive_entry *entry)
599
+ {
600
+ const char *p;
601
+ if (archive_mstring_get_utf8(
602
+ entry->archive, &entry->ae_pathname, &p) == 0)
603
+ return (p);
604
+ if (errno == ENOMEM)
605
+ __archive_errx(1, "No memory");
606
+ return (NULL);
607
+ }
608
+
609
+ const wchar_t *
610
+ archive_entry_pathname_w(struct archive_entry *entry)
611
+ {
612
+ const wchar_t *p;
613
+ if (archive_mstring_get_wcs(
614
+ entry->archive, &entry->ae_pathname, &p) == 0)
615
+ return (p);
616
+ if (errno == ENOMEM)
617
+ __archive_errx(1, "No memory");
618
+ return (NULL);
619
+ }
620
+
621
+ int
622
+ _archive_entry_pathname_l(struct archive_entry *entry,
623
+ const char **p, size_t *len, struct archive_string_conv *sc)
624
+ {
625
+ return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_pathname, p, len, sc));
626
+ }
627
+
628
+ __LA_MODE_T
629
+ archive_entry_perm(struct archive_entry *entry)
630
+ {
631
+ return (~AE_IFMT & entry->acl.mode);
632
+ }
633
+
634
+ dev_t
635
+ archive_entry_rdev(struct archive_entry *entry)
636
+ {
637
+ if (entry->ae_stat.aest_rdev_is_broken_down)
638
+ return ae_makedev(entry->ae_stat.aest_rdevmajor,
639
+ entry->ae_stat.aest_rdevminor);
640
+ else
641
+ return (entry->ae_stat.aest_rdev);
642
+ }
643
+
644
+ dev_t
645
+ archive_entry_rdevmajor(struct archive_entry *entry)
646
+ {
647
+ if (entry->ae_stat.aest_rdev_is_broken_down)
648
+ return (entry->ae_stat.aest_rdevmajor);
649
+ else
650
+ return major(entry->ae_stat.aest_rdev);
651
+ }
652
+
653
+ dev_t
654
+ archive_entry_rdevminor(struct archive_entry *entry)
655
+ {
656
+ if (entry->ae_stat.aest_rdev_is_broken_down)
657
+ return (entry->ae_stat.aest_rdevminor);
658
+ else
659
+ return minor(entry->ae_stat.aest_rdev);
660
+ }
661
+
662
+ la_int64_t
663
+ archive_entry_size(struct archive_entry *entry)
664
+ {
665
+ return (entry->ae_stat.aest_size);
666
+ }
667
+
668
+ int
669
+ archive_entry_size_is_set(struct archive_entry *entry)
670
+ {
671
+ return (entry->ae_set & AE_SET_SIZE);
672
+ }
673
+
674
+ const char *
675
+ archive_entry_sourcepath(struct archive_entry *entry)
676
+ {
677
+ const char *p;
678
+ if (archive_mstring_get_mbs(
679
+ entry->archive, &entry->ae_sourcepath, &p) == 0)
680
+ return (p);
681
+ if (errno == ENOMEM)
682
+ __archive_errx(1, "No memory");
683
+ return (NULL);
684
+ }
685
+
686
+ const wchar_t *
687
+ archive_entry_sourcepath_w(struct archive_entry *entry)
688
+ {
689
+ const wchar_t *p;
690
+ if (archive_mstring_get_wcs(
691
+ entry->archive, &entry->ae_sourcepath, &p) == 0)
692
+ return (p);
693
+ return (NULL);
694
+ }
695
+
696
+ const char *
697
+ archive_entry_symlink(struct archive_entry *entry)
698
+ {
699
+ const char *p;
700
+ if ((entry->ae_set & AE_SET_SYMLINK) == 0)
701
+ return (NULL);
702
+ if (archive_mstring_get_mbs(
703
+ entry->archive, &entry->ae_symlink, &p) == 0)
704
+ return (p);
705
+ if (errno == ENOMEM)
706
+ __archive_errx(1, "No memory");
707
+ return (NULL);
708
+ }
709
+
710
+ int
711
+ archive_entry_symlink_type(struct archive_entry *entry)
712
+ {
713
+ return (entry->ae_symlink_type);
714
+ }
715
+
716
+ const char *
717
+ archive_entry_symlink_utf8(struct archive_entry *entry)
718
+ {
719
+ const char *p;
720
+ if ((entry->ae_set & AE_SET_SYMLINK) == 0)
721
+ return (NULL);
722
+ if (archive_mstring_get_utf8(
723
+ entry->archive, &entry->ae_symlink, &p) == 0)
724
+ return (p);
725
+ if (errno == ENOMEM)
726
+ __archive_errx(1, "No memory");
727
+ return (NULL);
728
+ }
729
+
730
+ const wchar_t *
731
+ archive_entry_symlink_w(struct archive_entry *entry)
732
+ {
733
+ const wchar_t *p;
734
+ if ((entry->ae_set & AE_SET_SYMLINK) == 0)
735
+ return (NULL);
736
+ if (archive_mstring_get_wcs(
737
+ entry->archive, &entry->ae_symlink, &p) == 0)
738
+ return (p);
739
+ if (errno == ENOMEM)
740
+ __archive_errx(1, "No memory");
741
+ return (NULL);
742
+ }
743
+
744
+ int
745
+ _archive_entry_symlink_l(struct archive_entry *entry,
746
+ const char **p, size_t *len, struct archive_string_conv *sc)
747
+ {
748
+ if ((entry->ae_set & AE_SET_SYMLINK) == 0) {
749
+ *p = NULL;
750
+ *len = 0;
751
+ return (0);
752
+ }
753
+ return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_symlink, p, len, sc));
754
+ }
755
+
756
+ la_int64_t
757
+ archive_entry_uid(struct archive_entry *entry)
758
+ {
759
+ return (entry->ae_stat.aest_uid);
760
+ }
761
+
762
+ const char *
763
+ archive_entry_uname(struct archive_entry *entry)
764
+ {
765
+ const char *p;
766
+ if (archive_mstring_get_mbs(entry->archive, &entry->ae_uname, &p) == 0)
767
+ return (p);
768
+ if (errno == ENOMEM)
769
+ __archive_errx(1, "No memory");
770
+ return (NULL);
771
+ }
772
+
773
+ const char *
774
+ archive_entry_uname_utf8(struct archive_entry *entry)
775
+ {
776
+ const char *p;
777
+ if (archive_mstring_get_utf8(entry->archive, &entry->ae_uname, &p) == 0)
778
+ return (p);
779
+ if (errno == ENOMEM)
780
+ __archive_errx(1, "No memory");
781
+ return (NULL);
782
+ }
783
+
784
+ const wchar_t *
785
+ archive_entry_uname_w(struct archive_entry *entry)
786
+ {
787
+ const wchar_t *p;
788
+ if (archive_mstring_get_wcs(entry->archive, &entry->ae_uname, &p) == 0)
789
+ return (p);
790
+ if (errno == ENOMEM)
791
+ __archive_errx(1, "No memory");
792
+ return (NULL);
793
+ }
794
+
795
+ int
796
+ _archive_entry_uname_l(struct archive_entry *entry,
797
+ const char **p, size_t *len, struct archive_string_conv *sc)
798
+ {
799
+ return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_uname, p, len, sc));
800
+ }
801
+
802
+ int
803
+ archive_entry_is_data_encrypted(struct archive_entry *entry)
804
+ {
805
+ return ((entry->encryption & AE_ENCRYPTION_DATA) == AE_ENCRYPTION_DATA);
806
+ }
807
+
808
+ int
809
+ archive_entry_is_metadata_encrypted(struct archive_entry *entry)
810
+ {
811
+ return ((entry->encryption & AE_ENCRYPTION_METADATA) == AE_ENCRYPTION_METADATA);
812
+ }
813
+
814
+ int
815
+ archive_entry_is_encrypted(struct archive_entry *entry)
816
+ {
817
+ return (entry->encryption & (AE_ENCRYPTION_DATA|AE_ENCRYPTION_METADATA));
818
+ }
819
+
820
+ /*
821
+ * Functions to set archive_entry properties.
822
+ */
823
+
824
+ void
825
+ archive_entry_set_filetype(struct archive_entry *entry, unsigned int type)
826
+ {
827
+ entry->stat_valid = 0;
828
+ entry->acl.mode &= ~AE_IFMT;
829
+ entry->acl.mode |= AE_IFMT & type;
830
+ }
831
+
832
+ void
833
+ archive_entry_set_fflags(struct archive_entry *entry,
834
+ unsigned long set, unsigned long clear)
835
+ {
836
+ archive_mstring_clean(&entry->ae_fflags_text);
837
+ entry->ae_fflags_set = set;
838
+ entry->ae_fflags_clear = clear;
839
+ }
840
+
841
+ const char *
842
+ archive_entry_copy_fflags_text(struct archive_entry *entry,
843
+ const char *flags)
844
+ {
845
+ archive_mstring_copy_mbs(&entry->ae_fflags_text, flags);
846
+ return (ae_strtofflags(flags,
847
+ &entry->ae_fflags_set, &entry->ae_fflags_clear));
848
+ }
849
+
850
+ const wchar_t *
851
+ archive_entry_copy_fflags_text_w(struct archive_entry *entry,
852
+ const wchar_t *flags)
853
+ {
854
+ archive_mstring_copy_wcs(&entry->ae_fflags_text, flags);
855
+ return (ae_wcstofflags(flags,
856
+ &entry->ae_fflags_set, &entry->ae_fflags_clear));
857
+ }
858
+
859
+ void
860
+ archive_entry_set_gid(struct archive_entry *entry, la_int64_t g)
861
+ {
862
+ entry->stat_valid = 0;
863
+ entry->ae_stat.aest_gid = g;
864
+ }
865
+
866
+ void
867
+ archive_entry_set_gname(struct archive_entry *entry, const char *name)
868
+ {
869
+ archive_mstring_copy_mbs(&entry->ae_gname, name);
870
+ }
871
+
872
+ void
873
+ archive_entry_set_gname_utf8(struct archive_entry *entry, const char *name)
874
+ {
875
+ archive_mstring_copy_utf8(&entry->ae_gname, name);
876
+ }
877
+
878
+ void
879
+ archive_entry_copy_gname(struct archive_entry *entry, const char *name)
880
+ {
881
+ archive_mstring_copy_mbs(&entry->ae_gname, name);
882
+ }
883
+
884
+ void
885
+ archive_entry_copy_gname_w(struct archive_entry *entry, const wchar_t *name)
886
+ {
887
+ archive_mstring_copy_wcs(&entry->ae_gname, name);
888
+ }
889
+
890
+ int
891
+ archive_entry_update_gname_utf8(struct archive_entry *entry, const char *name)
892
+ {
893
+ if (archive_mstring_update_utf8(entry->archive,
894
+ &entry->ae_gname, name) == 0)
895
+ return (1);
896
+ if (errno == ENOMEM)
897
+ __archive_errx(1, "No memory");
898
+ return (0);
899
+ }
900
+
901
+ int
902
+ _archive_entry_copy_gname_l(struct archive_entry *entry,
903
+ const char *name, size_t len, struct archive_string_conv *sc)
904
+ {
905
+ return (archive_mstring_copy_mbs_len_l(&entry->ae_gname, name, len, sc));
906
+ }
907
+
908
+ void
909
+ archive_entry_set_ino(struct archive_entry *entry, la_int64_t ino)
910
+ {
911
+ entry->stat_valid = 0;
912
+ entry->ae_set |= AE_SET_INO;
913
+ entry->ae_stat.aest_ino = ino;
914
+ }
915
+
916
+ void
917
+ archive_entry_set_ino64(struct archive_entry *entry, la_int64_t ino)
918
+ {
919
+ entry->stat_valid = 0;
920
+ entry->ae_set |= AE_SET_INO;
921
+ entry->ae_stat.aest_ino = ino;
922
+ }
923
+
924
+ void
925
+ archive_entry_set_hardlink(struct archive_entry *entry, const char *target)
926
+ {
927
+ archive_mstring_copy_mbs(&entry->ae_hardlink, target);
928
+ if (target != NULL)
929
+ entry->ae_set |= AE_SET_HARDLINK;
930
+ else
931
+ entry->ae_set &= ~AE_SET_HARDLINK;
932
+ }
933
+
934
+ void
935
+ archive_entry_set_hardlink_utf8(struct archive_entry *entry, const char *target)
936
+ {
937
+ archive_mstring_copy_utf8(&entry->ae_hardlink, target);
938
+ if (target != NULL)
939
+ entry->ae_set |= AE_SET_HARDLINK;
940
+ else
941
+ entry->ae_set &= ~AE_SET_HARDLINK;
942
+ }
943
+
944
+ void
945
+ archive_entry_copy_hardlink(struct archive_entry *entry, const char *target)
946
+ {
947
+ archive_mstring_copy_mbs(&entry->ae_hardlink, target);
948
+ if (target != NULL)
949
+ entry->ae_set |= AE_SET_HARDLINK;
950
+ else
951
+ entry->ae_set &= ~AE_SET_HARDLINK;
952
+ }
953
+
954
+ void
955
+ archive_entry_copy_hardlink_w(struct archive_entry *entry, const wchar_t *target)
956
+ {
957
+ archive_mstring_copy_wcs(&entry->ae_hardlink, target);
958
+ if (target != NULL)
959
+ entry->ae_set |= AE_SET_HARDLINK;
960
+ else
961
+ entry->ae_set &= ~AE_SET_HARDLINK;
962
+ }
963
+
964
+ int
965
+ archive_entry_update_hardlink_utf8(struct archive_entry *entry, const char *target)
966
+ {
967
+ if (target != NULL)
968
+ entry->ae_set |= AE_SET_HARDLINK;
969
+ else
970
+ entry->ae_set &= ~AE_SET_HARDLINK;
971
+ if (archive_mstring_update_utf8(entry->archive,
972
+ &entry->ae_hardlink, target) == 0)
973
+ return (1);
974
+ if (errno == ENOMEM)
975
+ __archive_errx(1, "No memory");
976
+ return (0);
977
+ }
978
+
979
+ int
980
+ _archive_entry_copy_hardlink_l(struct archive_entry *entry,
981
+ const char *target, size_t len, struct archive_string_conv *sc)
982
+ {
983
+ int r;
984
+
985
+ r = archive_mstring_copy_mbs_len_l(&entry->ae_hardlink,
986
+ target, len, sc);
987
+ if (target != NULL && r == 0)
988
+ entry->ae_set |= AE_SET_HARDLINK;
989
+ else
990
+ entry->ae_set &= ~AE_SET_HARDLINK;
991
+ return (r);
992
+ }
993
+
994
+ void
995
+ archive_entry_set_atime(struct archive_entry *entry, time_t t, long ns)
996
+ {
997
+ FIX_NS(t, ns);
998
+ entry->stat_valid = 0;
999
+ entry->ae_set |= AE_SET_ATIME;
1000
+ entry->ae_stat.aest_atime = t;
1001
+ entry->ae_stat.aest_atime_nsec = ns;
1002
+ }
1003
+
1004
+ void
1005
+ archive_entry_unset_atime(struct archive_entry *entry)
1006
+ {
1007
+ archive_entry_set_atime(entry, 0, 0);
1008
+ entry->ae_set &= ~AE_SET_ATIME;
1009
+ }
1010
+
1011
+ void
1012
+ archive_entry_set_birthtime(struct archive_entry *entry, time_t t, long ns)
1013
+ {
1014
+ FIX_NS(t, ns);
1015
+ entry->stat_valid = 0;
1016
+ entry->ae_set |= AE_SET_BIRTHTIME;
1017
+ entry->ae_stat.aest_birthtime = t;
1018
+ entry->ae_stat.aest_birthtime_nsec = ns;
1019
+ }
1020
+
1021
+ void
1022
+ archive_entry_unset_birthtime(struct archive_entry *entry)
1023
+ {
1024
+ archive_entry_set_birthtime(entry, 0, 0);
1025
+ entry->ae_set &= ~AE_SET_BIRTHTIME;
1026
+ }
1027
+
1028
+ void
1029
+ archive_entry_set_ctime(struct archive_entry *entry, time_t t, long ns)
1030
+ {
1031
+ FIX_NS(t, ns);
1032
+ entry->stat_valid = 0;
1033
+ entry->ae_set |= AE_SET_CTIME;
1034
+ entry->ae_stat.aest_ctime = t;
1035
+ entry->ae_stat.aest_ctime_nsec = ns;
1036
+ }
1037
+
1038
+ void
1039
+ archive_entry_unset_ctime(struct archive_entry *entry)
1040
+ {
1041
+ archive_entry_set_ctime(entry, 0, 0);
1042
+ entry->ae_set &= ~AE_SET_CTIME;
1043
+ }
1044
+
1045
+ void
1046
+ archive_entry_set_dev(struct archive_entry *entry, dev_t d)
1047
+ {
1048
+ entry->stat_valid = 0;
1049
+ entry->ae_set |= AE_SET_DEV;
1050
+ entry->ae_stat.aest_dev_is_broken_down = 0;
1051
+ entry->ae_stat.aest_dev = d;
1052
+ }
1053
+
1054
+ void
1055
+ archive_entry_set_devmajor(struct archive_entry *entry, dev_t m)
1056
+ {
1057
+ entry->stat_valid = 0;
1058
+ entry->ae_set |= AE_SET_DEV;
1059
+ entry->ae_stat.aest_dev_is_broken_down = 1;
1060
+ entry->ae_stat.aest_devmajor = m;
1061
+ }
1062
+
1063
+ void
1064
+ archive_entry_set_devminor(struct archive_entry *entry, dev_t m)
1065
+ {
1066
+ entry->stat_valid = 0;
1067
+ entry->ae_set |= AE_SET_DEV;
1068
+ entry->ae_stat.aest_dev_is_broken_down = 1;
1069
+ entry->ae_stat.aest_devminor = m;
1070
+ }
1071
+
1072
+ /* Set symlink if symlink is already set, else set hardlink. */
1073
+ void
1074
+ archive_entry_set_link(struct archive_entry *entry, const char *target)
1075
+ {
1076
+ if (entry->ae_set & AE_SET_SYMLINK)
1077
+ archive_mstring_copy_mbs(&entry->ae_symlink, target);
1078
+ else
1079
+ archive_mstring_copy_mbs(&entry->ae_hardlink, target);
1080
+ }
1081
+
1082
+ void
1083
+ archive_entry_set_link_utf8(struct archive_entry *entry, const char *target)
1084
+ {
1085
+ if (entry->ae_set & AE_SET_SYMLINK)
1086
+ archive_mstring_copy_utf8(&entry->ae_symlink, target);
1087
+ else
1088
+ archive_mstring_copy_utf8(&entry->ae_hardlink, target);
1089
+ }
1090
+
1091
+ /* Set symlink if symlink is already set, else set hardlink. */
1092
+ void
1093
+ archive_entry_copy_link(struct archive_entry *entry, const char *target)
1094
+ {
1095
+ if (entry->ae_set & AE_SET_SYMLINK)
1096
+ archive_mstring_copy_mbs(&entry->ae_symlink, target);
1097
+ else
1098
+ archive_mstring_copy_mbs(&entry->ae_hardlink, target);
1099
+ }
1100
+
1101
+ /* Set symlink if symlink is already set, else set hardlink. */
1102
+ void
1103
+ archive_entry_copy_link_w(struct archive_entry *entry, const wchar_t *target)
1104
+ {
1105
+ if (entry->ae_set & AE_SET_SYMLINK)
1106
+ archive_mstring_copy_wcs(&entry->ae_symlink, target);
1107
+ else
1108
+ archive_mstring_copy_wcs(&entry->ae_hardlink, target);
1109
+ }
1110
+
1111
+ int
1112
+ archive_entry_update_link_utf8(struct archive_entry *entry, const char *target)
1113
+ {
1114
+ int r;
1115
+ if (entry->ae_set & AE_SET_SYMLINK)
1116
+ r = archive_mstring_update_utf8(entry->archive,
1117
+ &entry->ae_symlink, target);
1118
+ else
1119
+ r = archive_mstring_update_utf8(entry->archive,
1120
+ &entry->ae_hardlink, target);
1121
+ if (r == 0)
1122
+ return (1);
1123
+ if (errno == ENOMEM)
1124
+ __archive_errx(1, "No memory");
1125
+ return (0);
1126
+ }
1127
+
1128
+ int
1129
+ _archive_entry_copy_link_l(struct archive_entry *entry,
1130
+ const char *target, size_t len, struct archive_string_conv *sc)
1131
+ {
1132
+ int r;
1133
+
1134
+ if (entry->ae_set & AE_SET_SYMLINK)
1135
+ r = archive_mstring_copy_mbs_len_l(&entry->ae_symlink,
1136
+ target, len, sc);
1137
+ else
1138
+ r = archive_mstring_copy_mbs_len_l(&entry->ae_hardlink,
1139
+ target, len, sc);
1140
+ return (r);
1141
+ }
1142
+
1143
+ void
1144
+ archive_entry_set_mode(struct archive_entry *entry, mode_t m)
1145
+ {
1146
+ entry->stat_valid = 0;
1147
+ entry->acl.mode = m;
1148
+ }
1149
+
1150
+ void
1151
+ archive_entry_set_mtime(struct archive_entry *entry, time_t t, long ns)
1152
+ {
1153
+ FIX_NS(t, ns);
1154
+ entry->stat_valid = 0;
1155
+ entry->ae_set |= AE_SET_MTIME;
1156
+ entry->ae_stat.aest_mtime = t;
1157
+ entry->ae_stat.aest_mtime_nsec = ns;
1158
+ }
1159
+
1160
+ void
1161
+ archive_entry_unset_mtime(struct archive_entry *entry)
1162
+ {
1163
+ archive_entry_set_mtime(entry, 0, 0);
1164
+ entry->ae_set &= ~AE_SET_MTIME;
1165
+ }
1166
+
1167
+ void
1168
+ archive_entry_set_nlink(struct archive_entry *entry, unsigned int nlink)
1169
+ {
1170
+ entry->stat_valid = 0;
1171
+ entry->ae_stat.aest_nlink = nlink;
1172
+ }
1173
+
1174
+ void
1175
+ archive_entry_set_pathname(struct archive_entry *entry, const char *name)
1176
+ {
1177
+ archive_mstring_copy_mbs(&entry->ae_pathname, name);
1178
+ }
1179
+
1180
+ void
1181
+ archive_entry_set_pathname_utf8(struct archive_entry *entry, const char *name)
1182
+ {
1183
+ archive_mstring_copy_utf8(&entry->ae_pathname, name);
1184
+ }
1185
+
1186
+ void
1187
+ archive_entry_copy_pathname(struct archive_entry *entry, const char *name)
1188
+ {
1189
+ archive_mstring_copy_mbs(&entry->ae_pathname, name);
1190
+ }
1191
+
1192
+ void
1193
+ archive_entry_copy_pathname_w(struct archive_entry *entry, const wchar_t *name)
1194
+ {
1195
+ archive_mstring_copy_wcs(&entry->ae_pathname, name);
1196
+ }
1197
+
1198
+ int
1199
+ archive_entry_update_pathname_utf8(struct archive_entry *entry, const char *name)
1200
+ {
1201
+ if (archive_mstring_update_utf8(entry->archive,
1202
+ &entry->ae_pathname, name) == 0)
1203
+ return (1);
1204
+ if (errno == ENOMEM)
1205
+ __archive_errx(1, "No memory");
1206
+ return (0);
1207
+ }
1208
+
1209
+ int
1210
+ _archive_entry_copy_pathname_l(struct archive_entry *entry,
1211
+ const char *name, size_t len, struct archive_string_conv *sc)
1212
+ {
1213
+ return (archive_mstring_copy_mbs_len_l(&entry->ae_pathname,
1214
+ name, len, sc));
1215
+ }
1216
+
1217
+ void
1218
+ archive_entry_set_perm(struct archive_entry *entry, mode_t p)
1219
+ {
1220
+ entry->stat_valid = 0;
1221
+ entry->acl.mode &= AE_IFMT;
1222
+ entry->acl.mode |= ~AE_IFMT & p;
1223
+ }
1224
+
1225
+ void
1226
+ archive_entry_set_rdev(struct archive_entry *entry, dev_t m)
1227
+ {
1228
+ entry->stat_valid = 0;
1229
+ entry->ae_stat.aest_rdev = m;
1230
+ entry->ae_stat.aest_rdev_is_broken_down = 0;
1231
+ }
1232
+
1233
+ void
1234
+ archive_entry_set_rdevmajor(struct archive_entry *entry, dev_t m)
1235
+ {
1236
+ entry->stat_valid = 0;
1237
+ entry->ae_stat.aest_rdev_is_broken_down = 1;
1238
+ entry->ae_stat.aest_rdevmajor = m;
1239
+ }
1240
+
1241
+ void
1242
+ archive_entry_set_rdevminor(struct archive_entry *entry, dev_t m)
1243
+ {
1244
+ entry->stat_valid = 0;
1245
+ entry->ae_stat.aest_rdev_is_broken_down = 1;
1246
+ entry->ae_stat.aest_rdevminor = m;
1247
+ }
1248
+
1249
+ void
1250
+ archive_entry_set_size(struct archive_entry *entry, la_int64_t s)
1251
+ {
1252
+ entry->stat_valid = 0;
1253
+ entry->ae_stat.aest_size = s;
1254
+ entry->ae_set |= AE_SET_SIZE;
1255
+ }
1256
+
1257
+ void
1258
+ archive_entry_unset_size(struct archive_entry *entry)
1259
+ {
1260
+ archive_entry_set_size(entry, 0);
1261
+ entry->ae_set &= ~AE_SET_SIZE;
1262
+ }
1263
+
1264
+ void
1265
+ archive_entry_copy_sourcepath(struct archive_entry *entry, const char *path)
1266
+ {
1267
+ archive_mstring_copy_mbs(&entry->ae_sourcepath, path);
1268
+ }
1269
+
1270
+ void
1271
+ archive_entry_copy_sourcepath_w(struct archive_entry *entry, const wchar_t *path)
1272
+ {
1273
+ archive_mstring_copy_wcs(&entry->ae_sourcepath, path);
1274
+ }
1275
+
1276
+ void
1277
+ archive_entry_set_symlink(struct archive_entry *entry, const char *linkname)
1278
+ {
1279
+ archive_mstring_copy_mbs(&entry->ae_symlink, linkname);
1280
+ if (linkname != NULL)
1281
+ entry->ae_set |= AE_SET_SYMLINK;
1282
+ else
1283
+ entry->ae_set &= ~AE_SET_SYMLINK;
1284
+ }
1285
+
1286
+ void
1287
+ archive_entry_set_symlink_type(struct archive_entry *entry, int type)
1288
+ {
1289
+ entry->ae_symlink_type = type;
1290
+ }
1291
+
1292
+ void
1293
+ archive_entry_set_symlink_utf8(struct archive_entry *entry, const char *linkname)
1294
+ {
1295
+ archive_mstring_copy_utf8(&entry->ae_symlink, linkname);
1296
+ if (linkname != NULL)
1297
+ entry->ae_set |= AE_SET_SYMLINK;
1298
+ else
1299
+ entry->ae_set &= ~AE_SET_SYMLINK;
1300
+ }
1301
+
1302
+ void
1303
+ archive_entry_copy_symlink(struct archive_entry *entry, const char *linkname)
1304
+ {
1305
+ archive_mstring_copy_mbs(&entry->ae_symlink, linkname);
1306
+ if (linkname != NULL)
1307
+ entry->ae_set |= AE_SET_SYMLINK;
1308
+ else
1309
+ entry->ae_set &= ~AE_SET_SYMLINK;
1310
+ }
1311
+
1312
+ void
1313
+ archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linkname)
1314
+ {
1315
+ archive_mstring_copy_wcs(&entry->ae_symlink, linkname);
1316
+ if (linkname != NULL)
1317
+ entry->ae_set |= AE_SET_SYMLINK;
1318
+ else
1319
+ entry->ae_set &= ~AE_SET_SYMLINK;
1320
+ }
1321
+
1322
+ int
1323
+ archive_entry_update_symlink_utf8(struct archive_entry *entry, const char *linkname)
1324
+ {
1325
+ if (linkname != NULL)
1326
+ entry->ae_set |= AE_SET_SYMLINK;
1327
+ else
1328
+ entry->ae_set &= ~AE_SET_SYMLINK;
1329
+ if (archive_mstring_update_utf8(entry->archive,
1330
+ &entry->ae_symlink, linkname) == 0)
1331
+ return (1);
1332
+ if (errno == ENOMEM)
1333
+ __archive_errx(1, "No memory");
1334
+ return (0);
1335
+ }
1336
+
1337
+ int
1338
+ _archive_entry_copy_symlink_l(struct archive_entry *entry,
1339
+ const char *linkname, size_t len, struct archive_string_conv *sc)
1340
+ {
1341
+ int r;
1342
+
1343
+ r = archive_mstring_copy_mbs_len_l(&entry->ae_symlink,
1344
+ linkname, len, sc);
1345
+ if (linkname != NULL && r == 0)
1346
+ entry->ae_set |= AE_SET_SYMLINK;
1347
+ else
1348
+ entry->ae_set &= ~AE_SET_SYMLINK;
1349
+ return (r);
1350
+ }
1351
+
1352
+ void
1353
+ archive_entry_set_uid(struct archive_entry *entry, la_int64_t u)
1354
+ {
1355
+ entry->stat_valid = 0;
1356
+ entry->ae_stat.aest_uid = u;
1357
+ }
1358
+
1359
+ void
1360
+ archive_entry_set_uname(struct archive_entry *entry, const char *name)
1361
+ {
1362
+ archive_mstring_copy_mbs(&entry->ae_uname, name);
1363
+ }
1364
+
1365
+ void
1366
+ archive_entry_set_uname_utf8(struct archive_entry *entry, const char *name)
1367
+ {
1368
+ archive_mstring_copy_utf8(&entry->ae_uname, name);
1369
+ }
1370
+
1371
+ void
1372
+ archive_entry_copy_uname(struct archive_entry *entry, const char *name)
1373
+ {
1374
+ archive_mstring_copy_mbs(&entry->ae_uname, name);
1375
+ }
1376
+
1377
+ void
1378
+ archive_entry_copy_uname_w(struct archive_entry *entry, const wchar_t *name)
1379
+ {
1380
+ archive_mstring_copy_wcs(&entry->ae_uname, name);
1381
+ }
1382
+
1383
+ int
1384
+ archive_entry_update_uname_utf8(struct archive_entry *entry, const char *name)
1385
+ {
1386
+ if (archive_mstring_update_utf8(entry->archive,
1387
+ &entry->ae_uname, name) == 0)
1388
+ return (1);
1389
+ if (errno == ENOMEM)
1390
+ __archive_errx(1, "No memory");
1391
+ return (0);
1392
+ }
1393
+
1394
+ void
1395
+ archive_entry_set_is_data_encrypted(struct archive_entry *entry, char is_encrypted)
1396
+ {
1397
+ if (is_encrypted) {
1398
+ entry->encryption |= AE_ENCRYPTION_DATA;
1399
+ } else {
1400
+ entry->encryption &= ~AE_ENCRYPTION_DATA;
1401
+ }
1402
+ }
1403
+
1404
+ void
1405
+ archive_entry_set_is_metadata_encrypted(struct archive_entry *entry, char is_encrypted)
1406
+ {
1407
+ if (is_encrypted) {
1408
+ entry->encryption |= AE_ENCRYPTION_METADATA;
1409
+ } else {
1410
+ entry->encryption &= ~AE_ENCRYPTION_METADATA;
1411
+ }
1412
+ }
1413
+
1414
+ int
1415
+ _archive_entry_copy_uname_l(struct archive_entry *entry,
1416
+ const char *name, size_t len, struct archive_string_conv *sc)
1417
+ {
1418
+ return (archive_mstring_copy_mbs_len_l(&entry->ae_uname,
1419
+ name, len, sc));
1420
+ }
1421
+
1422
+ const void *
1423
+ archive_entry_mac_metadata(struct archive_entry *entry, size_t *s)
1424
+ {
1425
+ *s = entry->mac_metadata_size;
1426
+ return entry->mac_metadata;
1427
+ }
1428
+
1429
+ void
1430
+ archive_entry_copy_mac_metadata(struct archive_entry *entry,
1431
+ const void *p, size_t s)
1432
+ {
1433
+ free(entry->mac_metadata);
1434
+ if (p == NULL || s == 0) {
1435
+ entry->mac_metadata = NULL;
1436
+ entry->mac_metadata_size = 0;
1437
+ } else {
1438
+ entry->mac_metadata_size = s;
1439
+ entry->mac_metadata = malloc(s);
1440
+ if (entry->mac_metadata == NULL)
1441
+ abort();
1442
+ memcpy(entry->mac_metadata, p, s);
1443
+ }
1444
+ }
1445
+
1446
+ /* Digest handling */
1447
+ const unsigned char *
1448
+ archive_entry_digest(struct archive_entry *entry, int type)
1449
+ {
1450
+ switch (type) {
1451
+ case ARCHIVE_ENTRY_DIGEST_MD5:
1452
+ return entry->digest.md5;
1453
+ case ARCHIVE_ENTRY_DIGEST_RMD160:
1454
+ return entry->digest.rmd160;
1455
+ case ARCHIVE_ENTRY_DIGEST_SHA1:
1456
+ return entry->digest.sha1;
1457
+ case ARCHIVE_ENTRY_DIGEST_SHA256:
1458
+ return entry->digest.sha256;
1459
+ case ARCHIVE_ENTRY_DIGEST_SHA384:
1460
+ return entry->digest.sha384;
1461
+ case ARCHIVE_ENTRY_DIGEST_SHA512:
1462
+ return entry->digest.sha512;
1463
+ default:
1464
+ return NULL;
1465
+ }
1466
+ }
1467
+
1468
+ int
1469
+ archive_entry_set_digest(struct archive_entry *entry, int type,
1470
+ const unsigned char *digest)
1471
+ {
1472
+ #define copy_digest(_e, _t, _d)\
1473
+ memcpy(_e->digest._t, _d, sizeof(_e->digest._t))
1474
+
1475
+ switch (type) {
1476
+ case ARCHIVE_ENTRY_DIGEST_MD5:
1477
+ copy_digest(entry, md5, digest);
1478
+ break;
1479
+ case ARCHIVE_ENTRY_DIGEST_RMD160:
1480
+ copy_digest(entry, rmd160, digest);
1481
+ break;
1482
+ case ARCHIVE_ENTRY_DIGEST_SHA1:
1483
+ copy_digest(entry, sha1, digest);
1484
+ break;
1485
+ case ARCHIVE_ENTRY_DIGEST_SHA256:
1486
+ copy_digest(entry, sha256, digest);
1487
+ break;
1488
+ case ARCHIVE_ENTRY_DIGEST_SHA384:
1489
+ copy_digest(entry, sha384, digest);
1490
+ break;
1491
+ case ARCHIVE_ENTRY_DIGEST_SHA512:
1492
+ copy_digest(entry, sha512, digest);
1493
+ break;
1494
+ default:
1495
+ return ARCHIVE_WARN;
1496
+ }
1497
+
1498
+ return ARCHIVE_OK;
1499
+ #undef copy_digest
1500
+ }
1501
+
1502
+ /*
1503
+ * ACL management. The following would, of course, be a lot simpler
1504
+ * if: 1) the last draft of POSIX.1e were a really thorough and
1505
+ * complete standard that addressed the needs of ACL archiving and 2)
1506
+ * everyone followed it faithfully. Alas, neither is true, so the
1507
+ * following is a lot more complex than might seem necessary to the
1508
+ * uninitiated.
1509
+ */
1510
+
1511
+ struct archive_acl *
1512
+ archive_entry_acl(struct archive_entry *entry)
1513
+ {
1514
+ return &entry->acl;
1515
+ }
1516
+
1517
+ void
1518
+ archive_entry_acl_clear(struct archive_entry *entry)
1519
+ {
1520
+ archive_acl_clear(&entry->acl);
1521
+ }
1522
+
1523
+ /*
1524
+ * Add a single ACL entry to the internal list of ACL data.
1525
+ */
1526
+ int
1527
+ archive_entry_acl_add_entry(struct archive_entry *entry,
1528
+ int type, int permset, int tag, int id, const char *name)
1529
+ {
1530
+ return archive_acl_add_entry(&entry->acl, type, permset, tag, id, name);
1531
+ }
1532
+
1533
+ /*
1534
+ * As above, but with a wide-character name.
1535
+ */
1536
+ int
1537
+ archive_entry_acl_add_entry_w(struct archive_entry *entry,
1538
+ int type, int permset, int tag, int id, const wchar_t *name)
1539
+ {
1540
+ return archive_acl_add_entry_w_len(&entry->acl,
1541
+ type, permset, tag, id, name, wcslen(name));
1542
+ }
1543
+
1544
+ /*
1545
+ * Return a bitmask of ACL types in an archive entry ACL list
1546
+ */
1547
+ int
1548
+ archive_entry_acl_types(struct archive_entry *entry)
1549
+ {
1550
+ return (archive_acl_types(&entry->acl));
1551
+ }
1552
+
1553
+ /*
1554
+ * Return a count of entries matching "want_type".
1555
+ */
1556
+ int
1557
+ archive_entry_acl_count(struct archive_entry *entry, int want_type)
1558
+ {
1559
+ return archive_acl_count(&entry->acl, want_type);
1560
+ }
1561
+
1562
+ /*
1563
+ * Prepare for reading entries from the ACL data. Returns a count
1564
+ * of entries matching "want_type", or zero if there are no
1565
+ * non-extended ACL entries of that type.
1566
+ */
1567
+ int
1568
+ archive_entry_acl_reset(struct archive_entry *entry, int want_type)
1569
+ {
1570
+ return archive_acl_reset(&entry->acl, want_type);
1571
+ }
1572
+
1573
+ /*
1574
+ * Return the next ACL entry in the list. Fake entries for the
1575
+ * standard permissions and include them in the returned list.
1576
+ */
1577
+ int
1578
+ archive_entry_acl_next(struct archive_entry *entry, int want_type, int *type,
1579
+ int *permset, int *tag, int *id, const char **name)
1580
+ {
1581
+ int r;
1582
+ r = archive_acl_next(entry->archive, &entry->acl, want_type, type,
1583
+ permset, tag, id, name);
1584
+ if (r == ARCHIVE_FATAL && errno == ENOMEM)
1585
+ __archive_errx(1, "No memory");
1586
+ return (r);
1587
+ }
1588
+
1589
+ /*
1590
+ * Generate a text version of the ACL. The flags parameter controls
1591
+ * the style of the generated ACL.
1592
+ */
1593
+ wchar_t *
1594
+ archive_entry_acl_to_text_w(struct archive_entry *entry, la_ssize_t *len,
1595
+ int flags)
1596
+ {
1597
+ return (archive_acl_to_text_w(&entry->acl, len, flags,
1598
+ entry->archive));
1599
+ }
1600
+
1601
+ char *
1602
+ archive_entry_acl_to_text(struct archive_entry *entry, la_ssize_t *len,
1603
+ int flags)
1604
+ {
1605
+ return (archive_acl_to_text_l(&entry->acl, len, flags, NULL));
1606
+ }
1607
+
1608
+ char *
1609
+ _archive_entry_acl_to_text_l(struct archive_entry *entry, ssize_t *len,
1610
+ int flags, struct archive_string_conv *sc)
1611
+ {
1612
+ return (archive_acl_to_text_l(&entry->acl, len, flags, sc));
1613
+ }
1614
+
1615
+ /*
1616
+ * ACL text parser.
1617
+ */
1618
+ int
1619
+ archive_entry_acl_from_text_w(struct archive_entry *entry,
1620
+ const wchar_t *wtext, int type)
1621
+ {
1622
+ return (archive_acl_from_text_w(&entry->acl, wtext, type));
1623
+ }
1624
+
1625
+ int
1626
+ archive_entry_acl_from_text(struct archive_entry *entry,
1627
+ const char *text, int type)
1628
+ {
1629
+ return (archive_acl_from_text_l(&entry->acl, text, type, NULL));
1630
+ }
1631
+
1632
+ int
1633
+ _archive_entry_acl_from_text_l(struct archive_entry *entry, const char *text,
1634
+ int type, struct archive_string_conv *sc)
1635
+ {
1636
+ return (archive_acl_from_text_l(&entry->acl, text, type, sc));
1637
+ }
1638
+
1639
+ /* Deprecated */
1640
+ static int
1641
+ archive_entry_acl_text_compat(int *flags)
1642
+ {
1643
+ if ((*flags & ARCHIVE_ENTRY_ACL_TYPE_POSIX1E) == 0)
1644
+ return (1);
1645
+
1646
+ /* ABI compat with old ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID */
1647
+ if ((*flags & OLD_ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID) != 0)
1648
+ *flags |= ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID;
1649
+
1650
+ /* ABI compat with old ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT */
1651
+ if ((*flags & OLD_ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) != 0)
1652
+ *flags |= ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT;
1653
+
1654
+ *flags |= ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA;
1655
+
1656
+ return (0);
1657
+ }
1658
+
1659
+ /* Deprecated */
1660
+ const wchar_t *
1661
+ archive_entry_acl_text_w(struct archive_entry *entry, int flags)
1662
+ {
1663
+ free(entry->acl.acl_text_w);
1664
+ entry->acl.acl_text_w = NULL;
1665
+ if (archive_entry_acl_text_compat(&flags) == 0)
1666
+ entry->acl.acl_text_w = archive_acl_to_text_w(&entry->acl,
1667
+ NULL, flags, entry->archive);
1668
+ return (entry->acl.acl_text_w);
1669
+ }
1670
+
1671
+ /* Deprecated */
1672
+ const char *
1673
+ archive_entry_acl_text(struct archive_entry *entry, int flags)
1674
+ {
1675
+ free(entry->acl.acl_text);
1676
+ entry->acl.acl_text = NULL;
1677
+ if (archive_entry_acl_text_compat(&flags) == 0)
1678
+ entry->acl.acl_text = archive_acl_to_text_l(&entry->acl, NULL,
1679
+ flags, NULL);
1680
+
1681
+ return (entry->acl.acl_text);
1682
+ }
1683
+
1684
+ /* Deprecated */
1685
+ int
1686
+ _archive_entry_acl_text_l(struct archive_entry *entry, int flags,
1687
+ const char **acl_text, size_t *len, struct archive_string_conv *sc)
1688
+ {
1689
+ free(entry->acl.acl_text);
1690
+ entry->acl.acl_text = NULL;
1691
+
1692
+ if (archive_entry_acl_text_compat(&flags) == 0)
1693
+ entry->acl.acl_text = archive_acl_to_text_l(&entry->acl,
1694
+ (ssize_t *)len, flags, sc);
1695
+
1696
+ *acl_text = entry->acl.acl_text;
1697
+
1698
+ return (0);
1699
+ }
1700
+
1701
+ /*
1702
+ * Following code is modified from UC Berkeley sources, and
1703
+ * is subject to the following copyright notice.
1704
+ */
1705
+
1706
+ /*-
1707
+ * Copyright (c) 1993
1708
+ * The Regents of the University of California. All rights reserved.
1709
+ *
1710
+ * Redistribution and use in source and binary forms, with or without
1711
+ * modification, are permitted provided that the following conditions
1712
+ * are met:
1713
+ * 1. Redistributions of source code must retain the above copyright
1714
+ * notice, this list of conditions and the following disclaimer.
1715
+ * 2. Redistributions in binary form must reproduce the above copyright
1716
+ * notice, this list of conditions and the following disclaimer in the
1717
+ * documentation and/or other materials provided with the distribution.
1718
+ * 4. Neither the name of the University nor the names of its contributors
1719
+ * may be used to endorse or promote products derived from this software
1720
+ * without specific prior written permission.
1721
+ *
1722
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1723
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1724
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1725
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1726
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1727
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1728
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1729
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1730
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1731
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1732
+ * SUCH DAMAGE.
1733
+ */
1734
+
1735
+ /*
1736
+ * Supported file flags on FreeBSD and Mac OS:
1737
+ * sappnd,sappend SF_APPEND
1738
+ * arch,archived SF_ARCHIVED
1739
+ * schg,schange,simmutable SF_IMMUTABLE
1740
+ * sunlnk,sunlink SF_NOUNLINK (FreeBSD only)
1741
+ * uappnd,uappend UF_APPEND
1742
+ * compressed UF_COMPRESSED (Mac OS only)
1743
+ * hidden,uhidden UF_HIDDEN
1744
+ * uchg,uchange,uimmutable UF_IMMUTABLE
1745
+ * nodump UF_NODUMP
1746
+ * uunlnk,uunlink UF_NOUNLINK (FreeBSD only)
1747
+ * offline,uoffline UF_OFFLINE (FreeBSD only)
1748
+ * opaque UF_OPAQUE
1749
+ * rdonly,urdonly,readonly UF_READONLY (FreeBSD only)
1750
+ * reparse,ureparse UF_REPARSE (FreeBSD only)
1751
+ * sparse,usparse UF_SPARSE (FreeBSD only)
1752
+ * system,usystem UF_SYSTEM (FreeBSD only)
1753
+ *
1754
+ * See chflags(2) for more information
1755
+ *
1756
+ * Supported file attributes on Linux:
1757
+ * a append only FS_APPEND_FL sappnd
1758
+ * A no atime updates FS_NOATIME_FL atime
1759
+ * c compress FS_COMPR_FL compress
1760
+ * C no copy on write FS_NOCOW_FL cow
1761
+ * d no dump FS_NODUMP_FL dump
1762
+ * D synchronous directory updates FS_DIRSYNC_FL dirsync
1763
+ * i immutable FS_IMMUTABLE_FL schg
1764
+ * j data journalling FS_JOURNAL_DATA_FL journal
1765
+ * P project hierarchy FS_PROJINHERIT_FL projinherit
1766
+ * s secure deletion FS_SECRM_FL securedeletion
1767
+ * S synchronous updates FS_SYNC_FL sync
1768
+ * t no tail-merging FS_NOTAIL_FL tail
1769
+ * T top of directory hierarchy FS_TOPDIR_FL topdir
1770
+ * u undeletable FS_UNRM_FL undel
1771
+ *
1772
+ * See ioctl_iflags(2) for more information
1773
+ *
1774
+ * Equivalent file flags supported on FreeBSD / Mac OS and Linux:
1775
+ * SF_APPEND FS_APPEND_FL sappnd
1776
+ * SF_IMMUTABLE FS_IMMUTABLE_FL schg
1777
+ * UF_NODUMP FS_NODUMP_FL nodump
1778
+ */
1779
+
1780
+ static const struct flag {
1781
+ const char *name;
1782
+ const wchar_t *wname;
1783
+ unsigned long set;
1784
+ unsigned long clear;
1785
+ } fileflags[] = {
1786
+ /* Preferred (shorter) names per flag first, all prefixed by "no" */
1787
+ #ifdef SF_APPEND
1788
+ { "nosappnd", L"nosappnd", SF_APPEND, 0},
1789
+ { "nosappend", L"nosappend", SF_APPEND, 0},
1790
+ #endif
1791
+ #if defined(FS_APPEND_FL) /* 'a' */
1792
+ { "nosappnd", L"nosappnd", FS_APPEND_FL, 0},
1793
+ { "nosappend", L"nosappend", FS_APPEND_FL, 0},
1794
+ #elif defined(EXT2_APPEND_FL) /* 'a' */
1795
+ { "nosappnd", L"nosappnd", EXT2_APPEND_FL, 0},
1796
+ { "nosappend", L"nosappend", EXT2_APPEND_FL, 0},
1797
+ #endif
1798
+ #ifdef SF_ARCHIVED
1799
+ { "noarch", L"noarch", SF_ARCHIVED, 0},
1800
+ { "noarchived", L"noarchived", SF_ARCHIVED, 0},
1801
+ #endif
1802
+ #ifdef SF_IMMUTABLE
1803
+ { "noschg", L"noschg", SF_IMMUTABLE, 0},
1804
+ { "noschange", L"noschange", SF_IMMUTABLE, 0},
1805
+ { "nosimmutable", L"nosimmutable", SF_IMMUTABLE, 0},
1806
+ #endif
1807
+ #if defined(FS_IMMUTABLE_FL) /* 'i' */
1808
+ { "noschg", L"noschg", FS_IMMUTABLE_FL, 0},
1809
+ { "noschange", L"noschange", FS_IMMUTABLE_FL, 0},
1810
+ { "nosimmutable", L"nosimmutable", FS_IMMUTABLE_FL, 0},
1811
+ #elif defined(EXT2_IMMUTABLE_FL) /* 'i' */
1812
+ { "noschg", L"noschg", EXT2_IMMUTABLE_FL, 0},
1813
+ { "noschange", L"noschange", EXT2_IMMUTABLE_FL, 0},
1814
+ { "nosimmutable", L"nosimmutable", EXT2_IMMUTABLE_FL, 0},
1815
+ #endif
1816
+ #ifdef SF_NOUNLINK
1817
+ { "nosunlnk", L"nosunlnk", SF_NOUNLINK, 0},
1818
+ { "nosunlink", L"nosunlink", SF_NOUNLINK, 0},
1819
+ #endif
1820
+ #ifdef UF_APPEND
1821
+ { "nouappnd", L"nouappnd", UF_APPEND, 0},
1822
+ { "nouappend", L"nouappend", UF_APPEND, 0},
1823
+ #endif
1824
+ #ifdef UF_IMMUTABLE
1825
+ { "nouchg", L"nouchg", UF_IMMUTABLE, 0},
1826
+ { "nouchange", L"nouchange", UF_IMMUTABLE, 0},
1827
+ { "nouimmutable", L"nouimmutable", UF_IMMUTABLE, 0},
1828
+ #endif
1829
+ #ifdef UF_NODUMP
1830
+ { "nodump", L"nodump", 0, UF_NODUMP},
1831
+ #endif
1832
+ #if defined(FS_NODUMP_FL) /* 'd' */
1833
+ { "nodump", L"nodump", 0, FS_NODUMP_FL},
1834
+ #elif defined(EXT2_NODUMP_FL)
1835
+ { "nodump", L"nodump", 0, EXT2_NODUMP_FL},
1836
+ #endif
1837
+ #ifdef UF_OPAQUE
1838
+ { "noopaque", L"noopaque", UF_OPAQUE, 0},
1839
+ #endif
1840
+ #ifdef UF_NOUNLINK
1841
+ { "nouunlnk", L"nouunlnk", UF_NOUNLINK, 0},
1842
+ { "nouunlink", L"nouunlink", UF_NOUNLINK, 0},
1843
+ #endif
1844
+ #ifdef UF_COMPRESSED
1845
+ /* Mac OS */
1846
+ { "nocompressed", L"nocompressed", UF_COMPRESSED, 0},
1847
+ #endif
1848
+ #ifdef UF_HIDDEN
1849
+ { "nohidden", L"nohidden", UF_HIDDEN, 0},
1850
+ { "nouhidden", L"nouhidden", UF_HIDDEN, 0},
1851
+ #endif
1852
+ #ifdef FILE_ATTRIBUTE_HIDDEN
1853
+ { "nohidden", L"nohidden", FILE_ATTRIBUTE_HIDDEN, 0},
1854
+ { "nouhidden", L"nouhidden", FILE_ATTRIBUTE_HIDDEN, 0},
1855
+ #endif
1856
+ #ifdef UF_OFFLINE
1857
+ { "nooffline", L"nooffline", UF_OFFLINE, 0},
1858
+ { "nouoffline", L"nouoffline", UF_OFFLINE, 0},
1859
+ #endif
1860
+ #ifdef UF_READONLY
1861
+ { "nordonly", L"nordonly", UF_READONLY, 0},
1862
+ { "nourdonly", L"nourdonly", UF_READONLY, 0},
1863
+ { "noreadonly", L"noreadonly", UF_READONLY, 0},
1864
+ #endif
1865
+ #ifdef FILE_ATTRIBUTE_READONLY
1866
+ { "nordonly", L"nordonly", FILE_ATTRIBUTE_READONLY, 0},
1867
+ { "nourdonly", L"nourdonly", FILE_ATTRIBUTE_READONLY, 0},
1868
+ { "noreadonly", L"noreadonly", FILE_ATTRIBUTE_READONLY, 0},
1869
+ #endif
1870
+ #ifdef UF_SPARSE
1871
+ { "nosparse", L"nosparse", UF_SPARSE, 0},
1872
+ { "nousparse", L"nousparse", UF_SPARSE, 0},
1873
+ #endif
1874
+ #ifdef UF_REPARSE
1875
+ { "noreparse", L"noreparse", UF_REPARSE, 0},
1876
+ { "noureparse", L"noureparse", UF_REPARSE, 0},
1877
+ #endif
1878
+ #ifdef UF_SYSTEM
1879
+ { "nosystem", L"nosystem", UF_SYSTEM, 0},
1880
+ { "nousystem", L"nousystem", UF_SYSTEM, 0},
1881
+ #endif
1882
+ #ifdef FILE_ATTRIBUTE_SYSTEM
1883
+ { "nosystem", L"nosystem", FILE_ATTRIBUTE_SYSTEM, 0},
1884
+ { "nousystem", L"nousystem", FILE_ATTRIBUTE_SYSTEM, 0},
1885
+ #endif
1886
+ #if defined(FS_UNRM_FL) /* 'u' */
1887
+ { "noundel", L"noundel", FS_UNRM_FL, 0},
1888
+ #elif defined(EXT2_UNRM_FL)
1889
+ { "noundel", L"noundel", EXT2_UNRM_FL, 0},
1890
+ #endif
1891
+
1892
+ #if defined(FS_COMPR_FL) /* 'c' */
1893
+ { "nocompress", L"nocompress", FS_COMPR_FL, 0},
1894
+ #elif defined(EXT2_COMPR_FL)
1895
+ { "nocompress", L"nocompress", EXT2_COMPR_FL, 0},
1896
+ #endif
1897
+
1898
+ #if defined(FS_NOATIME_FL) /* 'A' */
1899
+ { "noatime", L"noatime", 0, FS_NOATIME_FL},
1900
+ #elif defined(EXT2_NOATIME_FL)
1901
+ { "noatime", L"noatime", 0, EXT2_NOATIME_FL},
1902
+ #endif
1903
+ #if defined(FS_DIRSYNC_FL) /* 'D' */
1904
+ { "nodirsync", L"nodirsync", FS_DIRSYNC_FL, 0},
1905
+ #elif defined(EXT2_DIRSYNC_FL)
1906
+ { "nodirsync", L"nodirsync", EXT2_DIRSYNC_FL, 0},
1907
+ #endif
1908
+ #if defined(FS_JOURNAL_DATA_FL) /* 'j' */
1909
+ { "nojournal-data",L"nojournal-data", FS_JOURNAL_DATA_FL, 0},
1910
+ { "nojournal", L"nojournal", FS_JOURNAL_DATA_FL, 0},
1911
+ #elif defined(EXT3_JOURNAL_DATA_FL)
1912
+ { "nojournal-data",L"nojournal-data", EXT3_JOURNAL_DATA_FL, 0},
1913
+ { "nojournal", L"nojournal", EXT3_JOURNAL_DATA_FL, 0},
1914
+ #endif
1915
+ #if defined(FS_SECRM_FL) /* 's' */
1916
+ { "nosecdel", L"nosecdel", FS_SECRM_FL, 0},
1917
+ { "nosecuredeletion",L"nosecuredeletion",FS_SECRM_FL, 0},
1918
+ #elif defined(EXT2_SECRM_FL)
1919
+ { "nosecdel", L"nosecdel", EXT2_SECRM_FL, 0},
1920
+ { "nosecuredeletion",L"nosecuredeletion",EXT2_SECRM_FL, 0},
1921
+ #endif
1922
+ #if defined(FS_SYNC_FL) /* 'S' */
1923
+ { "nosync", L"nosync", FS_SYNC_FL, 0},
1924
+ #elif defined(EXT2_SYNC_FL)
1925
+ { "nosync", L"nosync", EXT2_SYNC_FL, 0},
1926
+ #endif
1927
+ #if defined(FS_NOTAIL_FL) /* 't' */
1928
+ { "notail", L"notail", 0, FS_NOTAIL_FL},
1929
+ #elif defined(EXT2_NOTAIL_FL)
1930
+ { "notail", L"notail", 0, EXT2_NOTAIL_FL},
1931
+ #endif
1932
+ #if defined(FS_TOPDIR_FL) /* 'T' */
1933
+ { "notopdir", L"notopdir", FS_TOPDIR_FL, 0},
1934
+ #elif defined(EXT2_TOPDIR_FL)
1935
+ { "notopdir", L"notopdir", EXT2_TOPDIR_FL, 0},
1936
+ #endif
1937
+ #ifdef FS_NOCOW_FL /* 'C' */
1938
+ { "nocow", L"nocow", 0, FS_NOCOW_FL},
1939
+ #endif
1940
+ #ifdef FS_PROJINHERIT_FL /* 'P' */
1941
+ { "noprojinherit",L"noprojinherit", FS_PROJINHERIT_FL, 0},
1942
+ #endif
1943
+ { NULL, NULL, 0, 0}
1944
+ };
1945
+
1946
+ /*
1947
+ * fflagstostr --
1948
+ * Convert file flags to a comma-separated string. If no flags
1949
+ * are set, return the empty string.
1950
+ */
1951
+ static char *
1952
+ ae_fflagstostr(unsigned long bitset, unsigned long bitclear)
1953
+ {
1954
+ char *string, *dp;
1955
+ const char *sp;
1956
+ unsigned long bits;
1957
+ const struct flag *flag;
1958
+ size_t length;
1959
+
1960
+ bits = bitset | bitclear;
1961
+ length = 0;
1962
+ for (flag = fileflags; flag->name != NULL; flag++)
1963
+ if (bits & (flag->set | flag->clear)) {
1964
+ length += strlen(flag->name) + 1;
1965
+ bits &= ~(flag->set | flag->clear);
1966
+ }
1967
+
1968
+ if (length == 0)
1969
+ return (NULL);
1970
+ string = (char *)malloc(length);
1971
+ if (string == NULL)
1972
+ return (NULL);
1973
+
1974
+ dp = string;
1975
+ for (flag = fileflags; flag->name != NULL; flag++) {
1976
+ if (bitset & flag->set || bitclear & flag->clear) {
1977
+ sp = flag->name + 2;
1978
+ } else if (bitset & flag->clear || bitclear & flag->set) {
1979
+ sp = flag->name;
1980
+ } else
1981
+ continue;
1982
+ bitset &= ~(flag->set | flag->clear);
1983
+ bitclear &= ~(flag->set | flag->clear);
1984
+ if (dp > string)
1985
+ *dp++ = ',';
1986
+ while ((*dp++ = *sp++) != '\0')
1987
+ ;
1988
+ dp--;
1989
+ }
1990
+
1991
+ *dp = '\0';
1992
+ return (string);
1993
+ }
1994
+
1995
+ /*
1996
+ * strtofflags --
1997
+ * Take string of arguments and return file flags. This
1998
+ * version works a little differently than strtofflags(3).
1999
+ * In particular, it always tests every token, skipping any
2000
+ * unrecognized tokens. It returns a pointer to the first
2001
+ * unrecognized token, or NULL if every token was recognized.
2002
+ * This version is also const-correct and does not modify the
2003
+ * provided string.
2004
+ */
2005
+ static const char *
2006
+ ae_strtofflags(const char *s, unsigned long *setp, unsigned long *clrp)
2007
+ {
2008
+ const char *start, *end;
2009
+ const struct flag *flag;
2010
+ unsigned long set, clear;
2011
+ const char *failed;
2012
+
2013
+ set = clear = 0;
2014
+ start = s;
2015
+ failed = NULL;
2016
+ /* Find start of first token. */
2017
+ while (*start == '\t' || *start == ' ' || *start == ',')
2018
+ start++;
2019
+ while (*start != '\0') {
2020
+ size_t length;
2021
+ /* Locate end of token. */
2022
+ end = start;
2023
+ while (*end != '\0' && *end != '\t' &&
2024
+ *end != ' ' && *end != ',')
2025
+ end++;
2026
+ length = end - start;
2027
+ for (flag = fileflags; flag->name != NULL; flag++) {
2028
+ size_t flag_length = strlen(flag->name);
2029
+ if (length == flag_length
2030
+ && memcmp(start, flag->name, length) == 0) {
2031
+ /* Matched "noXXXX", so reverse the sense. */
2032
+ clear |= flag->set;
2033
+ set |= flag->clear;
2034
+ break;
2035
+ } else if (length == flag_length - 2
2036
+ && memcmp(start, flag->name + 2, length) == 0) {
2037
+ /* Matched "XXXX", so don't reverse. */
2038
+ set |= flag->set;
2039
+ clear |= flag->clear;
2040
+ break;
2041
+ }
2042
+ }
2043
+ /* Ignore unknown flag names. */
2044
+ if (flag->name == NULL && failed == NULL)
2045
+ failed = start;
2046
+
2047
+ /* Find start of next token. */
2048
+ start = end;
2049
+ while (*start == '\t' || *start == ' ' || *start == ',')
2050
+ start++;
2051
+
2052
+ }
2053
+
2054
+ if (setp)
2055
+ *setp = set;
2056
+ if (clrp)
2057
+ *clrp = clear;
2058
+
2059
+ /* Return location of first failure. */
2060
+ return (failed);
2061
+ }
2062
+
2063
+ /*
2064
+ * wcstofflags --
2065
+ * Take string of arguments and return file flags. This
2066
+ * version works a little differently than strtofflags(3).
2067
+ * In particular, it always tests every token, skipping any
2068
+ * unrecognized tokens. It returns a pointer to the first
2069
+ * unrecognized token, or NULL if every token was recognized.
2070
+ * This version is also const-correct and does not modify the
2071
+ * provided string.
2072
+ */
2073
+ static const wchar_t *
2074
+ ae_wcstofflags(const wchar_t *s, unsigned long *setp, unsigned long *clrp)
2075
+ {
2076
+ const wchar_t *start, *end;
2077
+ const struct flag *flag;
2078
+ unsigned long set, clear;
2079
+ const wchar_t *failed;
2080
+
2081
+ set = clear = 0;
2082
+ start = s;
2083
+ failed = NULL;
2084
+ /* Find start of first token. */
2085
+ while (*start == L'\t' || *start == L' ' || *start == L',')
2086
+ start++;
2087
+ while (*start != L'\0') {
2088
+ size_t length;
2089
+ /* Locate end of token. */
2090
+ end = start;
2091
+ while (*end != L'\0' && *end != L'\t' &&
2092
+ *end != L' ' && *end != L',')
2093
+ end++;
2094
+ length = end - start;
2095
+ for (flag = fileflags; flag->wname != NULL; flag++) {
2096
+ size_t flag_length = wcslen(flag->wname);
2097
+ if (length == flag_length
2098
+ && wmemcmp(start, flag->wname, length) == 0) {
2099
+ /* Matched "noXXXX", so reverse the sense. */
2100
+ clear |= flag->set;
2101
+ set |= flag->clear;
2102
+ break;
2103
+ } else if (length == flag_length - 2
2104
+ && wmemcmp(start, flag->wname + 2, length) == 0) {
2105
+ /* Matched "XXXX", so don't reverse. */
2106
+ set |= flag->set;
2107
+ clear |= flag->clear;
2108
+ break;
2109
+ }
2110
+ }
2111
+ /* Ignore unknown flag names. */
2112
+ if (flag->wname == NULL && failed == NULL)
2113
+ failed = start;
2114
+
2115
+ /* Find start of next token. */
2116
+ start = end;
2117
+ while (*start == L'\t' || *start == L' ' || *start == L',')
2118
+ start++;
2119
+
2120
+ }
2121
+
2122
+ if (setp)
2123
+ *setp = set;
2124
+ if (clrp)
2125
+ *clrp = clear;
2126
+
2127
+ /* Return location of first failure. */
2128
+ return (failed);
2129
+ }
2130
+
2131
+
2132
+ #ifdef TEST
2133
+ #include <stdio.h>
2134
+ int
2135
+ main(int argc, char **argv)
2136
+ {
2137
+ struct archive_entry *entry = archive_entry_new();
2138
+ unsigned long set, clear;
2139
+ const wchar_t *remainder;
2140
+
2141
+ remainder = archive_entry_copy_fflags_text_w(entry, L"nosappnd dump archive,,,,,,,");
2142
+ archive_entry_fflags(entry, &set, &clear);
2143
+
2144
+ wprintf(L"set=0x%lX clear=0x%lX remainder='%ls'\n", set, clear, remainder);
2145
+
2146
+ wprintf(L"new flags='%s'\n", archive_entry_fflags_text(entry));
2147
+ return (0);
2148
+ }
2149
+ #endif