omnizip 0.4.7-arm-linux

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 (632) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +293 -0
  5. data/CHANGELOG.md +1647 -0
  6. data/CONTEXT.md +68 -0
  7. data/COPYING +502 -0
  8. data/Gemfile +19 -0
  9. data/LICENSE +12 -0
  10. data/README.adoc +1327 -0
  11. data/Rakefile +15 -0
  12. data/TODO.refactor/00-overview.md +67 -0
  13. data/TODO.refactor/01-registry-base-class.md +81 -0
  14. data/TODO.refactor/02-error-hierarchy.md +57 -0
  15. data/TODO.refactor/03-autoload-entry-point.md +69 -0
  16. data/TODO.refactor/04-filter-base-consolidation.md +49 -0
  17. data/TODO.refactor/05-send-private-methods.md +64 -0
  18. data/TODO.refactor/06-instance-variable-access.md +69 -0
  19. data/TODO.refactor/07-respond-to-replacement.md +237 -0
  20. data/TODO.refactor/08-spec-doubles.md +27 -0
  21. data/TODO.refactor/09-cli-shared-module.md +35 -0
  22. data/TODO.refactor/10-format-detector-ocp.md +34 -0
  23. data/TODO.refactor/11-convenience-decoupling.md +38 -0
  24. data/TODO.refactor/12-thread-safety.md +8 -0
  25. data/TODO.refactor/13-lutaml-model-migration.md +158 -0
  26. data/TODO.refactor/14-add-missing-specs.md +25 -0
  27. data/benchmark/README.md +260 -0
  28. data/benchmark/benchmark_suite.rb +125 -0
  29. data/benchmark/compression_bench.rb +181 -0
  30. data/benchmark/filter_bench.rb +180 -0
  31. data/benchmark/models/benchmark_result.rb +59 -0
  32. data/benchmark/models/comparison_result.rb +69 -0
  33. data/benchmark/profile_suite.rb +167 -0
  34. data/benchmark/reporter.rb +150 -0
  35. data/benchmark/run_benchmarks.rb +66 -0
  36. data/benchmark/test_data.rb +137 -0
  37. data/config/formats/rar3_spec.yml +92 -0
  38. data/config/formats/rar5_spec.yml +102 -0
  39. data/docs/.github/workflows/docs.yml +142 -0
  40. data/docs/.gitignore +21 -0
  41. data/docs/.lychee.toml +67 -0
  42. data/docs/Gemfile +13 -0
  43. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  44. data/docs/README.md +101 -0
  45. data/docs/_config.yml +112 -0
  46. data/docs/assets/logo.svg +1 -0
  47. data/docs/assets/omnizip-logo.pdf +1540 -11
  48. data/docs/comparison/feature-matrix.adoc +694 -0
  49. data/docs/comparison/index.adoc +113 -0
  50. data/docs/comparison/vs-7zip.adoc +309 -0
  51. data/docs/comparison/vs-peazip.adoc +77 -0
  52. data/docs/comparison/vs-rubyzip.adoc +342 -0
  53. data/docs/comparison/vs-winrar.adoc +100 -0
  54. data/docs/compatibility.adoc +579 -0
  55. data/docs/concepts/index.adoc +129 -0
  56. data/docs/developer/architecture.adoc +256 -0
  57. data/docs/developer/contributing.adoc +158 -0
  58. data/docs/developer/index.adoc +25 -0
  59. data/docs/developer/testing.adoc +212 -0
  60. data/docs/getting-started/basic-usage.adoc +263 -0
  61. data/docs/getting-started/index.adoc +42 -0
  62. data/docs/getting-started/installation.adoc +138 -0
  63. data/docs/getting-started/quick-start.adoc +183 -0
  64. data/docs/getting-started/your-first-archive.adoc +219 -0
  65. data/docs/guides/advanced-features/encryption.adoc +277 -0
  66. data/docs/guides/advanced-features/index.adoc +59 -0
  67. data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
  68. data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
  69. data/docs/guides/advanced-features/streaming.adoc +142 -0
  70. data/docs/guides/archive-formats/gzip-format.adoc +105 -0
  71. data/docs/guides/archive-formats/index.adoc +160 -0
  72. data/docs/guides/archive-formats/ole-format.adoc +151 -0
  73. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  74. data/docs/guides/archive-formats/rar5.adoc +521 -0
  75. data/docs/guides/archive-formats/rpm-format.adoc +108 -0
  76. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  77. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  78. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  79. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  80. data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
  81. data/docs/guides/compression-algorithms/deflate.adoc +313 -0
  82. data/docs/guides/compression-algorithms/index.adoc +190 -0
  83. data/docs/guides/compression-algorithms/lzma.adoc +394 -0
  84. data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
  85. data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
  86. data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
  87. data/docs/guides/creating-archives.adoc +348 -0
  88. data/docs/guides/extracting-archives.adoc +53 -0
  89. data/docs/guides/format-conversion.adoc +64 -0
  90. data/docs/guides/index.adoc +49 -0
  91. data/docs/guides/migration-rubyzip.adoc +217 -0
  92. data/docs/guides/parity-archives.adoc +605 -0
  93. data/docs/guides/performance-tuning.adoc +88 -0
  94. data/docs/index.adoc +228 -0
  95. data/docs/lychee.toml +67 -0
  96. data/docs/reference/api/overview.adoc +187 -0
  97. data/docs/reference/cli/compress-command.adoc +114 -0
  98. data/docs/reference/cli/overview.adoc +140 -0
  99. data/docs/reference/index.adoc +26 -0
  100. data/docs/resources/faq.adoc +185 -0
  101. data/docs/resources/quick-reference.adoc +222 -0
  102. data/docs/rust-backend.md +0 -0
  103. data/docs/troubleshooting/index.adoc +207 -0
  104. data/docs/xar_format.md +216 -0
  105. data/examples/api_comparison.rb +205 -0
  106. data/examples/deflate64_example.rb +96 -0
  107. data/examples/par2_demo.rb +121 -0
  108. data/examples/quick_start_native.rb +150 -0
  109. data/examples/quick_start_rubyzip.rb +115 -0
  110. data/examples/rubyzip_compatibility_demo.rb +194 -0
  111. data/exe/omnizip +27 -0
  112. data/lib/omnizip/algorithm.rb +176 -0
  113. data/lib/omnizip/algorithm_registry.rb +65 -0
  114. data/lib/omnizip/algorithms/.keep +0 -0
  115. data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
  116. data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
  117. data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
  118. data/lib/omnizip/algorithms/bzip2.rb +108 -0
  119. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  120. data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
  121. data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
  122. data/lib/omnizip/algorithms/deflate.rb +135 -0
  123. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  124. data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
  125. data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
  126. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
  127. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
  128. data/lib/omnizip/algorithms/deflate64.rb +118 -0
  129. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  130. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  131. data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
  132. data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
  133. data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
  134. data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
  135. data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
  136. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
  137. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
  138. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
  139. data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
  140. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
  141. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  142. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  143. data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
  144. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  145. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
  146. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
  147. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  148. data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
  149. data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
  150. data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
  151. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  152. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
  153. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
  154. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
  155. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
  156. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
  157. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
  158. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  159. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
  160. data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
  161. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
  162. data/lib/omnizip/algorithms/lzma.rb +266 -0
  163. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
  164. data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
  165. data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
  166. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
  167. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  168. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
  169. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  170. data/lib/omnizip/algorithms/lzma2.rb +133 -0
  171. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  172. data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
  173. data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
  174. data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
  175. data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
  176. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  177. data/lib/omnizip/algorithms/ppmd7.rb +146 -0
  178. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  179. data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
  180. data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
  181. data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
  182. data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
  183. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  184. data/lib/omnizip/algorithms/ppmd8.rb +122 -0
  185. data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
  186. data/lib/omnizip/algorithms/registration.rb +28 -0
  187. data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
  188. data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
  189. data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
  190. data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
  191. data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
  192. data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
  193. data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
  194. data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
  195. data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
  196. data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
  197. data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
  198. data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
  199. data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
  200. data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
  201. data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
  202. data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
  203. data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
  204. data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
  205. data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
  206. data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
  207. data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
  208. data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
  209. data/lib/omnizip/algorithms/zstandard.rb +210 -0
  210. data/lib/omnizip/algorithms.rb +35 -0
  211. data/lib/omnizip/archive/builder.rb +48 -0
  212. data/lib/omnizip/archive/reader_session.rb +67 -0
  213. data/lib/omnizip/archive.rb +86 -0
  214. data/lib/omnizip/archive_handler.rb +82 -0
  215. data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
  216. data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
  217. data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
  218. data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
  219. data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
  220. data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
  221. data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
  222. data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
  223. data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
  224. data/lib/omnizip/archive_handlers.rb +18 -0
  225. data/lib/omnizip/backends.rb +160 -0
  226. data/lib/omnizip/buffer/memory_archive.rb +246 -0
  227. data/lib/omnizip/buffer/memory_extractor.rb +234 -0
  228. data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
  229. data/lib/omnizip/buffer.rb +187 -0
  230. data/lib/omnizip/checksum_registry.rb +41 -0
  231. data/lib/omnizip/checksums/crc32.rb +101 -0
  232. data/lib/omnizip/checksums/crc64.rb +102 -0
  233. data/lib/omnizip/checksums/crc_base.rb +158 -0
  234. data/lib/omnizip/checksums/registration.rb +16 -0
  235. data/lib/omnizip/checksums/verifier.rb +130 -0
  236. data/lib/omnizip/checksums.rb +11 -0
  237. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  238. data/lib/omnizip/chunked/reader.rb +78 -0
  239. data/lib/omnizip/chunked/writer.rb +123 -0
  240. data/lib/omnizip/chunked.rb +123 -0
  241. data/lib/omnizip/cli/output_formatter.rb +112 -0
  242. data/lib/omnizip/cli.rb +604 -0
  243. data/lib/omnizip/commands/.keep +0 -0
  244. data/lib/omnizip/commands/archive_create_command.rb +245 -0
  245. data/lib/omnizip/commands/archive_extract_command.rb +231 -0
  246. data/lib/omnizip/commands/archive_list_command.rb +204 -0
  247. data/lib/omnizip/commands/archive_repair_command.rb +129 -0
  248. data/lib/omnizip/commands/archive_verify_command.rb +115 -0
  249. data/lib/omnizip/commands/compress_command.rb +115 -0
  250. data/lib/omnizip/commands/decompress_command.rb +149 -0
  251. data/lib/omnizip/commands/list_command.rb +51 -0
  252. data/lib/omnizip/commands/metadata_command.rb +215 -0
  253. data/lib/omnizip/commands/parity_create_command.rb +114 -0
  254. data/lib/omnizip/commands/parity_repair_command.rb +120 -0
  255. data/lib/omnizip/commands/parity_verify_command.rb +122 -0
  256. data/lib/omnizip/commands/profile_list_command.rb +54 -0
  257. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  258. data/lib/omnizip/commands.rb +21 -0
  259. data/lib/omnizip/convenience.rb +389 -0
  260. data/lib/omnizip/converter/conversion_registry.rb +50 -0
  261. data/lib/omnizip/converter/conversion_strategy.rb +108 -0
  262. data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
  263. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
  264. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
  265. data/lib/omnizip/converter.rb +124 -0
  266. data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
  267. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  268. data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
  269. data/lib/omnizip/crypto/aes256.rb +102 -0
  270. data/lib/omnizip/crypto.rb +11 -0
  271. data/lib/omnizip/entry.rb +44 -0
  272. data/lib/omnizip/error.rb +110 -0
  273. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
  274. data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
  275. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  276. data/lib/omnizip/eta/sample_history.rb +143 -0
  277. data/lib/omnizip/eta/time_estimator.rb +106 -0
  278. data/lib/omnizip/eta.rb +68 -0
  279. data/lib/omnizip/extraction/filter_chain.rb +179 -0
  280. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  281. data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
  282. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  283. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  284. data/lib/omnizip/extraction/selective_extractor.rb +247 -0
  285. data/lib/omnizip/extraction.rb +115 -0
  286. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  287. data/lib/omnizip/file_type.rb +117 -0
  288. data/lib/omnizip/filter.rb +141 -0
  289. data/lib/omnizip/filter_pipeline.rb +108 -0
  290. data/lib/omnizip/filter_registry.rb +113 -0
  291. data/lib/omnizip/filters/bcj.rb +277 -0
  292. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  293. data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
  294. data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
  295. data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
  296. data/lib/omnizip/filters/bcj2.rb +93 -0
  297. data/lib/omnizip/filters/bcj_arm.rb +174 -0
  298. data/lib/omnizip/filters/bcj_arm64.rb +242 -0
  299. data/lib/omnizip/filters/bcj_ia64.rb +194 -0
  300. data/lib/omnizip/filters/bcj_ppc.rb +188 -0
  301. data/lib/omnizip/filters/bcj_sparc.rb +174 -0
  302. data/lib/omnizip/filters/bcj_x86.rb +191 -0
  303. data/lib/omnizip/filters/delta.rb +195 -0
  304. data/lib/omnizip/filters/xz_delta.rb +258 -0
  305. data/lib/omnizip/filters.rb +20 -0
  306. data/lib/omnizip/format_detector.rb +166 -0
  307. data/lib/omnizip/formats/.keep +0 -0
  308. data/lib/omnizip/formats/bzip2_file.rb +159 -0
  309. data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
  310. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  311. data/lib/omnizip/formats/cpio/entry.rb +389 -0
  312. data/lib/omnizip/formats/cpio/reader.rb +194 -0
  313. data/lib/omnizip/formats/cpio/writer.rb +232 -0
  314. data/lib/omnizip/formats/cpio.rb +132 -0
  315. data/lib/omnizip/formats/format_spec_loader.rb +228 -0
  316. data/lib/omnizip/formats/gzip.rb +236 -0
  317. data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
  318. data/lib/omnizip/formats/iso/directory_record.rb +162 -0
  319. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  320. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  321. data/lib/omnizip/formats/iso/reader.rb +194 -0
  322. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  323. data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
  324. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  325. data/lib/omnizip/formats/iso/writer.rb +543 -0
  326. data/lib/omnizip/formats/iso.rb +133 -0
  327. data/lib/omnizip/formats/lzip.rb +161 -0
  328. data/lib/omnizip/formats/lzma_alone.rb +149 -0
  329. data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
  330. data/lib/omnizip/formats/msi/constants.rb +157 -0
  331. data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
  332. data/lib/omnizip/formats/msi/entry.rb +134 -0
  333. data/lib/omnizip/formats/msi/reader.rb +301 -0
  334. data/lib/omnizip/formats/msi/string_pool.rb +246 -0
  335. data/lib/omnizip/formats/msi/table_parser.rb +244 -0
  336. data/lib/omnizip/formats/msi.rb +73 -0
  337. data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
  338. data/lib/omnizip/formats/ole/constants.rb +61 -0
  339. data/lib/omnizip/formats/ole/dirent.rb +439 -0
  340. data/lib/omnizip/formats/ole/header.rb +199 -0
  341. data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
  342. data/lib/omnizip/formats/ole/storage.rb +482 -0
  343. data/lib/omnizip/formats/ole/types/variant.rb +338 -0
  344. data/lib/omnizip/formats/ole.rb +143 -0
  345. data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
  346. data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
  347. data/lib/omnizip/formats/rar/block_parser.rb +282 -0
  348. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  349. data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
  350. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
  351. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
  352. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  353. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  354. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  355. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  356. data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
  357. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
  358. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
  359. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
  360. data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
  361. data/lib/omnizip/formats/rar/compression.rb +17 -0
  362. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  363. data/lib/omnizip/formats/rar/constants.rb +88 -0
  364. data/lib/omnizip/formats/rar/decompressor.rb +316 -0
  365. data/lib/omnizip/formats/rar/external_writer.rb +311 -0
  366. data/lib/omnizip/formats/rar/header.rb +209 -0
  367. data/lib/omnizip/formats/rar/license_validator.rb +111 -0
  368. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  369. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  370. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  371. data/lib/omnizip/formats/rar/models.rb +14 -0
  372. data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
  373. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
  374. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
  375. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  376. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  377. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
  378. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  379. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
  380. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  381. data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
  382. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  383. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  384. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  385. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  386. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  387. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
  388. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  389. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
  390. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
  391. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
  392. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  393. data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
  394. data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
  395. data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
  396. data/lib/omnizip/formats/rar/reader.rb +377 -0
  397. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  398. data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
  399. data/lib/omnizip/formats/rar/writer.rb +437 -0
  400. data/lib/omnizip/formats/rar.rb +193 -0
  401. data/lib/omnizip/formats/rar3/compressor.rb +71 -0
  402. data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
  403. data/lib/omnizip/formats/rar3/reader.rb +107 -0
  404. data/lib/omnizip/formats/rar3/writer.rb +220 -0
  405. data/lib/omnizip/formats/rar3.rb +15 -0
  406. data/lib/omnizip/formats/rar5/compressor.rb +71 -0
  407. data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
  408. data/lib/omnizip/formats/rar5/reader.rb +130 -0
  409. data/lib/omnizip/formats/rar5/writer.rb +65 -0
  410. data/lib/omnizip/formats/rar5.rb +15 -0
  411. data/lib/omnizip/formats/rpm/constants.rb +58 -0
  412. data/lib/omnizip/formats/rpm/entry.rb +106 -0
  413. data/lib/omnizip/formats/rpm/header.rb +106 -0
  414. data/lib/omnizip/formats/rpm/lead.rb +132 -0
  415. data/lib/omnizip/formats/rpm/tag.rb +228 -0
  416. data/lib/omnizip/formats/rpm/writer.rb +652 -0
  417. data/lib/omnizip/formats/rpm.rb +458 -0
  418. data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
  419. data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
  420. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  421. data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
  422. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
  423. data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
  424. data/lib/omnizip/formats/seven_zip/header.rb +102 -0
  425. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
  426. data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
  427. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  428. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
  429. data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
  430. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  431. data/lib/omnizip/formats/seven_zip/models.rb +20 -0
  432. data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
  433. data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
  434. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
  435. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
  436. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  437. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
  438. data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
  439. data/lib/omnizip/formats/seven_zip.rb +179 -0
  440. data/lib/omnizip/formats/tar/constants.rb +73 -0
  441. data/lib/omnizip/formats/tar/entry.rb +98 -0
  442. data/lib/omnizip/formats/tar/header.rb +206 -0
  443. data/lib/omnizip/formats/tar/reader.rb +119 -0
  444. data/lib/omnizip/formats/tar/writer.rb +212 -0
  445. data/lib/omnizip/formats/tar.rb +74 -0
  446. data/lib/omnizip/formats/xar/constants.rb +119 -0
  447. data/lib/omnizip/formats/xar/entry.rb +268 -0
  448. data/lib/omnizip/formats/xar/header.rb +223 -0
  449. data/lib/omnizip/formats/xar/reader.rb +400 -0
  450. data/lib/omnizip/formats/xar/toc.rb +570 -0
  451. data/lib/omnizip/formats/xar/writer.rb +461 -0
  452. data/lib/omnizip/formats/xar.rb +145 -0
  453. data/lib/omnizip/formats/xz/reader.rb +121 -0
  454. data/lib/omnizip/formats/xz/writer.rb +416 -0
  455. data/lib/omnizip/formats/xz.rb +210 -0
  456. data/lib/omnizip/formats/xz_const.rb +49 -0
  457. data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
  458. data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
  459. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  460. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
  461. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  462. data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
  463. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
  464. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
  465. data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
  466. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
  467. data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
  468. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
  469. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  470. data/lib/omnizip/formats/xz_impl.rb +52 -0
  471. data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
  472. data/lib/omnizip/formats/zip/constants.rb +69 -0
  473. data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
  474. data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
  475. data/lib/omnizip/formats/zip/reader.rb +376 -0
  476. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  477. data/lib/omnizip/formats/zip/writer.rb +489 -0
  478. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
  479. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
  480. data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
  481. data/lib/omnizip/formats/zip.rb +50 -0
  482. data/lib/omnizip/formats.rb +29 -0
  483. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  484. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  485. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  486. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  487. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  488. data/lib/omnizip/implementations/base.rb +19 -0
  489. data/lib/omnizip/implementations/rust/archive.rb +93 -0
  490. data/lib/omnizip/implementations/rust/library.rb +221 -0
  491. data/lib/omnizip/implementations/rust.rb +26 -0
  492. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
  493. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
  494. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
  495. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
  496. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
  497. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
  498. data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
  499. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
  500. data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
  501. data/lib/omnizip/implementations/seven_zip.rb +11 -0
  502. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
  503. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
  504. data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
  505. data/lib/omnizip/implementations/xz_utils.rb +10 -0
  506. data/lib/omnizip/implementations.rb +25 -0
  507. data/lib/omnizip/io/buffered_input.rb +147 -0
  508. data/lib/omnizip/io/buffered_output.rb +106 -0
  509. data/lib/omnizip/io/source.rb +143 -0
  510. data/lib/omnizip/io/stream_manager.rb +117 -0
  511. data/lib/omnizip/io.rb +15 -0
  512. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  513. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  514. data/lib/omnizip/link_handler.rb +129 -0
  515. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  516. data/lib/omnizip/metadata/entry_metadata.rb +153 -0
  517. data/lib/omnizip/metadata/metadata_editor.rb +169 -0
  518. data/lib/omnizip/metadata/metadata_registry.rb +71 -0
  519. data/lib/omnizip/metadata/metadata_validator.rb +101 -0
  520. data/lib/omnizip/metadata.rb +58 -0
  521. data/lib/omnizip/models/.keep +0 -0
  522. data/lib/omnizip/models/algorithm_metadata.rb +41 -0
  523. data/lib/omnizip/models/attribute_apply.rb +40 -0
  524. data/lib/omnizip/models/compression_options.rb +53 -0
  525. data/lib/omnizip/models/conversion_options.rb +79 -0
  526. data/lib/omnizip/models/conversion_result.rb +141 -0
  527. data/lib/omnizip/models/eta_result.rb +45 -0
  528. data/lib/omnizip/models/extraction_rule.rb +115 -0
  529. data/lib/omnizip/models/filter_chain.rb +142 -0
  530. data/lib/omnizip/models/filter_config.rb +148 -0
  531. data/lib/omnizip/models/match_result.rb +141 -0
  532. data/lib/omnizip/models/optimization_suggestion.rb +95 -0
  533. data/lib/omnizip/models/parallel_options.rb +116 -0
  534. data/lib/omnizip/models/performance_result.rb +85 -0
  535. data/lib/omnizip/models/profile_report.rb +116 -0
  536. data/lib/omnizip/models/progress_options.rb +39 -0
  537. data/lib/omnizip/models/split_options.rb +116 -0
  538. data/lib/omnizip/optimization_registry.rb +45 -0
  539. data/lib/omnizip/parallel/engine.rb +52 -0
  540. data/lib/omnizip/parallel/job_queue.rb +209 -0
  541. data/lib/omnizip/parallel/job_scheduler.rb +225 -0
  542. data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
  543. data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
  544. data/lib/omnizip/parallel/thread_pool.rb +60 -0
  545. data/lib/omnizip/parallel/worker_pool.rb +227 -0
  546. data/lib/omnizip/parallel.rb +156 -0
  547. data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
  548. data/lib/omnizip/parity/galois16.rb +145 -0
  549. data/lib/omnizip/parity/models/creator_packet.rb +71 -0
  550. data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
  551. data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
  552. data/lib/omnizip/parity/models/main_packet.rb +126 -0
  553. data/lib/omnizip/parity/models/packet.rb +156 -0
  554. data/lib/omnizip/parity/models/packet_registry.rb +102 -0
  555. data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
  556. data/lib/omnizip/parity/models.rb +27 -0
  557. data/lib/omnizip/parity/par2_creator.rb +496 -0
  558. data/lib/omnizip/parity/par2_repairer.rb +409 -0
  559. data/lib/omnizip/parity/par2_verifier.rb +373 -0
  560. data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
  561. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  562. data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
  563. data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
  564. data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
  565. data/lib/omnizip/parity.rb +207 -0
  566. data/lib/omnizip/password/encryption_registry.rb +26 -0
  567. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  568. data/lib/omnizip/password/password_validator.rb +129 -0
  569. data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
  570. data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
  571. data/lib/omnizip/password.rb +88 -0
  572. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  573. data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
  574. data/lib/omnizip/pipe.rb +120 -0
  575. data/lib/omnizip/platform/ntfs_streams.rb +200 -0
  576. data/lib/omnizip/platform.rb +189 -0
  577. data/lib/omnizip/profile/archive_profile.rb +36 -0
  578. data/lib/omnizip/profile/balanced_profile.rb +31 -0
  579. data/lib/omnizip/profile/binary_profile.rb +33 -0
  580. data/lib/omnizip/profile/compression_profile.rb +157 -0
  581. data/lib/omnizip/profile/custom_profile.rb +155 -0
  582. data/lib/omnizip/profile/fast_profile.rb +31 -0
  583. data/lib/omnizip/profile/maximum_profile.rb +31 -0
  584. data/lib/omnizip/profile/profile_detector.rb +108 -0
  585. data/lib/omnizip/profile/profile_registry.rb +160 -0
  586. data/lib/omnizip/profile/text_profile.rb +33 -0
  587. data/lib/omnizip/profile.rb +261 -0
  588. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  589. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  590. data/lib/omnizip/profiler/report_generator.rb +158 -0
  591. data/lib/omnizip/profiler.rb +192 -0
  592. data/lib/omnizip/progress/callback_reporter.rb +34 -0
  593. data/lib/omnizip/progress/console_reporter.rb +59 -0
  594. data/lib/omnizip/progress/log_reporter.rb +89 -0
  595. data/lib/omnizip/progress/operation_progress.rb +118 -0
  596. data/lib/omnizip/progress/progress_bar.rb +156 -0
  597. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  598. data/lib/omnizip/progress/progress_tracker.rb +215 -0
  599. data/lib/omnizip/progress/silent_reporter.rb +22 -0
  600. data/lib/omnizip/progress.rb +131 -0
  601. data/lib/omnizip/registry.rb +111 -0
  602. data/lib/omnizip/rubyzip_compat.rb +61 -0
  603. data/lib/omnizip/temp/safe_extract.rb +124 -0
  604. data/lib/omnizip/temp/temp_file.rb +123 -0
  605. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  606. data/lib/omnizip/temp.rb +184 -0
  607. data/lib/omnizip/version.rb +5 -0
  608. data/lib/omnizip/zip/entry.rb +160 -0
  609. data/lib/omnizip/zip/file.rb +485 -0
  610. data/lib/omnizip/zip/input_stream.rb +270 -0
  611. data/lib/omnizip/zip/output_stream.rb +320 -0
  612. data/lib/omnizip/zip.rb +23 -0
  613. data/lib/omnizip.rb +157 -0
  614. data/lib/tasks/msi_test_files.rake +66 -0
  615. data/lib/tasks/platform_gems.rake +147 -0
  616. data/lib/tasks/rust_backend.rake +48 -0
  617. data/readme-docs/advanced-features.adoc +514 -0
  618. data/readme-docs/api-usage.adoc +445 -0
  619. data/readme-docs/architecture.adoc +450 -0
  620. data/readme-docs/archive-formats.adoc +479 -0
  621. data/readme-docs/cli-usage.adoc +222 -0
  622. data/readme-docs/compression-algorithms.adoc +446 -0
  623. data/readme-docs/compression-profiles.adoc +247 -0
  624. data/readme-docs/encryption-checksums.adoc +328 -0
  625. data/readme-docs/format-converter.adoc +316 -0
  626. data/readme-docs/installation.adoc +228 -0
  627. data/readme-docs/par2-archives.adoc +608 -0
  628. data/readme-docs/performance-profiler.adoc +389 -0
  629. data/readme-docs/preprocessing-filters.adoc +280 -0
  630. data/vendor/libomnizip_ffi.so +0 -0
  631. data/xz-file-format-1.2.1.txt +1174 -0
  632. metadata +768 -0
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Cpio
6
+ # CPIO format constants
7
+ #
8
+ # Defines magic numbers, file types, and format specifications
9
+ # for different CPIO archive formats.
10
+ module Constants
11
+ # Magic numbers for different CPIO formats
12
+ MAGIC_BINARY = 0o070707 # Old binary format
13
+ MAGIC_ODC = "070707" # Old portable ASCII format
14
+ MAGIC_NEWC = "070701" # New ASCII format (SVR4, most common)
15
+ MAGIC_CRC = "070702" # New ASCII with CRC
16
+
17
+ # File type masks (from POSIX)
18
+ S_IFMT = 0o170000 # File type mask
19
+ S_IFSOCK = 0o140000 # Socket
20
+ S_IFLNK = 0o120000 # Symbolic link
21
+ S_IFREG = 0o100000 # Regular file
22
+ S_IFBLK = 0o060000 # Block device
23
+ S_IFDIR = 0o040000 # Directory
24
+ S_IFCHR = 0o020000 # Character device
25
+ S_IFIFO = 0o010000 # FIFO/pipe
26
+
27
+ # Permission bits
28
+ S_ISUID = 0o004000 # Set UID bit
29
+ S_ISGID = 0o002000 # Set GID bit
30
+ S_ISVTX = 0o001000 # Sticky bit
31
+ S_IRWXU = 0o000700 # User permissions
32
+ S_IRUSR = 0o000400 # User read
33
+ S_IWUSR = 0o000200 # User write
34
+ S_IXUSR = 0o000100 # User execute
35
+ S_IRWXG = 0o000070 # Group permissions
36
+ S_IRGRP = 0o000040 # Group read
37
+ S_IWGRP = 0o000020 # Group write
38
+ S_IXGRP = 0o000010 # Group execute
39
+ S_IRWXO = 0o000007 # Other permissions
40
+ S_IROTH = 0o000004 # Other read
41
+ S_IWOTH = 0o000002 # Other write
42
+ S_IXOTH = 0o000001 # Other execute
43
+
44
+ # CPIO newc header size (110 bytes for newc format)
45
+ NEWC_HEADER_SIZE = 110
46
+
47
+ # Trailer entry name
48
+ TRAILER_NAME = "TRAILER!!!"
49
+
50
+ # Alignment for newc format (4 bytes)
51
+ NEWC_ALIGNMENT = 4
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,389 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ module Cpio
6
+ # CPIO archive entry
7
+ #
8
+ # Represents a file, directory, or special file in a CPIO archive.
9
+ # Supports newc, CRC, and ODC formats.
10
+ class Entry
11
+ include Omnizip::Entry
12
+ include Omnizip::Formats::Cpio::Constants
13
+
14
+ # @return [String] Magic number identifying format
15
+ attr_accessor :magic
16
+
17
+ # @return [Integer] Inode number
18
+ attr_accessor :ino
19
+
20
+ # @return [Integer] File mode and type
21
+ attr_accessor :mode
22
+
23
+ # @return [Integer] User ID
24
+ attr_accessor :uid
25
+
26
+ # @return [Integer] Group ID
27
+ attr_accessor :gid
28
+
29
+ # @return [Integer] Number of hard links
30
+ attr_accessor :nlink
31
+
32
+ # @return [Integer] Modification time (Unix timestamp)
33
+ attr_accessor :mtime
34
+
35
+ # @return [Integer] File size in bytes
36
+ attr_accessor :filesize
37
+
38
+ # @return [Integer] Device major number
39
+ attr_accessor :dev_major
40
+
41
+ # @return [Integer] Device minor number
42
+ attr_accessor :dev_minor
43
+
44
+ # @return [Integer] Special device major number (for device files)
45
+ attr_accessor :rdev_major
46
+
47
+ # @return [Integer] Special device minor number (for device files)
48
+ attr_accessor :rdev_minor
49
+
50
+ # @return [Integer] Filename length (including null terminator)
51
+ attr_accessor :namesize
52
+
53
+ # @return [Integer] Checksum (CRC format only)
54
+ attr_accessor :checksum
55
+
56
+ # @return [String] Entry name/path
57
+ attr_accessor :name
58
+
59
+ # @return [String] File data
60
+ attr_accessor :data
61
+
62
+ def entry_name = name
63
+ def entry_directory? = directory?
64
+ def entry_size = filesize
65
+ def entry_mtime = mtime
66
+
67
+ # Initialize CPIO entry
68
+ #
69
+ # @param attributes [Hash] Entry attributes
70
+ def initialize(attributes = {})
71
+ @magic = attributes.fetch(:magic, MAGIC_NEWC)
72
+ @ino = attributes.fetch(:ino, 0)
73
+ @mode = attributes.fetch(:mode, S_IFREG | 0o644)
74
+ @uid = attributes.fetch(:uid, 0)
75
+ @gid = attributes.fetch(:gid, 0)
76
+ @nlink = attributes.fetch(:nlink, 1)
77
+ @mtime = attributes.fetch(:mtime, Time.now.to_i)
78
+ @filesize = attributes.fetch(:filesize, 0)
79
+ @dev_major = attributes.fetch(:dev_major, 0)
80
+ @dev_minor = attributes.fetch(:dev_minor, 0)
81
+ @rdev_major = attributes.fetch(:rdev_major, 0)
82
+ @rdev_minor = attributes.fetch(:rdev_minor, 0)
83
+ @namesize = attributes.fetch(:namesize, 0)
84
+ @checksum = attributes.fetch(:checksum, 0)
85
+ @name = attributes.fetch(:name, "")
86
+ @data = attributes.fetch(:data, "")
87
+
88
+ # Auto-calculate namesize if not provided
89
+ @namesize = @name.bytesize + 1 if @namesize.zero? && !@name.empty?
90
+ @filesize = @data.bytesize if @filesize.zero? && !@data.empty?
91
+ end
92
+
93
+ # Check if entry is a directory
94
+ #
95
+ # @return [Boolean] true if directory
96
+ def directory?
97
+ (@mode & S_IFMT) == S_IFDIR
98
+ end
99
+
100
+ # Check if entry is a regular file
101
+ #
102
+ # @return [Boolean] true if regular file
103
+ def file?
104
+ (@mode & S_IFMT) == S_IFREG
105
+ end
106
+
107
+ # Check if entry is a symbolic link
108
+ #
109
+ # @return [Boolean] true if symlink
110
+ def symlink?
111
+ (@mode & S_IFMT) == S_IFLNK
112
+ end
113
+
114
+ # Check if entry is a device
115
+ #
116
+ # @return [Boolean] true if device (block or character)
117
+ def device?
118
+ type = @mode & S_IFMT
119
+ [S_IFBLK, S_IFCHR].include?(type)
120
+ end
121
+
122
+ # Check if entry is the trailer
123
+ #
124
+ # @return [Boolean] true if trailer entry
125
+ def trailer?
126
+ @name == TRAILER_NAME
127
+ end
128
+
129
+ # Convert entry to binary format
130
+ #
131
+ # @param format [Symbol] CPIO format (:newc, :crc, :odc)
132
+ # @return [String] Binary representation
133
+ def to_binary(format: :newc)
134
+ case format
135
+ when :newc, :crc
136
+ to_newc_binary
137
+ when :odc
138
+ to_odc_binary
139
+ else
140
+ raise ArgumentError, "Unsupported CPIO format: #{format}"
141
+ end
142
+ end
143
+
144
+ # Convert to newc format binary
145
+ #
146
+ # @return [String] Binary data in newc format
147
+ def to_newc_binary
148
+ # Build header (110 bytes, ASCII hex)
149
+ header = format(
150
+ "%06s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
151
+ @magic,
152
+ @ino & 0xFFFFFFFF,
153
+ @mode & 0xFFFFFFFF,
154
+ @uid & 0xFFFFFFFF,
155
+ @gid & 0xFFFFFFFF,
156
+ @nlink & 0xFFFFFFFF,
157
+ @mtime & 0xFFFFFFFF,
158
+ @filesize & 0xFFFFFFFF,
159
+ @dev_major & 0xFFFFFFFF,
160
+ @dev_minor & 0xFFFFFFFF,
161
+ @rdev_major & 0xFFFFFFFF,
162
+ @rdev_minor & 0xFFFFFFFF,
163
+ @namesize & 0xFFFFFFFF,
164
+ @checksum & 0xFFFFFFFF,
165
+ )
166
+
167
+ # Assemble complete entry
168
+ result = +""
169
+ result << header
170
+ result << @name
171
+ result << "\x00"
172
+
173
+ # Pad header+name to 4-byte boundary
174
+ header_name_size = header.bytesize + @name.bytesize + 1
175
+ padding = padding_to_align(header_name_size, NEWC_ALIGNMENT)
176
+ result << ("\x00" * padding) if padding.positive?
177
+
178
+ # Add file data
179
+ result << @data
180
+
181
+ # Pad data to 4-byte boundary
182
+ data_padding = padding_to_align(@data.bytesize, NEWC_ALIGNMENT)
183
+ result << ("\x00" * data_padding) if data_padding.positive?
184
+
185
+ result
186
+ end
187
+
188
+ # Convert to ODC format binary
189
+ #
190
+ # @return [String] Binary data in ODC format
191
+ def to_odc_binary
192
+ # ODC format uses 6-character octal fields
193
+ header = format(
194
+ "%06o%06o%06o%06o%06o%06o%06o%06o%011o%06o%011o",
195
+ MAGIC_BINARY,
196
+ (@dev_major << 8) | @dev_minor,
197
+ @ino & 0o777777,
198
+ @mode & 0o777777,
199
+ @uid & 0o777777,
200
+ @gid & 0o777777,
201
+ @nlink & 0o777777,
202
+ (@rdev_major << 8) | @rdev_minor,
203
+ @mtime & 0o77777777777,
204
+ @namesize & 0o777777,
205
+ @filesize & 0o77777777777,
206
+ )
207
+
208
+ result = +""
209
+ result << header
210
+ result << @name
211
+ result << "\x00"
212
+ result << @data
213
+
214
+ result
215
+ end
216
+
217
+ # Parse entry from binary data
218
+ #
219
+ # @param io [IO] Input stream
220
+ # @param format [Symbol, nil] Format hint (:newc, :crc, :odc, nil=auto-detect)
221
+ # @return [Entry] Parsed entry
222
+ def self.parse(io, format: nil)
223
+ # Read magic to detect format
224
+ magic = io.read(6)
225
+ io.seek(-6, ::IO::SEEK_CUR) # Rewind
226
+
227
+ format ||= detect_format(magic)
228
+
229
+ case format
230
+ when :newc, :crc
231
+ parse_newc(io)
232
+ when :odc
233
+ parse_odc(io)
234
+ else
235
+ raise Omnizip::InvalidArchiveError, "Unknown CPIO format"
236
+ end
237
+ end
238
+
239
+ # Detect CPIO format from magic
240
+ #
241
+ # @param magic [String] Magic bytes
242
+ # @return [Symbol] Format type
243
+ def self.detect_format(magic)
244
+ case magic
245
+ when MAGIC_NEWC then :newc
246
+ when MAGIC_CRC then :crc
247
+ when MAGIC_ODC then :odc
248
+ else
249
+ # Try binary format
250
+ magic_int = magic.unpack1("n")
251
+ magic_int == MAGIC_BINARY ? :binary : nil
252
+ end
253
+ end
254
+
255
+ # Parse newc format entry
256
+ #
257
+ # @param io [IO] Input stream
258
+ # @return [Entry] Parsed entry
259
+ def self.parse_newc(io)
260
+ header = io.read(NEWC_HEADER_SIZE)
261
+ raise Omnizip::InvalidArchiveError, "Truncated CPIO header" unless header && header.bytesize == NEWC_HEADER_SIZE
262
+
263
+ # Parse ASCII hex fields
264
+ magic = header[0, 6]
265
+ ino = header[6, 8].to_i(16)
266
+ mode = header[14, 8].to_i(16)
267
+ uid = header[22, 8].to_i(16)
268
+ gid = header[30, 8].to_i(16)
269
+ nlink = header[38, 8].to_i(16)
270
+ mtime = header[46, 8].to_i(16)
271
+ filesize = header[54, 8].to_i(16)
272
+ dev_major = header[62, 8].to_i(16)
273
+ dev_minor = header[70, 8].to_i(16)
274
+ rdev_major = header[78, 8].to_i(16)
275
+ rdev_minor = header[86, 8].to_i(16)
276
+ namesize = header[94, 8].to_i(16)
277
+ checksum = header[102, 8].to_i(16)
278
+
279
+ # Read filename
280
+ name_data = io.read(namesize)
281
+ name = name_data.chomp("\x00")
282
+
283
+ # Skip padding to 4-byte boundary
284
+ header_name_size = NEWC_HEADER_SIZE + namesize
285
+ padding = padding_to_align(header_name_size, NEWC_ALIGNMENT)
286
+ io.read(padding) if padding.positive?
287
+
288
+ # Read file data
289
+ data = io.read(filesize)
290
+
291
+ # Skip padding to 4-byte boundary
292
+ data_padding = padding_to_align(filesize, NEWC_ALIGNMENT)
293
+ io.read(data_padding) if data_padding.positive?
294
+
295
+ new(
296
+ magic: magic,
297
+ ino: ino,
298
+ mode: mode,
299
+ uid: uid,
300
+ gid: gid,
301
+ nlink: nlink,
302
+ mtime: mtime,
303
+ filesize: filesize,
304
+ dev_major: dev_major,
305
+ dev_minor: dev_minor,
306
+ rdev_major: rdev_major,
307
+ rdev_minor: rdev_minor,
308
+ namesize: namesize,
309
+ checksum: checksum,
310
+ name: name,
311
+ data: data || "",
312
+ )
313
+ end
314
+
315
+ # Parse ODC format entry
316
+ #
317
+ # @param io [IO] Input stream
318
+ # @return [Entry] Parsed entry
319
+ def self.parse_odc(io)
320
+ header = io.read(76)
321
+ raise Omnizip::InvalidArchiveError, "Truncated CPIO header" unless header && header.bytesize == 76
322
+
323
+ # Parse octal fields
324
+ magic = header[0, 6]
325
+ dev = header[6, 6].to_i(8)
326
+ ino = header[12, 6].to_i(8)
327
+ mode = header[18, 6].to_i(8)
328
+ uid = header[24, 6].to_i(8)
329
+ gid = header[30, 6].to_i(8)
330
+ nlink = header[36, 6].to_i(8)
331
+ rdev = header[42, 6].to_i(8)
332
+ mtime = header[48, 11].to_i(8)
333
+ namesize = header[59, 6].to_i(8)
334
+ filesize = header[65, 11].to_i(8)
335
+
336
+ # Extract device numbers
337
+ dev_major = dev >> 8
338
+ dev_minor = dev & 0xFF
339
+ rdev_major = rdev >> 8
340
+ rdev_minor = rdev & 0xFF
341
+
342
+ # Read filename
343
+ name_data = io.read(namesize)
344
+ name = name_data.chomp("\x00")
345
+
346
+ # Read file data
347
+ data = io.read(filesize)
348
+
349
+ new(
350
+ magic: magic,
351
+ ino: ino,
352
+ mode: mode,
353
+ uid: uid,
354
+ gid: gid,
355
+ nlink: nlink,
356
+ mtime: mtime,
357
+ filesize: filesize,
358
+ dev_major: dev_major,
359
+ dev_minor: dev_minor,
360
+ rdev_major: rdev_major,
361
+ rdev_minor: rdev_minor,
362
+ namesize: namesize,
363
+ checksum: 0,
364
+ name: name,
365
+ data: data || "",
366
+ )
367
+ end
368
+
369
+ private
370
+
371
+ # Calculate padding needed to align to boundary
372
+ #
373
+ # @param size [Integer] Current size
374
+ # @param alignment [Integer] Alignment boundary
375
+ # @return [Integer] Padding bytes needed
376
+ def padding_to_align(size, alignment)
377
+ remainder = size % alignment
378
+ remainder.zero? ? 0 : alignment - remainder
379
+ end
380
+
381
+ # Class method for padding calculation
382
+ def self.padding_to_align(size, alignment)
383
+ remainder = size % alignment
384
+ remainder.zero? ? 0 : alignment - remainder
385
+ end
386
+ end
387
+ end
388
+ end
389
+ end
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ module Omnizip
6
+ module Formats
7
+ module Cpio
8
+ # CPIO archive reader
9
+ #
10
+ # Reads CPIO archives in newc, CRC, ODC, and binary formats.
11
+ # Automatically detects format from magic number.
12
+ #
13
+ # @example Read CPIO archive
14
+ # reader = Cpio::Reader.new('archive.cpio')
15
+ # reader.open
16
+ # reader.entries.each { |entry| puts entry.name }
17
+ #
18
+ # @example Extract CPIO archive
19
+ # reader = Cpio::Reader.new('archive.cpio')
20
+ # reader.open
21
+ # reader.extract_all('output/')
22
+ class Reader
23
+ include Omnizip::Formats::Cpio::Constants
24
+
25
+ # @return [String] Archive file path
26
+ attr_reader :file_path
27
+
28
+ # @return [Array<Entry>] Parsed entries
29
+ attr_reader :entries
30
+
31
+ # @return [Symbol, nil] Detected format
32
+ attr_reader :format
33
+
34
+ # Initialize CPIO reader
35
+ #
36
+ # @param file_path [String] Path to CPIO archive
37
+ def initialize(file_path)
38
+ @file_path = file_path
39
+ @entries = []
40
+ @format = nil
41
+ end
42
+
43
+ # Open and parse CPIO archive
44
+ #
45
+ # @raise [RuntimeError] if file cannot be opened or parsed
46
+ def open
47
+ File.open(@file_path, "rb") do |io|
48
+ parse_archive(io)
49
+ end
50
+ self
51
+ end
52
+
53
+ # List all entries
54
+ #
55
+ # @return [Array<Entry>] All entries except trailer
56
+ def list
57
+ @entries.reject(&:trailer?)
58
+ end
59
+
60
+ # Extract entry to output path
61
+ #
62
+ # @param entry_name [String] Entry name to extract
63
+ # @param output_path [String] Destination path
64
+ # @raise [RuntimeError] if entry not found
65
+ def extract_entry(entry_name, output_path)
66
+ entry = @entries.find { |e| e.name == entry_name }
67
+ raise Errno::ENOENT, "Entry not found: #{entry_name}" unless entry
68
+
69
+ extract_single_entry(entry, output_path)
70
+ end
71
+
72
+ # Extract all entries to directory
73
+ #
74
+ # @param output_dir [String] Output directory
75
+ def extract_all(output_dir)
76
+ FileUtils.mkdir_p(output_dir)
77
+
78
+ @entries.each do |entry|
79
+ next if entry.trailer?
80
+
81
+ output_path = File.join(output_dir, entry.name)
82
+ extract_single_entry(entry, output_path)
83
+ end
84
+ end
85
+
86
+ # Get archive format
87
+ #
88
+ # @return [String] Human-readable format name
89
+ def format_name
90
+ case @format
91
+ when :newc then "CPIO newc (SVR4)"
92
+ when :crc then "CPIO newc with CRC"
93
+ when :odc then "CPIO ODC (portable)"
94
+ when :binary then "CPIO binary (old)"
95
+ else "Unknown"
96
+ end
97
+ end
98
+
99
+ private
100
+
101
+ # Parse archive contents
102
+ #
103
+ # @param io [IO] Input stream
104
+ def parse_archive(io)
105
+ while !io.eof?
106
+ begin
107
+ entry = Entry.parse(io, format: @format)
108
+
109
+ # Detect format from first entry
110
+ @format ||= Entry.detect_format(entry.magic)
111
+
112
+ # Add entry (including trailer)
113
+ @entries << entry
114
+
115
+ # Stop at trailer
116
+ break if entry.trailer?
117
+ rescue StandardError => e
118
+ warn "Failed to parse CPIO entry: #{e.message}"
119
+ break
120
+ end
121
+ end
122
+ end
123
+
124
+ # Extract single entry
125
+ #
126
+ # @param entry [Entry] Entry to extract
127
+ # @param output_path [String] Destination path
128
+ def extract_single_entry(entry, output_path)
129
+ if entry.directory?
130
+ extract_directory(entry, output_path)
131
+ elsif entry.symlink?
132
+ extract_symlink(entry, output_path)
133
+ elsif entry.device?
134
+ # Skip device files (require root privileges)
135
+ warn "Skipping device file: #{entry.name}"
136
+ else
137
+ extract_file(entry, output_path)
138
+ end
139
+
140
+ # Set permissions and timestamps
141
+ set_entry_attributes(entry, output_path) unless entry.symlink?
142
+ end
143
+
144
+ # Extract directory
145
+ #
146
+ # @param entry [Entry] Directory entry
147
+ # @param output_path [String] Destination path
148
+ def extract_directory(_entry, output_path)
149
+ FileUtils.mkdir_p(output_path)
150
+ end
151
+
152
+ # Extract regular file
153
+ #
154
+ # @param entry [Entry] File entry
155
+ # @param output_path [String] Destination path
156
+ def extract_file(entry, output_path)
157
+ FileUtils.mkdir_p(File.dirname(output_path))
158
+ File.binwrite(output_path, entry.data)
159
+ end
160
+
161
+ # Extract symbolic link
162
+ #
163
+ # @param entry [Entry] Symlink entry
164
+ # @param output_path [String] Destination path
165
+ def extract_symlink(entry, output_path)
166
+ FileUtils.mkdir_p(File.dirname(output_path))
167
+
168
+ # Remove existing file/link if present
169
+ File.unlink(output_path) if File.exist?(output_path) || File.symlink?(output_path)
170
+
171
+ # Create symbolic link
172
+ File.symlink(entry.data, output_path)
173
+ end
174
+
175
+ # Set file attributes (permissions and timestamps)
176
+ #
177
+ # @param entry [Entry] Entry with attributes
178
+ # @param path [String] File path
179
+ def set_entry_attributes(entry, path)
180
+ # Set modification time
181
+ if entry.mtime&.positive?
182
+ mtime = Time.at(entry.mtime)
183
+ File.utime(mtime, mtime, path)
184
+ end
185
+
186
+ # Set permissions
187
+ File.chmod(entry.mode & 0o7777, path) if entry.mode
188
+ rescue Errno::EPERM, Errno::ENOENT
189
+ # Permission errors are non-fatal
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end