diff options
author | Patrik Nyblom <[email protected]> | 2010-08-30 14:21:01 +0200 |
---|---|---|
committer | Patrik Nyblom <[email protected]> | 2010-08-30 14:21:01 +0200 |
commit | 5b91c9f8e79f0e8eb0a5816fd54c5603f1c6df29 (patch) | |
tree | 75f82a9f7ef3367a8bfceff7333ff265023700b4 /erts/emulator/beam/erl_time_sup.c | |
parent | 1297a3ade2851be787a4c6a64d5f57d81761c8f5 (diff) | |
parent | 7e6fe78278c203c3756ce0d6bf23a6bd6cf7bb5d (diff) | |
download | otp-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.c | 20 |
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, |