Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bbe7bae authored by Yumi Yukimura's avatar Yumi Yukimura Committed by Jan Altensen
Browse files

updater: Support loading dynamic partition metadata from OTA

* Provides an alternative option when dynamic partition metadata
  could not be loaded from the device (like when migrating from
  standard partitions to dynamic partitions)

Change-Id: I73381abd5b0cc1af37172a784735e25aae9c5958
parent e386de48
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -72,7 +72,8 @@ class UpdaterRuntimeInterface {
  // Dynamic partition related functions.
  virtual bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) = 0;
  virtual bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) = 0;
  virtual bool UpdateDynamicPartitions(const std::string_view op_list_value) = 0;
  virtual bool UpdateDynamicPartitions(const std::string_view op_list_value,
                                       const std::string_view super_empty_value) = 0;

  // On devices supports A/B, add current slot suffix to arg. Otherwise, return |arg| as is.
  virtual std::string AddSlotSuffix(const std::string_view arg) const = 0;
+14 −3
Original line number Diff line number Diff line
@@ -88,8 +88,10 @@ static constexpr char kMetadataUpdatedMarker[] = "/dynamic_partition_metadata.UP

Value* UpdateDynamicPartitionsFn(const char* name, State* state,
                                 const std::vector<std::unique_ptr<Expr>>& argv) {
  if (argv.size() != 1) {
    ErrorAbort(state, kArgsParsingFailure, "%s expects 1 arguments, got %zu", name, argv.size());
  const std::string_view empty_string_view{};
  if (argv.size() != 1 && argv.size() != 2) {
    ErrorAbort(state, kArgsParsingFailure, "%s expects 1 or 2 arguments, got %zu", name,
               argv.size());
    return StringValue("");
  }
  std::vector<std::unique_ptr<Value>> args;
@@ -102,6 +104,14 @@ Value* UpdateDynamicPartitionsFn(const char* name, State* state,
    return StringValue("");
  }

  const std::unique_ptr<Value>& super_empty_value = args[1];
  if (argv.size() > 1) {
    if (super_empty_value->type != Value::Type::BLOB) {
      ErrorAbort(state, kArgsParsingFailure, "super_empty argument to %s must be blob", name);
      return StringValue("");
    }
  }

  std::string updated_marker = Paths::Get().stash_directory_base() + kMetadataUpdatedMarker;
  if (state->is_retry) {
    struct stat sb;
@@ -121,7 +131,8 @@ Value* UpdateDynamicPartitionsFn(const char* name, State* state,
  }

  auto updater_runtime = state->updater->GetRuntime();
  if (!updater_runtime->UpdateDynamicPartitions(op_list_value->data)) {
  if (!updater_runtime->UpdateDynamicPartitions(
          op_list_value->data, argv.size() > 1 ? super_empty_value->data : empty_string_view)) {
    return StringValue("");
  }

+2 −1
Original line number Diff line number Diff line
@@ -52,7 +52,8 @@ class SimulatorRuntime : public UpdaterRuntimeInterface {

  bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) override;
  bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value,
                               const std::string_view super_empty_value) override;
  std::string AddSlotSuffix(const std::string_view arg) const override;

 private:
+3 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <utility>
#include <vector>

#include "edify/expr.h"
#include "edify/updater_runtime_interface.h"

class UpdaterRuntime : public UpdaterRuntimeInterface {
@@ -53,7 +54,8 @@ class UpdaterRuntime : public UpdaterRuntimeInterface {

  bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) override;
  bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value,
                               const std::string_view super_empty_value) override;
  std::string AddSlotSuffix(const std::string_view arg) const override;

  struct selabel_handle* sehandle() const override {
+2 −1
Original line number Diff line number Diff line
@@ -113,7 +113,8 @@ bool SimulatorRuntime::UnmapPartitionOnDeviceMapper(const std::string& partition
  return true;
}

bool SimulatorRuntime::UpdateDynamicPartitions(const std::string_view op_list_value) {
bool SimulatorRuntime::UpdateDynamicPartitions(const std::string_view op_list_value,
                                               const std::string_view /* super_empty_value */) {
  const std::unordered_set<std::string> commands{
    "resize",    "remove",       "add",          "move",
    "add_group", "resize_group", "remove_group", "remove_all_groups",
Loading