From e40c421b28c55bec2f0106cf6ff8ce164545727f Mon Sep 17 00:00:00 2001 From: Todd Poynor Date: Mon, 30 Jan 2017 17:28:55 -0800 Subject: [PATCH] libcutils: android_reboot: save reboot reason in file Save a string identifying the reason for last Android reboot or power off in file /data/misc/recovery/last_reboot_reason . This file may be used for informing users of reboot or shutdown reasons at next boot, and for other diagnostic purposes. Bug: 30994946 Test: Manual: reboot, setprop sys.powerctl Change-Id: I01e44473fdd21b33e9e4dced77aba9a66b6d3755 --- libcutils/android_reboot.c | 45 +++++++++++++++++++++++ libcutils/include/cutils/android_reboot.h | 3 ++ 2 files changed, 48 insertions(+) diff --git a/libcutils/android_reboot.c b/libcutils/android_reboot.c index 6bdcc137f..06026d125 100644 --- a/libcutils/android_reboot.c +++ b/libcutils/android_reboot.c @@ -189,11 +189,56 @@ out: free_entries(&ro_entries); } +static void save_reboot_reason(int cmd, const char *arg) +{ + FILE *fp; + const char *reason = NULL; + + fp = fopen(LAST_REBOOT_REASON_FILE, "w"); + if (fp == NULL) { + KLOG_WARNING(TAG, "Error creating " LAST_REBOOT_REASON_FILE + ": %s\n", strerror(errno)); + return; + } + switch (cmd) { + case ANDROID_RB_RESTART: + reason = "restart"; + break; + + case ANDROID_RB_POWEROFF: + reason = "power-off"; + break; + + case ANDROID_RB_RESTART2: + reason = arg && strlen(arg) ? arg : "restart"; + break; + + case ANDROID_RB_THERMOFF: + reason = "thermal-shutdown"; + break; + + default: + fprintf(fp,"0x%08X\n", cmd); + break; + } + + if (reason) { + if (fprintf(fp, "%s\n", reason) < 0) { + KLOG_WARNING(TAG, "Error writing " LAST_REBOOT_REASON_FILE + ": %s\n", strerror(errno)); + } + } + + fclose(fp); +} + int android_reboot_with_callback( int cmd, int flags __unused, const char *arg, void (*cb_on_remount)(const struct mntent*)) { int ret; + + save_reboot_reason(cmd, arg); remount_ro(cb_on_remount); switch (cmd) { case ANDROID_RB_RESTART: diff --git a/libcutils/include/cutils/android_reboot.h b/libcutils/include/cutils/android_reboot.h index 549f25832..1bbb9b94b 100644 --- a/libcutils/include/cutils/android_reboot.h +++ b/libcutils/include/cutils/android_reboot.h @@ -30,6 +30,9 @@ __BEGIN_DECLS /* Properties */ #define ANDROID_RB_PROPERTY "sys.powerctl" +/* Android reboot reason stored in this file */ +#define LAST_REBOOT_REASON_FILE "/data/misc/recovery/last_reboot_reason" + int android_reboot(int cmd, int flags, const char *arg); int android_reboot_with_callback( int cmd, int flags, const char *arg,