aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-01-02 20:02:09 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2011-01-02 20:02:09 +0100
commit92ffe0571a49077f06fc65bf0ada753b30fd8a53 (patch)
tree706e3cd2aeb23ddfece91b6f9612e272070d3e44
parenta5d3d3436b16bf6e1a92ed969e171ac812e8f906 (diff)
downloadbusybox-w32-92ffe0571a49077f06fc65bf0ada753b30fd8a53.tar.gz
busybox-w32-92ffe0571a49077f06fc65bf0ada753b30fd8a53.tar.bz2
busybox-w32-92ffe0571a49077f06fc65bf0ada753b30fd8a53.zip
date,touch: treat 2-digit years better (fit them into +-50 yrs around today)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/touch.c7
-rw-r--r--libbb/time.c12
2 files changed, 16 insertions, 3 deletions
diff --git a/coreutils/touch.c b/coreutils/touch.c
index 352177111..6c2b948e6 100644
--- a/coreutils/touch.c
+++ b/coreutils/touch.c
@@ -120,9 +120,10 @@ int touch_main(int argc UNUSED_PARAM, char **argv)
120 struct tm tm_time; 120 struct tm tm_time;
121 time_t t; 121 time_t t;
122 122
123 //time(&t); 123 //memset(&tm_time, 0, sizeof(tm_time));
124 //localtime_r(&t, &tm_time); 124 /* Better than memset: makes "HH:MM" dates meaningful */
125 memset(&tm_time, 0, sizeof(tm_time)); 125 time(&t);
126 localtime_r(&t, &tm_time);
126 parse_datestr(date_str, &tm_time); 127 parse_datestr(date_str, &tm_time);
127 128
128 /* Correct any day of week and day of year etc. fields */ 129 /* Correct any day of week and day of year etc. fields */
diff --git a/libbb/time.c b/libbb/time.c
index 2a74d34c2..1eb2d75c2 100644
--- a/libbb/time.c
+++ b/libbb/time.c
@@ -93,6 +93,7 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm)
93 * 93 *
94 * This coincides with the format of "touch -t TIME" 94 * This coincides with the format of "touch -t TIME"
95 */ 95 */
96 unsigned cur_year = ptm->tm_year;
96 int len = strchrnul(date_str, '.') - date_str; 97 int len = strchrnul(date_str, '.') - date_str;
97 98
98 /* MM[.SS] */ 99 /* MM[.SS] */
@@ -133,6 +134,17 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm)
133 &end) >= 5) { 134 &end) >= 5) {
134 /* Adjust month from 1-12 to 0-11 */ 135 /* Adjust month from 1-12 to 0-11 */
135 ptm->tm_mon -= 1; 136 ptm->tm_mon -= 1;
137 if ((int)cur_year >= 50) { /* >= 1950 */
138 /* Adjust year: */
139 /* 1. Put it in the current century */
140 ptm->tm_year += (cur_year / 100) * 100;
141 /* 2. If too far in the past, +100 years */
142 if (ptm->tm_year < cur_year - 50)
143 ptm->tm_year += 100;
144 /* 3. If too far in the future, -100 years */
145 if (ptm->tm_year > cur_year + 50)
146 ptm->tm_year -= 100;
147 }
136 } else 148 } else
137 /* ccyymmddHHMM[.SS] */ 149 /* ccyymmddHHMM[.SS] */
138 if (len == 12 && sscanf(date_str, "%4u%2u%2u%2u%2u%c", 150 if (len == 12 && sscanf(date_str, "%4u%2u%2u%2u%2u%c",