From d5983dd3621adc737e7182b45ad05381f8a48699 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 22 Feb 2019 14:35:35 +0100 Subject: [PATCH] storage/udisks2: use the relative path Closes #487 --- NEWS | 1 + src/storage/plugins/UdisksStorage.cxx | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 4b012d852..e5d5fdaee 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ ver 0.21.5 (not yet released) - fix assertion failures with mount points * storage - udisks: fix "AlreadyMounted" error + - udisks: use relative path from mount URI * input - buffer: fix crash bug when playing remote WAV file * tags diff --git a/src/storage/plugins/UdisksStorage.cxx b/src/storage/plugins/UdisksStorage.cxx index 6cce7d14b..07ba6f45f 100644 --- a/src/storage/plugins/UdisksStorage.cxx +++ b/src/storage/plugins/UdisksStorage.cxx @@ -46,6 +46,8 @@ class UdisksStorage final : public Storage { const std::string base_uri; const std::string id; + const AllocatedPath inside_path; + std::string dbus_path; SafeSingleton dbus_glue; @@ -64,10 +66,12 @@ class UdisksStorage final : public Storage { DeferEvent defer_mount, defer_unmount; public: - template - UdisksStorage(EventLoop &_event_loop, B &&_base_uri, I &&_id) + template + UdisksStorage(EventLoop &_event_loop, B &&_base_uri, I &&_id, + IP &&_inside_path) :base_uri(std::forward(_base_uri)), id(std::forward(_id)), + inside_path(std::forward(_inside_path)), dbus_glue(_event_loop), defer_mount(_event_loop, BIND_THIS_METHOD(DeferredMount)), defer_unmount(_event_loop, BIND_THIS_METHOD(DeferredUnmount)) {} @@ -137,7 +141,10 @@ private: inline void UdisksStorage::SetMountPoint(Path mount_point) { - mounted_storage = CreateLocalStorage(mount_point); + mounted_storage = inside_path.IsNull() + ? CreateLocalStorage(mount_point) + : CreateLocalStorage(mount_point / inside_path); + mount_error = {}; want_mount = false; cond.broadcast(); @@ -360,12 +367,17 @@ CreateUdisksStorageURI(EventLoop &event_loop, const char *base_uri) } else { id = {id_begin, relative_path}; ++relative_path; + while (*relative_path == '/') + ++relative_path; } - // TODO: use relative_path + auto inside_path = *relative_path != 0 + ? AllocatedPath::FromUTF8Throw(relative_path) + : nullptr; return std::make_unique(event_loop, base_uri, - std::move(id)); + std::move(id), + std::move(inside_path)); } const StoragePlugin udisks_storage_plugin = {