aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_time_sup.c
diff options
context:
space:
mode:
authorPatrik Nyblom <[email protected]>2010-08-30 14:21:01 +0200
committerPatrik Nyblom <[email protected]>2010-08-30 14:21:01 +0200
commit5b91c9f8e79f0e8eb0a5816fd54c5603f1c6df29 (patch)
tree75f82a9f7ef3367a8bfceff7333ff265023700b4 /erts/emulator/beam/erl_time_sup.c
parent1297a3ade2851be787a4c6a64d5f57d81761c8f5 (diff)
parent7e6fe78278c203c3756ce0d6bf23a6bd6cf7bb5d (diff)
downloadotp-5b91c9f8e79f0e8eb0a5816fd54c5603f1c6df29.tar.gz
otp-5b91c9f8e79f0e8eb0a5816fd54c5603f1c6df29.tar.bz2
otp-5b91c9f8e79f0e8eb0a5816fd54c5603f1c6df29.zip
Merge branch 'pan/local_univ_time_bsd/OTP-8580' into dev
* pan/local_univ_time_bsd/OTP-8580: Teach erl_time_sup to handle timezones w/o DST on FreeBSD as on other platforms
Diffstat (limited to 'erts/emulator/beam/erl_time_sup.c')
-rw-r--r--erts/emulator/beam/erl_time_sup.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_time_sup.c b/erts/emulator/beam/erl_time_sup.c
index c15f85f8f1..7b8706ea13 100644
--- a/erts/emulator/beam/erl_time_sup.c
+++ b/erts/emulator/beam/erl_time_sup.c
@@ -650,6 +650,22 @@ local_to_univ(Sint *year, Sint *month, Sint *day,
t.tm_sec = *second;
t.tm_isdst = isdst;
the_clock = mktime(&t);
+ if (the_clock == -1) {
+ if (isdst) {
+ /* If this is a timezone without DST and the OS (correctly)
+ refuses to give us a DST time, we simulate the Linux/Solaris
+ behaviour of giving the same data as if is_dst was not set. */
+ t.tm_isdst = 0;
+ the_clock = mktime(&t);
+ if (the_clock == -1) {
+ /* Failed anyway, something else is bad - will be a badarg */
+ return 0;
+ }
+ } else {
+ /* Something else is the matter, badarg. */
+ return 0;
+ }
+ }
#ifdef HAVE_GMTIME_R
gmtime_r(&the_clock, (tm = &tmbuf));
#else
@@ -663,6 +679,10 @@ local_to_univ(Sint *year, Sint *month, Sint *day,
*second = tm->tm_sec;
return 1;
}
+#if defined(HAVE_POSIX2TIME) && defined(HAVE_DECL_POSIX2TIME) && \
+ !HAVE_DECL_POSIX2TIME
+extern time_t posix2time(time_t);
+#endif
int
univ_to_local(Sint *year, Sint *month, Sint *day,