• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
settime(char * s)9 static 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 
date_main(int argc,char * argv[])41 int 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