blob: 13b5210d73261ed8285973996e7a2cac869410ce [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001#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}