wip
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 24 Apr 2025 11:08:01 +0000 (13:08 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 24 Apr 2025 11:08:01 +0000 (13:08 +0200)
Change-Id: Ia335fabd1fcb3edec280ddaf7e2915ac836f9132

src/service/src/dir_backend.hpp
src/service/src/dir_backend_fixed_size.cpp
src/service/src/dir_backend_fixed_size.hpp
src/service/src/dir_backend_regular_dir.cpp
src/service/src/dir_backend_regular_dir.hpp
src/service/src/fs_helpers.cpp
src/service/src/fs_helpers.hpp

index d1c66c5cc41935fe4f1842639fda842a14e188a2..1fa75ea51a3e268d2c7a180d2b5f76f4127f3735 100644 (file)
@@ -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;
 };
index 81674705ac2aaa00da6dbd617fb9f795ae25e517..fab8cde7c65e7279111fc9f89cd7a647988bc1c2 100644 (file)
@@ -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
index cd752921d35bd17d9583a1d6e082bab01be7b9df..149a2327cc38cb0a665243c79beaccbadf48986d 100644 (file)
@@ -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;
 };
index 5f46a7f946fff456721f845f340ab77e014a2edc..4eaaec04e9be65cf6143ce741f51b17aa95559ad 100644 (file)
 
 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;
index ed4a9f612077af4db094b6254a8ac5e0da5fb63d..a5b7888e10a49e9f51269b0e08a6e9d0f9663053 100644 (file)
@@ -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;
 };
index 1c8503d6f5041363afbd76b2022f0e807db9c2cf..2d10c25bb2263ea5e8ef9a64682dde63804b66c7 100644 (file)
@@ -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<std::string> 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) {
index 4a50dee8405717109dbbd31cb52cf8d226cc389b..c4ace408da20d74aca60d22a641436bd8394408f 100644 (file)
@@ -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<std::string> get_user_list(const int session_uid);