aboutsummaryrefslogtreecommitdiffstats
path: root/recovery.cpp
diff options
context:
space:
mode:
authorDoug Zongker <dougz@android.com>2013-05-16 11:23:48 -0700
committerDoug Zongker <dougz@android.com>2013-05-21 11:19:15 -0700
commitda1ebaef0aa8e38db6edf8bfc3d96290461a424f (patch)
tree4a03ab1a17be62f76fd2e71719e747686f2c5b3d /recovery.cpp
parent7c3ae45ef9306d2ff4b491e0488c8849bf15ce90 (diff)
downloadbootable_recovery-da1ebaef0aa8e38db6edf8bfc3d96290461a424f.zip
bootable_recovery-da1ebaef0aa8e38db6edf8bfc3d96290461a424f.tar.gz
bootable_recovery-da1ebaef0aa8e38db6edf8bfc3d96290461a424f.tar.bz2
recovery: save logs from the last few invocations of recovery
Extends the last_log mechanism to save logs from the last six invocations of recovery, so that we're more likely to have useful logs even if the device has repeatedly booted into recovery. Change-Id: I08ae7a09553ada45f9e0733fe1e55e5a22efd9f9
Diffstat (limited to 'recovery.cpp')
-rw-r--r--recovery.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/recovery.cpp b/recovery.cpp
index a84d833..840e63c 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -59,10 +59,11 @@ static const struct option OPTIONS[] = {
{ NULL, 0, NULL, 0 },
};
+#define LAST_LOG_FILE "/cache/recovery/last_log"
+
static const char *COMMAND_FILE = "/cache/recovery/command";
static const char *INTENT_FILE = "/cache/recovery/intent";
static const char *LOG_FILE = "/cache/recovery/log";
-static const char *LAST_LOG_FILE = "/cache/recovery/last_log";
static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install";
static const char *LOCALE_FILE = "/cache/recovery/last_locale";
static const char *CACHE_ROOT = "/cache";
@@ -260,6 +261,21 @@ copy_log_file(const char* source, const char* destination, int append) {
}
}
+// Rename last_log -> last_log.1 -> last_log.2 -> ... -> last_log.$max
+// Overwrites any existing last_log.$max.
+static void
+rotate_last_logs(int max) {
+ char oldfn[256];
+ char newfn[256];
+
+ int i;
+ for (i = max-1; i >= 0; --i) {
+ snprintf(oldfn, sizeof(oldfn), (i==0) ? LAST_LOG_FILE : (LAST_LOG_FILE ".%d"), i);
+ snprintf(newfn, sizeof(newfn), LAST_LOG_FILE ".%d", i+1);
+ // ignore errors
+ rename(oldfn, newfn);
+ }
+}
// clear the recovery command and prepare to boot a (hopefully working) system,
// copy our log file to cache as well (for the system to read), and
@@ -843,6 +859,8 @@ main(int argc, char **argv) {
printf("Starting recovery on %s", ctime(&start));
load_volume_table();
+ ensure_path_mounted(LAST_LOG_FILE);
+ rotate_last_logs(5);
get_args(&argc, &argv);
int previous_runs = 0;