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 { diff --git a/src/fe-gtk/banlist.c b/src/fe-gtk/banlist.c index 897e61d6..d80d9333 100644 --- a/src/fe-gtk/banlist.c +++ b/src/fe-gtk/banlist.c @@ -323,10 +323,14 @@ banlist_copyentry (GtkWidget *menuitem, GtkTreeView *view) GtkTreeModel *model; GtkTreeSelection *sel; GtkTreeIter iter; - GValue mask = G_VALUE_INIT; - GValue from = G_VALUE_INIT; - GValue date = G_VALUE_INIT; + GValue mask; + GValue from; + GValue date; char *str; + + memset (&mask, 0, sizeof (mask)); + memset (&from, 0, sizeof (from)); + memset (&date, 0, sizeof (date)); /* get selection (which should have been set on click) * and temporarily switch to single mode to get selected iter */