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