summaryrefslogtreecommitdiffstats
path: root/toolchain/uClibc/uClibc-0.9.28-600-new_dst_rules.patch
diff options
context:
space:
mode:
Diffstat (limited to 'toolchain/uClibc/uClibc-0.9.28-600-new_dst_rules.patch')
-rw-r--r--toolchain/uClibc/uClibc-0.9.28-600-new_dst_rules.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/toolchain/uClibc/uClibc-0.9.28-600-new_dst_rules.patch b/toolchain/uClibc/uClibc-0.9.28-600-new_dst_rules.patch
new file mode 100644
index 000000000..8b1a5a9ac
--- /dev/null
+++ b/toolchain/uClibc/uClibc-0.9.28-600-new_dst_rules.patch
@@ -0,0 +1,101 @@
+--- uClibc/libc/misc/time/time.c (revision 16488)
++++ uClibc/libc/misc/time/time.c (working copy)
+@@ -157,6 +157,22 @@
+ #define TZNAME_MAX _POSIX_TZNAME_MAX
+ #endif
+
++#if defined (L_tzset) || defined (L_localtime_r) || defined(L_strftime) || \
++ defined(L__time_mktime) || defined(L__time_mktime_tzi) || \
++ ((defined(L_strftime) || defined(L_strftime_l)) && \
++ defined(__UCLIBC_HAS_XLOCALE__))
++
++void _time_tzset (int);
++
++#ifndef L__time_mktime
++
++ /* Jan 1, 2007 Z - tm = 0,0,0,1,0,107,1,0,0 */
++
++const static time_t new_rule_starts = 1167609600;
++
++#endif
++#endif
++
+ /**********************************************************************/
+ /* The era code is currently unfinished. */
+ /* #define ENABLE_ERA_CODE */
+@@ -532,7 +548,7 @@
+ {
+ __UCLIBC_MUTEX_LOCK(_time_tzlock);
+
+- tzset();
++ _time_tzset(*timer < new_rule_starts);
+
+ __time_localtime_tzi(timer, result, _time_tzinfo);
+
+@@ -956,7 +972,8 @@
+ unsigned char mod;
+ unsigned char code;
+
+- tzset(); /* We'll, let's get this out of the way. */
++ /* We'll, let's get this out of the way. */
++ _time_tzset(_time_mktime((struct tm *) timeptr, 0) < new_rule_starts);
+
+ lvl = 0;
+ p = format;
+@@ -1644,7 +1661,9 @@
+ 6, 0, 0, /* Note: overloaded for non-M non-J case... */
+ 0, 1, 0, /* J */
+ ',', 'M', '4', '.', '1', '.', '0',
+- ',', 'M', '1', '0', '.', '5', '.', '0', 0
++ ',', 'M', '1', '0', '.', '5', '.', '0', 0,
++ ',', 'M', '3', '.', '2', '.', '0',
++ ',', 'M', '1', '1', '.', '1', '.', '0', 0
+ };
+
+ #define TZ vals
+@@ -1652,6 +1671,7 @@
+ #define RANGE (vals + 7)
+ #define RULE (vals + 11 - 1)
+ #define DEFAULT_RULES (vals + 22)
++#define DEFAULT_2007_RULES (vals + 38)
+
+ /* Initialize to UTC. */
+ int daylight = 0;
+@@ -1774,6 +1794,11 @@
+
+ void tzset(void)
+ {
++ _time_tzset((time(NULL)) < new_rule_starts);
++}
++
++void _time_tzset(int use_old_rules)
++{
+ register const char *e;
+ register char *s;
+ long off;
+@@ -1896,7 +1921,15 @@
+ } else { /* OK, we have dst, so get some rules. */
+ count = 0;
+ if (!*e) { /* No rules so default to US rules. */
+- e = DEFAULT_RULES;
++ e = use_old_rules ? DEFAULT_RULES : DEFAULT_2007_RULES;
++#ifdef DEBUG_TZSET
++ if (e == DEFAULT_RULES)
++ printf("tzset: Using old rules.\n");
++ else if (e == DEFAULT_2007_RULES)
++ printf("tzset: Using new rules\n");
++ else
++ printf("tzset: Using undefined rules\n");
++#endif /* DEBUG_TZSET */
+ }
+
+ do {
+@@ -2230,6 +2263,8 @@
+ --d;
+ }
+
++ _time_tzset (x.tm_year < 2007); /* tm_year was expanded above */
++
+ #ifdef __BCC__
+ d = p[5] - 1;
+ days = -719163L + ((long)d)*365 + ((d/4) - (d/100) + (d/400) + p[3] + p[7]);