diff options
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/idmap2/idmap2/CommandUtils.cpp | 3 | ||||
-rw-r--r-- | cmds/idmap2/idmap2d/Idmap2Service.cpp | 35 | ||||
-rw-r--r-- | cmds/idmap2/idmap2d/Idmap2Service.h | 9 | ||||
-rw-r--r-- | cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl | 7 |
4 files changed, 44 insertions, 10 deletions
diff --git a/cmds/idmap2/idmap2/CommandUtils.cpp b/cmds/idmap2/idmap2/CommandUtils.cpp index 63235ff7d199..d344d0f1c531 100644 --- a/cmds/idmap2/idmap2/CommandUtils.cpp +++ b/cmds/idmap2/idmap2/CommandUtils.cpp @@ -14,12 +14,13 @@ * limitations under the License. */ +#include "idmap2/CommandUtils.h" + #include <fstream> #include <memory> #include <string> #include <vector> -#include "idmap2/CommandUtils.h" #include "idmap2/Idmap.h" #include "idmap2/Result.h" #include "idmap2/SysTrace.h" diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp index 2cfbac3f2c26..a8d648917b08 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.cpp +++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp @@ -297,17 +297,40 @@ Status Idmap2Service::createFabricatedOverlay( return ok(); } -Status Idmap2Service::getFabricatedOverlayInfos( +Status Idmap2Service::acquireFabricatedOverlayIterator() { + if (frro_iter_.has_value()) { + LOG(WARNING) << "active ffro iterator was not previously released"; + } + frro_iter_ = std::filesystem::directory_iterator(kIdmapCacheDir); + return ok(); +} + +Status Idmap2Service::releaseFabricatedOverlayIterator() { + if (!frro_iter_.has_value()) { + LOG(WARNING) << "no active ffro iterator to release"; + } + return ok(); +} + +Status Idmap2Service::nextFabricatedOverlayInfos( std::vector<os::FabricatedOverlayInfo>* _aidl_return) { - for (const auto& entry : std::filesystem::directory_iterator(kIdmapCacheDir)) { - if (!android::IsFabricatedOverlay(entry.path())) { + constexpr size_t kMaxEntryCount = 100; + if (!frro_iter_.has_value()) { + return error("no active frro iterator"); + } + + size_t count = 0; + auto& entry_iter = *frro_iter_; + auto entry_iter_end = end(*frro_iter_); + for (; entry_iter != entry_iter_end && count < kMaxEntryCount; ++entry_iter) { + auto& entry = *entry_iter; + if (!entry.is_regular_file() || !android::IsFabricatedOverlay(entry.path())) { continue; } const auto overlay = FabricatedOverlayContainer::FromPath(entry.path()); if (!overlay) { - // This is a sign something went wrong. - LOG(ERROR) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage(); + LOG(WARNING) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage(); continue; } @@ -319,8 +342,8 @@ Status Idmap2Service::getFabricatedOverlayInfos( out_info.targetOverlayable = info.target_name; out_info.path = entry.path(); _aidl_return->emplace_back(std::move(out_info)); + count++; } - return ok(); } diff --git a/cmds/idmap2/idmap2d/Idmap2Service.h b/cmds/idmap2/idmap2d/Idmap2Service.h index c16c3c52155f..c61e4bc98a54 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.h +++ b/cmds/idmap2/idmap2d/Idmap2Service.h @@ -24,6 +24,7 @@ #include <idmap2/ResourceContainer.h> #include <idmap2/Result.h> +#include <filesystem> #include <memory> #include <string> #include <vector> @@ -59,7 +60,11 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 { binder::Status deleteFabricatedOverlay(const std::string& overlay_path, bool* _aidl_return) override; - binder::Status getFabricatedOverlayInfos( + binder::Status acquireFabricatedOverlayIterator() override; + + binder::Status releaseFabricatedOverlayIterator() override; + + binder::Status nextFabricatedOverlayInfos( std::vector<os::FabricatedOverlayInfo>* _aidl_return) override; binder::Status dumpIdmap(const std::string& overlay_path, std::string* _aidl_return) override; @@ -69,7 +74,7 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 { // be able to be recalculated if idmap2 dies and restarts. std::unique_ptr<idmap2::TargetResourceContainer> framework_apk_cache_; - std::vector<os::FabricatedOverlayInfo> fabricated_overlays_; + std::optional<std::filesystem::directory_iterator> frro_iter_; template <typename T> using MaybeUniquePtr = std::variant<std::unique_ptr<T>, T*>; diff --git a/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl b/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl index 48cee69ca779..0059cf293177 100644 --- a/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl +++ b/cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl @@ -37,8 +37,13 @@ interface IIdmap2 { int fulfilledPolicies, boolean enforceOverlayable, int userId); + @nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay); - List<FabricatedOverlayInfo> getFabricatedOverlayInfos(); boolean deleteFabricatedOverlay(@utf8InCpp String path); + + void acquireFabricatedOverlayIterator(); + void releaseFabricatedOverlayIterator(); + List<FabricatedOverlayInfo> nextFabricatedOverlayInfos(); + @utf8InCpp String dumpIdmap(@utf8InCpp String overlayApkPath); } |