summaryrefslogtreecommitdiff
path: root/cmds
diff options
context:
space:
mode:
Diffstat (limited to 'cmds')
-rw-r--r--cmds/idmap2/idmap2/CommandUtils.cpp3
-rw-r--r--cmds/idmap2/idmap2d/Idmap2Service.cpp35
-rw-r--r--cmds/idmap2/idmap2d/Idmap2Service.h9
-rw-r--r--cmds/idmap2/idmap2d/aidl/services/android/os/IIdmap2.aidl7
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);
}