alarm.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <asm/ioctl.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//#include <linux/rtc.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/android_alarm.h> 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint alarm_main(int argc, char *argv[]) 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int c; 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct tm tm; 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time_t t; 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timespec ts; 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// struct rtc_time rtc_time; 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char strbuf[26]; 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int afd; 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int nfd; 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// struct timeval timeout = { 0, 0 }; 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int wait = 0; 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd_set rfds; 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char wake_lock_id[] = "alarm_test"; 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int waitalarmmask = 0; 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int useutc = 0; 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_alarm_type_t alarmtype_low = ANDROID_ALARM_RTC_WAKEUP; 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_alarm_type_t alarmtype_high = ANDROID_ALARM_RTC_WAKEUP; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_alarm_type_t alarmtype = 0; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //c = getopt(argc, argv, "uw:"); 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = getopt(argc, argv, "uwat:"); 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == EOF) 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (c) { 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'u': 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project useutc = 1; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 't': 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alarmtype_low = alarmtype_high = strtol(optarg, NULL, 0); 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'a': 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alarmtype_low = ANDROID_ALARM_RTC_WAKEUP; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project alarmtype_high = ANDROID_ALARM_TYPE_COUNT - 1; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'w': 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //timeout.tv_sec = strtol(optarg, NULL, 0); 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project wait = 1; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case '?': 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%s: invalid option -%c\n", 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[0], optopt); 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (1); 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(optind + 2 < argc) { 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%s [-uwa] [-t type] [seconds]\n", argv[0]); 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project afd = open("/dev/alarm", O_RDWR); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(afd < 0) { 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to open rtc: %s\n", strerror(errno)); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(optind == argc) { 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(alarmtype = alarmtype_low; alarmtype <= alarmtype_high; alarmtype++) { 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project waitalarmmask |= 1U << alarmtype; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(fd, RTC_ALM_READ, &tm); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to read alarm: %s\n", strerror(errno)); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t = timegm(&tm); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(useutc) 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gmtime_r(&t, &tm); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project localtime_r(&t, &tm); 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asctime_r(&tm, strbuf); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s", strbuf); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if(optind + 1 == argc) { 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(fd, RTC_RD_TIME, &tm); 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to set alarm: %s\n", strerror(errno)); 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asctime_r(&tm, strbuf); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Now: %s", strbuf); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time(&tv.tv_sec); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time(&ts.tv_sec); 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts.tv_nsec = 0; 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //strptime(argv[optind], NULL, &tm); 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //tv.tv_sec = mktime(&tm); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //tv.tv_usec = 0; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(alarmtype = alarmtype_low; alarmtype <= alarmtype_high; alarmtype++) { 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project waitalarmmask |= 1U << alarmtype; 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(afd, ANDROID_ALARM_GET_TIME(alarmtype), &ts); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to get current time: %s\n", strerror(errno)); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts.tv_sec += strtol(argv[optind], NULL, 0); 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //strtotimeval(argv[optind], &tv); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gmtime_r(&ts.tv_sec, &tm); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("time %s -> %ld.%09ld\n", argv[optind], ts.tv_sec, ts.tv_nsec); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project asctime_r(&tm, strbuf); 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Requested %s", strbuf); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(afd, ANDROID_ALARM_SET(alarmtype), &ts); 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to set alarm: %s\n", strerror(errno)); 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(fd, RTC_ALM_SET, &tm); 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to set alarm: %s\n", strerror(errno)); 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(fd, RTC_AIE_ON); 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to enable alarm: %s\n", strerror(errno)); 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%s [-u] [date]\n", argv[0]); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(wait) { 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(waitalarmmask) { 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("wait for alarm %x\n", waitalarmmask); 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(afd, ANDROID_ALARM_WAIT); 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "alarm wait failed\n"); 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("got alarm %x\n", res); 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project waitalarmmask &= ~res; 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nfd = open("/sys/android_power/acquire_full_wake_lock", O_RDWR); 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(nfd, wake_lock_id, sizeof(wake_lock_id) - 1); 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(nfd); 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //sleep(5); 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nfd = open("/sys/android_power/release_wake_lock", O_RDWR); 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(nfd, wake_lock_id, sizeof(wake_lock_id) - 1); 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(nfd); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("done\n"); 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FD_ZERO(&rfds); 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FD_SET(fd, &rfds); 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = select(fd + 1, &rfds, NULL, NULL, &timeout); 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "select failed: %s\n", strerror(errno)); 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res > 0) { 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int event; 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read(fd, &event, sizeof(event)); 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "got %x\n", event); 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "timeout waiting for alarm\n"); 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(afd); 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 191