date.c revision b93e5812faffd3b6c5fb349072413aace31918d8
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 3b93e5812faffd3b6c5fb349072413aace31918d8Olivier Bailly#include <unistd.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/android_alarm.h> 9b93e5812faffd3b6c5fb349072413aace31918d8Olivier Bailly#include <sys/ioctl.h> 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void settime(char *s) { 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct tm tm; 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int day = atoi(s); 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int hour; 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time_t t; 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timespec ts; 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*s && *s != '.') 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s++; 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*s) 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s++; 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project hour = atoi(s); 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_year = day / 10000 - 1900; 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_mon = (day % 10000) / 100 - 1; 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_mday = (day % 100); 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_hour = hour / 10000; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_min = (hour % 10000) / 100; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_sec = (hour % 100); 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm.tm_isdst = -1; 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t = mktime(&tm); 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open("/dev/alarm", O_RDWR); 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts.tv_sec = t; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts.tv_nsec = 0; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint date_main(int argc, char *argv[]) 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int c; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct tm tm; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time_t t; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timeval tv; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timespec ts; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char strbuf[260]; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int useutc = 0; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tzset(); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = getopt(argc, argv, "us:"); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == EOF) 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (c) { 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'u': 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project useutc = 1; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 's': 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project settime(optarg); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case '?': 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%s: invalid option -%c\n", 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[0], optopt); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (1); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(optind + 2 < argc) { 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%s [-u] [date]\n", argv[0]); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int hasfmt = argc == optind + 1 && argv[optind][0] == '+'; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(optind == argc || hasfmt) { 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[2000]; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time(&t); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (useutc) { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gmtime_r(&t, &tm); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strftime(strbuf, sizeof(strbuf), 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (hasfmt ? argv[optind] + 1 : "%a %b %e %H:%M:%S GMT %Y"), 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &tm); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project localtime_r(&t, &tm); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strftime(strbuf, sizeof(strbuf), 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (hasfmt ? argv[optind] + 1 : "%a %b %e %H:%M:%S %Z %Y"), 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &tm); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s\n", strbuf); 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if(optind + 1 == argc) { 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct tm *tmptr; 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmptr = getdate(argv[optind]); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmptr == NULL) { 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"getdate_r failed\n"); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tm = *tmptr; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(getdate_r(argv[optind], &tm) < 0) { 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"getdate_r failed %s\n", strerror(errno)); 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //strptime(argv[optind], NULL, &tm); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //tv.tv_sec = mktime(&tm); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //tv.tv_usec = 0; 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strtotimeval(argv[optind], &tv); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("time %s -> %d.%d\n", argv[optind], tv.tv_sec, tv.tv_usec); 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open("/dev/alarm", O_RDWR); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts.tv_sec = tv.tv_sec; 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ts.tv_nsec = tv.tv_usec * 1000; 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //res = settimeofday(&tv, NULL); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"settimeofday failed %s\n", strerror(errno)); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%s [-s 20070325.123456] [-u] [date]\n", argv[0]); 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 135