diff options
-rw-r--r-- | healthd/healthd_mode_charger.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/healthd/healthd_mode_charger.cpp b/healthd/healthd_mode_charger.cpp index 5fe58ac5a..bde5fbe4a 100644 --- a/healthd/healthd_mode_charger.cpp +++ b/healthd/healthd_mode_charger.cpp @@ -36,6 +36,7 @@ #include <linux/netlink.h> #include <sys/socket.h> +#include <cutils/android_get_control_file.h> #include <cutils/klog.h> #include <cutils/misc.h> #include <cutils/properties.h> @@ -206,10 +207,9 @@ static int64_t curr_time_ms() { #define MAX_KLOG_WRITE_BUF_SZ 256 static void dump_last_kmsg(void) { - char* buf; + std::string buf; char* ptr; - unsigned sz = 0; - int len; + size_t len; LOGW("\n"); LOGW("*************** LAST KMSG ***************\n"); @@ -221,21 +221,25 @@ static void dump_last_kmsg(void) { "/proc/last_kmsg", // clang-format on }; - for (size_t i = 0; i < arraysize(kmsg); ++i) { - buf = (char*)load_file(kmsg[i], &sz); - if (buf && sz) break; + for (size_t i = 0; i < arraysize(kmsg) && buf.empty(); ++i) { + auto fd = android_get_control_file(kmsg[i]); + if (fd >= 0) { + android::base::ReadFdToString(fd, &buf); + } else { + android::base::ReadFileToString(kmsg[i], &buf); + } } - if (!buf || !sz) { + if (buf.empty()) { LOGW("last_kmsg not found. Cold reset?\n"); goto out; } - len = min(sz, LAST_KMSG_MAX_SZ); - ptr = buf + (sz - len); + len = min(buf.size(), LAST_KMSG_MAX_SZ); + ptr = &buf[buf.size() - len]; while (len > 0) { - int cnt = min(len, MAX_KLOG_WRITE_BUF_SZ); + size_t cnt = min(len, MAX_KLOG_WRITE_BUF_SZ); char yoink; char* nl; @@ -251,8 +255,6 @@ static void dump_last_kmsg(void) { ptr += cnt; } - free(buf); - out: LOGW("\n"); LOGW("************* END LAST KMSG *************\n"); |