mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-24 03:43:18 -04:00
fix: remove access() implementation from FUSE driver (see gh #244)
This commit is contained in:
parent
f3afc72ea0
commit
a340410365
@ -740,25 +740,6 @@ bool check_readonly(fs::path const& p, bool readonly) {
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
{
|
||||
auto r = ::access(p.string().c_str(), W_OK);
|
||||
|
||||
if (readonly) {
|
||||
if (r != -1 || errno != EACCES) {
|
||||
std::cerr << "access(" << p << ", W_OK) = " << r << " (errno=" << errno
|
||||
<< ") [readonly]\n";
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (r != 0) {
|
||||
std::cerr << "access(" << p << ", W_OK) = " << r << "\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1309,19 +1290,19 @@ TEST_P(tools_test, mutating_and_error_ops) {
|
||||
{
|
||||
std::error_code ec;
|
||||
EXPECT_FALSE(fs::remove(file, ec)) << runner.cmdline();
|
||||
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
|
||||
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
{
|
||||
std::error_code ec;
|
||||
EXPECT_FALSE(fs::remove(empty_dir, ec)) << runner.cmdline();
|
||||
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
|
||||
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
{
|
||||
std::error_code ec;
|
||||
EXPECT_FALSE(fs::remove(non_empty_dir, ec)) << runner.cmdline();
|
||||
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
|
||||
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
{
|
||||
@ -1329,7 +1310,7 @@ TEST_P(tools_test, mutating_and_error_ops) {
|
||||
EXPECT_EQ(static_cast<std::uintmax_t>(-1),
|
||||
fs::remove_all(non_empty_dir, ec))
|
||||
<< runner.cmdline();
|
||||
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
|
||||
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
// rename
|
||||
@ -1405,7 +1386,7 @@ TEST_P(tools_test, mutating_and_error_ops) {
|
||||
{
|
||||
std::error_code ec;
|
||||
fs::resize_file(file, 1, ec);
|
||||
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
|
||||
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
// create directory
|
||||
|
@ -224,7 +224,6 @@ struct dwarfs_userdata {
|
||||
PERFMON_EXT_TIMER_DECL(op_init)
|
||||
PERFMON_EXT_TIMER_DECL(op_lookup)
|
||||
PERFMON_EXT_TIMER_DECL(op_getattr)
|
||||
PERFMON_EXT_TIMER_DECL(op_access)
|
||||
PERFMON_EXT_TIMER_DECL(op_readlink)
|
||||
PERFMON_EXT_TIMER_DECL(op_open)
|
||||
PERFMON_EXT_TIMER_DECL(op_read)
|
||||
@ -499,55 +498,6 @@ int op_getattr(char const* path, native_stat* st, struct fuse_file_info*) {
|
||||
}
|
||||
#endif
|
||||
|
||||
template <typename LogProxy, typename Find>
|
||||
int op_access_common(LogProxy& log_, dwarfs_userdata& userdata, int mode,
|
||||
file_stat::uid_type uid, file_stat::gid_type gid,
|
||||
Find const& find) {
|
||||
return checked_call(log_, [&] {
|
||||
if (auto iv = find()) {
|
||||
std::error_code ec;
|
||||
userdata.fs.access(*iv, mode, uid, gid, ec);
|
||||
return ec.value();
|
||||
}
|
||||
return ENOENT;
|
||||
});
|
||||
}
|
||||
|
||||
#if DWARFS_FUSE_LOWLEVEL
|
||||
template <typename LoggerPolicy>
|
||||
void op_access(fuse_req_t req, fuse_ino_t ino, int mode) {
|
||||
dUSERDATA;
|
||||
PERFMON_EXT_SCOPED_SECTION(userdata, op_access)
|
||||
LOG_PROXY(LoggerPolicy, userdata.lgr);
|
||||
|
||||
LOG_DEBUG << __func__ << "(" << ino << ")" << get_caller_context(req);
|
||||
PERFMON_SET_CONTEXT(ino)
|
||||
|
||||
auto ctx = fuse_req_ctx(req);
|
||||
|
||||
int err =
|
||||
op_access_common(log_, userdata, mode, ctx->uid, ctx->gid,
|
||||
[&userdata, ino] { return userdata.fs.find(ino); });
|
||||
|
||||
fuse_reply_err(req, err);
|
||||
}
|
||||
#else
|
||||
template <typename LoggerPolicy>
|
||||
int op_access(char const* path, int mode) {
|
||||
dUSERDATA;
|
||||
PERFMON_EXT_SCOPED_SECTION(userdata, op_access)
|
||||
LOG_PROXY(LoggerPolicy, userdata.lgr);
|
||||
|
||||
LOG_DEBUG << __func__ << "(" << path << ")" << get_caller_context();
|
||||
|
||||
auto ctx = fuse_get_context();
|
||||
|
||||
return -op_access_common(log_, userdata, mode, ctx->uid, ctx->gid, [&] {
|
||||
return find_inode(PERFMON_SECTION_ARG_ userdata.fs, path);
|
||||
});
|
||||
}
|
||||
#endif
|
||||
|
||||
template <typename LogProxy, typename Find>
|
||||
int op_readlink_common(LogProxy& log_, dwarfs_userdata& userdata,
|
||||
std::string* str, Find const& find) {
|
||||
@ -1304,7 +1254,6 @@ void init_fuse_ops(struct fuse_lowlevel_ops& ops,
|
||||
ops.init = &op_init<LoggerPolicy>;
|
||||
ops.lookup = &op_lookup<LoggerPolicy>;
|
||||
ops.getattr = &op_getattr<LoggerPolicy>;
|
||||
ops.access = &op_access<LoggerPolicy>;
|
||||
if (userdata.fs.has_symlinks()) {
|
||||
ops.readlink = &op_readlink<LoggerPolicy>;
|
||||
}
|
||||
@ -1321,7 +1270,6 @@ void init_fuse_ops(struct fuse_operations& ops,
|
||||
dwarfs_userdata const& userdata) {
|
||||
ops.init = &op_init<LoggerPolicy>;
|
||||
ops.getattr = &op_getattr<LoggerPolicy>;
|
||||
ops.access = &op_access<LoggerPolicy>;
|
||||
if (userdata.fs.has_symlinks()) {
|
||||
ops.readlink = &op_readlink<LoggerPolicy>;
|
||||
}
|
||||
@ -1502,7 +1450,6 @@ void load_filesystem(dwarfs_userdata& userdata) {
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_init)
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_lookup, "inode")
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_getattr, "inode")
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_access, "inode")
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_readlink, "inode")
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_open, "inode")
|
||||
PERFMON_EXT_TIMER_SETUP(userdata, op_read, "inode", "size")
|
||||
|
Loading…
x
Reference in New Issue
Block a user