Loading...
--- Libc/Libc-583/stdtime/FreeBSD/localtime.c.patch
+++ Libc/Libc-498.1.5/stdtime/FreeBSD/localtime.c.patch
@@ -1,6 +1,6 @@
---- localtime.c.orig 2008-12-15 11:41:07.000000000 -0800
-+++ localtime.c 2009-01-21 15:43:59.000000000 -0800
-@@ -22,8 +22,22 @@ __FBSDID("$FreeBSD: src/lib/libc/stdtime
+--- localtime.c.orig 2007-05-23 18:18:18.000000000 -0700
++++ localtime.c 2007-05-23 18:20:52.000000000 -0700
+@@ -22,8 +22,22 @@
#include "namespace.h"
#include <sys/types.h>
#include <sys/stat.h>
@@ -23,7 +23,15 @@
#include "private.h"
#include "un-namespace.h"
-@@ -135,40 +149,96 @@ struct rule {
+@@ -33,6 +47,7 @@
+
+ #define _MUTEX_LOCK(x) if (__isthreaded) _pthread_mutex_lock(x)
+ #define _MUTEX_UNLOCK(x) if (__isthreaded) _pthread_mutex_unlock(x)
++extern int __pthread_tsd_first;
+
+ /*
+ ** SunOS 4.1.1 headers lack O_BINARY.
+@@ -135,40 +150,96 @@
#define DAY_OF_YEAR 1 /* n - day of year */
#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */
@@ -64,9 +72,9 @@
+ int unix03);
+__private_extern__
+void tzset_basic(void);
-
++
+#define lcl_mutex _st_lcl_mutex
-+
+
+#if !BUILDING_VARIANT
static long detzcode(const char * codep);
-static const char * getzname(const char * strp);
@@ -129,7 +137,7 @@
static int tmcomp(const struct tm * atmp,
const struct tm * btmp);
static time_t transtime(time_t janfirst, int year,
-@@ -194,10 +264,15 @@ static struct state gmtmem;
+@@ -194,10 +265,15 @@
#endif /* !defined TZ_STRLEN_MAX */
static char lcl_TZname[TZ_STRLEN_MAX + 1];
@@ -147,7 +155,7 @@
char * tzname[2] = {
wildabbr,
-@@ -214,15 +289,62 @@ char * tzname[2] = {
+@@ -214,15 +290,62 @@
static struct tm tm;
@@ -212,7 +220,7 @@
static long
detzcode(codep)
const char * const codep;
-@@ -246,14 +368,14 @@ settzname(void)
+@@ -246,14 +369,14 @@
tzname[1] = wildabbr;
#ifdef USG_COMPAT
daylight = 0;
@@ -229,7 +237,7 @@
return;
}
#endif /* defined ALL_STATE */
-@@ -266,7 +388,7 @@ settzname(void)
+@@ -266,7 +389,7 @@
if (ttisp->tt_isdst)
daylight = 1;
if (i == 0 || !ttisp->tt_isdst)
@@ -238,7 +246,7 @@
#endif /* defined USG_COMPAT */
#ifdef ALTZONE
if (i == 0 || ttisp->tt_isdst)
-@@ -286,6 +408,119 @@ settzname(void)
+@@ -286,6 +409,119 @@
}
}
@@ -358,7 +366,7 @@
static int
tzload(name, sp)
const char * name;
-@@ -295,6 +530,9 @@ struct state * const sp;
+@@ -295,6 +531,9 @@
int i;
int fid;
@@ -368,7 +376,7 @@
/* XXX The following is from OpenBSD, and I'm not sure it is correct */
if (name != NULL && issetugid() != 0)
if ((name[0] == ':' && name[1] == '/') ||
-@@ -312,7 +550,15 @@ struct state * const sp;
+@@ -312,7 +551,15 @@
** to hold the longest file name string that the implementation
** guarantees can be opened."
*/
@@ -384,7 +392,7 @@
if (name[0] == ':')
++name;
-@@ -320,7 +566,11 @@ struct state * const sp;
+@@ -320,7 +567,11 @@
if (!doaccess) {
if ((p = TZDIR) == NULL)
return -1;
@@ -396,7 +404,7 @@
return -1;
(void) strcpy(fullname, p);
(void) strcat(fullname, "/");
-@@ -332,6 +582,10 @@ struct state * const sp;
+@@ -332,6 +583,10 @@
doaccess = TRUE;
name = fullname;
}
@@ -407,7 +415,7 @@
if (doaccess && access(name, R_OK) != 0)
return -1;
if ((fid = _open(name, OPEN_MODE)) == -1)
-@@ -350,6 +604,9 @@ struct state * const sp;
+@@ -350,6 +605,9 @@
int ttisstdcnt;
int ttisgmtcnt;
@@ -417,7 +425,7 @@
i = _read(fid, u.buf, sizeof u.buf);
if (_close(fid) != 0)
return -1;
-@@ -456,14 +713,24 @@ static const int year_lengths[2] = {
+@@ -456,14 +714,24 @@
*/
static const char *
@@ -443,7 +451,7 @@
return strp;
}
-@@ -743,16 +1010,15 @@ const int lastditch;
+@@ -743,16 +1011,15 @@
int load_result;
INITIALIZE(dstname);
@@ -462,7 +470,7 @@
if (stdlen < 3)
return -1;
if (*name == '\0')
-@@ -764,12 +1030,14 @@ const int lastditch;
+@@ -764,12 +1031,14 @@
}
}
load_result = tzload(TZDEFRULES, sp);
@@ -479,7 +487,7 @@
if (dstlen < 3)
return -1;
if (*name != '\0' && *name != ',' && *name != ';') {
-@@ -951,8 +1219,19 @@ struct state * const sp;
+@@ -951,8 +1220,19 @@
static void
tzsetwall_basic(void)
{
@@ -499,7 +507,7 @@
lcl_is_set = -1;
#ifdef ALL_STATE
-@@ -966,18 +1245,24 @@ tzsetwall_basic(void)
+@@ -966,18 +1246,24 @@
#endif /* defined ALL_STATE */
if (tzload((char *) NULL, lclptr) != 0)
gmtload(lclptr);
@@ -525,7 +533,7 @@
tzset_basic(void)
{
const char * name;
-@@ -988,8 +1273,18 @@ tzset_basic(void)
+@@ -988,8 +1274,18 @@
return;
}
@@ -544,7 +552,7 @@
lcl_is_set = strlen(name) < sizeof lcl_TZname;
if (lcl_is_set)
(void) strcpy(lcl_TZname, name);
-@@ -1014,15 +1309,25 @@ tzset_basic(void)
+@@ -1014,15 +1310,25 @@
lclptr->ttis[0].tt_gmtoff = 0;
lclptr->ttis[0].tt_abbrind = 0;
(void) strcpy(lclptr->chars, gmt);
@@ -570,7 +578,7 @@
_MUTEX_LOCK(&lcl_mutex);
tzset_basic();
_MUTEX_UNLOCK(&lcl_mutex);
-@@ -1038,7 +1343,11 @@ tzset(void)
+@@ -1038,7 +1344,11 @@
*/
/*ARGSUSED*/
@@ -583,7 +591,7 @@
localsub(timep, offset, tmp)
const time_t * const timep;
const long offset;
-@@ -1049,11 +1358,18 @@ struct tm * const tmp;
+@@ -1049,11 +1359,18 @@
int i;
const time_t t = *timep;
@@ -602,7 +610,7 @@
}
#endif /* defined ALL_STATE */
if (sp->timecnt == 0 || t < sp->ats[0]) {
-@@ -1076,12 +1392,20 @@ struct tm * const tmp;
+@@ -1076,12 +1393,20 @@
** t += ttisp->tt_gmtoff;
** timesub(&t, 0L, sp, tmp);
*/
@@ -623,19 +631,19 @@
}
struct tm *
-@@ -1094,8 +1418,9 @@ const time_t * const timep;
+@@ -1094,8 +1419,9 @@
if (__isthreaded != 0) {
_pthread_mutex_lock(&localtime_mutex);
- if (localtime_key < 0) {
- if (_pthread_key_create(&localtime_key, free) < 0) {
+ if (localtime_key == (pthread_key_t)-1) {
-+ localtime_key = __LIBC_PTHREAD_KEY_LOCALTIME;
++ localtime_key = __pthread_tsd_first + 2;
+ if (pthread_key_init_np(localtime_key, free) < 0) {
_pthread_mutex_unlock(&localtime_mutex);
return(NULL);
}
-@@ -1110,13 +1435,21 @@ const time_t * const timep;
+@@ -1110,13 +1436,21 @@
}
_pthread_mutex_lock(&lcl_mutex);
tzset_basic();
@@ -657,7 +665,7 @@
}
}
-@@ -1125,13 +1458,15 @@ const time_t * const timep;
+@@ -1125,13 +1459,15 @@
*/
struct tm *
@@ -676,7 +684,7 @@
_MUTEX_UNLOCK(&lcl_mutex);
return tm;
}
-@@ -1140,23 +1475,48 @@ struct tm * tm;
+@@ -1140,23 +1476,48 @@
** gmtsub is to gmtime as localsub is to localtime.
*/
@@ -726,7 +734,7 @@
#ifdef TM_ZONE
/*
** Could get fancy here and deliver something such as
-@@ -1168,7 +1528,7 @@ struct tm * const tmp;
+@@ -1168,7 +1529,7 @@
else {
#ifdef ALL_STATE
if (gmtptr == NULL)
@@ -735,7 +743,7 @@
else tmp->TM_ZONE = gmtptr->chars;
#endif /* defined ALL_STATE */
#ifndef ALL_STATE
-@@ -1176,6 +1536,9 @@ struct tm * const tmp;
+@@ -1176,6 +1537,9 @@
#endif /* State Farm */
}
#endif /* defined TM_ZONE */
@@ -745,7 +753,7 @@
}
struct tm *
-@@ -1186,10 +1549,12 @@ const time_t * const timep;
+@@ -1186,10 +1550,12 @@
static pthread_key_t gmtime_key = -1;
struct tm *p_tm;
@@ -755,12 +763,12 @@
- if (gmtime_key < 0) {
- if (_pthread_key_create(&gmtime_key, free) < 0) {
+ if (gmtime_key == (pthread_key_t)-1) {
-+ gmtime_key = __LIBC_PTHREAD_KEY_GMTIME;
++ gmtime_key = __pthread_tsd_first + 3;
+ if (pthread_key_init_np(gmtime_key, free) < 0) {
_pthread_mutex_unlock(&gmtime_mutex);
return(NULL);
}
-@@ -1206,12 +1571,20 @@ const time_t * const timep;
+@@ -1206,12 +1572,20 @@
}
_pthread_setspecific(gmtime_key, p_tm);
}
@@ -781,7 +789,7 @@
}
}
-@@ -1224,8 +1597,13 @@ gmtime_r(timep, tm)
+@@ -1224,8 +1598,13 @@
const time_t * const timep;
struct tm * tm;
{
@@ -795,7 +803,7 @@
}
#ifdef STD_INSPIRED
-@@ -1235,13 +1613,21 @@ offtime(timep, offset)
+@@ -1235,13 +1614,21 @@
const time_t * const timep;
const long offset;
{
@@ -817,7 +825,7 @@
timesub(timep, offset, sp, tmp)
const time_t * const timep;
const long offset;
-@@ -1330,7 +1716,16 @@ struct tm * const tmp;
+@@ -1330,7 +1717,16 @@
LEAPS_THRU_END_OF(y - 1);
y = newy;
}
@@ -834,7 +842,7 @@
tmp->tm_yday = (int) days;
ip = mon_lengths[yleap];
for (tmp->tm_mon = 0; days >= (long) ip[tmp->tm_mon]; ++(tmp->tm_mon))
-@@ -1340,6 +1735,9 @@ struct tm * const tmp;
+@@ -1340,6 +1736,9 @@
#ifdef TM_GMTOFF
tmp->TM_GMTOFF = offset;
#endif /* defined TM_GMTOFF */
@@ -844,47 +852,7 @@
}
char *
-@@ -1352,7 +1750,20 @@ const time_t * const timep;
- ** to local time in the form of a string. It is equivalent to
- ** asctime(localtime(timer))
- */
-+#ifdef __LP64__
-+ /*
-+ * In 64-bit, the timep value may produce a time value with a year
-+ * that exceeds 32-bits in size (won't fit in struct tm), so localtime
-+ * will return NULL.
-+ */
-+ struct tm *tm = localtime(timep);
-+
-+ if (tm == NULL)
-+ return NULL;
-+ return asctime(tm);
-+#else /* !__LP64__ */
- return asctime(localtime(timep));
-+#endif /* __LP64__ */
- }
-
- char *
-@@ -1362,7 +1773,18 @@ char * buf;
- {
- struct tm tm;
-
-+#ifdef __LP64__
-+ /*
-+ * In 64-bit, the timep value may produce a time value with a year
-+ * that exceeds 32-bits in size (won't fit in struct tm), so localtime_r
-+ * will return NULL.
-+ */
-+ if (localtime_r(timep, &tm) == NULL)
-+ return NULL;
-+ return asctime_r(&tm, buf);
-+#else /* !__LP64__ */
- return asctime_r(localtime_r(timep, &tm), buf);
-+#endif /* __LP64__ */
- }
-
- /*
-@@ -1427,12 +1849,17 @@ const struct tm * const btmp;
+@@ -1427,12 +1826,17 @@
}
static time_t
@@ -903,7 +871,7 @@
{
const struct state * sp;
int dir;
-@@ -1442,6 +1869,9 @@ const int do_norm_secs;
+@@ -1442,6 +1846,9 @@
time_t newt;
time_t t;
struct tm yourtm, mytm;
@@ -913,7 +881,7 @@
*okayp = FALSE;
yourtm = *tmp;
-@@ -1460,33 +1890,64 @@ const int do_norm_secs;
+@@ -1460,33 +1867,64 @@
** Turn yourtm.tm_year into an actual year number for now.
** It is converted back to an offset from TM_YEAR_BASE later.
*/
@@ -978,21 +946,7 @@
/* Don't go below 1900 for POLA */
if (yourtm.tm_year < 0)
return WRONG;
-@@ -1513,7 +1974,13 @@ const int do_norm_secs;
- ** Divide the search space in half
- ** (this works whether time_t is signed or unsigned).
- */
-+#ifdef __LP64__
-+ /* optimization: see if the value is 31-bit (signed) */
-+ t = (((time_t) 1) << (TYPE_BIT(int) - 1)) - 1;
-+ bits = ((*funcp)(&t, offset, &mytm) == NULL || tmcomp(&mytm, &yourtm) < 0) ? TYPE_BIT(time_t) - 1 : TYPE_BIT(int) - 1;
-+#else /* !__LP64__ */
- bits = TYPE_BIT(time_t) - 1;
-+#endif /* __LP64__ */
- /*
- ** If we have more than this, we will overflow tm_year for tmcomp().
- ** We should really return an error if we cannot represent it.
-@@ -1527,8 +1994,19 @@ const int do_norm_secs;
+@@ -1527,8 +1965,19 @@
*/
t = TYPE_SIGNED(time_t) ? 0 : (((time_t) 1) << bits);
for ( ; ; ) {
@@ -1012,7 +966,7 @@
if (dir != 0) {
if (bits-- < 0)
return WRONG;
-@@ -1539,6 +2017,9 @@ const int do_norm_secs;
+@@ -1539,6 +1988,9 @@
else t += ((time_t) 1) << bits;
continue;
}
@@ -1022,7 +976,7 @@
if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
break;
/*
-@@ -1547,7 +2028,6 @@ const int do_norm_secs;
+@@ -1547,7 +1999,6 @@
** It's okay to guess wrong since the guess
** gets checked.
*/
@@ -1030,7 +984,7 @@
#ifdef ALL_STATE
if (sp == NULL)
return WRONG;
-@@ -1560,7 +2040,12 @@ const int do_norm_secs;
+@@ -1560,7 +2011,12 @@
continue;
newt = t + sp->ttis[j].tt_gmtoff -
sp->ttis[i].tt_gmtoff;
@@ -1043,7 +997,7 @@
if (tmcomp(&mytm, &yourtm) != 0)
continue;
if (mytm.tm_isdst != yourtm.tm_isdst)
-@@ -1579,17 +2064,27 @@ label:
+@@ -1579,17 +2035,27 @@
if ((newt < t) != (saved_seconds < 0))
return WRONG;
t = newt;
@@ -1072,7 +1026,7 @@
{
time_t t;
-@@ -1598,15 +2093,20 @@ int * const okayp;
+@@ -1598,15 +2064,20 @@
** (in case tm_sec contains a value associated with a leap second).
** If that fails, try with normalization of seconds.
*/
@@ -1097,7 +1051,7 @@
{
time_t t;
const struct state * sp;
-@@ -1620,7 +2120,7 @@ const long offset;
+@@ -1620,7 +2091,7 @@
if (tmp->tm_isdst > 1)
tmp->tm_isdst = 1;
@@ -1106,7 +1060,7 @@
#ifdef PCTS
/*
** PCTS code courtesy Grant Sullivan (grant@osf.org).
-@@ -1664,7 +2164,7 @@ const long offset;
+@@ -1664,7 +2135,7 @@
tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
sp->ttis[samei].tt_gmtoff;
tmp->tm_isdst = !tmp->tm_isdst;
@@ -1115,7 +1069,7 @@
if (okay)
return t;
tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
-@@ -1674,19 +2174,25 @@ const long offset;
+@@ -1674,19 +2145,25 @@
}
return WRONG;
}
@@ -1142,7 +1096,7 @@
#ifdef STD_INSPIRED
time_t
-@@ -1702,7 +2208,7 @@ timegm(tmp)
+@@ -1702,7 +2179,7 @@
struct tm * const tmp;
{
tmp->tm_isdst = 0;
@@ -1151,7 +1105,7 @@
}
time_t
-@@ -1711,7 +2217,7 @@ struct tm * const tmp;
+@@ -1711,7 +2188,7 @@
const long offset;
{
tmp->tm_isdst = 0;
@@ -1160,7 +1114,7 @@
}
#endif /* defined STD_INSPIRED */
-@@ -1811,3 +2317,4 @@ time_t t;
+@@ -1811,3 +2288,4 @@
}
#endif /* defined STD_INSPIRED */