diff options
author | Mark Salyzyn <salyzyn@google.com> | 2016-03-31 23:00:59 +0200 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-03-31 23:00:59 +0200 |
commit | 9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96 (patch) | |
tree | 27e2deeaa1395cd2e6e8263ceb0567f7cdbe6c76 /recovery.cpp | |
parent | Import translations. DO NOT MERGE (diff) | |
parent | Merge "recovery: use __android_log_pmsg_file_write for log files" (diff) | |
download | android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.tar android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.tar.gz android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.tar.bz2 android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.tar.lz android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.tar.xz android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.tar.zst android_bootable_recovery-9b9e5843d296c4bb0d2cdca5eb18a2d2277dff96.zip |
Diffstat (limited to 'recovery.cpp')
-rw-r--r-- | recovery.cpp | 109 |
1 files changed, 97 insertions, 12 deletions
diff --git a/recovery.cpp b/recovery.cpp index 2d768ceb4..aee455a91 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -35,11 +35,14 @@ #include <chrono> #include <adb.h> +#include <android/log.h> /* Android Log Priority Tags */ #include <android-base/file.h> #include <android-base/parseint.h> #include <android-base/stringprintf.h> #include <cutils/android_reboot.h> #include <cutils/properties.h> +#include <log/logger.h> /* Android Log packet format */ +#include <private/android_logger.h> /* private pmsg functions */ #include <healthd/BatteryMonitor.h> @@ -377,6 +380,18 @@ static void save_kernel_log(const char* destination) { android::base::WriteStringToFile(buffer, destination); } +// write content to the current pmsg session. +static ssize_t __pmsg_write(const char *filename, const char *buf, size_t len) { + return __android_log_pmsg_file_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO, + filename, buf, len); +} + +static void copy_log_file_to_pmsg(const char* source, const char* destination) { + std::string content; + android::base::ReadFileToString(source, &content); + __pmsg_write(destination, content.c_str(), content.length()); +} + // How much of the temp log we have copied to the copy in cache. static long tmplog_offset = 0; @@ -436,11 +451,6 @@ static void rotate_logs(int max) { } static void copy_logs() { - // We can do nothing for now if there's no /cache partition. - if (!has_cache) { - return; - } - // We only rotate and record the log of the current session if there are // actual attempts to modify the flash, such as wipes, installs from BCB // or menu selections. This is to avoid unnecessary rotation (and @@ -449,6 +459,15 @@ static void copy_logs() { return; } + // Always write to pmsg, this allows the OTA logs to be caught in logcat -L + copy_log_file_to_pmsg(TEMPORARY_LOG_FILE, LAST_LOG_FILE); + copy_log_file_to_pmsg(TEMPORARY_INSTALL_FILE, LAST_INSTALL_FILE); + + // We can do nothing for now if there's no /cache partition. + if (!has_cache) { + return; + } + rotate_logs(KEEP_LOG_COUNT); // Copy logs to cache so the system can find out what happened. @@ -473,13 +492,17 @@ finish_recovery() { // Save the locale to cache, so if recovery is next started up // without a --locale argument (eg, directly from the bootloader) // it will use the last-known locale. - if (locale != NULL && has_cache) { - LOGI("Saving locale \"%s\"\n", locale); - FILE* fp = fopen_path(LOCALE_FILE, "w"); - fwrite(locale, 1, strlen(locale), fp); - fflush(fp); - fsync(fileno(fp)); - check_and_fclose(fp, LOCALE_FILE); + if (locale != NULL) { + size_t len = strlen(locale); + __pmsg_write(LOCALE_FILE, locale, len); + if (has_cache) { + LOGI("Saving locale \"%s\"\n", locale); + FILE* fp = fopen_path(LOCALE_FILE, "w"); + fwrite(locale, 1, len, fp); + fflush(fp); + fsync(fileno(fp)); + check_and_fclose(fp, LOCALE_FILE); + } } copy_logs(); @@ -1172,7 +1195,69 @@ static void set_retry_bootloader_message(int retry_count, int argc, char** argv) set_bootloader_message(&boot); } +static ssize_t logbasename( + log_id_t /* logId */, + char /* prio */, + const char *filename, + const char * /* buf */, size_t len, + void *arg) { + if (strstr(LAST_KMSG_FILE, filename) || + strstr(LAST_LOG_FILE, filename)) { + bool *doRotate = reinterpret_cast<bool *>(arg); + *doRotate = true; + } + return len; +} + +static ssize_t logrotate( + log_id_t logId, + char prio, + const char *filename, + const char *buf, size_t len, + void *arg) { + bool *doRotate = reinterpret_cast<bool *>(arg); + if (!*doRotate) { + return __android_log_pmsg_file_write(logId, prio, filename, buf, len); + } + + std::string name(filename); + size_t dot = name.find_last_of("."); + std::string sub = name.substr(0, dot); + + if (!strstr(LAST_KMSG_FILE, sub.c_str()) && + !strstr(LAST_LOG_FILE, sub.c_str())) { + return __android_log_pmsg_file_write(logId, prio, filename, buf, len); + } + + // filename rotation + if (dot == std::string::npos) { + name += ".1"; + } else { + std::string number = name.substr(dot + 1); + if (!isdigit(number.data()[0])) { + name += ".1"; + } else { + unsigned long long i = std::stoull(number); + name = sub + "." + std::to_string(i + 1); + } + } + + return __android_log_pmsg_file_write(logId, prio, name.c_str(), buf, len); +} + int main(int argc, char **argv) { + // Take last pmsg contents and rewrite it to the current pmsg session. + static const char filter[] = "recovery/"; + // Do we need to rotate? + bool doRotate = false; + __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, filter, + logbasename, &doRotate); + // Take action to refresh pmsg contents + __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, filter, + logrotate, &doRotate); + // If this binary is started with the single argument "--adbd", // instead of being the normal recovery binary, it turns into kind // of a stripped-down version of adbd that only supports the |