Merge "fastboot: Add a command to get current kernel logs."
diff --git a/fastboot/constants.h b/fastboot/constants.h
index 4ea68da..b732c76 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 0f3a208..524196c 100644
--- a/fastboot/device/commands.cpp
+++ b/fastboot/device/commands.cpp
@@ -112,52 +112,65 @@
}
}
-bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args) {
- const std::unordered_map<std::string, VariableHandlers> 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<std::string, VariableHandlers> 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<std::string, std::function<bool(FastbootDevice*)>> kSpecialVars = {
+ {"all", GetVarAll},
+ {"dmesg", GetDmesg},
+};
+
+bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& 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 0cf4699..0de00b1 100644
--- a/fastboot/device/variables.cpp
+++ b/fastboot/device/variables.cpp
@@ -17,6 +17,7 @@
#include "variables.h"
#include <inttypes.h>
+#include <stdio.h>
#include <android-base/file.h>
#include <android-base/logging.h>
@@ -28,6 +29,7 @@
#include <fs_mgr.h>
#include <liblp/liblp.h>
+#include "constants.h"
#include "fastboot_device.h"
#include "flashing.h"
#include "utility.h"
@@ -46,6 +48,7 @@
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 @@
*message = android::base::StringPrintf("0x%X", kMaxFetchSizeDefault);
return true;
}
+
+bool GetDmesg(FastbootDevice* device) {
+ if (GetDeviceLockStatus()) {
+ return device->WriteFail("Cannot use when device flashing is locked");
+ }
+
+ std::unique_ptr<FILE, decltype(&::fclose)> 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 f40a025..aa4d9fc 100644
--- a/fastboot/device/variables.h
+++ b/fastboot/device/variables.h
@@ -83,6 +83,9 @@
bool GetMaxFetchSize(FastbootDevice* /* device */, const std::vector<std::string>& /* args */,
std::string* message);
+// Complex cases.
+bool GetDmesg(FastbootDevice* device);
+
// Helpers for getvar all.
std::vector<std::vector<std::string>> GetAllPartitionArgsWithSlot(FastbootDevice* device);
std::vector<std::vector<std::string>> GetAllPartitionArgsNoSlot(FastbootDevice* device);