uptime.c revision 9d6d030f83f682a0ab944260eca8402d85fb008c
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>
389d6d030f83f682a0ab944260eca8402d85fb008cColin Cross#include <time.h>
395ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
405ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
415ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwoodstatic void format_time(int time, char* buffer) {
425ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    int seconds, minutes, hours, days;
435ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
445ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    seconds = time % 60;
455ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    time /= 60;
465ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    minutes = time % 60;
475ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    time /= 60;
485ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    hours = time % 24;
495ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    days = time / 24;
505ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
515ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (days > 0)
525ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        sprintf(buffer, "%d days, %02d:%02d:%02d", days, hours, minutes, seconds);
535ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    else
545ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds);
555ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood}
565ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
575ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwoodint64_t elapsedRealtime()
585ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood{
595ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    struct timespec ts;
605ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    int fd, result;
615ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
625ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    fd = open("/dev/alarm", O_RDONLY);
635ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (fd < 0)
645ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return fd;
655ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
665ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood   result = ioctl(fd, ANDROID_ALARM_GET_TIME(ANDROID_ALARM_ELAPSED_REALTIME), &ts);
675ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood   close(fd);
685ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
695ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (result == 0)
705ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return ts.tv_sec;
715ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    return -1;
725ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood}
735ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
745ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwoodint uptime_main(int argc, char *argv[])
755ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood{
765ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    float up_time, idle_time;
775ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    char up_string[100], idle_string[100], sleep_string[100];
785ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    int elapsed;
799d6d030f83f682a0ab944260eca8402d85fb008cColin Cross    struct timespec up_timespec;
805ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
815ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    FILE* file = fopen("/proc/uptime", "r");
825ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (!file) {
835ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fprintf(stderr, "Could not open /proc/uptime\n");
845ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return -1;
855ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    }
869d6d030f83f682a0ab944260eca8402d85fb008cColin Cross    if (fscanf(file, "%*f %f", &idle_time) != 1) {
875ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fprintf(stderr, "Could not parse /proc/uptime\n");
885ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fclose(file);
895ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return -1;
905ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    }
915ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    fclose(file);
925ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
939d6d030f83f682a0ab944260eca8402d85fb008cColin Cross    if (clock_gettime(CLOCK_MONOTONIC, &up_timespec) < 0) {
949d6d030f83f682a0ab944260eca8402d85fb008cColin Cross        fprintf(stderr, "Could not get monotonic time\n");
959d6d030f83f682a0ab944260eca8402d85fb008cColin Cross	return -1;
969d6d030f83f682a0ab944260eca8402d85fb008cColin Cross    }
979d6d030f83f682a0ab944260eca8402d85fb008cColin Cross    up_time = up_timespec.tv_sec + up_timespec.tv_nsec / 1e9;
989d6d030f83f682a0ab944260eca8402d85fb008cColin Cross
995ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    elapsed = elapsedRealtime();
1005ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    if (elapsed < 0) {
1015ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        fprintf(stderr, "elapsedRealtime failed\n");
1025ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood        return -1;
1035ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    }
1045ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
1055ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    format_time(elapsed, up_string);
1065ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    format_time((int)idle_time, idle_string);
1075ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    format_time((int)(elapsed - up_time), sleep_string);
1085ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    printf("up time: %s, idle time: %s, sleep time: %s\n", up_string, idle_string, sleep_string);
1095ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood
1105ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood    return 0;
1115ffbf26ebf9e29fe38b325e3c8f9502a31d2ff4cMike Lockwood}
112