lzh_file_source (無圧縮版)
CRCのチェックと無圧縮(lh0形式)のファイルの読み出しを実装しました。
<hamigaki/iostreams/device/lzh_file.hpp>
lzh_file_source自体は書庫中のエントリを辿って、解凍(LHA用語)後のデータを読み出す機能しかありません。
各エントリをファイルシステム上にどう展開するかはライブラリユーザー次第です。
単純な解凍プログラムはこんな感じです。
#include <hamigaki/iostreams/device/lzh_file.hpp> #include <boost/filesystem/convenience.hpp> #include <boost/filesystem/operations.hpp> #include <boost/iostreams/device/file.hpp> #include <boost/iostreams/copy.hpp> namespace io_ex = hamigaki::iostreams; namespace fs = boost::filesystem; namespace io = boost::iostreams; int main(int argc, char* argv[]) { if (argc != 2) return 1; fs::path::default_name_check(fs::no_check); typedef io_ex::lzh_file_source<io::file_source> lzh_type; lzh_type lzh(io::file_source(argv[1], std::ios_base::binary)); do { if (lzh.is_directory()) fs::create_directories(lzh.path()); else { const fs::path& ph = lzh.path(); fs::create_directories(ph.branch_path()); io::copy( lzh, io::file_sink( ph.native_file_string(), std::ios_base::binary) ); } } while (lzh.next_entry()); }
上記のコードは例の脆弱性の問題を持っています。
パスの安全性のチェックはlzh_file_sourceの仕事ではありませんが、チェックの必要性は明確なので別途用意するつもりです。