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