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