diff options
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.patch | 101 |
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]); |