| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| #include <fcntl.h> | |
| #include <string.h> | |
| #include <errno.h> | |
| #include <time.h> | |
| #include <linux/android_alarm.h> | |
| #include <sys/ioctl.h> | |
| static void settime(char *s) { | |
| struct tm tm; | |
| int day = atoi(s); | |
| int hour; | |
| time_t t; | |
| int fd; | |
| struct timespec ts; | |
| while (*s && *s != '.') | |
| s++; | |
| if (*s) | |
| s++; | |
| hour = atoi(s); | |
| tm.tm_year = day / 10000 - 1900; | |
| tm.tm_mon = (day % 10000) / 100 - 1; | |
| tm.tm_mday = (day % 100); | |
| tm.tm_hour = hour / 10000; | |
| tm.tm_min = (hour % 10000) / 100; | |
| tm.tm_sec = (hour % 100); | |
| tm.tm_isdst = -1; | |
| t = mktime(&tm); | |
| fd = open("/dev/alarm", O_RDWR); | |
| ts.tv_sec = t; | |
| ts.tv_nsec = 0; | |
| ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); | |
| } | |
| int date_main(int argc, char *argv[]) | |
| { | |
| int c; | |
| int res; | |
| struct tm tm; | |
| time_t t; | |
| struct timeval tv; | |
| struct timespec ts; | |
| char strbuf[260]; | |
| int fd; | |
| int useutc = 0; | |
| tzset(); | |
| do { | |
| c = getopt(argc, argv, "us:"); | |
| if (c == EOF) | |
| break; | |
| switch (c) { | |
| case 'u': | |
| useutc = 1; | |
| break; | |
| case 's': | |
| settime(optarg); | |
| break; | |
| case '?': | |
| fprintf(stderr, "%s: invalid option -%c\n", | |
| argv[0], optopt); | |
| exit(1); | |
| } | |
| } while (1); | |
| if(optind + 2 < argc) { | |
| fprintf(stderr,"%s [-u] [date]\n", argv[0]); | |
| return 1; | |
| } | |
| int hasfmt = argc == optind + 1 && argv[optind][0] == '+'; | |
| if(optind == argc || hasfmt) { | |
| char buf[2000]; | |
| time(&t); | |
| if (useutc) { | |
| gmtime_r(&t, &tm); | |
| strftime(strbuf, sizeof(strbuf), | |
| (hasfmt ? argv[optind] + 1 : "%a %b %e %H:%M:%S GMT %Y"), | |
| &tm); | |
| } else { | |
| localtime_r(&t, &tm); | |
| strftime(strbuf, sizeof(strbuf), | |
| (hasfmt ? argv[optind] + 1 : "%a %b %e %H:%M:%S %Z %Y"), | |
| &tm); | |
| } | |
| printf("%s\n", strbuf); | |
| } | |
| else if(optind + 1 == argc) { | |
| #if 0 | |
| struct tm *tmptr; | |
| tmptr = getdate(argv[optind]); | |
| if(tmptr == NULL) { | |
| fprintf(stderr,"getdate_r failed\n"); | |
| return 1; | |
| } | |
| tm = *tmptr; | |
| #if 0 | |
| if(getdate_r(argv[optind], &tm) < 0) { | |
| fprintf(stderr,"getdate_r failed %s\n", strerror(errno)); | |
| return 1; | |
| } | |
| #endif | |
| #endif | |
| //strptime(argv[optind], NULL, &tm); | |
| //tv.tv_sec = mktime(&tm); | |
| //tv.tv_usec = 0; | |
| strtotimeval(argv[optind], &tv); | |
| printf("time %s -> %d.%d\n", argv[optind], tv.tv_sec, tv.tv_usec); | |
| fd = open("/dev/alarm", O_RDWR); | |
| ts.tv_sec = tv.tv_sec; | |
| ts.tv_nsec = tv.tv_usec * 1000; | |
| res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); | |
| //res = settimeofday(&tv, NULL); | |
| if(res < 0) { | |
| fprintf(stderr,"settimeofday failed %s\n", strerror(errno)); | |
| return 1; | |
| } | |
| } | |
| else { | |
| fprintf(stderr,"%s [-s 20070325.123456] [-u] [date]\n", argv[0]); | |
| return 1; | |
| } | |
| return 0; | |
| } |