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-w32-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.tar.gz
busybox-w32-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.tar.bz2
busybox-w32-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.zip
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)
123 if (!(opt & (OPT_SET | OPT_DATE))) { 123 if (!(opt & (OPT_SET | OPT_DATE))) {
124 opt |= OPT_SET; 124 opt |= OPT_SET;
125 date_str = argv[0]; /* can be NULL */ 125 date_str = argv[0]; /* can be NULL */
126 if (date_str) 126 if (date_str) {
127#if ENABLE_DESKTOP
128 int len = strspn(date_str, "0123456789");
129 if (date_str[len] == '\0'
130 || (date_str[len] == '.'
131 && isdigit(date_str[len+1])
132 && isdigit(date_str[len+2])
133 && date_str[len+3] == '\0'
134 )
135 ) {
136 /* Dreaded [MMDDhhmm[[CC]YY][.ss]] format!
137 * It does not match -d or -s format.
138 * Some users actually do use it.
139 */
140 len -= 8;
141 if (len < 0 || len > 4 || (len & 1))
142 bb_error_msg_and_die(bb_msg_invalid_date, date_str);
143 if (len != 0) { /* move YY or CCYY to front */
144 char buf[4];
145 memcpy(buf, date_str + 8, len);
146 memmove(date_str + len, date_str, 8);
147 memcpy(date_str, buf, len);
148 }
149 }
150#endif
127 argv++; 151 argv++;
152 }
128 } 153 }
129 if (*argv) 154 if (*argv)
130 bb_show_usage(); 155 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)
74 int len = strchrnul(date_str, '.') - date_str; 74 int len = strchrnul(date_str, '.') - date_str;
75 75
76 /* MM[.SS] */ 76 /* MM[.SS] */
77 if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 12, 77 if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u""%2u%c" + 12,
78 &tm_time->tm_min, 78 &tm_time->tm_min,
79 &end) >= 1) { 79 &end) >= 1) {
80 } else 80 } else
81 /* HHMM[.SS] */ 81 /* HHMM[.SS] */
82 if (len == 4 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 9, 82 if (len == 4 && sscanf(date_str, "%2u%2u%2u""%2u%2u%c" + 9,
83 &tm_time->tm_hour, 83 &tm_time->tm_hour,
84 &tm_time->tm_min, 84 &tm_time->tm_min,
85 &end) >= 2) { 85 &end) >= 2) {
86 } else 86 } else
87 /* ddHHMM[.SS] */ 87 /* ddHHMM[.SS] */
88 if (len == 6 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 6, 88 if (len == 6 && sscanf(date_str, "%2u%2u""%2u%2u%2u%c" + 6,
89 &tm_time->tm_mday, 89 &tm_time->tm_mday,
90 &tm_time->tm_hour, 90 &tm_time->tm_hour,
91 &tm_time->tm_min, 91 &tm_time->tm_min,
92 &end) >= 3) { 92 &end) >= 3) {
93 } else 93 } else
94 /* mmddHHMM[.SS] */ 94 /* mmddHHMM[.SS] */
95 if (len == 8 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 3, 95 if (len == 8 && sscanf(date_str, "%2u""%2u%2u%2u%2u%c" + 3,
96 &tm_time->tm_mon, 96 &tm_time->tm_mon,
97 &tm_time->tm_mday, 97 &tm_time->tm_mday,
98 &tm_time->tm_hour, 98 &tm_time->tm_hour,