OSDN Git Service

date: restore hadling of MMDDhhmm[[CC]YY][.ss] date format
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 15 Nov 2009 03:55:40 +0000 (04:55 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 15 Nov 2009 03:55:40 +0000 (04:55 +0100)
function                                             old     new   delta
date_main                                            698     889    +191

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/date.c
libbb/time.c

index 51200e6..11b63ea 100644 (file)
@@ -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();
index b31683b..85c72d1 100644 (file)
@@ -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,