diff options
author | Elliott Hughes <enh@google.com> | 2014-04-07 22:25:18 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-04-07 22:25:18 +0000 |
commit | 47d374ec27af7bc431a86a592822fbb15ff6ba3c (patch) | |
tree | 88d13cb29321a3020a9971d0da236493ada044a3 | |
parent | 31631861647aadc28d6311a211419be79c34c7b0 (diff) | |
parent | e25a6413d381fc1f35def9ddfa2fbdcf199c09ff (diff) | |
download | system_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.c | 38 |
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) |