diff --git a/fastboot/constants.h b/fastboot/constants.h index 4ea68daff..b732c7601 100644 --- a/fastboot/constants.h +++ b/fastboot/constants.h @@ -79,3 +79,4 @@ #define FB_VAR_SECURITY_PATCH_LEVEL "security-patch-level" #define FB_VAR_TREBLE_ENABLED "treble-enabled" #define FB_VAR_MAX_FETCH_SIZE "max-fetch-size" +#define FB_VAR_DMESG "dmesg" diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index 0f3a208f7..524196c80 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -112,52 +112,65 @@ static void GetAllVars(FastbootDevice* device, const std::string& name, } } -bool GetVarHandler(FastbootDevice* device, const std::vector& args) { - const std::unordered_map kVariableMap = { - {FB_VAR_VERSION, {GetVersion, nullptr}}, - {FB_VAR_VERSION_BOOTLOADER, {GetBootloaderVersion, nullptr}}, - {FB_VAR_VERSION_BASEBAND, {GetBasebandVersion, nullptr}}, - {FB_VAR_VERSION_OS, {GetOsVersion, nullptr}}, - {FB_VAR_VERSION_VNDK, {GetVndkVersion, nullptr}}, - {FB_VAR_PRODUCT, {GetProduct, nullptr}}, - {FB_VAR_SERIALNO, {GetSerial, nullptr}}, - {FB_VAR_VARIANT, {GetVariant, nullptr}}, - {FB_VAR_SECURE, {GetSecure, nullptr}}, - {FB_VAR_UNLOCKED, {GetUnlocked, nullptr}}, - {FB_VAR_MAX_DOWNLOAD_SIZE, {GetMaxDownloadSize, nullptr}}, - {FB_VAR_CURRENT_SLOT, {::GetCurrentSlot, nullptr}}, - {FB_VAR_SLOT_COUNT, {GetSlotCount, nullptr}}, - {FB_VAR_HAS_SLOT, {GetHasSlot, GetAllPartitionArgsNoSlot}}, - {FB_VAR_SLOT_SUCCESSFUL, {GetSlotSuccessful, nullptr}}, - {FB_VAR_SLOT_UNBOOTABLE, {GetSlotUnbootable, nullptr}}, - {FB_VAR_PARTITION_SIZE, {GetPartitionSize, GetAllPartitionArgsWithSlot}}, - {FB_VAR_PARTITION_TYPE, {GetPartitionType, GetAllPartitionArgsWithSlot}}, - {FB_VAR_IS_LOGICAL, {GetPartitionIsLogical, GetAllPartitionArgsWithSlot}}, - {FB_VAR_IS_USERSPACE, {GetIsUserspace, nullptr}}, - {FB_VAR_OFF_MODE_CHARGE_STATE, {GetOffModeChargeState, nullptr}}, - {FB_VAR_BATTERY_VOLTAGE, {GetBatteryVoltage, nullptr}}, - {FB_VAR_BATTERY_SOC_OK, {GetBatterySoCOk, nullptr}}, - {FB_VAR_HW_REVISION, {GetHardwareRevision, nullptr}}, - {FB_VAR_SUPER_PARTITION_NAME, {GetSuperPartitionName, nullptr}}, - {FB_VAR_SNAPSHOT_UPDATE_STATUS, {GetSnapshotUpdateStatus, nullptr}}, - {FB_VAR_CPU_ABI, {GetCpuAbi, nullptr}}, - {FB_VAR_SYSTEM_FINGERPRINT, {GetSystemFingerprint, nullptr}}, - {FB_VAR_VENDOR_FINGERPRINT, {GetVendorFingerprint, nullptr}}, - {FB_VAR_DYNAMIC_PARTITION, {GetDynamicPartition, nullptr}}, - {FB_VAR_FIRST_API_LEVEL, {GetFirstApiLevel, nullptr}}, - {FB_VAR_SECURITY_PATCH_LEVEL, {GetSecurityPatchLevel, nullptr}}, - {FB_VAR_TREBLE_ENABLED, {GetTrebleEnabled, nullptr}}, - {FB_VAR_MAX_FETCH_SIZE, {GetMaxFetchSize, nullptr}}, - }; +const std::unordered_map kVariableMap = { + {FB_VAR_VERSION, {GetVersion, nullptr}}, + {FB_VAR_VERSION_BOOTLOADER, {GetBootloaderVersion, nullptr}}, + {FB_VAR_VERSION_BASEBAND, {GetBasebandVersion, nullptr}}, + {FB_VAR_VERSION_OS, {GetOsVersion, nullptr}}, + {FB_VAR_VERSION_VNDK, {GetVndkVersion, nullptr}}, + {FB_VAR_PRODUCT, {GetProduct, nullptr}}, + {FB_VAR_SERIALNO, {GetSerial, nullptr}}, + {FB_VAR_VARIANT, {GetVariant, nullptr}}, + {FB_VAR_SECURE, {GetSecure, nullptr}}, + {FB_VAR_UNLOCKED, {GetUnlocked, nullptr}}, + {FB_VAR_MAX_DOWNLOAD_SIZE, {GetMaxDownloadSize, nullptr}}, + {FB_VAR_CURRENT_SLOT, {::GetCurrentSlot, nullptr}}, + {FB_VAR_SLOT_COUNT, {GetSlotCount, nullptr}}, + {FB_VAR_HAS_SLOT, {GetHasSlot, GetAllPartitionArgsNoSlot}}, + {FB_VAR_SLOT_SUCCESSFUL, {GetSlotSuccessful, nullptr}}, + {FB_VAR_SLOT_UNBOOTABLE, {GetSlotUnbootable, nullptr}}, + {FB_VAR_PARTITION_SIZE, {GetPartitionSize, GetAllPartitionArgsWithSlot}}, + {FB_VAR_PARTITION_TYPE, {GetPartitionType, GetAllPartitionArgsWithSlot}}, + {FB_VAR_IS_LOGICAL, {GetPartitionIsLogical, GetAllPartitionArgsWithSlot}}, + {FB_VAR_IS_USERSPACE, {GetIsUserspace, nullptr}}, + {FB_VAR_OFF_MODE_CHARGE_STATE, {GetOffModeChargeState, nullptr}}, + {FB_VAR_BATTERY_VOLTAGE, {GetBatteryVoltage, nullptr}}, + {FB_VAR_BATTERY_SOC_OK, {GetBatterySoCOk, nullptr}}, + {FB_VAR_HW_REVISION, {GetHardwareRevision, nullptr}}, + {FB_VAR_SUPER_PARTITION_NAME, {GetSuperPartitionName, nullptr}}, + {FB_VAR_SNAPSHOT_UPDATE_STATUS, {GetSnapshotUpdateStatus, nullptr}}, + {FB_VAR_CPU_ABI, {GetCpuAbi, nullptr}}, + {FB_VAR_SYSTEM_FINGERPRINT, {GetSystemFingerprint, nullptr}}, + {FB_VAR_VENDOR_FINGERPRINT, {GetVendorFingerprint, nullptr}}, + {FB_VAR_DYNAMIC_PARTITION, {GetDynamicPartition, nullptr}}, + {FB_VAR_FIRST_API_LEVEL, {GetFirstApiLevel, nullptr}}, + {FB_VAR_SECURITY_PATCH_LEVEL, {GetSecurityPatchLevel, nullptr}}, + {FB_VAR_TREBLE_ENABLED, {GetTrebleEnabled, nullptr}}, + {FB_VAR_MAX_FETCH_SIZE, {GetMaxFetchSize, nullptr}}, +}; +static bool GetVarAll(FastbootDevice* device) { + for (const auto& [name, handlers] : kVariableMap) { + GetAllVars(device, name, handlers); + } + return true; +} + +const std::unordered_map> kSpecialVars = { + {"all", GetVarAll}, + {"dmesg", GetDmesg}, +}; + +bool GetVarHandler(FastbootDevice* device, const std::vector& args) { if (args.size() < 2) { return device->WriteFail("Missing argument"); } - // Special case: return all variables that we can. - if (args[1] == "all") { - for (const auto& [name, handlers] : kVariableMap) { - GetAllVars(device, name, handlers); + // "all" and "dmesg" are multiline and handled specially. + auto found_special = kSpecialVars.find(args[1]); + if (found_special != kSpecialVars.end()) { + if (!found_special->second(device)) { + return false; } return device->WriteOkay(""); } diff --git a/fastboot/device/variables.cpp b/fastboot/device/variables.cpp index 0cf4699aa..0de00b1f6 100644 --- a/fastboot/device/variables.cpp +++ b/fastboot/device/variables.cpp @@ -17,6 +17,7 @@ #include "variables.h" #include +#include #include #include @@ -28,6 +29,7 @@ #include #include +#include "constants.h" #include "fastboot_device.h" #include "flashing.h" #include "utility.h" @@ -46,6 +48,7 @@ using ::android::hardware::fastboot::V1_0::Result; using ::android::hardware::fastboot::V1_0::Status; using IBootControl1_1 = ::android::hardware::boot::V1_1::IBootControl; using namespace android::fs_mgr; +using namespace std::string_literals; constexpr char kFastbootProtocolVersion[] = "0.4"; @@ -518,3 +521,36 @@ bool GetMaxFetchSize(FastbootDevice* /* device */, const std::vectorWriteFail("Cannot use when device flashing is locked"); + } + + std::unique_ptr fp(popen("/system/bin/dmesg", "re"), ::fclose); + if (!fp) { + PLOG(ERROR) << "popen /system/bin/dmesg"; + return device->WriteFail("Unable to run dmesg: "s + strerror(errno)); + } + + ssize_t rv; + size_t n = 0; + char* str = nullptr; + while ((rv = ::getline(&str, &n, fp.get())) > 0) { + if (str[rv - 1] == '\n') { + rv--; + } + device->WriteInfo(std::string(str, rv)); + } + + int saved_errno = errno; + ::free(str); + + if (rv < 0 && saved_errno) { + LOG(ERROR) << "dmesg getline: " << strerror(saved_errno); + device->WriteFail("Unable to read dmesg: "s + strerror(saved_errno)); + return false; + } + + return true; +} diff --git a/fastboot/device/variables.h b/fastboot/device/variables.h index f40a0257e..aa4d9fc40 100644 --- a/fastboot/device/variables.h +++ b/fastboot/device/variables.h @@ -83,6 +83,9 @@ bool GetTrebleEnabled(FastbootDevice* device, const std::vector& ar bool GetMaxFetchSize(FastbootDevice* /* device */, const std::vector& /* args */, std::string* message); +// Complex cases. +bool GetDmesg(FastbootDevice* device); + // Helpers for getvar all. std::vector> GetAllPartitionArgsWithSlot(FastbootDevice* device); std::vector> GetAllPartitionArgsNoSlot(FastbootDevice* device);