From 7cc83164ffd69b4da0143f7e531f919b9006f944 Mon Sep 17 00:00:00 2001 From: Anna Platash Date: Thu, 15 Apr 2021 10:22:15 +0200 Subject: Image mount fails if socket directory not present When trying to mount virtual media image in Legacy mode nbd tries to create unix socket and if the parent directory does not exist mount fails. Also used noexcept versions of filesystem operations. Tested: Locally, by manually removing the socket's parent folder and mounting an image in Legacy mode (Samba). Change-Id: If5beb7add655e09a60511b30e4edbd34c8c15ec5 Signed-off-by: Anna Platash Signed-off-by: Czarnowski, Przemyslaw --- src/state/activating_state.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/state/activating_state.cpp b/src/state/activating_state.cpp index 9cbd324..15d7214 100644 --- a/src/state/activating_state.cpp +++ b/src/state/activating_state.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,36 @@ std::unique_ptr ActivatingState::activateLegacyMode() " Mount requested on address: ", machine.getTarget()->imgUrl, " ; RW: ", machine.getTarget()->rw); + std::filesystem::path socketPath(machine.getConfig().unixSocket); + if (!std::filesystem::exists(socketPath.parent_path())) + { + LogMsg(Logger::Debug, machine.getName(), + " Parent path for the socket does not exist, ", + socketPath.parent_path()); + + std::error_code errc; + std::filesystem::create_directories(socketPath.parent_path(), errc); + if (errc) + { + LogMsg(Logger::Debug, machine.getName(), + " Failed to create parent directory for socket", errc); + return std::make_unique( + machine, static_cast(errc.value()), + "Failed to create parent directory for socket"); + } + std::filesystem::permissions(socketPath.parent_path(), + std::filesystem::perms::owner_all, errc); + if (errc) + { + LogMsg(Logger::Debug, machine.getName(), + " Failed to set parent directory permissions for socket", + errc); + return std::make_unique( + machine, static_cast(errc.value()), + "Failed to set parent permissions directory for socket"); + } + } + if (isCifsUrl(machine.getTarget()->imgUrl)) { return mountSmbShare(); -- cgit v1.2.3