libarchive-static 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (296) hide show
  1. checksums.yaml +5 -5
  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_internal.h +0 -1
  20. data/ext/libarchive-0.1.1/ext/libarchive_reader.c +6 -4
  21. data/ext/libarchive-0.1.1/ext/libarchive_reader.o +0 -0
  22. data/ext/libarchive-0.1.1/ext/libarchive_ruby.so +0 -0
  23. data/ext/libarchive-0.1.1/ext/libarchive_win32.h +1 -1
  24. data/ext/libarchive-0.1.1/ext/libarchive_writer.c +2 -2
  25. data/ext/libarchive-0.1.1/ext/libarchive_writer.o +0 -0
  26. data/ext/libarchive-3.6.2/Makefile.in +16892 -0
  27. data/ext/libarchive-3.6.2/build/autoconf/ax_append_compile_flags.m4 +67 -0
  28. data/ext/libarchive-3.6.2/build/autoconf/ax_append_flag.m4 +71 -0
  29. data/ext/libarchive-3.6.2/build/autoconf/ax_check_compile_flag.m4 +74 -0
  30. data/ext/libarchive-3.6.2/build/autoconf/ax_require_defined.m4 +37 -0
  31. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/autoconf/check_stdcall_func.m4 +0 -0
  32. data/ext/libarchive-3.6.2/build/autoconf/compile +348 -0
  33. data/ext/libarchive-3.6.2/build/autoconf/config.guess +1754 -0
  34. data/ext/libarchive-3.6.2/build/autoconf/config.rpath +696 -0
  35. data/ext/libarchive-3.6.2/build/autoconf/config.sub +1890 -0
  36. data/ext/libarchive-3.6.2/build/autoconf/depcomp +791 -0
  37. data/ext/libarchive-3.6.2/build/autoconf/iconv.m4 +271 -0
  38. data/ext/libarchive-3.6.2/build/autoconf/install-sh +541 -0
  39. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/autoconf/la_uid_t.m4 +0 -0
  40. data/ext/libarchive-3.6.2/build/autoconf/lib-ld.m4 +109 -0
  41. data/ext/libarchive-3.6.2/build/autoconf/lib-link.m4 +777 -0
  42. data/ext/libarchive-3.6.2/build/autoconf/lib-prefix.m4 +224 -0
  43. data/ext/libarchive-3.6.2/build/autoconf/ltmain.sh +11251 -0
  44. data/ext/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 +115 -0
  45. data/ext/libarchive-3.6.2/build/autoconf/missing +215 -0
  46. data/ext/libarchive-3.6.2/build/autoconf/test-driver +153 -0
  47. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/pkgconfig/libarchive.pc.in +4 -1
  48. data/ext/libarchive-3.6.2/config.h.in +1504 -0
  49. data/ext/libarchive-3.6.2/configure +25558 -0
  50. data/ext/libarchive-3.6.2/libarchive/archive.h +1212 -0
  51. data/ext/libarchive-3.6.2/libarchive/archive_acl.c +2097 -0
  52. data/ext/libarchive-3.6.2/libarchive/archive_acl_private.h +83 -0
  53. data/ext/libarchive-3.6.2/libarchive/archive_blake2.h +197 -0
  54. data/ext/libarchive-3.6.2/libarchive/archive_blake2_impl.h +161 -0
  55. data/ext/libarchive-3.6.2/libarchive/archive_blake2s_ref.c +369 -0
  56. data/ext/libarchive-3.6.2/libarchive/archive_blake2sp_ref.c +361 -0
  57. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_check_magic.c +63 -22
  58. data/ext/libarchive-3.6.2/libarchive/archive_cmdline.c +227 -0
  59. data/ext/libarchive-3.6.2/libarchive/archive_cmdline_private.h +47 -0
  60. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_crc32.h +17 -0
  61. data/ext/libarchive-3.6.2/libarchive/archive_cryptor.c +534 -0
  62. data/ext/libarchive-3.6.2/libarchive/archive_cryptor_private.h +188 -0
  63. data/ext/libarchive-3.6.2/libarchive/archive_digest.c +1505 -0
  64. data/ext/libarchive-3.6.2/libarchive/archive_digest_private.h +416 -0
  65. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_darwin.c +559 -0
  66. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_freebsd.c +712 -0
  67. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_linux.c +760 -0
  68. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_sunos.c +824 -0
  69. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_endian.h +48 -15
  70. data/ext/libarchive-3.6.2/libarchive/archive_entry.c +2149 -0
  71. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry.h +305 -106
  72. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_copy_bhfi.c +5 -4
  73. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_copy_stat.c +9 -3
  74. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_link_resolver.c +104 -62
  75. data/ext/libarchive-3.6.2/libarchive/archive_entry_locale.h +92 -0
  76. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_private.h +65 -49
  77. data/ext/libarchive-3.6.2/libarchive/archive_entry_sparse.c +156 -0
  78. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_stat.c +6 -6
  79. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_strmode.c +1 -1
  80. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_xattr.c +4 -6
  81. data/ext/libarchive-3.6.2/libarchive/archive_getdate.c +1165 -0
  82. data/ext/libarchive-3.6.2/libarchive/archive_getdate.h +39 -0
  83. data/ext/libarchive-3.6.2/libarchive/archive_hmac.c +334 -0
  84. data/ext/libarchive-3.6.2/libarchive/archive_hmac_private.h +117 -0
  85. data/ext/libarchive-3.6.2/libarchive/archive_match.c +1875 -0
  86. data/ext/libarchive-3.6.2/libarchive/archive_openssl_evp_private.h +53 -0
  87. data/ext/libarchive-3.6.2/libarchive/archive_openssl_hmac_private.h +54 -0
  88. data/ext/libarchive-3.6.2/libarchive/archive_options.c +218 -0
  89. data/ext/libarchive-3.6.2/libarchive/archive_options_private.h +51 -0
  90. data/ext/libarchive-3.6.2/libarchive/archive_pack_dev.c +337 -0
  91. data/ext/libarchive-3.6.2/libarchive/archive_pack_dev.h +49 -0
  92. data/ext/libarchive-3.6.2/libarchive/archive_pathmatch.c +463 -0
  93. data/ext/libarchive-3.6.2/libarchive/archive_pathmatch.h +52 -0
  94. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_platform.h +77 -9
  95. data/ext/libarchive-3.6.2/libarchive/archive_platform_acl.h +55 -0
  96. data/ext/libarchive-3.6.2/libarchive/archive_platform_xattr.h +47 -0
  97. data/ext/libarchive-3.6.2/libarchive/archive_ppmd7.c +1168 -0
  98. data/ext/libarchive-3.6.2/libarchive/archive_ppmd7_private.h +119 -0
  99. data/ext/libarchive-3.6.2/libarchive/archive_ppmd8.c +1287 -0
  100. data/ext/libarchive-3.6.2/libarchive/archive_ppmd8_private.h +148 -0
  101. data/ext/libarchive-3.6.2/libarchive/archive_ppmd_private.h +151 -0
  102. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_private.h +74 -18
  103. data/ext/libarchive-3.6.2/libarchive/archive_random.c +272 -0
  104. data/ext/libarchive-3.6.2/libarchive/archive_random_private.h +36 -0
  105. data/ext/libarchive-3.6.2/libarchive/archive_rb.c +709 -0
  106. data/ext/libarchive-3.6.2/libarchive/archive_rb.h +113 -0
  107. data/ext/libarchive-3.6.2/libarchive/archive_read.c +1756 -0
  108. data/ext/libarchive-3.6.2/libarchive/archive_read_add_passphrase.c +190 -0
  109. data/ext/libarchive-3.6.2/libarchive/archive_read_append_filter.c +204 -0
  110. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_data_into_fd.c +64 -18
  111. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_entry_from_file.c +1086 -0
  112. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_posix.c +2732 -0
  113. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_disk_private.h +40 -4
  114. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_disk_set_standard_lookup.c +21 -11
  115. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_windows.c +2479 -0
  116. data/ext/libarchive-3.6.2/libarchive/archive_read_extract.c +60 -0
  117. data/ext/{libarchive-2.8.4/libarchive/archive_read_extract.c → libarchive-3.6.2/libarchive/archive_read_extract2.c} +34 -61
  118. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_fd.c +70 -49
  119. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_file.c +38 -23
  120. data/ext/libarchive-3.6.2/libarchive/archive_read_open_filename.c +586 -0
  121. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_memory.c +58 -28
  122. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_private.h +127 -59
  123. data/ext/libarchive-3.6.2/libarchive/archive_read_set_format.c +117 -0
  124. data/ext/libarchive-3.6.2/libarchive/archive_read_set_options.c +133 -0
  125. 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
  126. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_by_code.c +83 -0
  127. 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
  128. 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
  129. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_grzip.c +112 -0
  130. 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
  131. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lrzip.c +122 -0
  132. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lz4.c +742 -0
  133. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lzop.c +499 -0
  134. 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
  135. 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
  136. 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
  137. 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
  138. 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
  139. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_zstd.c +297 -0
  140. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_7zip.c +3900 -0
  141. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_all.c +89 -0
  142. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_ar.c +126 -72
  143. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_by_code.c +92 -0
  144. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_cab.c +3228 -0
  145. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_cpio.c +1104 -0
  146. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_empty.c +14 -11
  147. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_iso9660.c +990 -541
  148. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_lha.c +2916 -0
  149. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_mtree.c +2150 -0
  150. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_rar.c +3797 -0
  151. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_rar5.c +4251 -0
  152. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_raw.c +38 -31
  153. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_tar.c +1157 -629
  154. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_warc.c +848 -0
  155. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_xar.c +439 -258
  156. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_zip.c +4270 -0
  157. data/ext/libarchive-3.6.2/libarchive/archive_string.c +4240 -0
  158. data/ext/libarchive-3.6.2/libarchive/archive_string.h +243 -0
  159. data/ext/libarchive-3.6.2/libarchive/archive_string_composition.h +2292 -0
  160. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_string_sprintf.c +44 -16
  161. data/ext/libarchive-3.6.2/libarchive/archive_util.c +655 -0
  162. data/ext/libarchive-3.6.2/libarchive/archive_version_details.c +151 -0
  163. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_virtual.c +85 -16
  164. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_windows.c +214 -541
  165. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_windows.h +74 -106
  166. data/ext/libarchive-3.6.2/libarchive/archive_write.c +828 -0
  167. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter.c +72 -0
  168. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_b64encode.c +304 -0
  169. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_by_name.c +77 -0
  170. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_bzip2.c +401 -0
  171. 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
  172. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_grzip.c +135 -0
  173. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_gzip.c +442 -0
  174. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lrzip.c +197 -0
  175. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lz4.c +700 -0
  176. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lzop.c +478 -0
  177. 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
  178. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_program.c +391 -0
  179. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_uuencode.c +295 -0
  180. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_xz.c +545 -0
  181. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_zstd.c +418 -0
  182. data/ext/libarchive-3.6.2/libarchive/archive_write_disk_posix.c +4711 -0
  183. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_disk_private.h +9 -2
  184. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_disk_set_standard_lookup.c +30 -29
  185. data/ext/libarchive-3.6.2/libarchive/archive_write_disk_windows.c +2842 -0
  186. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_fd.c +15 -10
  187. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_file.c +15 -9
  188. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_filename.c +128 -20
  189. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_memory.c +7 -18
  190. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_private.h +72 -29
  191. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format.c +56 -3
  192. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_7zip.c +2322 -0
  193. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_ar.c +54 -34
  194. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_by_name.c +20 -2
  195. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio.c +11 -0
  196. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_binary.c +610 -0
  197. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_newc.c +457 -0
  198. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_odc.c +500 -0
  199. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_filter_by_ext.c +142 -0
  200. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_gnutar.c +755 -0
  201. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_iso9660.c +8165 -0
  202. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_mtree.c +2217 -0
  203. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_pax.c +1049 -387
  204. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_private.h +42 -0
  205. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_raw.c +125 -0
  206. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_shar.c +62 -47
  207. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_ustar.c +279 -108
  208. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_v7tar.c +638 -0
  209. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_warc.c +453 -0
  210. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_xar.c +3259 -0
  211. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_zip.c +1704 -0
  212. data/ext/libarchive-3.6.2/libarchive/archive_write_set_options.c +130 -0
  213. data/ext/libarchive-3.6.2/libarchive/archive_write_set_passphrase.c +95 -0
  214. data/ext/libarchive-3.6.2/libarchive/archive_xxhash.h +48 -0
  215. data/ext/libarchive-3.6.2/libarchive/config_freebsd.h +271 -0
  216. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/filter_fork.h +10 -5
  217. data/ext/{libarchive-2.8.4/libarchive/filter_fork.c → libarchive-3.6.2/libarchive/filter_fork_posix.c} +98 -19
  218. data/ext/libarchive-3.6.2/libarchive/filter_fork_windows.c +236 -0
  219. data/ext/libarchive-3.6.2/libarchive/xxhash.c +525 -0
  220. data/ext/libarchive-static-makefile +144 -80
  221. data/ext/libarchive-static-wrapper-makefile +1 -1
  222. data/ext/zlib-1.2.13/Makefile.in +404 -0
  223. data/ext/{zlib-1.2.5 → zlib-1.2.13}/adler32.c +51 -34
  224. data/ext/{zlib-1.2.5 → zlib-1.2.13}/compress.c +27 -21
  225. data/ext/zlib-1.2.13/configure +922 -0
  226. data/ext/zlib-1.2.13/crc32.c +1125 -0
  227. data/ext/zlib-1.2.13/crc32.h +9446 -0
  228. data/ext/{zlib-1.2.5 → zlib-1.2.13}/deflate.c +842 -459
  229. data/ext/{zlib-1.2.5 → zlib-1.2.13}/deflate.h +37 -33
  230. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzclose.c +0 -0
  231. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzguts.h +103 -16
  232. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzlib.c +155 -53
  233. data/ext/zlib-1.2.13/gzread.c +650 -0
  234. data/ext/zlib-1.2.13/gzwrite.c +677 -0
  235. data/ext/{zlib-1.2.5 → zlib-1.2.13}/infback.c +24 -12
  236. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffast.c +49 -66
  237. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffast.h +0 -0
  238. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffixed.h +3 -3
  239. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inflate.c +209 -94
  240. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inflate.h +9 -5
  241. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inftrees.c +24 -50
  242. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inftrees.h +1 -1
  243. data/ext/{zlib-1.2.5 → zlib-1.2.13}/trees.c +135 -198
  244. data/ext/{zlib-1.2.5 → zlib-1.2.13}/trees.h +0 -0
  245. data/ext/zlib-1.2.13/uncompr.c +93 -0
  246. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zconf.h +182 -63
  247. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zlib.h +617 -295
  248. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zutil.c +50 -41
  249. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zutil.h +83 -82
  250. metadata +244 -137
  251. data/ext/libarchive-0.1.1/libarchive.c +0 -1762
  252. data/ext/libarchive-2.8.4/Makefile.in +0 -7076
  253. data/ext/libarchive-2.8.4/build/autoconf/compile +0 -143
  254. data/ext/libarchive-2.8.4/build/autoconf/config.guess +0 -1502
  255. data/ext/libarchive-2.8.4/build/autoconf/config.sub +0 -1708
  256. data/ext/libarchive-2.8.4/build/autoconf/depcomp +0 -630
  257. data/ext/libarchive-2.8.4/build/autoconf/install-sh +0 -291
  258. data/ext/libarchive-2.8.4/build/autoconf/ltmain.sh +0 -8406
  259. data/ext/libarchive-2.8.4/build/autoconf/missing +0 -376
  260. data/ext/libarchive-2.8.4/config.h.in +0 -772
  261. data/ext/libarchive-2.8.4/configure +0 -17916
  262. data/ext/libarchive-2.8.4/libarchive/archive.h +0 -741
  263. data/ext/libarchive-2.8.4/libarchive/archive_entry.c +0 -2202
  264. data/ext/libarchive-2.8.4/libarchive/archive_hash.h +0 -281
  265. data/ext/libarchive-2.8.4/libarchive/archive_read.c +0 -1249
  266. data/ext/libarchive-2.8.4/libarchive/archive_read_disk.c +0 -198
  267. data/ext/libarchive-2.8.4/libarchive/archive_read_disk_entry_from_file.c +0 -570
  268. data/ext/libarchive-2.8.4/libarchive/archive_read_open_filename.c +0 -272
  269. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_cpio.c +0 -777
  270. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_mtree.c +0 -1304
  271. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_zip.c +0 -903
  272. data/ext/libarchive-2.8.4/libarchive/archive_string.c +0 -453
  273. data/ext/libarchive-2.8.4/libarchive/archive_string.h +0 -148
  274. data/ext/libarchive-2.8.4/libarchive/archive_util.c +0 -391
  275. data/ext/libarchive-2.8.4/libarchive/archive_write.c +0 -466
  276. data/ext/libarchive-2.8.4/libarchive/archive_write_disk.c +0 -2628
  277. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_bzip2.c +0 -408
  278. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_gzip.c +0 -477
  279. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_none.c +0 -257
  280. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_program.c +0 -347
  281. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_xz.c +0 -438
  282. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio.c +0 -344
  283. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio_newc.c +0 -295
  284. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_mtree.c +0 -1050
  285. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_zip.c +0 -667
  286. data/ext/libarchive-2.8.4/libarchive/config_freebsd.h +0 -154
  287. data/ext/libarchive-2.8.4/libarchive/filter_fork_windows.c +0 -113
  288. data/ext/zlib-1.2.5/Makefile.in +0 -257
  289. data/ext/zlib-1.2.5/configure +0 -596
  290. data/ext/zlib-1.2.5/crc32.c +0 -442
  291. data/ext/zlib-1.2.5/crc32.h +0 -441
  292. data/ext/zlib-1.2.5/example.c +0 -565
  293. data/ext/zlib-1.2.5/gzread.c +0 -653
  294. data/ext/zlib-1.2.5/gzwrite.c +0 -531
  295. data/ext/zlib-1.2.5/minigzip.c +0 -440
  296. data/ext/zlib-1.2.5/uncompr.c +0 -59
