diff --git a/fastboot/constants.h b/fastboot/constants.h index 57e25fc59..2a68a2b03 100644 --- a/fastboot/constants.h +++ b/fastboot/constants.h @@ -32,6 +32,7 @@ #define FB_CMD_DELETE_PARTITION "delete-logical-partition" #define FB_CMD_RESIZE_PARTITION "resize-logical-partition" #define FB_CMD_UPDATE_SUPER "update-super" +#define FB_CMD_OEM "oem" #define RESPONSE_OKAY "OKAY" #define RESPONSE_FAIL "FAIL" diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index 0ec09945b..48c935a73 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -40,6 +40,9 @@ 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; +using ::android::hardware::fastboot::V1_0::Result; +using ::android::hardware::fastboot::V1_0::Status; + using namespace android::fs_mgr; struct VariableHandlers { @@ -133,6 +136,24 @@ bool EraseHandler(FastbootDevice* device, const std::vector& args) return device->WriteStatus(FastbootResult::FAIL, "Erasing failed"); } +bool OemCmdHandler(FastbootDevice* device, const std::vector& args) { + auto fastboot_hal = device->fastboot_hal(); + if (!fastboot_hal) { + return device->WriteStatus(FastbootResult::FAIL, "Unable to open fastboot HAL"); + } + + Result ret; + auto ret_val = fastboot_hal->doOemCommand(args[0], [&](Result result) { ret = result; }); + if (!ret_val.isOk()) { + return device->WriteStatus(FastbootResult::FAIL, "Unable to do OEM command"); + } + if (ret.status != Status::SUCCESS) { + return device->WriteStatus(FastbootResult::FAIL, ret.message); + } + + return device->WriteStatus(FastbootResult::OKAY, ret.message); +} + bool DownloadHandler(FastbootDevice* device, const std::vector& args) { if (args.size() < 2) { return device->WriteStatus(FastbootResult::FAIL, "size argument unspecified"); diff --git a/fastboot/device/commands.h b/fastboot/device/commands.h index 4778d2350..9df43a90c 100644 --- a/fastboot/device/commands.h +++ b/fastboot/device/commands.h @@ -45,3 +45,4 @@ bool CreatePartitionHandler(FastbootDevice* device, const std::vector& args); bool ResizePartitionHandler(FastbootDevice* device, const std::vector& args); bool UpdateSuperHandler(FastbootDevice* device, const std::vector& args); +bool OemCmdHandler(FastbootDevice* device, const std::vector& args); diff --git a/fastboot/device/fastboot_device.cpp b/fastboot/device/fastboot_device.cpp index ae2e7a607..6862741b6 100644 --- a/fastboot/device/fastboot_device.cpp +++ b/fastboot/device/fastboot_device.cpp @@ -48,6 +48,7 @@ FastbootDevice::FastbootDevice() {FB_CMD_DELETE_PARTITION, DeletePartitionHandler}, {FB_CMD_RESIZE_PARTITION, ResizePartitionHandler}, {FB_CMD_UPDATE_SUPER, UpdateSuperHandler}, + {FB_CMD_OEM, OemCmdHandler}, }), transport_(std::make_unique()), boot_control_hal_(IBootControl::getService()), @@ -120,10 +121,20 @@ void FastbootDevice::ExecuteCommands() { command[bytes_read] = '\0'; LOG(INFO) << "Fastboot command: " << command; - auto args = android::base::Split(command, ":"); - auto found_command = kCommandMap.find(args[0]); + + std::vector args; + std::string cmd_name; + if (android::base::StartsWith(command, "oem ")) { + args = {command}; + cmd_name = "oem"; + } else { + args = android::base::Split(command, ":"); + cmd_name = args[0]; + } + + auto found_command = kCommandMap.find(cmd_name); if (found_command == kCommandMap.end()) { - WriteStatus(FastbootResult::FAIL, "Unrecognized command"); + WriteStatus(FastbootResult::FAIL, "Unrecognized command " + args[0]); continue; } if (!found_command->second(this, args)) {