refactor: remove access version returning int

This commit is contained in:
Marcus Holland-Moritz 2024-07-28 16:58:17 +02:00
parent 6a2cc3f860
commit 62899bbd73
8 changed files with 150 additions and 137 deletions

View File

@ -120,8 +120,8 @@ class filesystem_v2 {
file_stat getattr(inode_view entry) const { return impl_->getattr(entry); }
int access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const {
bool access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const {
return impl_->access(entry, mode, uid, gid);
}
@ -248,8 +248,8 @@ class filesystem_v2 {
find(int inode, const char* name) const = 0;
virtual file_stat getattr(inode_view entry, std::error_code& ec) const = 0;
virtual file_stat getattr(inode_view entry) const = 0;
virtual int access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const = 0;
virtual bool access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const = 0;
virtual void access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid, std::error_code& ec) const = 0;
virtual std::optional<directory_view> opendir(inode_view entry) const = 0;

View File

@ -120,9 +120,9 @@ class metadata_v2 {
size_t dirsize(directory_view dir) const { return impl_->dirsize(dir); }
int access(inode_view iv, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const {
return impl_->access(iv, mode, uid, gid);
void access(inode_view iv, int mode, file_stat::uid_type uid,
file_stat::gid_type gid, std::error_code& ec) const {
impl_->access(iv, mode, uid, gid, ec);
}
int open(inode_view iv) const { return impl_->open(iv); }
@ -199,8 +199,8 @@ class metadata_v2 {
virtual size_t dirsize(directory_view dir) const = 0;
virtual int access(inode_view iv, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const = 0;
virtual void access(inode_view iv, int mode, file_stat::uid_type uid,
file_stat::gid_type gid, std::error_code& ec) const = 0;
virtual int open(inode_view iv) const = 0;

View File

@ -441,8 +441,8 @@ class filesystem_ final : public filesystem_v2::impl {
std::optional<inode_view> find(int inode, const char* name) const override;
file_stat getattr(inode_view entry, std::error_code& ec) const override;
file_stat getattr(inode_view entry) const override;
int access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const override;
bool access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const override;
void access(inode_view entry, int mode, file_stat::uid_type uid,
file_stat::gid_type gid, std::error_code& ec) const override;
std::optional<directory_view> opendir(inode_view entry) const override;
@ -1080,11 +1080,13 @@ file_stat filesystem_<LoggerPolicy>::getattr(inode_view entry) const {
}
template <typename LoggerPolicy>
int filesystem_<LoggerPolicy>::access(inode_view entry, int mode,
file_stat::uid_type uid,
file_stat::gid_type gid) const {
bool filesystem_<LoggerPolicy>::access(inode_view entry, int mode,
file_stat::uid_type uid,
file_stat::gid_type gid) const {
PERFMON_CLS_SCOPED_SECTION(access)
return meta_.access(entry, mode, uid, gid);
std::error_code ec;
meta_.access(entry, mode, uid, gid, ec);
return !ec;
}
template <typename LoggerPolicy>
@ -1093,7 +1095,7 @@ void filesystem_<LoggerPolicy>::access(inode_view entry, int mode,
file_stat::gid_type gid,
std::error_code& ec) const {
PERFMON_CLS_SCOPED_SECTION(access_ec)
call_int_error([&] { return meta_.access(entry, mode, uid, gid); }, ec);
meta_.access(entry, mode, uid, gid, ec);
}
template <typename LoggerPolicy>

View File

@ -494,8 +494,8 @@ class metadata_ final : public metadata_v2::impl {
return 2 + dir.entry_count(); // adds '.' and '..', which we fake in ;-)
}
int access(inode_view iv, int mode, file_stat::uid_type uid,
file_stat::gid_type gid) const override;
void access(inode_view iv, int mode, file_stat::uid_type uid,
file_stat::gid_type gid, std::error_code& ec) const override;
int open(inode_view iv) const override;
@ -1618,16 +1618,18 @@ metadata_<LoggerPolicy>::readdir(directory_view dir, size_t offset) const {
}
template <typename LoggerPolicy>
int metadata_<LoggerPolicy>::access(inode_view iv, int mode,
file_stat::uid_type uid,
file_stat::gid_type gid) const {
void metadata_<LoggerPolicy>::access(inode_view iv, int mode,
file_stat::uid_type uid,
file_stat::gid_type gid,
std::error_code& ec) const {
LOG_DEBUG << fmt::format("access([{}, {:o}, {}, {}], {:o}, {}, {})",
iv.inode_num(), iv.mode(), iv.getuid(), iv.getgid(),
mode, uid, gid);
if (mode == F_OK) {
// easy; we're only interested in the file's existance
return 0;
ec.clear();
return;
}
int access_mode = 0;
@ -1679,7 +1681,11 @@ int metadata_<LoggerPolicy>::access(inode_view iv, int mode,
}
}
return (access_mode & mode) == mode ? 0 : EACCES;
if ((access_mode & mode) == mode) {
ec.clear();
} else {
ec = std::make_error_code(std::errc::permission_denied);
}
}
template <typename LoggerPolicy>

View File

@ -459,7 +459,9 @@ int op_access_common(LogProxy& log_, dwarfs_userdata& userdata, int mode,
Find const& find) {
return checked_call(log_, [&] {
if (auto entry = find()) {
return userdata.fs.access(*entry, mode, uid, gid);
std::error_code ec;
userdata.fs.access(*entry, mode, uid, gid, ec);
return ec.value();
}
return ENOENT;
});

View File

@ -849,7 +849,7 @@ void check_compat(logger& lgr, filesystem_v2 const& fs,
EXPECT_EQ(1616013816, st.ctime);
}
EXPECT_EQ(0, fs.access(*entry, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*entry, R_OK, 1000, 0));
auto inode = fs.open(*entry);
EXPECT_GE(inode, 0);

View File

@ -420,10 +420,13 @@ void basic_end_to_end_test(std::string const& compressor,
ASSERT_TRUE(entry);
st1 = fs.getattr(*entry);
EXPECT_EQ(access_fail ? 0 : 10000, st1.size);
EXPECT_EQ(0, fs.access(*entry, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*entry, R_OK, 1000, 100));
entry = fs.find(0, "baz.pl");
ASSERT_TRUE(entry);
EXPECT_EQ(set_uid ? EACCES : 0, fs.access(*entry, R_OK, 1337, 0));
std::error_code ec;
fs.access(*entry, R_OK, 1337, 0, ec);
EXPECT_EQ(set_uid ? EACCES : 0, ec.value());
EXPECT_EQ(set_uid, !fs.access(*entry, R_OK, 1337, 0));
for (auto mp : {&filesystem_v2::walk, &filesystem_v2::walk_data_order}) {
std::map<std::string, file_stat> entries;
@ -1296,65 +1299,65 @@ TEST(filesystem, root_access_github204) {
static constexpr int const x_ok{X_OK};
#endif
EXPECT_EQ(0, fs.access(*other, R_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*group, R_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*user, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*other, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*group, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*user, R_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*other, W_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*group, W_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*user, W_OK, 1000, 100));
EXPECT_TRUE(fs.access(*other, W_OK, 1000, 100));
EXPECT_TRUE(fs.access(*group, W_OK, 1000, 100));
EXPECT_TRUE(fs.access(*user, W_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*other, x_ok, 1000, 100));
EXPECT_EQ(0, fs.access(*group, x_ok, 1000, 100));
EXPECT_EQ(0, fs.access(*user, x_ok, 1000, 100));
EXPECT_TRUE(fs.access(*other, x_ok, 1000, 100));
EXPECT_TRUE(fs.access(*group, x_ok, 1000, 100));
EXPECT_TRUE(fs.access(*user, x_ok, 1000, 100));
EXPECT_EQ(0, fs.access(*other, R_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*group, R_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*user, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*other, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*group, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*user, R_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*other, W_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*group, W_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*user, W_OK, 1000, 0));
EXPECT_TRUE(fs.access(*other, W_OK, 1000, 0));
EXPECT_TRUE(fs.access(*group, W_OK, 1000, 0));
EXPECT_TRUE(fs.access(*user, W_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*other, x_ok, 1000, 0));
EXPECT_EQ(0, fs.access(*group, x_ok, 1000, 0));
EXPECT_EQ(0, fs.access(*user, x_ok, 1000, 0));
EXPECT_TRUE(fs.access(*other, x_ok, 1000, 0));
EXPECT_TRUE(fs.access(*group, x_ok, 1000, 0));
EXPECT_TRUE(fs.access(*user, x_ok, 1000, 0));
EXPECT_EQ(0, fs.access(*other, R_OK, 2000, 100));
EXPECT_EQ(0, fs.access(*group, R_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*user, R_OK, 2000, 100));
EXPECT_TRUE(fs.access(*other, R_OK, 2000, 100));
EXPECT_TRUE(fs.access(*group, R_OK, 2000, 100));
EXPECT_FALSE(fs.access(*user, R_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*other, W_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*group, W_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*user, W_OK, 2000, 100));
EXPECT_FALSE(fs.access(*other, W_OK, 2000, 100));
EXPECT_FALSE(fs.access(*group, W_OK, 2000, 100));
EXPECT_FALSE(fs.access(*user, W_OK, 2000, 100));
EXPECT_EQ(0, fs.access(*other, x_ok, 2000, 100));
EXPECT_EQ(0, fs.access(*group, x_ok, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 2000, 100));
EXPECT_TRUE(fs.access(*other, x_ok, 2000, 100));
EXPECT_TRUE(fs.access(*group, x_ok, 2000, 100));
EXPECT_FALSE(fs.access(*user, x_ok, 2000, 100));
EXPECT_EQ(0, fs.access(*other, R_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*group, R_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*user, R_OK, 2000, 200));
EXPECT_TRUE(fs.access(*other, R_OK, 2000, 200));
EXPECT_FALSE(fs.access(*group, R_OK, 2000, 200));
EXPECT_FALSE(fs.access(*user, R_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*other, W_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*group, W_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*user, W_OK, 2000, 200));
EXPECT_FALSE(fs.access(*other, W_OK, 2000, 200));
EXPECT_FALSE(fs.access(*group, W_OK, 2000, 200));
EXPECT_FALSE(fs.access(*user, W_OK, 2000, 200));
EXPECT_EQ(0, fs.access(*other, x_ok, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*group, x_ok, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 2000, 200));
EXPECT_TRUE(fs.access(*other, x_ok, 2000, 200));
EXPECT_FALSE(fs.access(*group, x_ok, 2000, 200));
EXPECT_FALSE(fs.access(*user, x_ok, 2000, 200));
EXPECT_EQ(0, fs.access(*other, R_OK, 0, 0));
EXPECT_EQ(0, fs.access(*group, R_OK, 0, 0));
EXPECT_EQ(0, fs.access(*user, R_OK, 0, 0));
EXPECT_TRUE(fs.access(*other, R_OK, 0, 0));
EXPECT_TRUE(fs.access(*group, R_OK, 0, 0));
EXPECT_TRUE(fs.access(*user, R_OK, 0, 0));
EXPECT_EQ(0, fs.access(*other, W_OK, 0, 0));
EXPECT_EQ(0, fs.access(*group, W_OK, 0, 0));
EXPECT_EQ(0, fs.access(*user, W_OK, 0, 0));
EXPECT_TRUE(fs.access(*other, W_OK, 0, 0));
EXPECT_TRUE(fs.access(*group, W_OK, 0, 0));
EXPECT_TRUE(fs.access(*user, W_OK, 0, 0));
EXPECT_EQ(0, fs.access(*other, x_ok, 0, 0));
EXPECT_EQ(0, fs.access(*group, x_ok, 0, 0));
EXPECT_EQ(0, fs.access(*user, x_ok, 0, 0));
EXPECT_TRUE(fs.access(*other, x_ok, 0, 0));
EXPECT_TRUE(fs.access(*group, x_ok, 0, 0));
EXPECT_TRUE(fs.access(*user, x_ok, 0, 0));
other = fs.find("/other/file");
group = fs.find("/group/file");
@ -1364,63 +1367,63 @@ TEST(filesystem, root_access_github204) {
EXPECT_TRUE(group);
EXPECT_TRUE(user);
EXPECT_EQ(0, fs.access(*other, R_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*group, R_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*user, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*other, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*group, R_OK, 1000, 100));
EXPECT_TRUE(fs.access(*user, R_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*other, W_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*group, W_OK, 1000, 100));
EXPECT_EQ(0, fs.access(*user, W_OK, 1000, 100));
EXPECT_TRUE(fs.access(*other, W_OK, 1000, 100));
EXPECT_TRUE(fs.access(*group, W_OK, 1000, 100));
EXPECT_TRUE(fs.access(*user, W_OK, 1000, 100));
EXPECT_EQ(EACCES, fs.access(*other, x_ok, 1000, 100));
EXPECT_EQ(EACCES, fs.access(*group, x_ok, 1000, 100));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 1000, 100));
EXPECT_FALSE(fs.access(*other, x_ok, 1000, 100));
EXPECT_FALSE(fs.access(*group, x_ok, 1000, 100));
EXPECT_FALSE(fs.access(*user, x_ok, 1000, 100));
EXPECT_EQ(0, fs.access(*other, R_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*group, R_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*user, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*other, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*group, R_OK, 1000, 0));
EXPECT_TRUE(fs.access(*user, R_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*other, W_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*group, W_OK, 1000, 0));
EXPECT_EQ(0, fs.access(*user, W_OK, 1000, 0));
EXPECT_TRUE(fs.access(*other, W_OK, 1000, 0));
EXPECT_TRUE(fs.access(*group, W_OK, 1000, 0));
EXPECT_TRUE(fs.access(*user, W_OK, 1000, 0));
EXPECT_EQ(EACCES, fs.access(*other, x_ok, 1000, 0));
EXPECT_EQ(EACCES, fs.access(*group, x_ok, 1000, 0));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 1000, 0));
EXPECT_FALSE(fs.access(*other, x_ok, 1000, 0));
EXPECT_FALSE(fs.access(*group, x_ok, 1000, 0));
EXPECT_FALSE(fs.access(*user, x_ok, 1000, 0));
EXPECT_EQ(0, fs.access(*other, R_OK, 2000, 100));
EXPECT_EQ(0, fs.access(*group, R_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*user, R_OK, 2000, 100));
EXPECT_TRUE(fs.access(*other, R_OK, 2000, 100));
EXPECT_TRUE(fs.access(*group, R_OK, 2000, 100));
EXPECT_FALSE(fs.access(*user, R_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*other, W_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*group, W_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*user, W_OK, 2000, 100));
EXPECT_FALSE(fs.access(*other, W_OK, 2000, 100));
EXPECT_FALSE(fs.access(*group, W_OK, 2000, 100));
EXPECT_FALSE(fs.access(*user, W_OK, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*other, x_ok, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*group, x_ok, 2000, 100));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 2000, 100));
EXPECT_FALSE(fs.access(*other, x_ok, 2000, 100));
EXPECT_FALSE(fs.access(*group, x_ok, 2000, 100));
EXPECT_FALSE(fs.access(*user, x_ok, 2000, 100));
EXPECT_EQ(0, fs.access(*other, R_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*group, R_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*user, R_OK, 2000, 200));
EXPECT_TRUE(fs.access(*other, R_OK, 2000, 200));
EXPECT_FALSE(fs.access(*group, R_OK, 2000, 200));
EXPECT_FALSE(fs.access(*user, R_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*other, W_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*group, W_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*user, W_OK, 2000, 200));
EXPECT_FALSE(fs.access(*other, W_OK, 2000, 200));
EXPECT_FALSE(fs.access(*group, W_OK, 2000, 200));
EXPECT_FALSE(fs.access(*user, W_OK, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*other, x_ok, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*group, x_ok, 2000, 200));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 2000, 200));
EXPECT_FALSE(fs.access(*other, x_ok, 2000, 200));
EXPECT_FALSE(fs.access(*group, x_ok, 2000, 200));
EXPECT_FALSE(fs.access(*user, x_ok, 2000, 200));
EXPECT_EQ(0, fs.access(*other, R_OK, 0, 0));
EXPECT_EQ(0, fs.access(*group, R_OK, 0, 0));
EXPECT_EQ(0, fs.access(*user, R_OK, 0, 0));
EXPECT_TRUE(fs.access(*other, R_OK, 0, 0));
EXPECT_TRUE(fs.access(*group, R_OK, 0, 0));
EXPECT_TRUE(fs.access(*user, R_OK, 0, 0));
EXPECT_EQ(0, fs.access(*other, W_OK, 0, 0));
EXPECT_EQ(0, fs.access(*group, W_OK, 0, 0));
EXPECT_EQ(0, fs.access(*user, W_OK, 0, 0));
EXPECT_TRUE(fs.access(*other, W_OK, 0, 0));
EXPECT_TRUE(fs.access(*group, W_OK, 0, 0));
EXPECT_TRUE(fs.access(*user, W_OK, 0, 0));
EXPECT_EQ(EACCES, fs.access(*other, x_ok, 0, 0));
EXPECT_EQ(EACCES, fs.access(*group, x_ok, 0, 0));
EXPECT_EQ(EACCES, fs.access(*user, x_ok, 0, 0));
EXPECT_FALSE(fs.access(*other, x_ok, 0, 0));
EXPECT_FALSE(fs.access(*group, x_ok, 0, 0));
EXPECT_FALSE(fs.access(*user, x_ok, 0, 0));
}

View File

@ -1093,19 +1093,19 @@ TEST(mkdwarfs_test, metadata_access) {
auto iv = fs.find("/access");
ASSERT_TRUE(iv);
EXPECT_EQ(0, fs.access(*iv, F_OK, 1, 1));
EXPECT_TRUE(fs.access(*iv, F_OK, 1, 1));
EXPECT_EQ(EACCES, fs.access(*iv, R_OK, 1, 1));
EXPECT_EQ(0, fs.access(*iv, W_OK, 1, 1));
EXPECT_EQ(EACCES, fs.access(*iv, x_ok, 1, 1));
EXPECT_FALSE(fs.access(*iv, R_OK, 1, 1));
EXPECT_TRUE(fs.access(*iv, W_OK, 1, 1));
EXPECT_FALSE(fs.access(*iv, x_ok, 1, 1));
EXPECT_EQ(0, fs.access(*iv, R_OK, 1, 3333));
EXPECT_EQ(0, fs.access(*iv, W_OK, 1, 3333));
EXPECT_EQ(EACCES, fs.access(*iv, x_ok, 1, 3333));
EXPECT_TRUE(fs.access(*iv, R_OK, 1, 3333));
EXPECT_TRUE(fs.access(*iv, W_OK, 1, 3333));
EXPECT_FALSE(fs.access(*iv, x_ok, 1, 3333));
EXPECT_EQ(0, fs.access(*iv, R_OK, 222, 7));
EXPECT_EQ(0, fs.access(*iv, W_OK, 222, 7));
EXPECT_EQ(0, fs.access(*iv, x_ok, 222, 7));
EXPECT_TRUE(fs.access(*iv, R_OK, 222, 7));
EXPECT_TRUE(fs.access(*iv, W_OK, 222, 7));
EXPECT_TRUE(fs.access(*iv, x_ok, 222, 7));
}
{
@ -1114,19 +1114,19 @@ TEST(mkdwarfs_test, metadata_access) {
auto iv = fs.find("/access");
ASSERT_TRUE(iv);
EXPECT_EQ(0, fs.access(*iv, F_OK, 1, 1));
EXPECT_TRUE(fs.access(*iv, F_OK, 1, 1));
EXPECT_EQ(EACCES, fs.access(*iv, R_OK, 1, 1));
EXPECT_EQ(EACCES, fs.access(*iv, W_OK, 1, 1));
EXPECT_EQ(EACCES, fs.access(*iv, x_ok, 1, 1));
EXPECT_FALSE(fs.access(*iv, R_OK, 1, 1));
EXPECT_FALSE(fs.access(*iv, W_OK, 1, 1));
EXPECT_FALSE(fs.access(*iv, x_ok, 1, 1));
EXPECT_EQ(0, fs.access(*iv, R_OK, 1, 3333));
EXPECT_EQ(EACCES, fs.access(*iv, W_OK, 1, 3333));
EXPECT_EQ(EACCES, fs.access(*iv, x_ok, 1, 3333));
EXPECT_TRUE(fs.access(*iv, R_OK, 1, 3333));
EXPECT_FALSE(fs.access(*iv, W_OK, 1, 3333));
EXPECT_FALSE(fs.access(*iv, x_ok, 1, 3333));
EXPECT_EQ(0, fs.access(*iv, R_OK, 222, 7));
EXPECT_EQ(EACCES, fs.access(*iv, W_OK, 222, 7));
EXPECT_EQ(0, fs.access(*iv, x_ok, 222, 7));
EXPECT_TRUE(fs.access(*iv, R_OK, 222, 7));
EXPECT_FALSE(fs.access(*iv, W_OK, 222, 7));
EXPECT_TRUE(fs.access(*iv, x_ok, 222, 7));
}
}