From c7728ea5aa2f4e584159b3d12ad815294c44ca6a Mon Sep 17 00:00:00 2001 From: Ailin Nemui Date: Tue, 17 Mar 2020 14:32:52 +0100 Subject: [PATCH] add compatibility code to GTimeVal -> gint64 transition this is for irssi/irssi#1145 --- src/core/xep/ping.c | 50 +++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/core/xep/ping.c b/src/core/xep/ping.c index d51930a..7b811cb 100644 --- a/src/core/xep/ping.c +++ b/src/core/xep/ping.c @@ -36,15 +36,40 @@ #define XMLNS_PING "urn:xmpp:ping" +#if defined(IRSSI_ABI_VERSION) && IRSSI_ABI_VERSION >= 25 +#define NO_TIMEVAL +#define TimeType gint64 +#else +#define TimeType GTimeVal +#endif + struct ping_data { - char *id; - GTimeVal time; + char *id; + TimeType time; }; static int timeout_tag; static GSList *supported_servers; static DATALIST *pings; +#ifdef NO_TIMEVAL + +#define set_current_time(var) (var) = g_get_real_time() +#define clear_time(var) (var) = 0 +#define has_time(var) ((var) != 0) +#define get_time_sec(var) ((var) / G_TIME_SPAN_SECOND) +#define get_time_diff(to, from) (to) - (from) + +#else + +#define set_current_time(var) g_get_current_time(&(var)) +#define clear_time(var) memset(&(var), 0, sizeof((var))) +#define has_time(var) ((var).tv_sec != 0) +#define get_time_sec(var) ((var).tv_sec) +#define get_time_diff(to, from) (int) get_timeval_diff(&(to), &(from)) + +#endif + static void request_ping(XMPP_SERVER_REC *server, const char *dest) { @@ -63,13 +88,13 @@ request_ping(XMPP_SERVER_REC *server, const char *dest) g_free(server->ping_id); server->ping_id = g_strdup(lm_message_node_get_attribute(lmsg->node, "id")); - g_get_current_time(&server->lag_sent); + set_current_time(server->lag_sent); server->lag_last_check = time(NULL); } else { pd = g_new0(struct ping_data, 1); pd->id = g_strdup(lm_message_node_get_attribute(lmsg->node, "id")); - g_get_current_time(&pd->time); + set_current_time(pd->time); datalist_add(pings, server, dest, pd); } signal_emit("xmpp send iq", 2, server, lmsg); @@ -98,7 +123,7 @@ sig_recv_iq(XMPP_SERVER_REC *server, LmMessage *lmsg, const int type, { DATALIST_REC *rec; LmMessageNode *node; - GTimeVal now; + TimeType now; struct ping_data *pd; if (type == LM_MESSAGE_SUB_TYPE_RESULT) { @@ -106,19 +131,18 @@ sig_recv_iq(XMPP_SERVER_REC *server, LmMessage *lmsg, const int type, if (server->ping_id != NULL && (*from == '\0' || strcmp(from, server->domain) == 0) && strcmp(id, server->ping_id) == 0) { - g_get_current_time(&now); - server->lag = - (int)get_timeval_diff(&now, &server->lag_sent); - memset(&server->lag_sent, 0, sizeof(server->lag_sent)); + set_current_time(now); + server->lag = get_time_diff(now, server->lag_sent); + clear_time(server->lag_sent); g_free_and_null(server->ping_id); signal_emit("server lag", 1, server); } else if (lmsg->node->children == NULL && (rec = datalist_find(pings, server, from)) != NULL) { pd = rec->data; if (strcmp(id, pd->id) == 0) { - g_get_current_time(&now); + set_current_time(now); signal_emit("xmpp ping", 3, server, from, - get_timeval_diff(&now, &pd->time)); + get_time_diff(now, pd->time)); } } } else if (type == LM_MESSAGE_SUB_TYPE_GET) { @@ -166,10 +190,10 @@ check_ping_func(void) now = time(NULL); for (tmp = supported_servers; tmp != NULL; tmp = tmp->next) { server = XMPP_SERVER(tmp->data); - if (server->lag_sent.tv_sec != 0) { + if (has_time(server->lag_sent)) { /* waiting for lag reply */ if (max_lag > 1 && - (now - server->lag_sent.tv_sec) > max_lag) { + (now - get_time_sec(server->lag_sent)) > max_lag) { /* too much lag - disconnect */ signal_emit("server lag disconnect", 1, server);