diff --git a/libstratosphere/include/stratosphere/erpt/srv/erpt_srv_api.hpp b/libstratosphere/include/stratosphere/erpt/srv/erpt_srv_api.hpp index 9b9e833d..1feb10ee 100644 --- a/libstratosphere/include/stratosphere/erpt/srv/erpt_srv_api.hpp +++ b/libstratosphere/include/stratosphere/erpt/srv/erpt_srv_api.hpp @@ -27,6 +27,7 @@ namespace ams::erpt::srv { /* Atmosphere extension. */ Result SetRedirectNewReportsToSdCard(bool redirect); + Result SetEnabledAutomaticReportCleanup(bool redirect); void Wait(); diff --git a/libstratosphere/source/erpt/srv/erpt_srv_main.cpp b/libstratosphere/source/erpt/srv/erpt_srv_main.cpp index 3413afb5..abb90d89 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_main.cpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_main.cpp @@ -34,6 +34,8 @@ namespace ams::erpt::srv { constexpr s64 SystemSaveDataSize = 11_MB; constexpr s64 SystemSaveDataJournalSize = 2720_KB; + constinit bool g_automatic_report_cleanup_enabled = true; + Result ExtendSystemSaveData() { s64 cur_journal_size; s64 cur_savedata_size; @@ -81,6 +83,24 @@ namespace ams::erpt::srv { R_ABORT_UNLESS(fs::MountSdCardErrorReportDirectoryForAtmosphere(ReportOnSdStoragePath)); + if (g_automatic_report_cleanup_enabled) { + constexpr s64 MinimumReportCountForCleanup = 1000; + s64 report_count = MinimumReportCountForCleanup; + + fs::DirectoryHandle dir; + if (R_SUCCEEDED(fs::OpenDirectory(std::addressof(dir), ReportOnSdStoragePath, fs::OpenDirectoryMode_All))) { + ON_SCOPE_EXIT { fs::CloseDirectory(dir); }; + + if (R_FAILED(fs::GetDirectoryEntryCount(std::addressof(report_count), dir))) { + report_count = MinimumReportCountForCleanup; + } + } + + if (report_count >= MinimumReportCountForCleanup) { + fs::CleanDirectoryRecursively(ReportOnSdStoragePath); + } + } + R_ABORT_UNLESS(MountSystemSaveData()); g_sf_allocator.Attach(g_heap_handle); @@ -137,6 +157,11 @@ namespace ams::erpt::srv { return ResultSuccess(); } + Result SetEnabledAutomaticReportCleanup(bool en) { + g_automatic_report_cleanup_enabled = en; + return ResultSuccess(); + } + void Wait() { /* Get the update event. */ os::Event *event = GetForcedShutdownUpdateEvent();