refactor
This commit is contained in:
parent
1eec19c583
commit
fe0fef2f21
@ -96,6 +96,7 @@ expect_streq
|
|||||||
fallocate_impl
|
fallocate_impl
|
||||||
fext
|
fext
|
||||||
fgetattr
|
fgetattr
|
||||||
|
fgetattr_impl
|
||||||
filebase
|
filebase
|
||||||
flac_version
|
flac_version
|
||||||
flag_nopath
|
flag_nopath
|
||||||
|
@ -205,19 +205,24 @@ auto fuse_drive::create_impl(std::string api_path, mode_t mode,
|
|||||||
if ((res != api_error::item_exists) && (res != api_error::success)) {
|
if ((res != api_error::item_exists) && (res != api_error::success)) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
} else if (((res = fm_->open(api_path, is_directory_op, file_info->flags,
|
} else {
|
||||||
handle, open_file)) != api_error::success)) {
|
res = fm_->open(api_path, is_directory_op, file_info->flags, handle,
|
||||||
return res;
|
open_file);
|
||||||
|
if (res != api_error::success) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
file_info->fh = handle;
|
file_info->fh = handle;
|
||||||
if (is_truncate_op) {
|
if (is_truncate_op) {
|
||||||
#if FUSE_USE_VERSION >= 30
|
#if FUSE_USE_VERSION >= 30
|
||||||
if ((res = truncate_impl(api_path, 0, file_info)) != api_error::success) {
|
res = truncate_impl(api_path, 0, file_info);
|
||||||
#else
|
if (res != api_error::success) {
|
||||||
if ((res = ftruncate_impl(api_path, 0, file_info)) != api_error::success) {
|
#else // FUSE_USE_VERSION < 30
|
||||||
#endif
|
res = ftruncate_impl(api_path, 0, file_info);
|
||||||
|
if (res != api_error::success) {
|
||||||
|
#endif // FUSE_USE_VERSION >= 30
|
||||||
fm_->close(handle);
|
fm_->close(handle);
|
||||||
file_info->fh = 0U;
|
file_info->fh = 0U;
|
||||||
errno = std::abs(utils::from_api_error(res));
|
errno = std::abs(utils::from_api_error(res));
|
||||||
@ -286,9 +291,9 @@ auto fuse_drive::fallocate_impl(std::string /*api_path*/, int mode,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_open_flags(
|
res = check_open_flags(open_file->get_open_data(file_info->fh),
|
||||||
open_file->get_open_data(file_info->fh), O_WRONLY | O_APPEND,
|
O_WRONLY | O_APPEND, api_error::invalid_handle);
|
||||||
api_error::invalid_handle)) != api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,8 +481,8 @@ auto fuse_drive::getattr_impl(std::string api_path,
|
|||||||
auto found = false;
|
auto found = false;
|
||||||
directory_cache_->execute_action(parent, [&](directory_iterator &iter) {
|
directory_cache_->execute_action(parent, [&](directory_iterator &iter) {
|
||||||
directory_item dir_item{};
|
directory_item dir_item{};
|
||||||
if ((found = (iter.get_directory_item(api_path, dir_item) ==
|
found = (iter.get_directory_item(api_path, dir_item) == api_error::success);
|
||||||
api_error::success))) {
|
if (found) {
|
||||||
fuse_drive_base::populate_stat(api_path, dir_item.size, dir_item.meta,
|
fuse_drive_base::populate_stat(api_path, dir_item.size, dir_item.meta,
|
||||||
dir_item.directory, provider_, st);
|
dir_item.directory, provider_, st);
|
||||||
}
|
}
|
||||||
@ -485,7 +490,8 @@ auto fuse_drive::getattr_impl(std::string api_path,
|
|||||||
|
|
||||||
if (not found) {
|
if (not found) {
|
||||||
api_meta_map meta{};
|
api_meta_map meta{};
|
||||||
if ((res = provider_.get_item_meta(api_path, meta)) != api_error::success) {
|
res = provider_.get_item_meta(api_path, meta);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -672,7 +678,8 @@ auto fuse_drive::opendir_impl(std::string api_path,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_parent_access(api_path, mask)) != api_error::success) {
|
res = check_parent_access(api_path, mask);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,8 +693,8 @@ auto fuse_drive::opendir_impl(std::string api_path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
directory_item_list list{};
|
directory_item_list list{};
|
||||||
if ((res = provider_.get_directory_items(api_path, list)) !=
|
res = provider_.get_directory_items(api_path, list);
|
||||||
api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -715,7 +722,8 @@ auto fuse_drive::read_impl(std::string api_path, char *buffer, size_t read_size,
|
|||||||
data_buffer data;
|
data_buffer data;
|
||||||
res =
|
res =
|
||||||
open_file->read(read_size, static_cast<std::uint64_t>(read_offset), data);
|
open_file->read(read_size, static_cast<std::uint64_t>(read_offset), data);
|
||||||
if ((bytes_read = data.size()) != 0U) {
|
bytes_read = data.size();
|
||||||
|
if (bytes_read != 0U) {
|
||||||
std::memcpy(buffer, data.data(), data.size());
|
std::memcpy(buffer, data.data(), data.size());
|
||||||
data.clear();
|
data.clear();
|
||||||
update_accessed_time(api_path);
|
update_accessed_time(api_path);
|
||||||
@ -809,8 +817,8 @@ auto fuse_drive::rename_impl(std::string from_api_path,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_parent_access(from_api_path, W_OK | X_OK)) !=
|
res = check_parent_access(from_api_path, W_OK | X_OK);
|
||||||
api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -837,7 +845,8 @@ auto fuse_drive::rmdir_impl(std::string api_path) -> api_error {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = provider_.remove_directory(api_path)) != api_error::success) {
|
res = provider_.remove_directory(api_path);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -862,42 +871,48 @@ auto fuse_drive::getxattr_common(std::string api_path, const char *name,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_parent_access(api_path, X_OK)) != api_error::success) {
|
res = check_parent_access(api_path, X_OK);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
api_meta_map meta;
|
api_meta_map meta;
|
||||||
auto found = false;
|
auto found{false};
|
||||||
directory_cache_->execute_action(
|
directory_cache_->execute_action(
|
||||||
utils::path::get_parent_api_path(api_path),
|
utils::path::get_parent_api_path(api_path),
|
||||||
[&](directory_iterator &iterator) {
|
[&](directory_iterator &iterator) {
|
||||||
directory_item dir_item{};
|
directory_item dir_item{};
|
||||||
if ((found = (iterator.get_directory_item(api_path, dir_item) ==
|
found = (iterator.get_directory_item(api_path, dir_item) ==
|
||||||
api_error::success))) {
|
api_error::success);
|
||||||
|
if (found) {
|
||||||
meta = dir_item.meta;
|
meta = dir_item.meta;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (found ||
|
res = found ? api_error::success : provider_.get_item_meta(api_path, meta);
|
||||||
((res = provider_.get_item_meta(api_path, meta)) == api_error::success)) {
|
if (res != api_error::success) {
|
||||||
res = api_error::xattr_not_found;
|
return res;
|
||||||
if (meta.find(attribute_name) != meta.end()) {
|
|
||||||
auto data = macaron::Base64::Decode(meta[attribute_name]);
|
|
||||||
if ((position == nullptr) || (*position < data.size())) {
|
|
||||||
res = api_error::success;
|
|
||||||
attribute_size = static_cast<int>(data.size());
|
|
||||||
if (size != 0U) {
|
|
||||||
res = api_error::xattr_buffer_small;
|
|
||||||
if (size >= data.size()) {
|
|
||||||
memcpy(value, data.data(), data.size());
|
|
||||||
return api_error::success;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
if (meta.find(attribute_name) == meta.end()) {
|
||||||
|
return api_error::xattr_not_found;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto data = macaron::Base64::Decode(meta.at(attribute_name));
|
||||||
|
if ((position == nullptr) || (*position < data.size())) {
|
||||||
|
attribute_size = static_cast<int>(data.size());
|
||||||
|
if (size == 0U) {
|
||||||
|
return api_error::success;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < data.size()) {
|
||||||
|
return api_error::xattr_buffer_small;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::memcpy(value, data.data(), data.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
return api_error::success;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
@ -926,7 +941,8 @@ auto fuse_drive::listxattr_impl(std::string api_path, char *buffer, size_t size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
api_meta_map meta;
|
api_meta_map meta;
|
||||||
if ((res = provider_.get_item_meta(api_path, meta)) == api_error::success) {
|
res = provider_.get_item_meta(api_path, meta);
|
||||||
|
if (res == api_error::success) {
|
||||||
for (auto &&meta_item : meta) {
|
for (auto &&meta_item : meta) {
|
||||||
if (utils::collection::excludes(META_USED_NAMES, meta_item.first)) {
|
if (utils::collection::excludes(META_USED_NAMES, meta_item.first)) {
|
||||||
auto attribute_name = meta_item.first;
|
auto attribute_name = meta_item.first;
|
||||||
@ -1019,15 +1035,18 @@ auto fuse_drive::setxattr_impl(std::string api_path, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
api_meta_map meta;
|
api_meta_map meta;
|
||||||
if ((res = provider_.get_item_meta(api_path, meta)) != api_error::success) {
|
res = provider_.get_item_meta(api_path, meta);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_parent_access(api_path, X_OK)) != api_error::success) {
|
res = check_parent_access(api_path, X_OK);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_owner(meta)) != api_error::success) {
|
res = check_owner(meta);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1257,12 +1276,12 @@ auto fuse_drive::truncate_impl(std::string api_path, off_t size) -> api_error {
|
|||||||
if (res != api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
res = check_parent_access(api_path, X_OK);
|
||||||
if ((res = check_parent_access(api_path, X_OK)) != api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
res = check_access(api_path, W_OK);
|
||||||
if ((res = check_access(api_path, W_OK)) != api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1270,8 +1289,8 @@ auto fuse_drive::truncate_impl(std::string api_path, off_t size) -> api_error {
|
|||||||
{
|
{
|
||||||
open_file_data ofd{O_RDWR};
|
open_file_data ofd{O_RDWR};
|
||||||
std::shared_ptr<i_open_file> open_file;
|
std::shared_ptr<i_open_file> open_file;
|
||||||
if ((res = fm_->open(api_path, false, ofd, handle, open_file)) !=
|
res = fm_->open(api_path, false, ofd, handle, open_file);
|
||||||
api_error::success) {
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1314,7 +1333,8 @@ auto fuse_drive::utimens_impl(std::string api_path,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = check_owner(meta)) != api_error::success) {
|
res = check_owner(meta);
|
||||||
|
if (res != api_error::success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user