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
This commit is contained in:
Doug Zongker
2013-05-16 11:23:48 -07:00
parent 7c3ae45ef9
commit da1ebaef0a

View File

@@ -59,10 +59,11 @@ static const struct option OPTIONS[] = {
{ NULL, 0, NULL, 0 }, { NULL, 0, NULL, 0 },
}; };
#define LAST_LOG_FILE "/cache/recovery/last_log"
static const char *COMMAND_FILE = "/cache/recovery/command"; static const char *COMMAND_FILE = "/cache/recovery/command";
static const char *INTENT_FILE = "/cache/recovery/intent"; static const char *INTENT_FILE = "/cache/recovery/intent";
static const char *LOG_FILE = "/cache/recovery/log"; 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 *LAST_INSTALL_FILE = "/cache/recovery/last_install";
static const char *LOCALE_FILE = "/cache/recovery/last_locale"; static const char *LOCALE_FILE = "/cache/recovery/last_locale";
static const char *CACHE_ROOT = "/cache"; 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, // 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 // 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)); printf("Starting recovery on %s", ctime(&start));
load_volume_table(); load_volume_table();
ensure_path_mounted(LAST_LOG_FILE);
rotate_last_logs(5);
get_args(&argc, &argv); get_args(&argc, &argv);
int previous_runs = 0; int previous_runs = 0;