mirror of
https://github.com/mhx/dwarfs.git
synced 2025-08-04 10:16:34 -04:00
Fix metadata link handling
This commit is contained in:
parent
24616178f3
commit
984fca1b51
@ -206,7 +206,7 @@ class metadata_ : public metadata_v2::impl {
|
||||
|
||||
std::string_view link_value(entry_view entry) const {
|
||||
return meta_
|
||||
.links()[meta_.link_index()[entry.inode()] - meta_.link_index_offset()];
|
||||
.links()[meta_.link_index()[entry.inode() - meta_.link_index_offset()]];
|
||||
}
|
||||
|
||||
folly::ByteRange data_;
|
||||
|
@ -533,6 +533,7 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
|
||||
mv2.links = ge_data.get_links();
|
||||
mv2.timestamp_base = ge_data.get_timestamp_base();
|
||||
mv2.chunk_index_offset = first_file_inode;
|
||||
mv2.link_index_offset = first_link_inode;
|
||||
mv2.block_size = UINT32_C(1) << cfg_.block_size_bits;
|
||||
mv2.total_fs_size = prog.original_size;
|
||||
|
||||
|
@ -77,6 +77,7 @@ std::unordered_map<std::string, simplestat> statmap{
|
||||
{"//foo.pl", {S_IFREG | 0600, 1337, 0, 23456}},
|
||||
{"//ipsum.txt", {S_IFREG | 0644, 1000, 1000, 2000000}},
|
||||
{"//somedir/ipsum.py", {S_IFREG | 0644, 1000, 1000, 10000}},
|
||||
{"//somedir/bad", {S_IFLNK | 0777, 1000, 1000, 6}},
|
||||
};
|
||||
} // namespace
|
||||
|
||||
@ -87,6 +88,13 @@ class mmap_mock : public mmif {
|
||||
assign(m_data.data(), m_data.size());
|
||||
}
|
||||
|
||||
boost::system::error_code lock(void const*, size_t) override {
|
||||
return boost::system::error_code();
|
||||
}
|
||||
boost::system::error_code advise(void const*, size_t, int) override {
|
||||
return boost::system::error_code();
|
||||
}
|
||||
|
||||
private:
|
||||
const std::string m_data;
|
||||
};
|
||||
@ -105,6 +113,7 @@ class os_access_mock : public os_access {
|
||||
".",
|
||||
"..",
|
||||
"ipsum.py",
|
||||
"bad",
|
||||
};
|
||||
|
||||
return std::make_shared<dir_reader_mock>(std::move(files));
|
||||
@ -128,6 +137,8 @@ class os_access_mock : public os_access {
|
||||
std::string readlink(const std::string& path, size_t size) const override {
|
||||
if (path == "//somelink" && size == 16) {
|
||||
return "somedir/ipsum.py";
|
||||
} else if (path == "//somedir/bad" && size == 6) {
|
||||
return "../foo";
|
||||
}
|
||||
|
||||
throw std::runtime_error("oops");
|
||||
@ -216,6 +227,23 @@ void basic_end_to_end_test(const std::string& compressor,
|
||||
ssize_t rv = fs.read(inode, &buf[0], st.st_size, 0);
|
||||
EXPECT_EQ(rv, st.st_size);
|
||||
EXPECT_EQ(std::string(buf.begin(), buf.end()), test::loremipsum(st.st_size));
|
||||
|
||||
entry = fs.find("/somelink");
|
||||
|
||||
EXPECT_EQ(fs.getattr(*entry, &st), 0);
|
||||
EXPECT_EQ(st.st_size, 16);
|
||||
|
||||
std::string link;
|
||||
EXPECT_EQ(fs.readlink(*entry, &link), 0);
|
||||
EXPECT_EQ(link, "somedir/ipsum.py");
|
||||
|
||||
entry = fs.find("/somedir/bad");
|
||||
|
||||
EXPECT_EQ(fs.getattr(*entry, &st), 0);
|
||||
EXPECT_EQ(st.st_size, 6);
|
||||
|
||||
EXPECT_EQ(fs.readlink(*entry, &link), 0);
|
||||
EXPECT_EQ(link, "../foo");
|
||||
}
|
||||
|
||||
std::vector<std::string> const compressions{"null",
|
||||
|
Loading…
x
Reference in New Issue
Block a user