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