mirror of
https://github.com/mhx/dwarfs.git
synced 2025-08-04 02:06:22 -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 {
|
std::string_view link_value(entry_view entry) const {
|
||||||
return meta_
|
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_;
|
folly::ByteRange data_;
|
||||||
|
@ -533,6 +533,7 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
|
|||||||
mv2.links = ge_data.get_links();
|
mv2.links = ge_data.get_links();
|
||||||
mv2.timestamp_base = ge_data.get_timestamp_base();
|
mv2.timestamp_base = ge_data.get_timestamp_base();
|
||||||
mv2.chunk_index_offset = first_file_inode;
|
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.block_size = UINT32_C(1) << cfg_.block_size_bits;
|
||||||
mv2.total_fs_size = prog.original_size;
|
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}},
|
{"//foo.pl", {S_IFREG | 0600, 1337, 0, 23456}},
|
||||||
{"//ipsum.txt", {S_IFREG | 0644, 1000, 1000, 2000000}},
|
{"//ipsum.txt", {S_IFREG | 0644, 1000, 1000, 2000000}},
|
||||||
{"//somedir/ipsum.py", {S_IFREG | 0644, 1000, 1000, 10000}},
|
{"//somedir/ipsum.py", {S_IFREG | 0644, 1000, 1000, 10000}},
|
||||||
|
{"//somedir/bad", {S_IFLNK | 0777, 1000, 1000, 6}},
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@ -87,6 +88,13 @@ class mmap_mock : public mmif {
|
|||||||
assign(m_data.data(), m_data.size());
|
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:
|
private:
|
||||||
const std::string m_data;
|
const std::string m_data;
|
||||||
};
|
};
|
||||||
@ -105,6 +113,7 @@ class os_access_mock : public os_access {
|
|||||||
".",
|
".",
|
||||||
"..",
|
"..",
|
||||||
"ipsum.py",
|
"ipsum.py",
|
||||||
|
"bad",
|
||||||
};
|
};
|
||||||
|
|
||||||
return std::make_shared<dir_reader_mock>(std::move(files));
|
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 {
|
std::string readlink(const std::string& path, size_t size) const override {
|
||||||
if (path == "//somelink" && size == 16) {
|
if (path == "//somelink" && size == 16) {
|
||||||
return "somedir/ipsum.py";
|
return "somedir/ipsum.py";
|
||||||
|
} else if (path == "//somedir/bad" && size == 6) {
|
||||||
|
return "../foo";
|
||||||
}
|
}
|
||||||
|
|
||||||
throw std::runtime_error("oops");
|
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);
|
ssize_t rv = fs.read(inode, &buf[0], st.st_size, 0);
|
||||||
EXPECT_EQ(rv, st.st_size);
|
EXPECT_EQ(rv, st.st_size);
|
||||||
EXPECT_EQ(std::string(buf.begin(), buf.end()), test::loremipsum(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",
|
std::vector<std::string> const compressions{"null",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user