From bed1b15096000e4eb4d48747b0bd3ca6d5ec5db2 Mon Sep 17 00:00:00 2001 From: David-cmrg <202826622+David-cmrg@users.noreply.github.com> Date: Mon, 12 Oct 2026 20:10:03 +0200 Subject: [PATCH] fix(libkernel): create /data at start-up --- .../prx/libkernel/AppMetadata/src/AppMetadata.cpp | 11 +++++++++++ core/libs/prx/libkernel/CMakeLists.txt | 6 ++++-- core/libs/tests/GuestDownloadDataMount.cpp | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp b/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp index 79df79827..8bf4cbc2d 100644 --- a/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp +++ b/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp @@ -54,6 +54,17 @@ const bool g_downloadDataMounted = [] { } }(); +const bool g_dataMounted = [] { + try { + const auto run = std::filesystem::current_path(); + if (!std::filesystem::exists(run / "app0" / "sce_sys" / "param.json")) return false; + std::filesystem::create_directories(run / "data"); + return true; + } catch (const std::exception&) { + return false; + } +}(); + void ensureIconLoaded() { if (g_iconAttempted) return; g_iconAttempted = true; diff --git a/core/libs/prx/libkernel/CMakeLists.txt b/core/libs/prx/libkernel/CMakeLists.txt index 62cc6ef66..8b7a5ba61 100644 --- a/core/libs/prx/libkernel/CMakeLists.txt +++ b/core/libs/prx/libkernel/CMakeLists.txt @@ -82,12 +82,14 @@ if(BUILD_TESTING) target_include_directories(download_data_mount_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(download_data_mount_tests PRIVATE libkernel libc) configure_windows_unwind(download_data_mount_tests) - foreach(downloadDataCase IN ITEMS declared:256 none:0 invalid:256) + foreach(downloadDataCase IN ITEMS declared:256 none:0 invalid:256 missing:0) string(REPLACE ":" ";" downloadDataCase ${downloadDataCase}) list(GET downloadDataCase 0 downloadDataName) list(GET downloadDataCase 1 downloadDataSize) set(downloadDataRun ${CMAKE_CURRENT_BINARY_DIR}/download_data_mount_${downloadDataName}) - if(downloadDataName STREQUAL "invalid") + if(downloadDataName STREQUAL "missing") + file(MAKE_DIRECTORY ${downloadDataRun}) + elseif(downloadDataName STREQUAL "invalid") file(WRITE ${downloadDataRun}/app0/sce_sys/param.json "{\"downloadDataSize\":${downloadDataSize}}") else() file(WRITE ${downloadDataRun}/app0/sce_sys/param.json diff --git a/core/libs/tests/GuestDownloadDataMount.cpp b/core/libs/tests/GuestDownloadDataMount.cpp index e588f786d..a3ebfccef 100644 --- a/core/libs/tests/GuestDownloadDataMount.cpp +++ b/core/libs/tests/GuestDownloadDataMount.cpp @@ -11,6 +11,10 @@ int main(int argc, char** argv) { Require(argc == 2); const std::string_view mode = argv[1]; Require(std::filesystem::is_directory("download0") == (mode == "declared")); + const bool data = std::filesystem::is_directory("data"); + std::filesystem::remove_all("data"); + Require(data == (mode != "missing")); + if (mode == "missing") return 0; if (mode == "invalid") { bool rejected = false; try {