summaryrefslogtreecommitdiffstats
path: root/src/lib/utc-offset.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/utc-offset.c')
-rw-r--r--src/lib/utc-offset.c38
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
+}