summary refs log tree commit diff stats
path: root/src/common/proto-irc.c
diff options
context:
space:
mode:
authorTingPing <tngpng@gmail.com>2013-07-01 18:51:51 -0700
committerTingPing <tngpng@gmail.com>2013-07-01 18:51:51 -0700
commit340811da6ed28f6ea0e30f27ce041cfc0a263bef (patch)
tree1f4128ea7ef6260de4232648a7b8d965a3883ced /src/common/proto-irc.c
parent82277a80eae4e300935a6e90f053a5b22fac5850 (diff)
parent4b40597c76063e0d97c6e0b6295c72caf3dc2d07 (diff)
Merge pull request #665 from orium/freebsd-fixes
Freebsd fixes
Diffstat (limited to 'src/common/proto-irc.c')
-rw-r--r--src/common/proto-irc.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c
index 7742c064..29102afc 100644
--- a/src/common/proto-irc.c
+++ b/src/common/proto-irc.c
@@ -1326,6 +1326,34 @@ process_named_servermsg (session *sess, char *buf, char *rawname, char *word_eol
 								  rawname, NULL, 0, tags_data->timestamp);
 }
 
+/* Returns the timezone offset. This should be the same as the variable
+ * "timezone" in time.h, but *BSD doesn't have it.
+ */
+static int
+get_timezone(void)
+{
+	struct tm tm_utc, tm_local;
+	time_t t, time_utc, time_local;
+
+	time (&t);
+
+	/* gmtime() and localtime() are thread-safe on windows.
+	 * on other systems we should use {gmtime,localtime}_r().
+	 */
+#if WIN32
+	tm_utc = *gmtime (&t);
+	tm_local = *localtime (&t);
+#else
+	gmtime_r (&t, &tm_utc);
+	localtime_r (&t, &tm_local);
+#endif
+
+	time_utc = mktime (&tm_utc);
+	time_local = mktime (&tm_local);
+
+	return time_utc - time_local;
+}
+
 /* Handle time-server tags.
  * 
  * Sets tags_data->timestamp to the correct time (in unix time). 
@@ -1370,7 +1398,7 @@ handle_message_tag_time (const char *time, message_tags_data *tags_data)
 		}
 
 		/* get rid of the local time (mktime() receives a local calendar time) */
-		tags_data->timestamp -= timezone;
+		tags_data->timestamp -= get_timezone();
 	}
 	else
 	{