diff --git a/include/dwarfs/entry.h b/include/dwarfs/entry.h index eed7357a..e2b6aad9 100644 --- a/include/dwarfs/entry.h +++ b/include/dwarfs/entry.h @@ -109,6 +109,8 @@ class entry : public entry_interface { uint64_t get_ctime() const override; void set_ctime(uint64_t ctime) override; + void override_size(size_t size) { stat_.st_size = size; } + private: std::string name_; std::weak_ptr parent_; diff --git a/src/dwarfs/scanner.cpp b/src/dwarfs/scanner.cpp index a442d598..ed42523f 100644 --- a/src/dwarfs/scanner.cpp +++ b/src/dwarfs/scanner.cpp @@ -360,9 +360,10 @@ scanner_::add_entry(std::string const& name, switch (pe->type()) { case entry::E_FILE: if (os_->access(pe->path(), R_OK)) { - LOG_ERROR << "cannot access: " << pe->path(); + LOG_ERROR << "cannot access " << pe->path() + << ", creating empty file"; + pe->override_size(0); prog.errors++; - return nullptr; } break; diff --git a/test/dwarfs.cpp b/test/dwarfs.cpp index 16bb952d..ad61daaf 100644 --- a/test/dwarfs.cpp +++ b/test/dwarfs.cpp @@ -92,6 +92,7 @@ void basic_end_to_end_test(std::string const& compressor, bool pack_names, bool pack_names_index, bool pack_symlinks, bool pack_symlinks_index, bool plain_names_table, bool plain_symlinks_table, + bool access_fail, std::optional file_hash_algo) { block_manager::config cfg; scanner_options options; @@ -135,6 +136,10 @@ void basic_end_to_end_test(std::string const& compressor, auto input = test::os_access_mock::create_test_instance(); + if (access_fail) { + input->set_access_fail("/somedir/ipsum.py"); + } + auto prog = progress([](const progress&, bool) {}, 1000); std::shared_ptr