summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-04-07 22:25:18 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-04-07 22:25:18 +0000
commit47d374ec27af7bc431a86a592822fbb15ff6ba3c (patch)
tree88d13cb29321a3020a9971d0da236493ada044a3
parent31631861647aadc28d6311a211419be79c34c7b0 (diff)
parente25a6413d381fc1f35def9ddfa2fbdcf199c09ff (diff)
downloadsystem_core-47d374ec27af7bc431a86a592822fbb15ff6ba3c.zip
system_core-47d374ec27af7bc431a86a592822fbb15ff6ba3c.tar.gz
system_core-47d374ec27af7bc431a86a592822fbb15ff6ba3c.tar.bz2
Merge "Move date off the non-portable bionic32 'strtotimeval'."
-rw-r--r--toolbox/date.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/toolbox/date.c b/toolbox/date.c
index d6c9052..aa3b72e 100644
--- a/toolbox/date.c
+++ b/toolbox/date.c
@@ -1,10 +1,13 @@
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
#include <string.h>
-#include <errno.h>
#include <time.h>
+#include <unistd.h>
+
#include <linux/android_alarm.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
@@ -108,6 +111,33 @@ static void settime(char *s) {
settime_rtc_tm(&tm);
}
+static char *parse_time(const char *str, struct timeval *ts) {
+ char *s;
+ long fs = 0; /* fractional seconds */
+
+ ts->tv_sec = strtoumax(str, &s, 10);
+
+ if (*s == '.') {
+ s++;
+ int count = 0;
+
+ /* read up to 6 digits (microseconds) */
+ while (*s && isdigit(*s)) {
+ if (++count < 7) {
+ fs = fs*10 + (*s - '0');
+ }
+ s++;
+ }
+
+ for (; count < 6; count++) {
+ fs *= 10;
+ }
+ }
+
+ ts->tv_usec = fs;
+ return s;
+}
+
int date_main(int argc, char *argv[])
{
int c;
@@ -181,7 +211,7 @@ int date_main(int argc, char *argv[])
//strptime(argv[optind], NULL, &tm);
//tv.tv_sec = mktime(&tm);
//tv.tv_usec = 0;
- strtotimeval(argv[optind], &tv);
+ parse_time(argv[optind], &tv);
printf("time %s -> %lu.%lu\n", argv[optind], tv.tv_sec, tv.tv_usec);
res = settime_alarm_timeval(&tv);
if (res < 0)