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

Commit 70306b92 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "fastbootd: Implement the getvar command."

parents ec004eb1 31d2c264
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -96,6 +96,8 @@ cc_binary {
        "device/fastboot_device.cpp",
        "device/main.cpp",
        "device/usb_client.cpp",
        "device/utility.cpp",
        "device/variables.cpp",
    ],

    shared_libs: [
@@ -103,6 +105,7 @@ cc_binary {
        "libext4_utils",
        "libsparse",
        "liblog",
        "android.hardware.boot@1.0",
        "libbootloader_message",
        "libhidltransport",
        "libhidlbase",
+2 −0
Original line number Diff line number Diff line
@@ -51,3 +51,5 @@
#define FB_VAR_HAS_SLOT "has-slot"
#define FB_VAR_SLOT_COUNT "slot-count"
#define FB_VAR_PARTITION_SIZE "partition-size"
#define FB_VAR_SLOT_SUCCESSFUL "slot-successful"
#define FB_VAR_SLOT_UNBOOTABLE "slot-unbootable"
+61 −2
Original line number Diff line number Diff line
@@ -27,7 +27,43 @@
#include <android-base/unique_fd.h>
#include <cutils/android_reboot.h>

#include "constants.h"
#include "fastboot_device.h"
#include "utility.h"

using ::android::hardware::hidl_string;
using ::android::hardware::boot::V1_0::BoolResult;
using ::android::hardware::boot::V1_0::CommandResult;
using ::android::hardware::boot::V1_0::Slot;

bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args) {
    using VariableHandler =
            std::function<std::string(FastbootDevice*, const std::vector<std::string>&)>;
    const std::unordered_map<std::string, VariableHandler> kVariableMap = {
            {FB_VAR_VERSION, GetVersion},
            {FB_VAR_VERSION_BOOTLOADER, GetBootloaderVersion},
            {FB_VAR_VERSION_BASEBAND, GetBasebandVersion},
            {FB_VAR_PRODUCT, GetProduct},
            {FB_VAR_SERIALNO, GetSerial},
            {FB_VAR_SECURE, GetSecure},
            {FB_VAR_UNLOCKED, GetUnlocked},
            {FB_VAR_MAX_DOWNLOAD_SIZE, GetMaxDownloadSize},
            {FB_VAR_CURRENT_SLOT, ::GetCurrentSlot},
            {FB_VAR_SLOT_COUNT, GetSlotCount},
            {FB_VAR_HAS_SLOT, GetHasSlot},
            {FB_VAR_SLOT_SUCCESSFUL, GetSlotSuccessful},
            {FB_VAR_SLOT_UNBOOTABLE, GetSlotUnbootable}};

    // args[0] is command name, args[1] is variable.
    auto found_variable = kVariableMap.find(args[1]);
    if (found_variable == kVariableMap.end()) {
        return device->WriteStatus(FastbootResult::FAIL, "Unknown variable");
    }

    std::vector<std::string> getvar_args(args.begin() + 2, args.end());
    auto result = found_variable->second(device, getvar_args);
    return device->WriteStatus(FastbootResult::OKAY, result);
}

bool DownloadHandler(FastbootDevice* device, const std::vector<std::string>& args) {
    if (args.size() < 2) {
@@ -51,8 +87,31 @@ bool DownloadHandler(FastbootDevice* device, const std::vector<std::string>& arg
    return device->WriteStatus(FastbootResult::FAIL, "Couldn't download data");
}

bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& /* args */) {
    return device->WriteStatus(FastbootResult::OKAY, "");
bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& args) {
    if (args.size() < 2) {
        return device->WriteStatus(FastbootResult::FAIL, "Missing slot argument");
    }

    // Slot suffix needs to be between 'a' and 'z'.
    Slot slot;
    if (!GetSlotNumber(args[1], &slot)) {
        return device->WriteStatus(FastbootResult::FAIL, "Bad slot suffix");
    }

    // Non-A/B devices will not have a boot control HAL.
    auto boot_control_hal = device->boot_control_hal();
    if (!boot_control_hal) {
        return device->WriteStatus(FastbootResult::FAIL,
                                   "Cannot set slot: boot control HAL absent");
    }
    if (slot >= boot_control_hal->getNumberSlots()) {
        return device->WriteStatus(FastbootResult::FAIL, "Slot out of range");
    }
    CommandResult ret;
    auto cb = [&ret](CommandResult result) { ret = result; };
    auto result = boot_control_hal->setActiveBootSlot(slot, cb);
    if (result.isOk() && ret.success) return device->WriteStatus(FastbootResult::OKAY, "");
    return device->WriteStatus(FastbootResult::FAIL, "Unable to set slot");
}

bool ShutDownHandler(FastbootDevice* device, const std::vector<std::string>& /* args */) {
+1 −0
Original line number Diff line number Diff line
@@ -38,3 +38,4 @@ bool RebootHandler(FastbootDevice* device, const std::vector<std::string>& args)
bool RebootBootloaderHandler(FastbootDevice* device, const std::vector<std::string>& args);
bool RebootFastbootHandler(FastbootDevice* device, const std::vector<std::string>& args);
bool RebootRecoveryHandler(FastbootDevice* device, const std::vector<std::string>& args);
bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args);
+21 −1
Original line number Diff line number Diff line
@@ -18,23 +18,31 @@

#include <android-base/logging.h>
#include <android-base/strings.h>
#include <android/hardware/boot/1.0/IBootControl.h>

#include <algorithm>

#include "constants.h"
#include "usb_client.h"

using ::android::hardware::hidl_string;
using ::android::hardware::boot::V1_0::IBootControl;
using ::android::hardware::boot::V1_0::Slot;
namespace sph = std::placeholders;

FastbootDevice::FastbootDevice()
    : kCommandMap({
              {FB_CMD_SET_ACTIVE, SetActiveHandler},
              {FB_CMD_DOWNLOAD, DownloadHandler},
              {FB_CMD_GETVAR, GetVarHandler},
              {FB_CMD_SHUTDOWN, ShutDownHandler},
              {FB_CMD_REBOOT, RebootHandler},
              {FB_CMD_REBOOT_BOOTLOADER, RebootBootloaderHandler},
              {FB_CMD_REBOOT_FASTBOOT, RebootFastbootHandler},
              {FB_CMD_REBOOT_RECOVERY, RebootRecoveryHandler},
      }),
      transport_(std::make_unique<ClientUsbTransport>()) {}
      transport_(std::make_unique<ClientUsbTransport>()),
      boot_control_hal_(IBootControl::getService()) {}

FastbootDevice::~FastbootDevice() {
    CloseDevice();
@@ -44,9 +52,21 @@ void FastbootDevice::CloseDevice() {
    transport_->Close();
}

std::string FastbootDevice::GetCurrentSlot() {
    // Non-A/B devices must not have boot control HALs.
    if (!boot_control_hal_) {
        return "";
    }
    std::string suffix;
    auto cb = [&suffix](hidl_string s) { suffix = s; };
    boot_control_hal_->getSuffix(boot_control_hal_->getCurrentSlot(), cb);
    return suffix;
}

bool FastbootDevice::WriteStatus(FastbootResult result, const std::string& message) {
    constexpr size_t kResponseReasonSize = 4;
    constexpr size_t kNumResponseTypes = 4;  // "FAIL", "OKAY", "INFO", "DATA"

    char buf[FB_RESPONSE_SZ];
    constexpr size_t kMaxMessageSize = sizeof(buf) - kResponseReasonSize;
    size_t msg_len = std::min(kMaxMessageSize, message.size());
Loading