aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-11-15 04:55:40 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-11-15 04:55:40 +0100
commitff1822aed159e1c1b5a92dc5c1fd1648b026f8f4 (patch)
tree2dc5446a7049e666cda7053bd8c13a41a5cedf0e
parent6e54249e05f3fbe472814465d8f3e122801b7e96 (diff)
downloadbusybox-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.tar.gz
date: restore hadling of MMDDhhmm[[CC]YY][.ss] date format
function old new delta date_main 698 889 +191 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/date.c27
-rw-r--r--libbb/time.c8
2 files changed, 30 insertions, 5 deletions
diff --git a/coreutils/date.c b/coreutils/date.c
index 51200e64c..11b63eaeb 100644
--- a/coreutils/date.c
+++ b/coreutils/date.c
@@ -123,8 +123,33 @@ int date_main(int argc UNUSED_PARAM, char **argv)
if (!(opt & (OPT_SET | OPT_DATE))) {
opt |= OPT_SET;
date_str = argv[0]; /* can be NULL */
- if (date_str)
+ if (date_str) {
+#if ENABLE_DESKTOP
+ int len = strspn(date_str, "0123456789");
+ if (date_str[len] == '\0'
+ || (date_str[len] == '.'
+ && isdigit(date_str[len+1])
+ && isdigit(date_str[len+2])
+ && date_str[len+3] == '\0'
+ )
+ ) {
+ /* Dreaded [MMDDhhmm[[CC]YY][.ss]] format!
+ * It does not match -d or -s format.
+ * Some users actually do use it.
+ */
+ len -= 8;
+ if (len < 0 || len > 4 || (len & 1))
+ bb_error_msg_and_die(bb_msg_invalid_date, date_str);
+ if (len != 0) { /* move YY or CCYY to front */
+ char buf[4];
+ memcpy(buf, date_str + 8, len);
+ memmove(date_str + len, date_str, 8);
+ memcpy(date_str, buf, len);
+ }
+ }
+#endif
argv++;
+ }
}
if (*argv)
bb_show_usage();
diff --git a/libbb/time.c b/libbb/time.c
index b31683b67..85c72d163 100644
--- a/libbb/time.c
+++ b/libbb/time.c
@@ -74,25 +74,25 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time)
int len = strchrnul(date_str, '.') - date_str;
/* MM[.SS] */
- if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 12,
+ if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u""%2u%c" + 12,
&tm_time->tm_min,
&end) >= 1) {
} else
/* HHMM[.SS] */
- if (len == 4 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 9,
+ if (len == 4 && sscanf(date_str, "%2u%2u%2u""%2u%2u%c" + 9,
&tm_time->tm_hour,
&tm_time->tm_min,
&end) >= 2) {
} else
/* ddHHMM[.SS] */
- if (len == 6 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 6,
+ if (len == 6 && sscanf(date_str, "%2u%2u""%2u%2u%2u%c" + 6,
&tm_time->tm_mday,
&tm_time->tm_hour,
&tm_time->tm_min,
&end) >= 3) {
} else
/* mmddHHMM[.SS] */
- if (len == 8 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 3,
+ if (len == 8 && sscanf(date_str, "%2u""%2u%2u%2u%2u%c" + 3,
&tm_time->tm_mon,
&tm_time->tm_mday,
&tm_time->tm_hour,