diff src/lib/utc-offset.c @ 492:efa46e28a0d7 HEAD

Fixes to timezone handling which were handling quite badly. added ioloop_timezone which gets updated with ioloop_time. Changed some GMT references to UTC. Timezone offsets are in minutes now everywhere instead of seconds. Fixes for unsigned time_t.
author Timo Sirainen <tss@iki.fi>
date Thu, 24 Oct 2002 03:15:38 +0300
parents
children 293aac070c2c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/utc-offset.c	Thu Oct 24 03:15:38 2002 +0300
@@ -0,0 +1,59 @@
+/*
+ compat.c : Compatibility functions for OSes not having them
+
+    Copyright (c) 2002 Timo Sirainen
+
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    "Software"), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+
+    The above copyright notice and this permission notice shall be
+    included in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#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)
+		offset = -24 * 60;
+	else if (ltm.tm_yday > gtm.tm_yday)
+		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
+}