From 5ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4c Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 9 Apr 2010 15:27:16 -0400 Subject: [PATCH] toolbox: add "uptime" command Prints elapsed real time since boot, as well as idle time and sleep time. Change-Id: I97f482d6087e9f802d74e91147bf767e6b2d4f42 Signed-off-by: Mike Lockwood --- toolbox/Android.mk | 3 +- toolbox/uptime.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 toolbox/uptime.c diff --git a/toolbox/Android.mk b/toolbox/Android.mk index a6114ac0e..5f7231188 100644 --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -52,7 +52,8 @@ TOOLS := \ id \ vmstat \ nandread \ - ionice + uptime \ + ionice LOCAL_SRC_FILES:= \ toolbox.c \ diff --git a/toolbox/uptime.c b/toolbox/uptime.c new file mode 100644 index 000000000..8b1983d79 --- /dev/null +++ b/toolbox/uptime.c @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + + +static void format_time(int time, char* buffer) { + int seconds, minutes, hours, days; + + seconds = time % 60; + time /= 60; + minutes = time % 60; + time /= 60; + hours = time % 24; + days = time / 24; + + if (days > 0) + sprintf(buffer, "%d days, %02d:%02d:%02d", days, hours, minutes, seconds); + else + sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds); +} + +int64_t elapsedRealtime() +{ + struct timespec ts; + int fd, result; + + fd = open("/dev/alarm", O_RDONLY); + if (fd < 0) + return fd; + + result = ioctl(fd, ANDROID_ALARM_GET_TIME(ANDROID_ALARM_ELAPSED_REALTIME), &ts); + close(fd); + + if (result == 0) + return ts.tv_sec; + return -1; +} + +int uptime_main(int argc, char *argv[]) +{ + float up_time, idle_time; + char up_string[100], idle_string[100], sleep_string[100]; + int elapsed; + + FILE* file = fopen("/proc/uptime", "r"); + if (!file) { + fprintf(stderr, "Could not open /proc/uptime\n"); + return -1; + } + if (fscanf(file, "%f %f", &up_time, &idle_time) != 2) { + fprintf(stderr, "Could not parse /proc/uptime\n"); + fclose(file); + return -1; + } + fclose(file); + + elapsed = elapsedRealtime(); + if (elapsed < 0) { + fprintf(stderr, "elapsedRealtime failed\n"); + return -1; + } + + format_time(elapsed, up_string); + format_time((int)idle_time, idle_string); + format_time((int)(elapsed - up_time), sleep_string); + printf("up time: %s, idle time: %s, sleep time: %s\n", up_string, idle_string, sleep_string); + + return 0; +}