From c2f815f5baf3b1336f52c6f892315e44dec66ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 2 Mar 2024 18:33:14 +0800 Subject: [PATCH] Uptime (Android): fix implementation Regression of 41fed1da5f4c4d88b174ebf7b5b4a43c80c5a57a --- src/detection/uptime/uptime_linux.c | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/detection/uptime/uptime_linux.c b/src/detection/uptime/uptime_linux.c index 79bb5580c..ab85dd87a 100644 --- a/src/detection/uptime/uptime_linux.c +++ b/src/detection/uptime/uptime_linux.c @@ -6,20 +6,32 @@ const char* ffDetectUptime(FFUptimeResult* result) { + #ifndef __ANDROID__ // cat: /proc/uptime: Permission denied + // #620 char buf[64]; ssize_t nRead = ffReadFileData("/proc/uptime", sizeof(buf) - 1, buf); - if(nRead < 0) - return "ffReadFileData(\"/proc/uptime\", sizeof(buf) - 1, buf) failed"; - buf[nRead] = '\0'; + if(nRead > 0) + { + buf[nRead] = '\0'; - char *err = NULL; - double sec = strtod(buf, &err); - if(err != buf) - result->uptime = (uint64_t) (sec * 1000); - else - return "strtod(buf, &err) failed"; + char *err = NULL; + double sec = strtod(buf, &err); + if(err != buf) + { + result->uptime = (uint64_t) (sec * 1000); + result->bootTime = ffTimeGetNow() + result->uptime; + return NULL; + } + } + #endif + + struct timespec uptime; + if (clock_gettime(CLOCK_BOOTTIME, &uptime) != 0) + return "clock_gettime(CLOCK_BOOTTIME) failed"; + + result->uptime = (uint64_t) uptime.tv_sec * 1000 + (uint64_t) uptime.tv_nsec / 1000000; result->bootTime = ffTimeGetNow() + result->uptime; return NULL;