uptime.c revision 53308d4cd5c4414402e979a6771f7ef3b35f5c2f
15ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood/*
253308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * Copyright (c) 2010, The Android Open Source Project
353308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * All rights reserved.
45ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood *
553308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * Redistribution and use in source and binary forms, with or without
653308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * modification, are permitted provided that the following conditions
753308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * are met:
853308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *  * Redistributions of source code must retain the above copyright
953308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *    notice, this list of conditions and the following disclaimer.
1053308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *  * Redistributions in binary form must reproduce the above copyright
1153308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *    notice, this list of conditions and the following disclaimer in
1253308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *    the documentation and/or other materials provided with the
1353308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *    distribution.
1453308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *  * Neither the name of Google, Inc. nor the names of its contributors
1553308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *    may be used to endorse or promote products derived from this
1653308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root *    software without specific prior written permission.
175ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood *
1853308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1953308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2053308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2153308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2253308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2353308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2453308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2553308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2653308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2753308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2853308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2953308d4cd5c4414402e979a6771f7ef3b35f5c2fKenny Root * SUCH DAMAGE.
305ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood */
315ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
325ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood#include <sys/time.h>
335ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood#include <linux/ioctl.h>
345ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood#include <linux/rtc.h>
355ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood#include <linux/android_alarm.h>
365ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood#include <fcntl.h>
375ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood#include <stdio.h>
385ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
395ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
405ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwoodstatic void format_time(int time, char* buffer) {
415ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    int seconds, minutes, hours, days;
425ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
435ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    seconds = time % 60;
445ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    time /= 60;
455ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    minutes = time % 60;
465ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    time /= 60;
475ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    hours = time % 24;
485ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    days = time / 24;
495ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
505ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (days > 0)
515ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        sprintf(buffer, "%d days, %02d:%02d:%02d", days, hours, minutes, seconds);
525ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    else
535ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds);
545ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood}
555ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
565ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwoodint64_t elapsedRealtime()
575ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood{
585ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    struct timespec ts;
595ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    int fd, result;
605ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
615ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    fd = open("/dev/alarm", O_RDONLY);
625ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (fd < 0)
635ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return fd;
645ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
655ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood   result = ioctl(fd, ANDROID_ALARM_GET_TIME(ANDROID_ALARM_ELAPSED_REALTIME), &ts);
665ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood   close(fd);
675ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
685ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (result == 0)
695ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return ts.tv_sec;
705ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    return -1;
715ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood}
725ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
735ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwoodint uptime_main(int argc, char *argv[])
745ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood{
755ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    float up_time, idle_time;
765ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    char up_string[100], idle_string[100], sleep_string[100];
775ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    int elapsed;
785ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
795ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    FILE* file = fopen("/proc/uptime", "r");
805ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (!file) {
815ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fprintf(stderr, "Could not open /proc/uptime\n");
825ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return -1;
835ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    }
845ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (fscanf(file, "%f %f", &up_time, &idle_time) != 2) {
855ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fprintf(stderr, "Could not parse /proc/uptime\n");
865ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fclose(file);
875ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return -1;
885ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    }
895ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    fclose(file);
905ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
915ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    elapsed = elapsedRealtime();
925ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (elapsed < 0) {
935ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fprintf(stderr, "elapsedRealtime failed\n");
945ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return -1;
955ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    }
965ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
975ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    format_time(elapsed, up_string);
985ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    format_time((int)idle_time, idle_string);
995ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    format_time((int)(elapsed - up_time), sleep_string);
1005ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    printf("up time: %s, idle time: %s, sleep time: %s\n", up_string, idle_string, sleep_string);
1015ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
1025ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    return 0;
1035ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood}
104