From c627558a4839ba295fb21bfbf2b9c71a0babce22 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Tue, 22 Mar 2016 10:47:44 -0700 Subject: [PATCH] bootstat: Add a value option to allow recording an associated value for a boot event. This has been useful in debugging, but I could see it being used practically. Change-Id: Ied6e23d0f7a1bc39f606b2dba88fea92adc31bda --- bootstat/bootstat.cpp | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index 9214e6ddf..e0548447d 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -63,6 +63,21 @@ void LogBootEvents() { } } +// Records the named boot |event| to the record store. If |value| is non-empty +// and is a proper string representation of an integer value, the converted +// integer value is associated with the boot event. +void RecordBootEventFromCommandLine( + const std::string& event, const std::string& value_str) { + BootEventRecordStore boot_event_store; + if (!value_str.empty()) { + int32_t value = 0; + value = std::stoi(value_str); + boot_event_store.AddBootEventWithValue(event, value); + } else { + boot_event_store.AddBootEvent(event); + } +} + void PrintBootEvents() { printf("Boot events:\n"); printf("------------\n"); @@ -82,6 +97,7 @@ void ShowHelp(const char *cmd) { " -l, --log Log all metrics to logstorage\n" " -p, --print Dump the boot event records to the console\n" " -r, --record Record the timestamp of a named boot event\n" + " --value Optional value to associate with the boot event\n" " --record_boot_reason Record the reason why the device booted\n" " --record_time_since_factory_reset Record the time since the device was reset\n"); } @@ -261,6 +277,7 @@ int main(int argc, char **argv) { LOG(INFO) << "Service started: " << cmd_line; int option_index = 0; + static const char value_str[] = "value"; static const char boot_complete_str[] = "record_boot_complete"; static const char boot_reason_str[] = "record_boot_reason"; static const char factory_reset_str[] = "record_time_since_factory_reset"; @@ -269,19 +286,26 @@ int main(int argc, char **argv) { { "log", no_argument, NULL, 'l' }, { "print", no_argument, NULL, 'p' }, { "record", required_argument, NULL, 'r' }, + { value_str, required_argument, NULL, 0 }, { boot_complete_str, no_argument, NULL, 0 }, { boot_reason_str, no_argument, NULL, 0 }, { factory_reset_str, no_argument, NULL, 0 }, { NULL, 0, NULL, 0 } }; + std::string boot_event; + std::string value; int opt = 0; while ((opt = getopt_long(argc, argv, "hlpr:", long_options, &option_index)) != -1) { switch (opt) { // This case handles long options which have no single-character mapping. case 0: { const std::string option_name = long_options[option_index].name; - if (option_name == boot_complete_str) { + if (option_name == value_str) { + // |optarg| is an external variable set by getopt representing + // the option argument. + value = optarg; + } else if (option_name == boot_complete_str) { RecordBootComplete(); } else if (option_name == boot_reason_str) { RecordBootReason(); @@ -311,10 +335,7 @@ int main(int argc, char **argv) { case 'r': { // |optarg| is an external variable set by getopt representing // the option argument. - const char* event = optarg; - - BootEventRecordStore boot_event_store; - boot_event_store.AddBootEvent(event); + boot_event = optarg; break; } @@ -330,5 +351,9 @@ int main(int argc, char **argv) { } } + if (!boot_event.empty()) { + RecordBootEventFromCommandLine(boot_event, value); + } + return 0; }