This commit is contained in:
2024-08-23 14:39:27 -05:00
parent 31e0b4c5d9
commit 51320f9a09
3 changed files with 102 additions and 48 deletions

View File

@ -42,9 +42,9 @@ private:
private: private:
#if defined(_WIN32) #if defined(_WIN32)
#define to_handle(x) (x) #define to_handle(x) (x)
#else #else // !defined(_WIN32)
static auto to_handle(PVOID file_desc) -> native_handle; static auto to_handle(PVOID file_desc) -> native_handle;
#endif #endif // defined(_WIN32)
public: public:
auto json_create_directory_snapshot(const std::string &path, json &json_data) auto json_create_directory_snapshot(const std::string &path, json &json_data)

View File

@ -65,7 +65,10 @@ auto remote_client::winfsp_can_delete(PVOID file_desc,
request.encode(file_name); request.encode(file_name);
std::uint32_t service_flags{}; std::uint32_t service_flags{};
const auto ret = packet_client_.send(function_name, request, service_flags); auto ret{
packet_client_.send(function_name, request, service_flags),
};
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
function_name, function_name,
utils::path::create_api_path(utils::string::to_utf8(file_name)), ret); utils::path::create_api_path(utils::string::to_utf8(file_name)), ret);
@ -83,8 +86,9 @@ auto remote_client::json_create_directory_snapshot(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
if (ret == 0) { if (ret == 0) {
ret = packet::decode_json(response, json_data); ret = packet::decode_json(response, json_data);
} }
@ -107,8 +111,9 @@ auto remote_client::json_read_directory_snapshot(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
if (ret == 0) { if (ret == 0) {
ret = packet::decode_json(response, json_data); ret = packet::decode_json(response, json_data);
} }
@ -129,7 +134,9 @@ auto remote_client::json_release_directory_snapshot(
request.encode(handle); request.encode(handle);
std::uint32_t service_flags{}; std::uint32_t service_flags{};
const auto ret = packet_client_.send(function_name, request, service_flags); auto ret{
packet_client_.send(function_name, request, service_flags),
};
RAISE_REMOTE_WINFSP_CLIENT_EVENT(function_name, path, ret); RAISE_REMOTE_WINFSP_CLIENT_EVENT(function_name, path, ret);
return ret; return ret;
@ -142,8 +149,14 @@ auto remote_client::winfsp_cleanup(PVOID file_desc, PWSTR file_name,
static_cast<const char *>(__FUNCTION__), static_cast<const char *>(__FUNCTION__),
}; };
auto handle = to_handle(file_desc); auto handle{
const auto file_path = get_open_file_path(handle); to_handle(file_desc),
};
auto file_path{
get_open_file_path(handle),
};
was_closed = 0; was_closed = 0;
packet request; packet request;
@ -153,8 +166,9 @@ auto remote_client::winfsp_cleanup(PVOID file_desc, PWSTR file_name,
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, was_closed); DECODE_OR_IGNORE(&response, was_closed);
if (was_closed != 0U) { if (was_closed != 0U) {
remove_all(file_path); remove_all(file_path);
@ -168,15 +182,21 @@ auto remote_client::winfsp_close(PVOID file_desc) -> packet::error_type {
static_cast<const char *>(__FUNCTION__), static_cast<const char *>(__FUNCTION__),
}; };
auto handle = to_handle(file_desc); auto handle{
to_handle(file_desc),
};
if (has_open_info(handle, STATUS_INVALID_HANDLE) == STATUS_SUCCESS) { if (has_open_info(handle, STATUS_INVALID_HANDLE) == STATUS_SUCCESS) {
const auto file_path = get_open_file_path(handle); auto file_path{
get_open_file_path(handle),
};
packet request; packet request;
request.encode(file_desc); request.encode(file_desc);
std::uint32_t service_flags{}; std::uint32_t service_flags{};
const auto ret = packet_client_.send(function_name, request, service_flags); auto ret{
packet_client_.send(function_name, request, service_flags),
};
if ((ret == STATUS_SUCCESS) || if ((ret == STATUS_SUCCESS) ||
(ret == static_cast<packet::error_type>(STATUS_INVALID_HANDLE))) { (ret == static_cast<packet::error_type>(STATUS_INVALID_HANDLE))) {
remove_open_info(handle); remove_open_info(handle);
@ -206,8 +226,9 @@ auto remote_client::winfsp_create(PWSTR file_name, UINT32 create_options,
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
if (ret == STATUS_SUCCESS) { if (ret == STATUS_SUCCESS) {
HANDLE handle{}; HANDLE handle{};
DECODE_OR_IGNORE(&response, handle); DECODE_OR_IGNORE(&response, handle);
@ -243,8 +264,9 @@ auto remote_client::winfsp_flush(PVOID file_desc, remote::file_info *file_info)
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *file_info); DECODE_OR_IGNORE(&response, *file_info);
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
@ -274,8 +296,9 @@ auto remote_client::winfsp_get_file_info(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *file_info); DECODE_OR_IGNORE(&response, *file_info);
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
@ -298,8 +321,9 @@ auto remote_client::winfsp_get_security_by_name(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
string_descriptor.clear(); string_descriptor.clear();
DECODE_OR_IGNORE(&response, string_descriptor); DECODE_OR_IGNORE(&response, string_descriptor);
@ -326,8 +350,9 @@ auto remote_client::winfsp_get_volume_info(
packet request; packet request;
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, total_size); DECODE_OR_IGNORE(&response, total_size);
DECODE_OR_IGNORE(&response, free_size); DECODE_OR_IGNORE(&response, free_size);
DECODE_OR_IGNORE(&response, volume_label); DECODE_OR_IGNORE(&response, volume_label);
@ -346,8 +371,13 @@ auto remote_client::winfsp_mounted(const std::wstring &location)
request.encode(location); request.encode(location);
std::uint32_t service_flags{}; std::uint32_t service_flags{};
const auto ret = packet_client_.send(function_name, request, service_flags); auto ret{
const auto mount_location = utils::string::to_utf8(location); packet_client_.send(function_name, request, service_flags),
};
auto mount_location{
utils::string::to_utf8(location),
};
event_system::instance().raise<drive_mounted>(mount_location); event_system::instance().raise<drive_mounted>(mount_location);
RAISE_REMOTE_WINFSP_CLIENT_EVENT(function_name, mount_location, ret); RAISE_REMOTE_WINFSP_CLIENT_EVENT(function_name, mount_location, ret);
@ -369,8 +399,9 @@ auto remote_client::winfsp_open(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
if (ret == STATUS_SUCCESS) { if (ret == STATUS_SUCCESS) {
HANDLE handle{}; HANDLE handle{};
DECODE_OR_IGNORE(&response, handle); DECODE_OR_IGNORE(&response, handle);
@ -406,8 +437,9 @@ auto remote_client::winfsp_overwrite(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *file_info); DECODE_OR_IGNORE(&response, *file_info);
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
@ -429,8 +461,9 @@ auto remote_client::winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset,
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *bytes_transferred); DECODE_OR_IGNORE(&response, *bytes_transferred);
if (ret == STATUS_SUCCESS) { if (ret == STATUS_SUCCESS) {
ret = response.decode(buffer, *bytes_transferred); ret = response.decode(buffer, *bytes_transferred);
@ -464,8 +497,9 @@ auto remote_client::winfsp_read_directory(PVOID file_desc, PWSTR pattern,
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
if (ret == STATUS_SUCCESS) { if (ret == STATUS_SUCCESS) {
ret = packet::decode_json(response, item_list); ret = packet::decode_json(response, item_list);
} }
@ -489,7 +523,10 @@ auto remote_client::winfsp_rename(
request.encode(replace_if_exists); request.encode(replace_if_exists);
std::uint32_t service_flags{}; std::uint32_t service_flags{};
const auto ret = packet_client_.send(function_name, request, service_flags); auto ret{
packet_client_.send(function_name, request, service_flags),
};
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
function_name, function_name,
utils::path::create_api_path(utils::string::to_utf8(file_name)) + "|" + utils::path::create_api_path(utils::string::to_utf8(file_name)) + "|" +
@ -516,8 +553,9 @@ auto remote_client::winfsp_set_basic_info(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *file_info); DECODE_OR_IGNORE(&response, *file_info);
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
@ -539,8 +577,9 @@ auto remote_client::winfsp_set_file_size(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *file_info); DECODE_OR_IGNORE(&response, *file_info);
RAISE_REMOTE_WINFSP_CLIENT_EVENT( RAISE_REMOTE_WINFSP_CLIENT_EVENT(
@ -554,13 +593,17 @@ auto remote_client::winfsp_unmounted(const std::wstring &location)
static_cast<const char *>(__FUNCTION__), static_cast<const char *>(__FUNCTION__),
}; };
const auto mount_location = utils::string::to_utf8(location); auto mount_location{
utils::string::to_utf8(location),
};
event_system::instance().raise<drive_unmount_pending>(mount_location); event_system::instance().raise<drive_unmount_pending>(mount_location);
packet request; packet request;
request.encode(location); request.encode(location);
std::uint32_t service_flags{}; std::uint32_t service_flags{};
const auto ret = packet_client_.send(function_name, request, service_flags); auto ret{
packet_client_.send(function_name, request, service_flags),
};
event_system::instance().raise<drive_unmounted>(mount_location); event_system::instance().raise<drive_unmounted>(mount_location);
RAISE_REMOTE_WINFSP_CLIENT_EVENT(function_name, mount_location, ret); RAISE_REMOTE_WINFSP_CLIENT_EVENT(function_name, mount_location, ret);
@ -587,8 +630,9 @@ auto remote_client::winfsp_write(
packet response; packet response;
std::uint32_t service_flags{}; std::uint32_t service_flags{};
auto ret = auto ret{
packet_client_.send(function_name, request, response, service_flags); packet_client_.send(function_name, request, response, service_flags),
};
DECODE_OR_IGNORE(&response, *bytes_transferred); DECODE_OR_IGNORE(&response, *bytes_transferred);
DECODE_OR_IGNORE(&response, *file_info); DECODE_OR_IGNORE(&response, *file_info);
@ -603,5 +647,5 @@ auto remote_client::winfsp_write(
auto remote_client::to_handle(PVOID file_desc) -> native_handle { auto remote_client::to_handle(PVOID file_desc) -> native_handle {
return static_cast<native_handle>(reinterpret_cast<std::uint64_t>(file_desc)); return static_cast<native_handle>(reinterpret_cast<std::uint64_t>(file_desc));
} }
#endif #endif // !defined(_WIN32)
} // namespace repertory::remote_winfsp } // namespace repertory::remote_winfsp

View File

@ -111,12 +111,22 @@ auto remote_server::fuse_access(const char *path, const std::int32_t &mask)
static_cast<const char *>(__FUNCTION__), static_cast<const char *>(__FUNCTION__),
}; };
const auto file_path = construct_path(path); auto file_path{
const auto windows_mask = utils::unix_access_mask_to_windows(mask); construct_path(path),
};
auto windows_mask{
utils::unix_access_mask_to_windows(mask),
};
auto res{ auto res{
_access(file_path.c_str(), windows_mask), _access(file_path.c_str(), windows_mask),
}; };
const auto ret = ((res < 0) ? -errno : 0);
auto ret{
((res < 0) ? -errno : 0),
};
RAISE_REMOTE_WINFSP_SERVER_EVENT(function_name, file_path, ret); RAISE_REMOTE_WINFSP_SERVER_EVENT(function_name, file_path, ret);
return ret; return ret;
} }