metadata_v2: implement opendir

This commit is contained in:
Marcus Holland-Moritz 2020-11-27 01:36:54 +01:00
parent bb66f5180c
commit fdb8b07b08
2 changed files with 21 additions and 15 deletions

View File

@ -111,6 +111,10 @@ class metadata_v2 {
return impl_->getattr(de, stbuf);
}
std::optional<directory_view> opendir(entry_view de) const {
return impl_->opendir(de);
}
#if 0
size_t block_size() const { return impl_->block_size(); }
@ -120,10 +124,6 @@ class metadata_v2 {
return impl_->access(de, mode, uid, gid);
}
directory_view opendir(entry_view de) const {
return impl_->opendir(de);
}
entry_view
readdir(directory_view d, size_t offset, std::string* name) const {
return impl_->readdir(d, offset, name);
@ -167,12 +167,14 @@ class metadata_v2 {
find(int inode, const char* name) const = 0;
virtual int getattr(entry_view de, struct ::stat* stbuf) const = 0;
virtual std::optional<directory_view> opendir(entry_view de) const = 0;
#if 0
virtual size_t block_size() const = 0;
virtual unsigned block_size_bits() const = 0;
virtual int
access(entry_view de, int mode, uid_t uid, gid_t gid) const = 0;
virtual directory_view opendir(entry_view de) const = 0;
virtual entry_view
readdir(directory_view d, size_t offset, std::string* name) const = 0;
virtual size_t dirsize(directory_view d) const = 0;

View File

@ -94,6 +94,8 @@ class metadata_v2_ : public metadata_v2::impl {
int getattr(entry_view entry, struct ::stat* stbuf) const override;
std::optional<directory_view> opendir(entry_view entry) const override;
#if 0
size_t block_size() const override {
return static_cast<size_t>(1) << cfg_->block_size_bits;
@ -103,7 +105,6 @@ class metadata_v2_ : public metadata_v2::impl {
int access(entry_view entry, int mode, uid_t uid,
gid_t gid) const override;
directory_view opendir(entry_view entry) const override;
entry_view
readdir(directory_view d, size_t offset, std::string* name) const override;
size_t dirsize(directory_view d) const override {
@ -367,6 +368,18 @@ int metadata_v2_<LoggerPolicy>::getattr(entry_view entry,
return 0;
}
template <typename LoggerPolicy>
std::optional<directory_view>
metadata_v2_<LoggerPolicy>::opendir(entry_view entry) const {
std::optional<directory_view> rv;
if (S_ISDIR(entry.mode())) {
rv = getdir(entry);
}
return rv;
}
#if 0
template <typename LoggerPolicy>
int metadata_v2_<LoggerPolicy>::access(entry_view entry, int mode, uid_t uid,
@ -374,15 +387,6 @@ int metadata_v2_<LoggerPolicy>::access(entry_view entry, int mode, uid_t uid,
return dir_reader_->access(entry, mode, uid, gid);
}
template <typename LoggerPolicy>
directory_view metadata_v2_<LoggerPolicy>::opendir(entry_view entry) const {
if (S_ISDIR(entry->mode)) {
return getdir(entry);
}
return nullptr;
}
template <typename LoggerPolicy>
int metadata_v2_<LoggerPolicy>::open(entry_view entry) const {
if (S_ISREG(entry->mode)) {