@@ -1,2202 +0,0 @@
1
- /*-
2
- * Copyright (c) 2003-2007 Tim Kientzle
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions
7
- * are met:
8
- * 1. Redistributions of source code must retain the above copyright
9
- * notice, this list of conditions and the following disclaimer.
10
- * 2. Redistributions in binary form must reproduce the above copyright
11
- * notice, this list of conditions and the following disclaimer in the
12
- * documentation and/or other materials provided with the distribution.
13
- *
14
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
- */
25
-
26
- #include "archive_platform.h"
27
- __FBSDID("$FreeBSD: head/lib/libarchive/archive_entry.c 201096 2009-12-28 02:41:27Z kientzle $");
28
-
29
- #ifdef HAVE_SYS_STAT_H
30
- #include <sys/stat.h>
31
- #endif
32
- #ifdef HAVE_SYS_TYPES_H
33
- #include <sys/types.h>
34
- #endif
35
- #if MAJOR_IN_MKDEV
36
- #include <sys/mkdev.h>
37
- #define HAVE_MAJOR
38
- #elif MAJOR_IN_SYSMACROS
39
- #include <sys/sysmacros.h>
40
- #define HAVE_MAJOR
41
- #endif
42
- #ifdef HAVE_LIMITS_H
43
- #include <limits.h>
44
- #endif
45
- #ifdef HAVE_LINUX_FS_H
46
- #include <linux/fs.h> /* for Linux file flags */
47
- #endif
48
- /*
49
- * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h.
50
- * As the include guards don't agree, the order of include is important.
51
- */
52
- #ifdef HAVE_LINUX_EXT2_FS_H
53
- #include <linux/ext2_fs.h> /* for Linux file flags */
54
- #endif
55
- #if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__)
56
- #include <ext2fs/ext2_fs.h> /* for Linux file flags */
57
- #endif
58
- #include <stddef.h>
59
- #include <stdio.h>
60
- #ifdef HAVE_STDLIB_H
61
- #include <stdlib.h>
62
- #endif
63
- #ifdef HAVE_STRING_H
64
- #include <string.h>
65
- #endif
66
- #ifdef HAVE_WCHAR_H
67
- #include <wchar.h>
68
- #endif
69
-
70
- #include "archive.h"
71
- #include "archive_entry.h"
72
- #include "archive_private.h"
73
- #include "archive_entry_private.h"
74
-
75
- #undef max
76
- #define max(a, b) ((a)>(b)?(a):(b))
77
-
78
- #if !defined(HAVE_MAJOR) && !defined(major)
79
- /* Replacement for major/minor/makedev. */
80
- #define major(x) ((int)(0x00ff & ((x) >> 8)))
81
- #define minor(x) ((int)(0xffff00ff & (x)))
82
- #define makedev(maj,min) ((0xff00 & ((maj)<<8)) | (0xffff00ff & (min)))
83
- #endif
84
-
85
- /* Play games to come up with a suitable makedev() definition. */
86
- #ifdef __QNXNTO__
87
- /* QNX. <sigh> */
88
- #include <sys/netmgr.h>
89
- #define ae_makedev(maj, min) makedev(ND_LOCAL_NODE, (maj), (min))
90
- #elif defined makedev
91
- /* There's a "makedev" macro. */
92
- #define ae_makedev(maj, min) makedev((maj), (min))
93
- #elif defined mkdev || ((defined _WIN32 || defined __WIN32__) && !defined(__CYGWIN__))
94
- /* Windows. <sigh> */
95
- #define ae_makedev(maj, min) mkdev((maj), (min))
96
- #else
97
- /* There's a "makedev" function. */
98
- #define ae_makedev(maj, min) makedev((maj), (min))
99
- #endif
100
-
101
- static void aes_clean(struct aes *);
102
- static void aes_copy(struct aes *dest, struct aes *src);
103
- static const char * aes_get_mbs(struct aes *);
104
- static const wchar_t * aes_get_wcs(struct aes *);
105
- static int aes_set_mbs(struct aes *, const char *mbs);
106
- static int aes_copy_mbs(struct aes *, const char *mbs);
107
- /* static void aes_set_wcs(struct aes *, const wchar_t *wcs); */
108
- static int aes_copy_wcs(struct aes *, const wchar_t *wcs);
109
- static int aes_copy_wcs_len(struct aes *, const wchar_t *wcs, size_t);
110
-
111
- static char * ae_fflagstostr(unsigned long bitset, unsigned long bitclear);
112
- static const wchar_t *ae_wcstofflags(const wchar_t *stringp,
113
- unsigned long *setp, unsigned long *clrp);
114
- static const char *ae_strtofflags(const char *stringp,
115
- unsigned long *setp, unsigned long *clrp);
116
- static void append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag,
117
- const wchar_t *wname, int perm, int id);
118
- static void append_id_w(wchar_t **wp, int id);
119
-
120
- static int acl_special(struct archive_entry *entry,
121
- int type, int permset, int tag);
122
- static struct ae_acl *acl_new_entry(struct archive_entry *entry,
123
- int type, int permset, int tag, int id);
124
- static int isint_w(const wchar_t *start, const wchar_t *end, int *result);
125
- static int ismode_w(const wchar_t *start, const wchar_t *end, int *result);
126
- static void next_field_w(const wchar_t **wp, const wchar_t **start,
127
- const wchar_t **end, wchar_t *sep);
128
- static int prefix_w(const wchar_t *start, const wchar_t *end,
129
- const wchar_t *test);
130
- static void
131
- archive_entry_acl_add_entry_w_len(struct archive_entry *entry, int type,
132
- int permset, int tag, int id, const wchar_t *name, size_t);
133
-
134
-
135
- #ifndef HAVE_WCSCPY
136
- static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2)
137
- {
138
- wchar_t *dest = s1;
139
- while ((*s1 = *s2) != L'\0')
140
- ++s1, ++s2;
141
- return dest;
142
- }
143
- #endif
144
- #ifndef HAVE_WCSLEN
145
- static size_t wcslen(const wchar_t *s)
146
- {
147
- const wchar_t *p = s;
148
- while (*p != L'\0')
149
- ++p;
150
- return p - s;
151
- }
152
- #endif
153
- #ifndef HAVE_WMEMCMP
154
- /* Good enough for simple equality testing, but not for sorting. */
155
- #define wmemcmp(a,b,i) memcmp((a), (b), (i) * sizeof(wchar_t))
156
- #endif
157
- #ifndef HAVE_WMEMCPY
158
- #define wmemcpy(a,b,i) (wchar_t *)memcpy((a), (b), (i) * sizeof(wchar_t))
159
- #endif
160
-
161
- static void
162
- aes_clean(struct aes *aes)
163
- {
164
- if (aes->aes_wcs) {
165
- free((wchar_t *)(uintptr_t)aes->aes_wcs);
166
- aes->aes_wcs = NULL;
167
- }
168
- archive_string_free(&(aes->aes_mbs));
169
- archive_string_free(&(aes->aes_utf8));
170
- aes->aes_set = 0;
171
- }
172
-
173
- static void
174
- aes_copy(struct aes *dest, struct aes *src)
175
- {
176
- wchar_t *wp;
177
-
178
- dest->aes_set = src->aes_set;
179
- archive_string_copy(&(dest->aes_mbs), &(src->aes_mbs));
180
- archive_string_copy(&(dest->aes_utf8), &(src->aes_utf8));
181
-
182
- if (src->aes_wcs != NULL) {
183
- wp = (wchar_t *)malloc((wcslen(src->aes_wcs) + 1)
184
- * sizeof(wchar_t));
185
- if (wp == NULL)
186
- __archive_errx(1, "No memory for aes_copy()");
187
- wcscpy(wp, src->aes_wcs);
188
- dest->aes_wcs = wp;
189
- }
190
- }
191
-
192
- static const char *
193
- aes_get_utf8(struct aes *aes)
194
- {
195
- if (aes->aes_set & AES_SET_UTF8)
196
- return (aes->aes_utf8.s);
197
- if ((aes->aes_set & AES_SET_WCS)
198
- && archive_strappend_w_utf8(&(aes->aes_utf8), aes->aes_wcs) != NULL) {
199
- aes->aes_set |= AES_SET_UTF8;
200
- return (aes->aes_utf8.s);
201
- }
202
- return (NULL);
203
- }
204
-
205
- static const char *
206
- aes_get_mbs(struct aes *aes)
207
- {
208
- /* If we already have an MBS form, return that immediately. */
209
- if (aes->aes_set & AES_SET_MBS)
210
- return (aes->aes_mbs.s);
211
- /* If there's a WCS form, try converting with the native locale. */
212
- if ((aes->aes_set & AES_SET_WCS)
213
- && archive_strappend_w_mbs(&(aes->aes_mbs), aes->aes_wcs) != NULL) {
214
- aes->aes_set |= AES_SET_MBS;
215
- return (aes->aes_mbs.s);
216
- }
217
- /* We'll use UTF-8 for MBS if all else fails. */
218
- return (aes_get_utf8(aes));
219
- }
220
-
221
- static const wchar_t *
222
- aes_get_wcs(struct aes *aes)
223
- {
224
- wchar_t *w;
225
- size_t r;
226
-
227
- /* Return WCS form if we already have it. */
228
- if (aes->aes_set & AES_SET_WCS)
229
- return (aes->aes_wcs);
230
-
231
- if (aes->aes_set & AES_SET_MBS) {
232
- /* Try converting MBS to WCS using native locale. */
233
- /*
234
- * No single byte will be more than one wide character,
235
- * so this length estimate will always be big enough.
236
- */
237
- size_t wcs_length = aes->aes_mbs.length;
238
-
239
- w = (wchar_t *)malloc((wcs_length + 1) * sizeof(wchar_t));
240
- if (w == NULL)
241
- __archive_errx(1, "No memory for aes_get_wcs()");
242
- r = mbstowcs(w, aes->aes_mbs.s, wcs_length);
243
- if (r != (size_t)-1 && r != 0) {
244
- w[r] = 0;
245
- aes->aes_set |= AES_SET_WCS;
246
- return (aes->aes_wcs = w);
247
- }
248
- free(w);
249
- }
250
-
251
- if (aes->aes_set & AES_SET_UTF8) {
252
- /* Try converting UTF8 to WCS. */
253
- aes->aes_wcs = __archive_string_utf8_w(&(aes->aes_utf8));
254
- if (aes->aes_wcs != NULL)
255
- aes->aes_set |= AES_SET_WCS;
256
- return (aes->aes_wcs);
257
- }
258
- return (NULL);
259
- }
260
-
261
- static int
262
- aes_set_mbs(struct aes *aes, const char *mbs)
263
- {
264
- return (aes_copy_mbs(aes, mbs));
265
- }
266
-
267
- static int
268
- aes_copy_mbs(struct aes *aes, const char *mbs)
269
- {
270
- if (mbs == NULL) {
271
- aes->aes_set = 0;
272
- return (0);
273
- }
274
- aes->aes_set = AES_SET_MBS; /* Only MBS form is set now. */
275
- archive_strcpy(&(aes->aes_mbs), mbs);
276
- archive_string_empty(&(aes->aes_utf8));
277
- if (aes->aes_wcs) {
278
- free((wchar_t *)(uintptr_t)aes->aes_wcs);
279
- aes->aes_wcs = NULL;
280
- }
281
- return (0);
282
- }
283
-
284
- /*
285
- * The 'update' form tries to proactively update all forms of
286
- * this string (WCS and MBS) and returns an error if any of
287
- * them fail. This is used by the 'pax' handler, for instance,
288
- * to detect and report character-conversion failures early while
289
- * still allowing clients to get potentially useful values from
290
- * the more tolerant lazy conversions. (get_mbs and get_wcs will
291
- * strive to give the user something useful, so you can get hopefully
292
- * usable values even if some of the character conversions are failing.)
293
- */
294
- static int
295
- aes_update_utf8(struct aes *aes, const char *utf8)
296
- {
297
- if (utf8 == NULL) {
298
- aes->aes_set = 0;
299
- return (1); /* Succeeded in clearing everything. */
300
- }
301
-
302
- /* Save the UTF8 string. */
303
- archive_strcpy(&(aes->aes_utf8), utf8);
304
-
305
- /* Empty the mbs and wcs strings. */
306
- archive_string_empty(&(aes->aes_mbs));
307
- if (aes->aes_wcs) {
308
- free((wchar_t *)(uintptr_t)aes->aes_wcs);
309
- aes->aes_wcs = NULL;
310
- }
311
-
312
- aes->aes_set = AES_SET_UTF8; /* Only UTF8 is set now. */
313
-
314
- /* TODO: We should just do a direct UTF-8 to MBS conversion
315
- * here. That would be faster, use less space, and give the
316
- * same information. (If a UTF-8 to MBS conversion succeeds,
317
- * then UTF-8->WCS and Unicode->MBS conversions will both
318
- * succeed.) */
319
-
320
- /* Try converting UTF8 to WCS, return false on failure. */
321
- aes->aes_wcs = __archive_string_utf8_w(&(aes->aes_utf8));
322
- if (aes->aes_wcs == NULL)
323
- return (0);
324
- aes->aes_set = AES_SET_UTF8 | AES_SET_WCS; /* Both UTF8 and WCS set. */
325
-
326
- /* Try converting WCS to MBS, return false on failure. */
327
- if (archive_strappend_w_mbs(&(aes->aes_mbs), aes->aes_wcs) == NULL)
328
- return (0);
329
- aes->aes_set = AES_SET_UTF8 | AES_SET_WCS | AES_SET_MBS;
330
-
331
- /* All conversions succeeded. */
332
- return (1);
333
- }
334
-
335
- static int
336
- aes_copy_wcs(struct aes *aes, const wchar_t *wcs)
337
- {
338
- return aes_copy_wcs_len(aes, wcs, wcs == NULL ? 0 : wcslen(wcs));
339
- }
340
-
341
- static int
342
- aes_copy_wcs_len(struct aes *aes, const wchar_t *wcs, size_t len)
343
- {
344
- wchar_t *w;
345
-
346
- if (wcs == NULL) {
347
- aes->aes_set = 0;
348
- return (0);
349
- }
350
- aes->aes_set = AES_SET_WCS; /* Only WCS form set. */
351
- archive_string_empty(&(aes->aes_mbs));
352
- archive_string_empty(&(aes->aes_utf8));
353
- if (aes->aes_wcs) {
354
- free((wchar_t *)(uintptr_t)aes->aes_wcs);
355
- aes->aes_wcs = NULL;
356
- }
357
- w = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
358
- if (w == NULL)
359
- __archive_errx(1, "No memory for aes_copy_wcs()");
360
- wmemcpy(w, wcs, len);
361
- w[len] = L'\0';
362
- aes->aes_wcs = w;
363
- return (0);
364
- }
365
-
366
- /****************************************************************************
367
- *
368
- * Public Interface
369
- *
370
- ****************************************************************************/
371
-
372
- struct archive_entry *
373
- archive_entry_clear(struct archive_entry *entry)
374
- {
375
- if (entry == NULL)
376
- return (NULL);
377
- aes_clean(&entry->ae_fflags_text);
378
- aes_clean(&entry->ae_gname);
379
- aes_clean(&entry->ae_hardlink);
380
- aes_clean(&entry->ae_pathname);
381
- aes_clean(&entry->ae_sourcepath);
382
- aes_clean(&entry->ae_symlink);
383
- aes_clean(&entry->ae_uname);
384
- archive_entry_acl_clear(entry);
385
- archive_entry_xattr_clear(entry);
386
- free(entry->stat);
387
- memset(entry, 0, sizeof(*entry));
388
- return entry;
389
- }
390
-
391
- struct archive_entry *
392
- archive_entry_clone(struct archive_entry *entry)
393
- {
394
- struct archive_entry *entry2;
395
- struct ae_acl *ap, *ap2;
396
- struct ae_xattr *xp;
397
-
398
- /* Allocate new structure and copy over all of the fields. */
399
- entry2 = (struct archive_entry *)malloc(sizeof(*entry2));
400
- if (entry2 == NULL)
401
- return (NULL);
402
- memset(entry2, 0, sizeof(*entry2));
403
- entry2->ae_stat = entry->ae_stat;
404
- entry2->ae_fflags_set = entry->ae_fflags_set;
405
- entry2->ae_fflags_clear = entry->ae_fflags_clear;
406
-
407
- aes_copy(&entry2->ae_fflags_text, &entry->ae_fflags_text);
408
- aes_copy(&entry2->ae_gname, &entry->ae_gname);
409
- aes_copy(&entry2->ae_hardlink, &entry->ae_hardlink);
410
- aes_copy(&entry2->ae_pathname, &entry->ae_pathname);
411
- aes_copy(&entry2->ae_sourcepath, &entry->ae_sourcepath);
412
- aes_copy(&entry2->ae_symlink, &entry->ae_symlink);
413
- entry2->ae_set = entry->ae_set;
414
- aes_copy(&entry2->ae_uname, &entry->ae_uname);
415
-
416
- /* Copy ACL data over. */
417
- ap = entry->acl_head;
418
- while (ap != NULL) {
419
- ap2 = acl_new_entry(entry2,
420
- ap->type, ap->permset, ap->tag, ap->id);
421
- if (ap2 != NULL)
422
- aes_copy(&ap2->name, &ap->name);
423
- ap = ap->next;
424
- }
425
-
426
- /* Copy xattr data over. */
427
- xp = entry->xattr_head;
428
- while (xp != NULL) {
429
- archive_entry_xattr_add_entry(entry2,
430
- xp->name, xp->value, xp->size);
431
- xp = xp->next;
432
- }
433
-
434
- return (entry2);
435
- }
436
-
437
- void
438
- archive_entry_free(struct archive_entry *entry)
439
- {
440
- archive_entry_clear(entry);
441
- free(entry);
442
- }
443
-
444
- struct archive_entry *
445
- archive_entry_new(void)
446
- {
447
- struct archive_entry *entry;
448
-
449
- entry = (struct archive_entry *)malloc(sizeof(*entry));
450
- if (entry == NULL)
451
- return (NULL);
452
- memset(entry, 0, sizeof(*entry));
453
- return (entry);
454
- }
455
-
456
- /*
457
- * Functions for reading fields from an archive_entry.
458
- */
459
-
460
- time_t
461
- archive_entry_atime(struct archive_entry *entry)
462
- {
463
- return (entry->ae_stat.aest_atime);
464
- }
465
-
466
- long
467
- archive_entry_atime_nsec(struct archive_entry *entry)
468
- {
469
- return (entry->ae_stat.aest_atime_nsec);
470
- }
471
-
472
- int
473
- archive_entry_atime_is_set(struct archive_entry *entry)
474
- {
475
- return (entry->ae_set & AE_SET_ATIME);
476
- }
477
-
478
- time_t
479
- archive_entry_birthtime(struct archive_entry *entry)
480
- {
481
- return (entry->ae_stat.aest_birthtime);
482
- }
483
-
484
- long
485
- archive_entry_birthtime_nsec(struct archive_entry *entry)
486
- {
487
- return (entry->ae_stat.aest_birthtime_nsec);
488
- }
489
-
490
- int
491
- archive_entry_birthtime_is_set(struct archive_entry *entry)
492
- {
493
- return (entry->ae_set & AE_SET_BIRTHTIME);
494
- }
495
-
496
- time_t
497
- archive_entry_ctime(struct archive_entry *entry)
498
- {
499
- return (entry->ae_stat.aest_ctime);
500
- }
501
-
502
- int
503
- archive_entry_ctime_is_set(struct archive_entry *entry)
504
- {
505
- return (entry->ae_set & AE_SET_CTIME);
506
- }
507
-
508
- long
509
- archive_entry_ctime_nsec(struct archive_entry *entry)
510
- {
511
- return (entry->ae_stat.aest_ctime_nsec);
512
- }
513
-
514
- dev_t
515
- archive_entry_dev(struct archive_entry *entry)
516
- {
517
- if (entry->ae_stat.aest_dev_is_broken_down)
518
- return ae_makedev(entry->ae_stat.aest_devmajor,
519
- entry->ae_stat.aest_devminor);
520
- else
521
- return (entry->ae_stat.aest_dev);
522
- }
523
-
524
- dev_t
525
- archive_entry_devmajor(struct archive_entry *entry)
526
- {
527
- if (entry->ae_stat.aest_dev_is_broken_down)
528
- return (entry->ae_stat.aest_devmajor);
529
- else
530
- return major(entry->ae_stat.aest_dev);
531
- }
532
-
533
- dev_t
534
- archive_entry_devminor(struct archive_entry *entry)
535
- {
536
- if (entry->ae_stat.aest_dev_is_broken_down)
537
- return (entry->ae_stat.aest_devminor);
538
- else
539
- return minor(entry->ae_stat.aest_dev);
540
- }
541
-
542
- mode_t
543
- archive_entry_filetype(struct archive_entry *entry)
544
- {
545
- return (AE_IFMT & entry->ae_stat.aest_mode);
546
- }
547
-
548
- void
549
- archive_entry_fflags(struct archive_entry *entry,
550
- unsigned long *set, unsigned long *clear)
551
- {
552
- *set = entry->ae_fflags_set;
553
- *clear = entry->ae_fflags_clear;
554
- }
555
-
556
- /*
557
- * Note: if text was provided, this just returns that text. If you
558
- * really need the text to be rebuilt in a canonical form, set the
559
- * text, ask for the bitmaps, then set the bitmaps. (Setting the
560
- * bitmaps clears any stored text.) This design is deliberate: if
561
- * we're editing archives, we don't want to discard flags just because
562
- * they aren't supported on the current system. The bitmap<->text
563
- * conversions are platform-specific (see below).
564
- */
565
- const char *
566
- archive_entry_fflags_text(struct archive_entry *entry)
567
- {
568
- const char *f;
569
- char *p;
570
-
571
- f = aes_get_mbs(&entry->ae_fflags_text);
572
- if (f != NULL)
573
- return (f);
574
-
575
- if (entry->ae_fflags_set == 0 && entry->ae_fflags_clear == 0)
576
- return (NULL);
577
-
578
- p = ae_fflagstostr(entry->ae_fflags_set, entry->ae_fflags_clear);
579
- if (p == NULL)
580
- return (NULL);
581
-
582
- aes_copy_mbs(&entry->ae_fflags_text, p);
583
- free(p);
584
- f = aes_get_mbs(&entry->ae_fflags_text);
585
- return (f);
586
- }
587
-
588
- gid_t
589
- archive_entry_gid(struct archive_entry *entry)
590
- {
591
- return (entry->ae_stat.aest_gid);
592
- }
593
-
594
- const char *
595
- archive_entry_gname(struct archive_entry *entry)
596
- {
597
- return (aes_get_mbs(&entry->ae_gname));
598
- }
599
-
600
- const wchar_t *
601
- archive_entry_gname_w(struct archive_entry *entry)
602
- {
603
- return (aes_get_wcs(&entry->ae_gname));
604
- }
605
-
606
- const char *
607
- archive_entry_hardlink(struct archive_entry *entry)
608
- {
609
- if (entry->ae_set & AE_SET_HARDLINK)
610
- return (aes_get_mbs(&entry->ae_hardlink));
611
- return (NULL);
612
- }
613
-
614
- const wchar_t *
615
- archive_entry_hardlink_w(struct archive_entry *entry)
616
- {
617
- if (entry->ae_set & AE_SET_HARDLINK)
618
- return (aes_get_wcs(&entry->ae_hardlink));
619
- return (NULL);
620
- }
621
-
622
- ino_t
623
- archive_entry_ino(struct archive_entry *entry)
624
- {
625
- return (entry->ae_stat.aest_ino);
626
- }
627
-
628
- int64_t
629
- archive_entry_ino64(struct archive_entry *entry)
630
- {
631
- return (entry->ae_stat.aest_ino);
632
- }
633
-
634
- mode_t
635
- archive_entry_mode(struct archive_entry *entry)
636
- {
637
- return (entry->ae_stat.aest_mode);
638
- }
639
-
640
- time_t
641
- archive_entry_mtime(struct archive_entry *entry)
642
- {
643
- return (entry->ae_stat.aest_mtime);
644
- }
645
-
646
- long
647
- archive_entry_mtime_nsec(struct archive_entry *entry)
648
- {
649
- return (entry->ae_stat.aest_mtime_nsec);
650
- }
651
-
652
- int
653
- archive_entry_mtime_is_set(struct archive_entry *entry)
654
- {
655
- return (entry->ae_set & AE_SET_MTIME);
656
- }
657
-
658
- unsigned int
659
- archive_entry_nlink(struct archive_entry *entry)
660
- {
661
- return (entry->ae_stat.aest_nlink);
662
- }
663
-
664
- const char *
665
- archive_entry_pathname(struct archive_entry *entry)
666
- {
667
- return (aes_get_mbs(&entry->ae_pathname));
668
- }
669
-
670
- const wchar_t *
671
- archive_entry_pathname_w(struct archive_entry *entry)
672
- {
673
- return (aes_get_wcs(&entry->ae_pathname));
674
- }
675
-
676
- dev_t
677
- archive_entry_rdev(struct archive_entry *entry)
678
- {
679
- if (entry->ae_stat.aest_rdev_is_broken_down)
680
- return ae_makedev(entry->ae_stat.aest_rdevmajor,
681
- entry->ae_stat.aest_rdevminor);
682
- else
683
- return (entry->ae_stat.aest_rdev);
684
- }
685
-
686
- dev_t
687
- archive_entry_rdevmajor(struct archive_entry *entry)
688
- {
689
- if (entry->ae_stat.aest_rdev_is_broken_down)
690
- return (entry->ae_stat.aest_rdevmajor);
691
- else
692
- return major(entry->ae_stat.aest_rdev);
693
- }
694
-
695
- dev_t
696
- archive_entry_rdevminor(struct archive_entry *entry)
697
- {
698
- if (entry->ae_stat.aest_rdev_is_broken_down)
699
- return (entry->ae_stat.aest_rdevminor);
700
- else
701
- return minor(entry->ae_stat.aest_rdev);
702
- }
703
-
704
- int64_t
705
- archive_entry_size(struct archive_entry *entry)
706
- {
707
- return (entry->ae_stat.aest_size);
708
- }
709
-
710
- int
711
- archive_entry_size_is_set(struct archive_entry *entry)
712
- {
713
- return (entry->ae_set & AE_SET_SIZE);
714
- }
715
-
716
- const char *
717
- archive_entry_sourcepath(struct archive_entry *entry)
718
- {
719
- return (aes_get_mbs(&entry->ae_sourcepath));
720
- }
721
-
722
- const char *
723
- archive_entry_symlink(struct archive_entry *entry)
724
- {
725
- if (entry->ae_set & AE_SET_SYMLINK)
726
- return (aes_get_mbs(&entry->ae_symlink));
727
- return (NULL);
728
- }
729
-
730
- const wchar_t *
731
- archive_entry_symlink_w(struct archive_entry *entry)
732
- {
733
- if (entry->ae_set & AE_SET_SYMLINK)
734
- return (aes_get_wcs(&entry->ae_symlink));
735
- return (NULL);
736
- }
737
-
738
- uid_t
739
- archive_entry_uid(struct archive_entry *entry)
740
- {
741
- return (entry->ae_stat.aest_uid);
742
- }
743
-
744
- const char *
745
- archive_entry_uname(struct archive_entry *entry)
746
- {
747
- return (aes_get_mbs(&entry->ae_uname));
748
- }
749
-
750
- const wchar_t *
751
- archive_entry_uname_w(struct archive_entry *entry)
752
- {
753
- return (aes_get_wcs(&entry->ae_uname));
754
- }
755
-
756
- /*
757
- * Functions to set archive_entry properties.
758
- */
759
-
760
- void
761
- archive_entry_set_filetype(struct archive_entry *entry, unsigned int type)
762
- {
763
- entry->stat_valid = 0;
764
- entry->ae_stat.aest_mode &= ~AE_IFMT;
765
- entry->ae_stat.aest_mode |= AE_IFMT & type;
766
- }
767
-
768
- void
769
- archive_entry_set_fflags(struct archive_entry *entry,
770
- unsigned long set, unsigned long clear)
771
- {
772
- aes_clean(&entry->ae_fflags_text);
773
- entry->ae_fflags_set = set;
774
- entry->ae_fflags_clear = clear;
775
- }
776
-
777
- const char *
778
- archive_entry_copy_fflags_text(struct archive_entry *entry,
779
- const char *flags)
780
- {
781
- aes_copy_mbs(&entry->ae_fflags_text, flags);
782
- return (ae_strtofflags(flags,
783
- &entry->ae_fflags_set, &entry->ae_fflags_clear));
784
- }
785
-
786
- const wchar_t *
787
- archive_entry_copy_fflags_text_w(struct archive_entry *entry,
788
- const wchar_t *flags)
789
- {
790
- aes_copy_wcs(&entry->ae_fflags_text, flags);
791
- return (ae_wcstofflags(flags,
792
- &entry->ae_fflags_set, &entry->ae_fflags_clear));
793
- }
794
-
795
- void
796
- archive_entry_set_gid(struct archive_entry *entry, gid_t g)
797
- {
798
- entry->stat_valid = 0;
799
- entry->ae_stat.aest_gid = g;
800
- }
801
-
802
- void
803
- archive_entry_set_gname(struct archive_entry *entry, const char *name)
804
- {
805
- aes_set_mbs(&entry->ae_gname, name);
806
- }
807
-
808
- void
809
- archive_entry_copy_gname(struct archive_entry *entry, const char *name)
810
- {
811
- aes_copy_mbs(&entry->ae_gname, name);
812
- }
813
-
814
- void
815
- archive_entry_copy_gname_w(struct archive_entry *entry, const wchar_t *name)
816
- {
817
- aes_copy_wcs(&entry->ae_gname, name);
818
- }
819
-
820
- int
821
- archive_entry_update_gname_utf8(struct archive_entry *entry, const char *name)
822
- {
823
- return (aes_update_utf8(&entry->ae_gname, name));
824
- }
825
-
826
- void
827
- archive_entry_set_ino(struct archive_entry *entry, unsigned long ino)
828
- {
829
- entry->stat_valid = 0;
830
- entry->ae_stat.aest_ino = ino;
831
- }
832
-
833
- void
834
- archive_entry_set_ino64(struct archive_entry *entry, int64_t ino)
835
- {
836
- entry->stat_valid = 0;
837
- entry->ae_stat.aest_ino = ino;
838
- }
839
-
840
- void
841
- archive_entry_set_hardlink(struct archive_entry *entry, const char *target)
842
- {
843
- aes_set_mbs(&entry->ae_hardlink, target);
844
- if (target != NULL)
845
- entry->ae_set |= AE_SET_HARDLINK;
846
- else
847
- entry->ae_set &= ~AE_SET_HARDLINK;
848
- }
849
-
850
- void
851
- archive_entry_copy_hardlink(struct archive_entry *entry, const char *target)
852
- {
853
- aes_copy_mbs(&entry->ae_hardlink, target);
854
- if (target != NULL)
855
- entry->ae_set |= AE_SET_HARDLINK;
856
- else
857
- entry->ae_set &= ~AE_SET_HARDLINK;
858
- }
859
-
860
- void
861
- archive_entry_copy_hardlink_w(struct archive_entry *entry, const wchar_t *target)
862
- {
863
- aes_copy_wcs(&entry->ae_hardlink, target);
864
- if (target != NULL)
865
- entry->ae_set |= AE_SET_HARDLINK;
866
- else
867
- entry->ae_set &= ~AE_SET_HARDLINK;
868
- }
869
-
870
- int
871
- archive_entry_update_hardlink_utf8(struct archive_entry *entry, const char *target)
872
- {
873
- if (target != NULL)
874
- entry->ae_set |= AE_SET_HARDLINK;
875
- else
876
- entry->ae_set &= ~AE_SET_HARDLINK;
877
- return (aes_update_utf8(&entry->ae_hardlink, target));
878
- }
879
-
880
- void
881
- archive_entry_set_atime(struct archive_entry *entry, time_t t, long ns)
882
- {
883
- entry->stat_valid = 0;
884
- entry->ae_set |= AE_SET_ATIME;
885
- entry->ae_stat.aest_atime = t;
886
- entry->ae_stat.aest_atime_nsec = ns;
887
- }
888
-
889
- void
890
- archive_entry_unset_atime(struct archive_entry *entry)
891
- {
892
- archive_entry_set_atime(entry, 0, 0);
893
- entry->ae_set &= ~AE_SET_ATIME;
894
- }
895
-
896
- void
897
- archive_entry_set_birthtime(struct archive_entry *entry, time_t m, long ns)
898
- {
899
- entry->stat_valid = 0;
900
- entry->ae_set |= AE_SET_BIRTHTIME;
901
- entry->ae_stat.aest_birthtime = m;
902
- entry->ae_stat.aest_birthtime_nsec = ns;
903
- }
904
-
905
- void
906
- archive_entry_unset_birthtime(struct archive_entry *entry)
907
- {
908
- archive_entry_set_birthtime(entry, 0, 0);
909
- entry->ae_set &= ~AE_SET_BIRTHTIME;
910
- }
911
-
912
- void
913
- archive_entry_set_ctime(struct archive_entry *entry, time_t t, long ns)
914
- {
915
- entry->stat_valid = 0;
916
- entry->ae_set |= AE_SET_CTIME;
917
- entry->ae_stat.aest_ctime = t;
918
- entry->ae_stat.aest_ctime_nsec = ns;
919
- }
920
-
921
- void
922
- archive_entry_unset_ctime(struct archive_entry *entry)
923
- {
924
- archive_entry_set_ctime(entry, 0, 0);
925
- entry->ae_set &= ~AE_SET_CTIME;
926
- }
927
-
928
- void
929
- archive_entry_set_dev(struct archive_entry *entry, dev_t d)
930
- {
931
- entry->stat_valid = 0;
932
- entry->ae_stat.aest_dev_is_broken_down = 0;
933
- entry->ae_stat.aest_dev = d;
934
- }
935
-
936
- void
937
- archive_entry_set_devmajor(struct archive_entry *entry, dev_t m)
938
- {
939
- entry->stat_valid = 0;
940
- entry->ae_stat.aest_dev_is_broken_down = 1;
941
- entry->ae_stat.aest_devmajor = m;
942
- }
943
-
944
- void
945
- archive_entry_set_devminor(struct archive_entry *entry, dev_t m)
946
- {
947
- entry->stat_valid = 0;
948
- entry->ae_stat.aest_dev_is_broken_down = 1;
949
- entry->ae_stat.aest_devminor = m;
950
- }
951
-
952
- /* Set symlink if symlink is already set, else set hardlink. */
953
- void
954
- archive_entry_set_link(struct archive_entry *entry, const char *target)
955
- {
956
- if (entry->ae_set & AE_SET_SYMLINK)
957
- aes_set_mbs(&entry->ae_symlink, target);
958
- else
959
- aes_set_mbs(&entry->ae_hardlink, target);
960
- }
961
-
962
- /* Set symlink if symlink is already set, else set hardlink. */
963
- void
964
- archive_entry_copy_link(struct archive_entry *entry, const char *target)
965
- {
966
- if (entry->ae_set & AE_SET_SYMLINK)
967
- aes_copy_mbs(&entry->ae_symlink, target);
968
- else
969
- aes_copy_mbs(&entry->ae_hardlink, target);
970
- }
971
-
972
- /* Set symlink if symlink is already set, else set hardlink. */
973
- void
974
- archive_entry_copy_link_w(struct archive_entry *entry, const wchar_t *target)
975
- {
976
- if (entry->ae_set & AE_SET_SYMLINK)
977
- aes_copy_wcs(&entry->ae_symlink, target);
978
- else
979
- aes_copy_wcs(&entry->ae_hardlink, target);
980
- }
981
-
982
- int
983
- archive_entry_update_link_utf8(struct archive_entry *entry, const char *target)
984
- {
985
- if (entry->ae_set & AE_SET_SYMLINK)
986
- return (aes_update_utf8(&entry->ae_symlink, target));
987
- else
988
- return (aes_update_utf8(&entry->ae_hardlink, target));
989
- }
990
-
991
- void
992
- archive_entry_set_mode(struct archive_entry *entry, mode_t m)
993
- {
994
- entry->stat_valid = 0;
995
- entry->ae_stat.aest_mode = m;
996
- }
997
-
998
- void
999
- archive_entry_set_mtime(struct archive_entry *entry, time_t m, long ns)
1000
- {
1001
- entry->stat_valid = 0;
1002
- entry->ae_set |= AE_SET_MTIME;
1003
- entry->ae_stat.aest_mtime = m;
1004
- entry->ae_stat.aest_mtime_nsec = ns;
1005
- }
1006
-
1007
- void
1008
- archive_entry_unset_mtime(struct archive_entry *entry)
1009
- {
1010
- archive_entry_set_mtime(entry, 0, 0);
1011
- entry->ae_set &= ~AE_SET_MTIME;
1012
- }
1013
-
1014
- void
1015
- archive_entry_set_nlink(struct archive_entry *entry, unsigned int nlink)
1016
- {
1017
- entry->stat_valid = 0;
1018
- entry->ae_stat.aest_nlink = nlink;
1019
- }
1020
-
1021
- void
1022
- archive_entry_set_pathname(struct archive_entry *entry, const char *name)
1023
- {
1024
- aes_set_mbs(&entry->ae_pathname, name);
1025
- }
1026
-
1027
- void
1028
- archive_entry_copy_pathname(struct archive_entry *entry, const char *name)
1029
- {
1030
- aes_copy_mbs(&entry->ae_pathname, name);
1031
- }
1032
-
1033
- void
1034
- archive_entry_copy_pathname_w(struct archive_entry *entry, const wchar_t *name)
1035
- {
1036
- aes_copy_wcs(&entry->ae_pathname, name);
1037
- }
1038
-
1039
- int
1040
- archive_entry_update_pathname_utf8(struct archive_entry *entry, const char *name)
1041
- {
1042
- return (aes_update_utf8(&entry->ae_pathname, name));
1043
- }
1044
-
1045
- void
1046
- archive_entry_set_perm(struct archive_entry *entry, mode_t p)
1047
- {
1048
- entry->stat_valid = 0;
1049
- entry->ae_stat.aest_mode &= AE_IFMT;
1050
- entry->ae_stat.aest_mode |= ~AE_IFMT & p;
1051
- }
1052
-
1053
- void
1054
- archive_entry_set_rdev(struct archive_entry *entry, dev_t m)
1055
- {
1056
- entry->stat_valid = 0;
1057
- entry->ae_stat.aest_rdev = m;
1058
- entry->ae_stat.aest_rdev_is_broken_down = 0;
1059
- }
1060
-
1061
- void
1062
- archive_entry_set_rdevmajor(struct archive_entry *entry, dev_t m)
1063
- {
1064
- entry->stat_valid = 0;
1065
- entry->ae_stat.aest_rdev_is_broken_down = 1;
1066
- entry->ae_stat.aest_rdevmajor = m;
1067
- }
1068
-
1069
- void
1070
- archive_entry_set_rdevminor(struct archive_entry *entry, dev_t m)
1071
- {
1072
- entry->stat_valid = 0;
1073
- entry->ae_stat.aest_rdev_is_broken_down = 1;
1074
- entry->ae_stat.aest_rdevminor = m;
1075
- }
1076
-
1077
- void
1078
- archive_entry_set_size(struct archive_entry *entry, int64_t s)
1079
- {
1080
- entry->stat_valid = 0;
1081
- entry->ae_stat.aest_size = s;
1082
- entry->ae_set |= AE_SET_SIZE;
1083
- }
1084
-
1085
- void
1086
- archive_entry_unset_size(struct archive_entry *entry)
1087
- {
1088
- archive_entry_set_size(entry, 0);
1089
- entry->ae_set &= ~AE_SET_SIZE;
1090
- }
1091
-
1092
- void
1093
- archive_entry_copy_sourcepath(struct archive_entry *entry, const char *path)
1094
- {
1095
- aes_set_mbs(&entry->ae_sourcepath, path);
1096
- }
1097
-
1098
- void
1099
- archive_entry_set_symlink(struct archive_entry *entry, const char *linkname)
1100
- {
1101
- aes_set_mbs(&entry->ae_symlink, linkname);
1102
- if (linkname != NULL)
1103
- entry->ae_set |= AE_SET_SYMLINK;
1104
- else
1105
- entry->ae_set &= ~AE_SET_SYMLINK;
1106
- }
1107
-
1108
- void
1109
- archive_entry_copy_symlink(struct archive_entry *entry, const char *linkname)
1110
- {
1111
- aes_copy_mbs(&entry->ae_symlink, linkname);
1112
- if (linkname != NULL)
1113
- entry->ae_set |= AE_SET_SYMLINK;
1114
- else
1115
- entry->ae_set &= ~AE_SET_SYMLINK;
1116
- }
1117
-
1118
- void
1119
- archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linkname)
1120
- {
1121
- aes_copy_wcs(&entry->ae_symlink, linkname);
1122
- if (linkname != NULL)
1123
- entry->ae_set |= AE_SET_SYMLINK;
1124
- else
1125
- entry->ae_set &= ~AE_SET_SYMLINK;
1126
- }
1127
-
1128
- int
1129
- archive_entry_update_symlink_utf8(struct archive_entry *entry, const char *linkname)
1130
- {
1131
- if (linkname != NULL)
1132
- entry->ae_set |= AE_SET_SYMLINK;
1133
- else
1134
- entry->ae_set &= ~AE_SET_SYMLINK;
1135
- return (aes_update_utf8(&entry->ae_symlink, linkname));
1136
- }
1137
-
1138
- void
1139
- archive_entry_set_uid(struct archive_entry *entry, uid_t u)
1140
- {
1141
- entry->stat_valid = 0;
1142
- entry->ae_stat.aest_uid = u;
1143
- }
1144
-
1145
- void
1146
- archive_entry_set_uname(struct archive_entry *entry, const char *name)
1147
- {
1148
- aes_set_mbs(&entry->ae_uname, name);
1149
- }
1150
-
1151
- void
1152
- archive_entry_copy_uname(struct archive_entry *entry, const char *name)
1153
- {
1154
- aes_copy_mbs(&entry->ae_uname, name);
1155
- }
1156
-
1157
- void
1158
- archive_entry_copy_uname_w(struct archive_entry *entry, const wchar_t *name)
1159
- {
1160
- aes_copy_wcs(&entry->ae_uname, name);
1161
- }
1162
-
1163
- int
1164
- archive_entry_update_uname_utf8(struct archive_entry *entry, const char *name)
1165
- {
1166
- return (aes_update_utf8(&entry->ae_uname, name));
1167
- }
1168
-
1169
- /*
1170
- * ACL management. The following would, of course, be a lot simpler
1171
- * if: 1) the last draft of POSIX.1e were a really thorough and
1172
- * complete standard that addressed the needs of ACL archiving and 2)
1173
- * everyone followed it faithfully. Alas, neither is true, so the
1174
- * following is a lot more complex than might seem necessary to the
1175
- * uninitiated.
1176
- */
1177
-
1178
- void
1179
- archive_entry_acl_clear(struct archive_entry *entry)
1180
- {
1181
- struct ae_acl *ap;
1182
-
1183
- while (entry->acl_head != NULL) {
1184
- ap = entry->acl_head->next;
1185
- aes_clean(&entry->acl_head->name);
1186
- free(entry->acl_head);
1187
- entry->acl_head = ap;
1188
- }
1189
- if (entry->acl_text_w != NULL) {
1190
- free(entry->acl_text_w);
1191
- entry->acl_text_w = NULL;
1192
- }
1193
- entry->acl_p = NULL;
1194
- entry->acl_state = 0; /* Not counting. */
1195
- }
1196
-
1197
- /*
1198
- * Add a single ACL entry to the internal list of ACL data.
1199
- */
1200
- void
1201
- archive_entry_acl_add_entry(struct archive_entry *entry,
1202
- int type, int permset, int tag, int id, const char *name)
1203
- {
1204
- struct ae_acl *ap;
1205
-
1206
- if (acl_special(entry, type, permset, tag) == 0)
1207
- return;
1208
- ap = acl_new_entry(entry, type, permset, tag, id);
1209
- if (ap == NULL) {
1210
- /* XXX Error XXX */
1211
- return;
1212
- }
1213
- if (name != NULL && *name != '\0')
1214
- aes_copy_mbs(&ap->name, name);
1215
- else
1216
- aes_clean(&ap->name);
1217
- }
1218
-
1219
- /*
1220
- * As above, but with a wide-character name.
1221
- */
1222
- void
1223
- archive_entry_acl_add_entry_w(struct archive_entry *entry,
1224
- int type, int permset, int tag, int id, const wchar_t *name)
1225
- {
1226
- archive_entry_acl_add_entry_w_len(entry, type, permset, tag, id, name, wcslen(name));
1227
- }
1228
-
1229
- static void
1230
- archive_entry_acl_add_entry_w_len(struct archive_entry *entry,
1231
- int type, int permset, int tag, int id, const wchar_t *name, size_t len)
1232
- {
1233
- struct ae_acl *ap;
1234
-
1235
- if (acl_special(entry, type, permset, tag) == 0)
1236
- return;
1237
- ap = acl_new_entry(entry, type, permset, tag, id);
1238
- if (ap == NULL) {
1239
- /* XXX Error XXX */
1240
- return;
1241
- }
1242
- if (name != NULL && *name != L'\0' && len > 0)
1243
- aes_copy_wcs_len(&ap->name, name, len);
1244
- else
1245
- aes_clean(&ap->name);
1246
- }
1247
-
1248
- /*
1249
- * If this ACL entry is part of the standard POSIX permissions set,
1250
- * store the permissions in the stat structure and return zero.
1251
- */
1252
- static int
1253
- acl_special(struct archive_entry *entry, int type, int permset, int tag)
1254
- {
1255
- if (type == ARCHIVE_ENTRY_ACL_TYPE_ACCESS) {
1256
- switch (tag) {
1257
- case ARCHIVE_ENTRY_ACL_USER_OBJ:
1258
- entry->ae_stat.aest_mode &= ~0700;
1259
- entry->ae_stat.aest_mode |= (permset & 7) << 6;
1260
- return (0);
1261
- case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
1262
- entry->ae_stat.aest_mode &= ~0070;
1263
- entry->ae_stat.aest_mode |= (permset & 7) << 3;
1264
- return (0);
1265
- case ARCHIVE_ENTRY_ACL_OTHER:
1266
- entry->ae_stat.aest_mode &= ~0007;
1267
- entry->ae_stat.aest_mode |= permset & 7;
1268
- return (0);
1269
- }
1270
- }
1271
- return (1);
1272
- }
1273
-
1274
- /*
1275
- * Allocate and populate a new ACL entry with everything but the
1276
- * name.
1277
- */
1278
- static struct ae_acl *
1279
- acl_new_entry(struct archive_entry *entry,
1280
- int type, int permset, int tag, int id)
1281
- {
1282
- struct ae_acl *ap, *aq;
1283
-
1284
- if (type != ARCHIVE_ENTRY_ACL_TYPE_ACCESS &&
1285
- type != ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)
1286
- return (NULL);
1287
- if (entry->acl_text_w != NULL) {
1288
- free(entry->acl_text_w);
1289
- entry->acl_text_w = NULL;
1290
- }
1291
-
1292
- /* XXX TODO: More sanity-checks on the arguments XXX */
1293
-
1294
- /* If there's a matching entry already in the list, overwrite it. */
1295
- ap = entry->acl_head;
1296
- aq = NULL;
1297
- while (ap != NULL) {
1298
- if (ap->type == type && ap->tag == tag && ap->id == id) {
1299
- ap->permset = permset;
1300
- return (ap);
1301
- }
1302
- aq = ap;
1303
- ap = ap->next;
1304
- }
1305
-
1306
- /* Add a new entry to the end of the list. */
1307
- ap = (struct ae_acl *)malloc(sizeof(*ap));
1308
- if (ap == NULL)
1309
- return (NULL);
1310
- memset(ap, 0, sizeof(*ap));
1311
- if (aq == NULL)
1312
- entry->acl_head = ap;
1313
- else
1314
- aq->next = ap;
1315
- ap->type = type;
1316
- ap->tag = tag;
1317
- ap->id = id;
1318
- ap->permset = permset;
1319
- return (ap);
1320
- }
1321
-
1322
- /*
1323
- * Return a count of entries matching "want_type".
1324
- */
1325
- int
1326
- archive_entry_acl_count(struct archive_entry *entry, int want_type)
1327
- {
1328
- int count;
1329
- struct ae_acl *ap;
1330
-
1331
- count = 0;
1332
- ap = entry->acl_head;
1333
- while (ap != NULL) {
1334
- if ((ap->type & want_type) != 0)
1335
- count++;
1336
- ap = ap->next;
1337
- }
1338
-
1339
- if (count > 0 && ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0))
1340
- count += 3;
1341
- return (count);
1342
- }
1343
-
1344
- /*
1345
- * Prepare for reading entries from the ACL data. Returns a count
1346
- * of entries matching "want_type", or zero if there are no
1347
- * non-extended ACL entries of that type.
1348
- */
1349
- int
1350
- archive_entry_acl_reset(struct archive_entry *entry, int want_type)
1351
- {
1352
- int count, cutoff;
1353
-
1354
- count = archive_entry_acl_count(entry, want_type);
1355
-
1356
- /*
1357
- * If the only entries are the three standard ones,
1358
- * then don't return any ACL data. (In this case,
1359
- * client can just use chmod(2) to set permissions.)
1360
- */
1361
- if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)
1362
- cutoff = 3;
1363
- else
1364
- cutoff = 0;
1365
-
1366
- if (count > cutoff)
1367
- entry->acl_state = ARCHIVE_ENTRY_ACL_USER_OBJ;
1368
- else
1369
- entry->acl_state = 0;
1370
- entry->acl_p = entry->acl_head;
1371
- return (count);
1372
- }
1373
-
1374
- /*
1375
- * Return the next ACL entry in the list. Fake entries for the
1376
- * standard permissions and include them in the returned list.
1377
- */
1378
-
1379
- int
1380
- archive_entry_acl_next(struct archive_entry *entry, int want_type, int *type,
1381
- int *permset, int *tag, int *id, const char **name)
1382
- {
1383
- *name = NULL;
1384
- *id = -1;
1385
-
1386
- /*
1387
- * The acl_state is either zero (no entries available), -1
1388
- * (reading from list), or an entry type (retrieve that type
1389
- * from ae_stat.aest_mode).
1390
- */
1391
- if (entry->acl_state == 0)
1392
- return (ARCHIVE_WARN);
1393
-
1394
- /* The first three access entries are special. */
1395
- if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
1396
- switch (entry->acl_state) {
1397
- case ARCHIVE_ENTRY_ACL_USER_OBJ:
1398
- *permset = (entry->ae_stat.aest_mode >> 6) & 7;
1399
- *type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS;
1400
- *tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
1401
- entry->acl_state = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
1402
- return (ARCHIVE_OK);
1403
- case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
1404
- *permset = (entry->ae_stat.aest_mode >> 3) & 7;
1405
- *type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS;
1406
- *tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
1407
- entry->acl_state = ARCHIVE_ENTRY_ACL_OTHER;
1408
- return (ARCHIVE_OK);
1409
- case ARCHIVE_ENTRY_ACL_OTHER:
1410
- *permset = entry->ae_stat.aest_mode & 7;
1411
- *type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS;
1412
- *tag = ARCHIVE_ENTRY_ACL_OTHER;
1413
- entry->acl_state = -1;
1414
- entry->acl_p = entry->acl_head;
1415
- return (ARCHIVE_OK);
1416
- default:
1417
- break;
1418
- }
1419
- }
1420
-
1421
- while (entry->acl_p != NULL && (entry->acl_p->type & want_type) == 0)
1422
- entry->acl_p = entry->acl_p->next;
1423
- if (entry->acl_p == NULL) {
1424
- entry->acl_state = 0;
1425
- *type = 0;
1426
- *permset = 0;
1427
- *tag = 0;
1428
- *id = -1;
1429
- *name = NULL;
1430
- return (ARCHIVE_EOF); /* End of ACL entries. */
1431
- }
1432
- *type = entry->acl_p->type;
1433
- *permset = entry->acl_p->permset;
1434
- *tag = entry->acl_p->tag;
1435
- *id = entry->acl_p->id;
1436
- *name = aes_get_mbs(&entry->acl_p->name);
1437
- entry->acl_p = entry->acl_p->next;
1438
- return (ARCHIVE_OK);
1439
- }
1440
-
1441
- /*
1442
- * Generate a text version of the ACL. The flags parameter controls
1443
- * the style of the generated ACL.
1444
- */
1445
- const wchar_t *
1446
- archive_entry_acl_text_w(struct archive_entry *entry, int flags)
1447
- {
1448
- int count;
1449
- size_t length;
1450
- const wchar_t *wname;
1451
- const wchar_t *prefix;
1452
- wchar_t separator;
1453
- struct ae_acl *ap;
1454
- int id;
1455
- wchar_t *wp;
1456
-
1457
- if (entry->acl_text_w != NULL) {
1458
- free (entry->acl_text_w);
1459
- entry->acl_text_w = NULL;
1460
- }
1461
-
1462
- separator = L',';
1463
- count = 0;
1464
- length = 0;
1465
- ap = entry->acl_head;
1466
- while (ap != NULL) {
1467
- if ((ap->type & flags) != 0) {
1468
- count++;
1469
- if ((flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT) &&
1470
- (ap->type & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT))
1471
- length += 8; /* "default:" */
1472
- length += 5; /* tag name */
1473
- length += 1; /* colon */
1474
- wname = aes_get_wcs(&ap->name);
1475
- if (wname != NULL)
1476
- length += wcslen(wname);
1477
- else
1478
- length += sizeof(uid_t) * 3 + 1;
1479
- length ++; /* colon */
1480
- length += 3; /* rwx */
1481
- length += 1; /* colon */
1482
- length += max(sizeof(uid_t), sizeof(gid_t)) * 3 + 1;
1483
- length ++; /* newline */
1484
- }
1485
- ap = ap->next;
1486
- }
1487
-
1488
- if (count > 0 && ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0)) {
1489
- length += 10; /* "user::rwx\n" */
1490
- length += 11; /* "group::rwx\n" */
1491
- length += 11; /* "other::rwx\n" */
1492
- }
1493
-
1494
- if (count == 0)
1495
- return (NULL);
1496
-
1497
- /* Now, allocate the string and actually populate it. */
1498
- wp = entry->acl_text_w = (wchar_t *)malloc(length * sizeof(wchar_t));
1499
- if (wp == NULL)
1500
- __archive_errx(1, "No memory to generate the text version of the ACL");
1501
- count = 0;
1502
- if ((flags & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
1503
- append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_USER_OBJ, NULL,
1504
- entry->ae_stat.aest_mode & 0700, -1);
1505
- *wp++ = ',';
1506
- append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_GROUP_OBJ, NULL,
1507
- entry->ae_stat.aest_mode & 0070, -1);
1508
- *wp++ = ',';
1509
- append_entry_w(&wp, NULL, ARCHIVE_ENTRY_ACL_OTHER, NULL,
1510
- entry->ae_stat.aest_mode & 0007, -1);
1511
- count += 3;
1512
-
1513
- ap = entry->acl_head;
1514
- while (ap != NULL) {
1515
- if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0) {
1516
- wname = aes_get_wcs(&ap->name);
1517
- *wp++ = separator;
1518
- if (flags & ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID)
1519
- id = ap->id;
1520
- else
1521
- id = -1;
1522
- append_entry_w(&wp, NULL, ap->tag, wname,
1523
- ap->permset, id);
1524
- count++;
1525
- }
1526
- ap = ap->next;
1527
- }
1528
- }
1529
-
1530
-
1531
- if ((flags & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) != 0) {
1532
- if (flags & ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT)
1533
- prefix = L"default:";
1534
- else
1535
- prefix = NULL;
1536
- ap = entry->acl_head;
1537
- count = 0;
1538
- while (ap != NULL) {
1539
- if ((ap->type & ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) != 0) {
1540
- wname = aes_get_wcs(&ap->name);
1541
- if (count > 0)
1542
- *wp++ = separator;
1543
- if (flags & ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID)
1544
- id = ap->id;
1545
- else
1546
- id = -1;
1547
- append_entry_w(&wp, prefix, ap->tag,
1548
- wname, ap->permset, id);
1549
- count ++;
1550
- }
1551
- ap = ap->next;
1552
- }
1553
- }
1554
-
1555
- return (entry->acl_text_w);
1556
- }
1557
-
1558
- static void
1559
- append_id_w(wchar_t **wp, int id)
1560
- {
1561
- if (id < 0)
1562
- id = 0;
1563
- if (id > 9)
1564
- append_id_w(wp, id / 10);
1565
- *(*wp)++ = L"0123456789"[id % 10];
1566
- }
1567
-
1568
- static void
1569
- append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag,
1570
- const wchar_t *wname, int perm, int id)
1571
- {
1572
- if (prefix != NULL) {
1573
- wcscpy(*wp, prefix);
1574
- *wp += wcslen(*wp);
1575
- }
1576
- switch (tag) {
1577
- case ARCHIVE_ENTRY_ACL_USER_OBJ:
1578
- wname = NULL;
1579
- id = -1;
1580
- /* FALLTHROUGH */
1581
- case ARCHIVE_ENTRY_ACL_USER:
1582
- wcscpy(*wp, L"user");
1583
- break;
1584
- case ARCHIVE_ENTRY_ACL_GROUP_OBJ:
1585
- wname = NULL;
1586
- id = -1;
1587
- /* FALLTHROUGH */
1588
- case ARCHIVE_ENTRY_ACL_GROUP:
1589
- wcscpy(*wp, L"group");
1590
- break;
1591
- case ARCHIVE_ENTRY_ACL_MASK:
1592
- wcscpy(*wp, L"mask");
1593
- wname = NULL;
1594
- id = -1;
1595
- break;
1596
- case ARCHIVE_ENTRY_ACL_OTHER:
1597
- wcscpy(*wp, L"other");
1598
- wname = NULL;
1599
- id = -1;
1600
- break;
1601
- }
1602
- *wp += wcslen(*wp);
1603
- *(*wp)++ = L':';
1604
- if (wname != NULL) {
1605
- wcscpy(*wp, wname);
1606
- *wp += wcslen(*wp);
1607
- } else if (tag == ARCHIVE_ENTRY_ACL_USER
1608
- || tag == ARCHIVE_ENTRY_ACL_GROUP) {
1609
- append_id_w(wp, id);
1610
- id = -1;
1611
- }
1612
- *(*wp)++ = L':';
1613
- *(*wp)++ = (perm & 0444) ? L'r' : L'-';
1614
- *(*wp)++ = (perm & 0222) ? L'w' : L'-';
1615
- *(*wp)++ = (perm & 0111) ? L'x' : L'-';
1616
- if (id != -1) {
1617
- *(*wp)++ = L':';
1618
- append_id_w(wp, id);
1619
- }
1620
- **wp = L'\0';
1621
- }
1622
-
1623
- /*
1624
- * Parse a textual ACL. This automatically recognizes and supports
1625
- * extensions described above. The 'type' argument is used to
1626
- * indicate the type that should be used for any entries not
1627
- * explicitly marked as "default:".
1628
- */
1629
- int
1630
- __archive_entry_acl_parse_w(struct archive_entry *entry,
1631
- const wchar_t *text, int default_type)
1632
- {
1633
- struct {
1634
- const wchar_t *start;
1635
- const wchar_t *end;
1636
- } field[4], name;
1637
-
1638
- int fields, n;
1639
- int type, tag, permset, id;
1640
- wchar_t sep;
1641
-
1642
- while (text != NULL && *text != L'\0') {
1643
- /*
1644
- * Parse the fields out of the next entry,
1645
- * advance 'text' to start of next entry.
1646
- */
1647
- fields = 0;
1648
- do {
1649
- const wchar_t *start, *end;
1650
- next_field_w(&text, &start, &end, &sep);
1651
- if (fields < 4) {
1652
- field[fields].start = start;
1653
- field[fields].end = end;
1654
- }
1655
- ++fields;
1656
- } while (sep == L':');
1657
-
1658
- /* Set remaining fields to blank. */
1659
- for (n = fields; n < 4; ++n)
1660
- field[n].start = field[n].end = NULL;
1661
-
1662
- /* Check for a numeric ID in field 1 or 3. */
1663
- id = -1;
1664
- isint_w(field[1].start, field[1].end, &id);
1665
- /* Field 3 is optional. */
1666
- if (id == -1 && fields > 3)
1667
- isint_w(field[3].start, field[3].end, &id);
1668
-
1669
- /*
1670
- * Solaris extension: "defaultuser::rwx" is the
1671
- * default ACL corresponding to "user::rwx", etc.
1672
- */
1673
- if (field[0].end - field[0].start > 7
1674
- && wmemcmp(field[0].start, L"default", 7) == 0) {
1675
- type = ARCHIVE_ENTRY_ACL_TYPE_DEFAULT;
1676
- field[0].start += 7;
1677
- } else
1678
- type = default_type;
1679
-
1680
- name.start = name.end = NULL;
1681
- if (prefix_w(field[0].start, field[0].end, L"user")) {
1682
- if (!ismode_w(field[2].start, field[2].end, &permset))
1683
- return (ARCHIVE_WARN);
1684
- if (id != -1 || field[1].start < field[1].end) {
1685
- tag = ARCHIVE_ENTRY_ACL_USER;
1686
- name = field[1];
1687
- } else
1688
- tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
1689
- } else if (prefix_w(field[0].start, field[0].end, L"group")) {
1690
- if (!ismode_w(field[2].start, field[2].end, &permset))
1691
- return (ARCHIVE_WARN);
1692
- if (id != -1 || field[1].start < field[1].end) {
1693
- tag = ARCHIVE_ENTRY_ACL_GROUP;
1694
- name = field[1];
1695
- } else
1696
- tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
1697
- } else if (prefix_w(field[0].start, field[0].end, L"other")) {
1698
- if (fields == 2
1699
- && field[1].start < field[1].end
1700
- && ismode_w(field[1].start, field[1].end, &permset)) {
1701
- /* This is Solaris-style "other:rwx" */
1702
- } else if (fields == 3
1703
- && field[1].start == field[1].end
1704
- && field[2].start < field[2].end
1705
- && ismode_w(field[2].start, field[2].end, &permset)) {
1706
- /* This is FreeBSD-style "other::rwx" */
1707
- } else
1708
- return (ARCHIVE_WARN);
1709
- tag = ARCHIVE_ENTRY_ACL_OTHER;
1710
- } else if (prefix_w(field[0].start, field[0].end, L"mask")) {
1711
- if (fields == 2
1712
- && field[1].start < field[1].end
1713
- && ismode_w(field[1].start, field[1].end, &permset)) {
1714
- /* This is Solaris-style "mask:rwx" */
1715
- } else if (fields == 3
1716
- && field[1].start == field[1].end
1717
- && field[2].start < field[2].end
1718
- && ismode_w(field[2].start, field[2].end, &permset)) {
1719
- /* This is FreeBSD-style "mask::rwx" */
1720
- } else
1721
- return (ARCHIVE_WARN);
1722
- tag = ARCHIVE_ENTRY_ACL_MASK;
1723
- } else
1724
- return (ARCHIVE_WARN);
1725
-
1726
- /* Add entry to the internal list. */
1727
- archive_entry_acl_add_entry_w_len(entry, type, permset,
1728
- tag, id, name.start, name.end - name.start);
1729
- }
1730
- return (ARCHIVE_OK);
1731
- }
1732
-
1733
- /*
1734
- * Parse a string to a positive decimal integer. Returns true if
1735
- * the string is non-empty and consists only of decimal digits,
1736
- * false otherwise.
1737
- */
1738
- static int
1739
- isint_w(const wchar_t *start, const wchar_t *end, int *result)
1740
- {
1741
- int n = 0;
1742
- if (start >= end)
1743
- return (0);
1744
- while (start < end) {
1745
- if (*start < '0' || *start > '9')
1746
- return (0);
1747
- if (n > (INT_MAX / 10))
1748
- n = INT_MAX;
1749
- else {
1750
- n *= 10;
1751
- n += *start - '0';
1752
- }
1753
- start++;
1754
- }
1755
- *result = n;
1756
- return (1);
1757
- }
1758
-
1759
- /*
1760
- * Parse a string as a mode field. Returns true if
1761
- * the string is non-empty and consists only of mode characters,
1762
- * false otherwise.
1763
- */
1764
- static int
1765
- ismode_w(const wchar_t *start, const wchar_t *end, int *permset)
1766
- {
1767
- const wchar_t *p;
1768
-
1769
- if (start >= end)
1770
- return (0);
1771
- p = start;
1772
- *permset = 0;
1773
- while (p < end) {
1774
- switch (*p++) {
1775
- case 'r': case 'R':
1776
- *permset |= ARCHIVE_ENTRY_ACL_READ;
1777
- break;
1778
- case 'w': case 'W':
1779
- *permset |= ARCHIVE_ENTRY_ACL_WRITE;
1780
- break;
1781
- case 'x': case 'X':
1782
- *permset |= ARCHIVE_ENTRY_ACL_EXECUTE;
1783
- break;
1784
- case '-':
1785
- break;
1786
- default:
1787
- return (0);
1788
- }
1789
- }
1790
- return (1);
1791
- }
1792
-
1793
- /*
1794
- * Match "[:whitespace:]*(.*)[:whitespace:]*[:,\n]". *wp is updated
1795
- * to point to just after the separator. *start points to the first
1796
- * character of the matched text and *end just after the last
1797
- * character of the matched identifier. In particular *end - *start
1798
- * is the length of the field body, not including leading or trailing
1799
- * whitespace.
1800
- */
1801
- static void
1802
- next_field_w(const wchar_t **wp, const wchar_t **start,
1803
- const wchar_t **end, wchar_t *sep)
1804
- {
1805
- /* Skip leading whitespace to find start of field. */
1806
- while (**wp == L' ' || **wp == L'\t' || **wp == L'\n') {
1807
- (*wp)++;
1808
- }
1809
- *start = *wp;
1810
-
1811
- /* Scan for the separator. */
1812
- while (**wp != L'\0' && **wp != L',' && **wp != L':' &&
1813
- **wp != L'\n') {
1814
- (*wp)++;
1815
- }
1816
- *sep = **wp;
1817
-
1818
- /* Trim trailing whitespace to locate end of field. */
1819
- *end = *wp - 1;
1820
- while (**end == L' ' || **end == L'\t' || **end == L'\n') {
1821
- (*end)--;
1822
- }
1823
- (*end)++;
1824
-
1825
- /* Adjust scanner location. */
1826
- if (**wp != L'\0')
1827
- (*wp)++;
1828
- }
1829
-
1830
- /*
1831
- * Return true if the characters [start...end) are a prefix of 'test'.
1832
- * This makes it easy to handle the obvious abbreviations: 'u' for 'user', etc.
1833
- */
1834
- static int
1835
- prefix_w(const wchar_t *start, const wchar_t *end, const wchar_t *test)
1836
- {
1837
- if (start == end)
1838
- return (0);
1839
-
1840
- if (*start++ != *test++)
1841
- return (0);
1842
-
1843
- while (start < end && *start++ == *test++)
1844
- ;
1845
-
1846
- if (start < end)
1847
- return (0);
1848
-
1849
- return (1);
1850
- }
1851
-
1852
-
1853
- /*
1854
- * Following code is modified from UC Berkeley sources, and
1855
- * is subject to the following copyright notice.
1856
- */
1857
-
1858
- /*-
1859
- * Copyright (c) 1993
1860
- * The Regents of the University of California. All rights reserved.
1861
- *
1862
- * Redistribution and use in source and binary forms, with or without
1863
- * modification, are permitted provided that the following conditions
1864
- * are met:
1865
- * 1. Redistributions of source code must retain the above copyright
1866
- * notice, this list of conditions and the following disclaimer.
1867
- * 2. Redistributions in binary form must reproduce the above copyright
1868
- * notice, this list of conditions and the following disclaimer in the
1869
- * documentation and/or other materials provided with the distribution.
1870
- * 4. Neither the name of the University nor the names of its contributors
1871
- * may be used to endorse or promote products derived from this software
1872
- * without specific prior written permission.
1873
- *
1874
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1875
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1876
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1877
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1878
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1879
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1880
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1881
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1882
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1883
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1884
- * SUCH DAMAGE.
1885
- */
1886
-
1887
- static struct flag {
1888
- const char *name;
1889
- const wchar_t *wname;
1890
- unsigned long set;
1891
- unsigned long clear;
1892
- } flags[] = {
1893
- /* Preferred (shorter) names per flag first, all prefixed by "no" */
1894
- #ifdef SF_APPEND
1895
- { "nosappnd", L"nosappnd", SF_APPEND, 0 },
1896
- { "nosappend", L"nosappend", SF_APPEND, 0 },
1897
- #endif
1898
- #ifdef EXT2_APPEND_FL /* 'a' */
1899
- { "nosappnd", L"nosappnd", EXT2_APPEND_FL, 0 },
1900
- { "nosappend", L"nosappend", EXT2_APPEND_FL, 0 },
1901
- #endif
1902
- #ifdef SF_ARCHIVED
1903
- { "noarch", L"noarch", SF_ARCHIVED, 0 },
1904
- { "noarchived", L"noarchived", SF_ARCHIVED, 0 },
1905
- #endif
1906
- #ifdef SF_IMMUTABLE
1907
- { "noschg", L"noschg", SF_IMMUTABLE, 0 },
1908
- { "noschange", L"noschange", SF_IMMUTABLE, 0 },
1909
- { "nosimmutable", L"nosimmutable", SF_IMMUTABLE, 0 },
1910
- #endif
1911
- #ifdef EXT2_IMMUTABLE_FL /* 'i' */
1912
- { "noschg", L"noschg", EXT2_IMMUTABLE_FL, 0 },
1913
- { "noschange", L"noschange", EXT2_IMMUTABLE_FL, 0 },
1914
- { "nosimmutable", L"nosimmutable", EXT2_IMMUTABLE_FL, 0 },
1915
- #endif
1916
- #ifdef SF_NOUNLINK
1917
- { "nosunlnk", L"nosunlnk", SF_NOUNLINK, 0 },
1918
- { "nosunlink", L"nosunlink", SF_NOUNLINK, 0 },
1919
- #endif
1920
- #ifdef SF_SNAPSHOT
1921
- { "nosnapshot", L"nosnapshot", SF_SNAPSHOT, 0 },
1922
- #endif
1923
- #ifdef UF_APPEND
1924
- { "nouappnd", L"nouappnd", UF_APPEND, 0 },
1925
- { "nouappend", L"nouappend", UF_APPEND, 0 },
1926
- #endif
1927
- #ifdef UF_IMMUTABLE
1928
- { "nouchg", L"nouchg", UF_IMMUTABLE, 0 },
1929
- { "nouchange", L"nouchange", UF_IMMUTABLE, 0 },
1930
- { "nouimmutable", L"nouimmutable", UF_IMMUTABLE, 0 },
1931
- #endif
1932
- #ifdef UF_NODUMP
1933
- { "nodump", L"nodump", 0, UF_NODUMP},
1934
- #endif
1935
- #ifdef EXT2_NODUMP_FL /* 'd' */
1936
- { "nodump", L"nodump", 0, EXT2_NODUMP_FL},
1937
- #endif
1938
- #ifdef UF_OPAQUE
1939
- { "noopaque", L"noopaque", UF_OPAQUE, 0 },
1940
- #endif
1941
- #ifdef UF_NOUNLINK
1942
- { "nouunlnk", L"nouunlnk", UF_NOUNLINK, 0 },
1943
- { "nouunlink", L"nouunlink", UF_NOUNLINK, 0 },
1944
- #endif
1945
- #ifdef EXT2_UNRM_FL
1946
- { "nouunlink", L"nouunlink", EXT2_UNRM_FL, 0},
1947
- #endif
1948
-
1949
- #ifdef EXT2_BTREE_FL
1950
- { "nobtree", L"nobtree", EXT2_BTREE_FL, 0 },
1951
- #endif
1952
-
1953
- #ifdef EXT2_ECOMPR_FL
1954
- { "nocomperr", L"nocomperr", EXT2_ECOMPR_FL, 0 },
1955
- #endif
1956
-
1957
- #ifdef EXT2_COMPR_FL /* 'c' */
1958
- { "nocompress", L"nocompress", EXT2_COMPR_FL, 0 },
1959
- #endif
1960
-
1961
- #ifdef EXT2_NOATIME_FL /* 'A' */
1962
- { "noatime", L"noatime", 0, EXT2_NOATIME_FL},
1963
- #endif
1964
-
1965
- #ifdef EXT2_DIRTY_FL
1966
- { "nocompdirty",L"nocompdirty", EXT2_DIRTY_FL, 0},
1967
- #endif
1968
-
1969
- #ifdef EXT2_COMPRBLK_FL
1970
- #ifdef EXT2_NOCOMPR_FL
1971
- { "nocomprblk", L"nocomprblk", EXT2_COMPRBLK_FL, EXT2_NOCOMPR_FL},
1972
- #else
1973
- { "nocomprblk", L"nocomprblk", EXT2_COMPRBLK_FL, 0},
1974
- #endif
1975
- #endif
1976
- #ifdef EXT2_DIRSYNC_FL
1977
- { "nodirsync", L"nodirsync", EXT2_DIRSYNC_FL, 0},
1978
- #endif
1979
- #ifdef EXT2_INDEX_FL
1980
- { "nohashidx", L"nohashidx", EXT2_INDEX_FL, 0},
1981
- #endif
1982
- #ifdef EXT2_IMAGIC_FL
1983
- { "noimagic", L"noimagic", EXT2_IMAGIC_FL, 0},
1984
- #endif
1985
- #ifdef EXT3_JOURNAL_DATA_FL
1986
- { "nojournal", L"nojournal", EXT3_JOURNAL_DATA_FL, 0},
1987
- #endif
1988
- #ifdef EXT2_SECRM_FL
1989
- { "nosecuredeletion",L"nosecuredeletion",EXT2_SECRM_FL, 0},
1990
- #endif
1991
- #ifdef EXT2_SYNC_FL
1992
- { "nosync", L"nosync", EXT2_SYNC_FL, 0},
1993
- #endif
1994
- #ifdef EXT2_NOTAIL_FL
1995
- { "notail", L"notail", 0, EXT2_NOTAIL_FL},
1996
- #endif
1997
- #ifdef EXT2_TOPDIR_FL
1998
- { "notopdir", L"notopdir", EXT2_TOPDIR_FL, 0},
1999
- #endif
2000
- #ifdef EXT2_RESERVED_FL
2001
- { "noreserved", L"noreserved", EXT2_RESERVED_FL, 0},
2002
- #endif
2003
-
2004
- { NULL, NULL, 0, 0 }
2005
- };
2006
-
2007
- /*
2008
- * fflagstostr --
2009
- * Convert file flags to a comma-separated string. If no flags
2010
- * are set, return the empty string.
2011
- */
2012
- static char *
2013
- ae_fflagstostr(unsigned long bitset, unsigned long bitclear)
2014
- {
2015
- char *string, *dp;
2016
- const char *sp;
2017
- unsigned long bits;
2018
- struct flag *flag;
2019
- size_t length;
2020
-
2021
- bits = bitset | bitclear;
2022
- length = 0;
2023
- for (flag = flags; flag->name != NULL; flag++)
2024
- if (bits & (flag->set | flag->clear)) {
2025
- length += strlen(flag->name) + 1;
2026
- bits &= ~(flag->set | flag->clear);
2027
- }
2028
-
2029
- if (length == 0)
2030
- return (NULL);
2031
- string = (char *)malloc(length);
2032
- if (string == NULL)
2033
- return (NULL);
2034
-
2035
- dp = string;
2036
- for (flag = flags; flag->name != NULL; flag++) {
2037
- if (bitset & flag->set || bitclear & flag->clear) {
2038
- sp = flag->name + 2;
2039
- } else if (bitset & flag->clear || bitclear & flag->set) {
2040
- sp = flag->name;
2041
- } else
2042
- continue;
2043
- bitset &= ~(flag->set | flag->clear);
2044
- bitclear &= ~(flag->set | flag->clear);
2045
- if (dp > string)
2046
- *dp++ = ',';
2047
- while ((*dp++ = *sp++) != '\0')
2048
- ;
2049
- dp--;
2050
- }
2051
-
2052
- *dp = '\0';
2053
- return (string);
2054
- }
2055
-
2056
- /*
2057
- * strtofflags --
2058
- * Take string of arguments and return file flags. This
2059
- * version works a little differently than strtofflags(3).
2060
- * In particular, it always tests every token, skipping any
2061
- * unrecognized tokens. It returns a pointer to the first
2062
- * unrecognized token, or NULL if every token was recognized.
2063
- * This version is also const-correct and does not modify the
2064
- * provided string.
2065
- */
2066
- static const char *
2067
- ae_strtofflags(const char *s, unsigned long *setp, unsigned long *clrp)
2068
- {
2069
- const char *start, *end;
2070
- struct flag *flag;
2071
- unsigned long set, clear;
2072
- const char *failed;
2073
-
2074
- set = clear = 0;
2075
- start = s;
2076
- failed = NULL;
2077
- /* Find start of first token. */
2078
- while (*start == '\t' || *start == ' ' || *start == ',')
2079
- start++;
2080
- while (*start != '\0') {
2081
- /* Locate end of token. */
2082
- end = start;
2083
- while (*end != '\0' && *end != '\t' &&
2084
- *end != ' ' && *end != ',')
2085
- end++;
2086
- for (flag = flags; flag->name != NULL; flag++) {
2087
- if (memcmp(start, flag->name, end - start) == 0) {
2088
- /* Matched "noXXXX", so reverse the sense. */
2089
- clear |= flag->set;
2090
- set |= flag->clear;
2091
- break;
2092
- } else if (memcmp(start, flag->name + 2, end - start)
2093
- == 0) {
2094
- /* Matched "XXXX", so don't reverse. */
2095
- set |= flag->set;
2096
- clear |= flag->clear;
2097
- break;
2098
- }
2099
- }
2100
- /* Ignore unknown flag names. */
2101
- if (flag->name == NULL && failed == NULL)
2102
- failed = start;
2103
-
2104
- /* Find start of next token. */
2105
- start = end;
2106
- while (*start == '\t' || *start == ' ' || *start == ',')
2107
- start++;
2108
-
2109
- }
2110
-
2111
- if (setp)
2112
- *setp = set;
2113
- if (clrp)
2114
- *clrp = clear;
2115
-
2116
- /* Return location of first failure. */
2117
- return (failed);
2118
- }
2119
-
2120
- /*
2121
- * wcstofflags --
2122
- * Take string of arguments and return file flags. This
2123
- * version works a little differently than strtofflags(3).
2124
- * In particular, it always tests every token, skipping any
2125
- * unrecognized tokens. It returns a pointer to the first
2126
- * unrecognized token, or NULL if every token was recognized.
2127
- * This version is also const-correct and does not modify the
2128
- * provided string.
2129
- */
2130
- static const wchar_t *
2131
- ae_wcstofflags(const wchar_t *s, unsigned long *setp, unsigned long *clrp)
2132
- {
2133
- const wchar_t *start, *end;
2134
- struct flag *flag;
2135
- unsigned long set, clear;
2136
- const wchar_t *failed;
2137
-
2138
- set = clear = 0;
2139
- start = s;
2140
- failed = NULL;
2141
- /* Find start of first token. */
2142
- while (*start == L'\t' || *start == L' ' || *start == L',')
2143
- start++;
2144
- while (*start != L'\0') {
2145
- /* Locate end of token. */
2146
- end = start;
2147
- while (*end != L'\0' && *end != L'\t' &&
2148
- *end != L' ' && *end != L',')
2149
- end++;
2150
- for (flag = flags; flag->wname != NULL; flag++) {
2151
- if (wmemcmp(start, flag->wname, end - start) == 0) {
2152
- /* Matched "noXXXX", so reverse the sense. */
2153
- clear |= flag->set;
2154
- set |= flag->clear;
2155
- break;
2156
- } else if (wmemcmp(start, flag->wname + 2, end - start)
2157
- == 0) {
2158
- /* Matched "XXXX", so don't reverse. */
2159
- set |= flag->set;
2160
- clear |= flag->clear;
2161
- break;
2162
- }
2163
- }
2164
- /* Ignore unknown flag names. */
2165
- if (flag->wname == NULL && failed == NULL)
2166
- failed = start;
2167
-
2168
- /* Find start of next token. */
2169
- start = end;
2170
- while (*start == L'\t' || *start == L' ' || *start == L',')
2171
- start++;
2172
-
2173
- }
2174
-
2175
- if (setp)
2176
- *setp = set;
2177
- if (clrp)
2178
- *clrp = clear;
2179
-
2180
- /* Return location of first failure. */
2181
- return (failed);
2182
- }
2183
-
2184
-
2185
- #ifdef TEST
2186
- #include <stdio.h>
2187
- int
2188
- main(int argc, char **argv)
2189
- {
2190
- struct archive_entry *entry = archive_entry_new();
2191
- unsigned long set, clear;
2192
- const wchar_t *remainder;
2193
-
2194
- remainder = archive_entry_copy_fflags_text_w(entry, L"nosappnd dump archive,,,,,,,");
2195
- archive_entry_fflags(entry, &set, &clear);
2196
-
2197
- wprintf(L"set=0x%lX clear=0x%lX remainder='%ls'\n", set, clear, remainder);
2198
-
2199
- wprintf(L"new flags='%s'\n", archive_entry_fflags_text(entry));
2200
- return (0);
2201
- }
2202
- #endif