From: Karol Lewandowski Date: Thu, 24 Apr 2025 11:08:01 +0000 (+0200) Subject: wip X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9acb5871b46bfc8540ee1f854bc478bc9c4ace9d;p=platform%2Fcore%2Fsystem%2Fsessiond.git wip Change-Id: Ia335fabd1fcb3edec280ddaf7e2915ac836f9132 --- diff --git a/src/service/src/dir_backend.hpp b/src/service/src/dir_backend.hpp index d1c66c5..1fa75ea 100644 --- a/src/service/src/dir_backend.hpp +++ b/src/service/src/dir_backend.hpp @@ -11,7 +11,8 @@ struct DirBackend { }; struct DirBackendAdd { - virtual fs::path AddSubsessionPrepare (const fs::path& subsession_path, int uid, int gid) const = 0; + virtual fs::path AddSubsessionPrepare (const fs::path& subsession_path, int uid, int gid) const = 0; + virtual fs::path AddSubsessionPrepareFromTemplate (const fs::path& subsession_path, const fs::path& main_path) const = 0; virtual void AddSubsessionFinalize (const fs::path& tmpdir_path, const fs::path& subsession_path, int uid, int gid) const = 0; virtual void AddSubsessionCleanupFailure (const fs::path& tmpdir_path, const fs::path& subsession_path) const = 0; }; diff --git a/src/service/src/dir_backend_fixed_size.cpp b/src/service/src/dir_backend_fixed_size.cpp index 8167470..fab8cde 100644 --- a/src/service/src/dir_backend_fixed_size.cpp +++ b/src/service/src/dir_backend_fixed_size.cpp @@ -44,11 +44,18 @@ fs::path DirBackendFixedSize::GetImagePathFromSubsessionPath(fs::path subsession return subsession_path; } -fs::path DirBackendAddFixedSize::AddSubsessionPrepareFromTemplate (const fs::path& subsession_path, const fs::path& main_path, int uid, int gid) const +fs::path DirBackendAddFixedSize::AddSubsessionPrepareFromTemplate (const fs::path& subsession_path, const fs::path& main_path) const { fs::path template_path = main_path / ".template"; - fs::copy(GetImagePathFromSubsessionPath(subsession_path), GetImagePathFromSubsessionPath(template_path)); - do_resizefs(GetImagePathFromSubsessionPath(subsession_path); + + auto tmp_subsession_path = subsession_path; + tmp_subsession_path.replace_filename(TMP_NEW_PREFIX + subsession_path.filename().native()); + + fs::copy_file (DirBackendFixedSize::GetImagePathFromSubsessionPath(subsession_path), + DirBackendFixedSize::GetImagePathFromSubsessionPath(template_path)); + do_resize2fs (DirBackendFixedSize::GetImagePathFromSubsessionPath(tmp_subsession_path), size_kB); + + return tmp_subsession_path; } fs::path DirBackendAddFixedSize::AddSubsessionPrepare (const fs::path& subsession_path, int uid, int gid) const diff --git a/src/service/src/dir_backend_fixed_size.hpp b/src/service/src/dir_backend_fixed_size.hpp index cd75292..149a232 100644 --- a/src/service/src/dir_backend_fixed_size.hpp +++ b/src/service/src/dir_backend_fixed_size.hpp @@ -17,6 +17,7 @@ struct DirBackendAddFixedSize : public DirBackendAdd { DirBackendAddFixedSize(uint32_t s) : size_kB(s) { } fs::path AddSubsessionPrepare (const fs::path& subsession_path, int uid, int gid) const override; + fs::path AddSubsessionPrepareFromTemplate (const fs::path& subsession_path, const fs::path& main_path) const override; void AddSubsessionFinalize (const fs::path& tmpdir_path, const fs::path& subsession_path, int uid, int gid) const override; void AddSubsessionCleanupFailure (const fs::path& tmpdir_path, const fs::path& subsession_path) const override; }; diff --git a/src/service/src/dir_backend_regular_dir.cpp b/src/service/src/dir_backend_regular_dir.cpp index 5f46a7f..4eaaec0 100644 --- a/src/service/src/dir_backend_regular_dir.cpp +++ b/src/service/src/dir_backend_regular_dir.cpp @@ -25,6 +25,11 @@ using namespace std::string_literals; +fs::path DirBackendAddRegularDir::AddSubsessionPrepareFromTemplate (const fs::path& subsession_path, const fs::path &main_path) const +{ + throw std::runtime_error("not supported"); +} + fs::path DirBackendAddRegularDir::AddSubsessionPrepare (const fs::path& subsession_path, int uid, int gid) const { auto tmp_subsession_path = subsession_path; diff --git a/src/service/src/dir_backend_regular_dir.hpp b/src/service/src/dir_backend_regular_dir.hpp index ed4a9f6..a5b7888 100644 --- a/src/service/src/dir_backend_regular_dir.hpp +++ b/src/service/src/dir_backend_regular_dir.hpp @@ -10,6 +10,7 @@ struct DirBackendRegularDir : public DirBackend { struct DirBackendAddRegularDir : public DirBackendAdd { fs::path AddSubsessionPrepare (const fs::path& subsession_path, int uid, int gid) const override; + fs::path AddSubsessionPrepareFromTemplate (const fs::path& subsession_path, const fs::path &main_path) const override; void AddSubsessionFinalize (const fs::path& tmpdir_path, const fs::path& subsession_path, int uid, int gid) const override; void AddSubsessionCleanupFailure (const fs::path& tmpdir_path, const fs::path& subsession_path) const override; }; diff --git a/src/service/src/fs_helpers.cpp b/src/service/src/fs_helpers.cpp index 1c8503d..2d10c25 100644 --- a/src/service/src/fs_helpers.cpp +++ b/src/service/src/fs_helpers.cpp @@ -145,20 +145,18 @@ void add_user_subsession(const int session_uid, const std::string_view subsessio "Subsession directory already exists"); const int system_share_gid = OS::get_gid_from_name(system_share_group); - - // Work off a temporary dir and then switch it at once so that it appears atomically const auto tmp_subsession_path = backend.AddSubsessionPrepareFromTemplate - ( subsession_path, main_path, - , session_uid, system_share_gid - ); + ( subsession_path, main_path ); + backend.AddSubsessionFinalize(tmp_subsession_path, subsession_path, session_uid, system_share_gid); + } - catch (std::exception const &ex) { - LOGE("Exception while creating user subsession data [session_uid=%d subsession_id=%s]: %s", session_uid, subsession_id.data(), ex.what()); - throw std::runtime_error("Couldn't add user subsession data"); + catch (const std::exception &ex) { + LOGE("Logic exception while copying skel from template [session_uid=%d subsession_id=%s]: %s", session_uid, subsession_id.data(), ex.what()); + return add_user_subsession_inner(session_uid, subsession_id, backend); } } -void add_user_subsession_internal(const int session_uid, const std::string_view subsession_id, const DirBackendAdd &backend) +void add_user_subsession_inner(const int session_uid, const std::string_view subsession_id, const DirBackendAdd &backend) { try { fs::path main_path = get_main_dir_by_user_id(session_uid); @@ -371,7 +369,7 @@ std::vector get_user_list(const int session_uid) try throw std::runtime_error("Couldn't enumerate user subsessions"); } -void do_resizefs(const fs::path& image_path, uint64_t size_kB) +void do_resize2fs(const fs::path& image_path, uint64_t size_kB) { const auto child_pid = OS::throwing_fork(); if (child_pid == 0) { diff --git a/src/service/src/fs_helpers.hpp b/src/service/src/fs_helpers.hpp index 4a50dee..c4ace40 100644 --- a/src/service/src/fs_helpers.hpp +++ b/src/service/src/fs_helpers.hpp @@ -12,6 +12,7 @@ std::filesystem::path get_main_dir_by_user_id(const int uid); std::filesystem::path get_last_subsession_path_by_user_id(const int uid); bool subsession_exists(const int session_uid, const std::string_view subsession_id); void add_user_subsession(const int session_uid, const std::string_view subsession_id, const DirBackendAdd& backend); +void add_user_subsession_inner(const int session_uid, const std::string_view subsession_id, const DirBackendAdd& backend); void remove_user_subsession(const int session_uid, const std::string_view subsession_id); bool switch_user_subsession(const int session_uid, const std::string_view prev_subsession, const std::string_view next_subsession); std::vector get_user_list(const int session_uid);