diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
commit | f7548d6d28c313cf80e6f3ef89aed16a19815df1 (patch) | |
tree | a3f6f2a3f247293bee59ecd28e8cd8ceb6ca064a /src/lib/utc-offset.c | |
parent | Initial commit. (diff) | |
download | dovecot-f7548d6d28c313cf80e6f3ef89aed16a19815df1.tar.xz dovecot-f7548d6d28c313cf80e6f3ef89aed16a19815df1.zip |
Adding upstream version 1:2.3.19.1+dfsg1.upstream/1%2.3.19.1+dfsg1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib/utc-offset.c')
-rw-r--r-- | src/lib/utc-offset.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/lib/utc-offset.c b/src/lib/utc-offset.c new file mode 100644 index 0000000..d3b4bd2 --- /dev/null +++ b/src/lib/utc-offset.c @@ -0,0 +1,38 @@ +/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "utc-offset.h" + +#include <sys/time.h> + +int utc_offset(struct tm *tm, time_t t ATTR_UNUSED) +{ +#ifdef HAVE_TM_GMTOFF + return (int) (tm->tm_gmtoff/60); +#else + struct tm ltm, gtm; + int offset; + + /* gmtime() overwrites tm, so we need to copy it elsewhere */ + ltm = *tm; + tm = gmtime(&t); + gtm = *tm; + + /* max offset of 24 hours */ + if ((ltm.tm_yday < gtm.tm_yday && ltm.tm_year == gtm.tm_year) || + ltm.tm_year < gtm.tm_year) + offset = -24 * 60; + else if ((ltm.tm_yday > gtm.tm_yday && ltm.tm_year == gtm.tm_year) || + ltm.tm_year > gtm.tm_year) + offset = 24 * 60; + else + offset = 0; + + offset += (ltm.tm_hour - gtm.tm_hour) * 60; + offset += (ltm.tm_min - gtm.tm_min); + + /* restore overwritten tm */ + *tm = ltm; + return offset; +#endif +} |