--- perl-5.8.8/config_h.SH.bz172396 2005-10-31 13:13:05.000000000 -0500 +++ perl-5.8.8/config_h.SH 2006-03-27 16:09:01.000000000 -0500 @@ -1912,7 +1912,18 @@ */ #$d_localtime_r HAS_LOCALTIME_R /**/ #define LOCALTIME_R_PROTO $localtime_r_proto /**/ - +/* LOCALTIME_R_NEEDS_TZSET : + * many libc's localtime_r implementations do not call tzset, + * making them differ from localtime(), and making timezone + * changes using $ENV{TZ} without explicitly calling tzset + * impossible. This symbol makes us call tzset before localtime_r: + */ +#$d_localtime_r_needs_tzset LOCALTIME_R_NEEDS_TZSET /**/ +#ifdef LOCALTIME_R_NEEDS_TZSET +#define L_R_TZSET tzset(), +#else +#define L_R_TZSET +#endif /* HAS_LONG_DOUBLE: * This symbol will be defined if the C compiler supports long * doubles. --- perl-5.8.8/reentr.inc.bz172396 2006-03-27 16:09:01.000000000 -0500 +++ perl-5.8.8/reentr.inc 2006-03-27 16:09:01.000000000 -0500 @@ -1368,10 +1368,10 @@ #ifdef HAS_LOCALTIME_R # undef localtime # if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_S_TS -# define localtime(a) (localtime_r(a, &PL_reentrant_buffer->_localtime_struct) ? &PL_reentrant_buffer->_localtime_struct : 0) +# define localtime(a) ( L_R_TZSET localtime_r(a, &PL_reentrant_buffer->_localtime_struct) ? &PL_reentrant_buffer->_localtime_struct : 0) # endif # if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_I_TS -# define localtime(a) (localtime_r(a, &PL_reentrant_buffer->_localtime_struct) == 0 ? &PL_reentrant_buffer->_localtime_struct : 0) +# define localtime(a) ( L_R_TZSET localtime_r(a, &PL_reentrant_buffer->_localtime_struct) == 0 ? &PL_reentrant_buffer->_localtime_struct : 0) # endif #endif /* HAS_LOCALTIME_R */ --- perl-5.8.8/Configure.bz172396 2006-03-27 16:09:01.000000000 -0500 +++ perl-5.8.8/Configure 2006-03-27 16:09:33.000000000 -0500 @@ -542,6 +542,7 @@ d_libm_lib_version='' d_link='' d_localtime_r='' +d_localtime_r_needs_tzset='' localtime_r_proto='' d_locconv='' d_lockf='' @@ -14261,7 +14262,58 @@ *) localtime_r_proto=0 ;; esac +: see if localtime_r calls tzset +case "$localtime_r_proto" in +REENTRANT_PROTO*) + $cat >try.c < +#include +#include +#include +#include +int main() +{ + time_t t = time(0L); + char w_tz[]="TZ=GMT+5", + e_tz[]="TZ=GMT-5", + *tz_e = (char*)malloc(16), + *tz_w = (char*)malloc(16); + struct tm tm_e, tm_w; + + strcpy(tz_e,e_tz); + strcpy(tz_w,w_tz); + putenv(tz_e); + localtime_r(&t, &tm_e); + + putenv(tz_w); + localtime_r(&t, &tm_w); + + if( memcmp(&tm_e, &tm_w, sizeof(struct tm)) == 0 ) + return 1; + return 0; +} +EOCP + set try + if eval $compile; then + if ./try; then + d_localtime_r_needs_tzset=undef; + else + d_localtime_r_needs_tzset=define; + fi; + rm -f ./try; + else + d_localtime_r_needs_tzset=undef; + fi; + rm -f try.c; + ;; + *) + d_localtime_r_needs_tzset=undef; + ;; +esac : see if localeconv exists set localeconv d_locconv eval $inlibc @@ -21220,6 +21272,7 @@ d_libm_lib_version='$d_libm_lib_version' d_link='$d_link' d_localtime_r='$d_localtime_r' +d_localtime_r_needs_tzset='$d_localtime_r_needs_tzset' d_locconv='$d_locconv' d_lockf='$d_lockf' d_longdbl='$d_longdbl'