diff --git a/src/core/Makefile.am b/src/core/Makefile.am index 4cc2226c..99a2adfc 100644 --- a/src/core/Makefile.am +++ b/src/core/Makefile.am @@ -116,4 +116,12 @@ pkginc_core_HEADERS = \ window-item-def.h \ tls.h \ write-buffer.h \ + signal-registry-macros.h \ + signal-registry.h \ $(structure_headers) + +BUILT_SOURCES = \ + signal-registry.def + +signal-registry.def: signal-registry.def.in + $(top_srcdir)/utils/signals-to-reg.pl $^ > $@ diff --git a/src/core/signal-registry.def b/src/core/signal-registry.def index 45db3a09..653573aa 100644 --- a/src/core/signal-registry.def +++ b/src/core/signal-registry.def @@ -162,7 +162,7 @@ SIGNAL_REGISTER(server_connect_failed, 2, (SERVER_REC *server, const char *msg), server, msg) SIGNAL_REGISTER(server_disconnected, 1, (SERVER_REC *server), server) -SIGNAL_REGISTER(server_quit, 2, (SERVER_REC *server, char *msg), +SIGNAL_REGISTER(server_quit, 2, (SERVER_REC *server, const char *msg), server, msg) SIGNAL_REGISTER(server_sendmsg, 4, (SERVER_REC *server, const char *target, const char *msg, int_in_ptr target_type), server, target, msg, target_type) diff --git a/src/core/signal-registry.def.in b/src/core/signal-registry.def.in index 83d60282..f746248b 100644 --- a/src/core/signal-registry.def.in +++ b/src/core/signal-registry.def.in @@ -97,7 +97,7 @@ "server connecting", SERVER_REC, mem_ptr ip "server connect failed", SERVER_REC, const char *msg "server disconnected", SERVER_REC - "server quit", SERVER_REC, char *msg + "server quit", SERVER_REC, const char *msg "server sendmsg", SERVER_REC, const char *target, const char *msg, int target_type "server destroyed", SERVER_REC diff --git a/src/fe-common/core/Makefile.am b/src/fe-common/core/Makefile.am index cf4e8ee3..9c253580 100644 --- a/src/fe-common/core/Makefile.am +++ b/src/fe-common/core/Makefile.am @@ -69,3 +69,9 @@ pkginc_fe_common_core_HEADERS = \ window-items.h \ windows-layout.h \ fe-windows.h + +BUILT_SOURCES = \ + signal-registry.def + +signal-registry.def: signal-registry.def.in + $(top_srcdir)/utils/signals-to-reg.pl $^ > $@ diff --git a/src/fe-common/irc/Makefile.am b/src/fe-common/irc/Makefile.am index a5e95885..1f6f7cae 100644 --- a/src/fe-common/irc/Makefile.am +++ b/src/fe-common/irc/Makefile.am @@ -42,6 +42,12 @@ pkginc_fe_common_irc_HEADERS = \ module.h \ module-formats.h +BUILT_SOURCES = \ + signal-registry.def + +signal-registry.def: signal-registry.def.in + $(top_srcdir)/utils/signals-to-reg.pl $^ > $@ + DISTFILES = $(DIST_COMMON) $(real_sources) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) distclean-generic: diff --git a/src/fe-text/Makefile.am b/src/fe-text/Makefile.am index 448a9389..5b2dadbf 100644 --- a/src/fe-text/Makefile.am +++ b/src/fe-text/Makefile.am @@ -70,5 +70,11 @@ noinst_HEADERS = \ module.h \ module-formats.h +BUILT_SOURCES = \ + signal-registry.def + +signal-registry.def: signal-registry.def.in + $(top_srcdir)/utils/signals-to-reg.pl $^ > $@ + EXTRA_DIST = \ $(terminfo_sources) diff --git a/src/irc/core/Makefile.am b/src/irc/core/Makefile.am index c668faea..2e00fab2 100644 --- a/src/irc/core/Makefile.am +++ b/src/irc/core/Makefile.am @@ -58,4 +58,11 @@ pkginc_irc_core_HEADERS = \ module.h \ netsplit.h \ servers-idle.h \ - servers-redirect.h + servers-redirect.h \ + signal-registry.h + +BUILT_SOURCES = \ + signal-registry.def + +signal-registry.def: signal-registry.def.in + $(top_srcdir)/utils/signals-to-reg.pl $^ > $@ diff --git a/src/irc/core/irc-servers-reconnect.c b/src/irc/core/irc-servers-reconnect.c index 9564ffa2..c9e5024e 100644 --- a/src/irc/core/irc-servers-reconnect.c +++ b/src/irc/core/irc-servers-reconnect.c @@ -22,6 +22,8 @@ #include "commands.h" #include "network.h" #include "signals.h" +#include "core/signal-registry.h" +#include "signal-registry.h" #include "modes.h" #include "irc-servers.h" @@ -29,79 +31,89 @@ #include "settings.h" static void sig_server_connect_copy(SERVER_CONNECT_REC **dest, - IRC_SERVER_CONNECT_REC *src) + SERVER_CONNECT_REC *src) { - IRC_SERVER_CONNECT_REC *rec; + IRC_SERVER_CONNECT_REC *rec, *irc_src; g_return_if_fail(dest != NULL); - if (!IS_IRC_SERVER_CONNECT(src)) + if ((irc_src = IRC_SERVER_CONNECT(src)) == NULL) return; rec = g_new0(IRC_SERVER_CONNECT_REC, 1); rec->chat_type = IRC_PROTOCOL; - rec->max_cmds_at_once = src->max_cmds_at_once; - rec->cmd_queue_speed = src->cmd_queue_speed; - rec->max_query_chans = src->max_query_chans; - rec->max_kicks = src->max_kicks; - rec->max_modes = src->max_modes; - rec->max_msgs = src->max_msgs; - rec->max_whois = src->max_whois; - rec->usermode = g_strdup(src->usermode); - rec->alternate_nick = g_strdup(src->alternate_nick); - rec->sasl_mechanism = src->sasl_mechanism; - rec->sasl_username = src->sasl_username; - rec->sasl_password = src->sasl_password; + rec->max_cmds_at_once = irc_src->max_cmds_at_once; + rec->cmd_queue_speed = irc_src->cmd_queue_speed; + rec->max_query_chans = irc_src->max_query_chans; + rec->max_kicks = irc_src->max_kicks; + rec->max_modes = irc_src->max_modes; + rec->max_msgs = irc_src->max_msgs; + rec->max_whois = irc_src->max_whois; + rec->usermode = g_strdup(irc_src->usermode); + rec->alternate_nick = g_strdup(irc_src->alternate_nick); + rec->sasl_mechanism = irc_src->sasl_mechanism; + rec->sasl_username = irc_src->sasl_username; + rec->sasl_password = irc_src->sasl_password; *dest = (SERVER_CONNECT_REC *) rec; } -static void sig_server_reconnect_save_status(IRC_SERVER_CONNECT_REC *conn, - IRC_SERVER_REC *server) +static void sig_server_reconnect_save_status(SERVER_CONNECT_REC *conn, + SERVER_REC *server) { - if (!IS_IRC_SERVER_CONNECT(conn) || !IS_IRC_SERVER(server) || + IRC_SERVER_CONNECT_REC *irc_conn; + IRC_SERVER_REC *irc_server; + if ((irc_conn = IRC_SERVER_CONNECT(conn)) == NULL || (irc_server = IRC_SERVER(server)) == NULL || !server->connected) return; - g_free_not_null(conn->channels); - conn->channels = irc_server_get_channels(server); + g_free_not_null(irc_conn->channels); + irc_conn->channels = irc_server_get_channels(irc_server); - g_free_not_null(conn->usermode); - conn->usermode = g_strdup(server->wanted_usermode); + g_free_not_null(irc_conn->usermode); + irc_conn->usermode = g_strdup(irc_server->wanted_usermode); } -static void sig_connected(IRC_SERVER_REC *server) +static void sig_connected(SERVER_REC *server, const char *u0, const char *u1, const char *u2) { - if (!IS_IRC_SERVER(server) || !server->connrec->reconnection) + IRC_SERVER_REC *irc_server; + if ((irc_server = IRC_SERVER(server)) == NULL || !irc_server->connrec->reconnection) return; - if (server->connrec->away_reason != NULL) - irc_server_send_away(server, server->connrec->away_reason); + if (irc_server->connrec->away_reason != NULL) + irc_server_send_away(irc_server, irc_server->connrec->away_reason); } -static void event_nick_collision(IRC_SERVER_REC *server, const char *data) +static void event_nick_collision(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; + time_t new_connect; - if (!IS_IRC_SERVER(server)) + if ((irc_server = IRC_SERVER(server)) == NULL) return; /* after server kills us because of nick collision, we want to connect back immediately. but no matter how hard they kill us, don't connect to the server more than once in every 10 seconds. */ - new_connect = server->connect_time+10 - + new_connect = irc_server->connect_time+10 - settings_get_time("server_reconnect_time")/1000; - if (server->connect_time > new_connect) - server->connect_time = new_connect; + if (irc_server->connect_time > new_connect) + irc_server->connect_time = new_connect; - server->nick_collision = TRUE; + irc_server->nick_collision = TRUE; } -static void event_kill(IRC_SERVER_REC *server, const char *data, +static void event_kill(SERVER_REC *server, const char *data, const char *nick, const char *addr) { - if (addr != NULL && !server->nick_collision) { + IRC_SERVER_REC *irc_server; + + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + + if (addr != NULL && !irc_server->nick_collision) { /* don't reconnect if we were killed by an oper (not server) */ - server->no_reconnect = TRUE; + irc_server->no_reconnect = TRUE; } } diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 2f0e9842..9b1e17ac 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -735,21 +735,25 @@ static void event_connected(SERVER_REC *server, const char *data, const char *fr g_free(params); } -static void event_server_info(IRC_SERVER_REC *server, const char *data) +static void event_server_info(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; char *params, *ircd_version, *usermodes, *chanmodes; g_return_if_fail(server != NULL); params = event_get_params(data, 5, NULL, NULL, &ircd_version, &usermodes, &chanmodes); + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + /* check if server understands I and e channel modes */ if (strchr(chanmodes, 'I') && strchr(chanmodes, 'e')) - server->emode_known = TRUE; + irc_server->emode_known = TRUE; /* save server version */ - g_free_not_null(server->version); - server->version = g_strdup(ircd_version); + g_free_not_null(irc_server->version); + irc_server->version = g_strdup(ircd_version); g_free(params); } @@ -799,15 +803,19 @@ static void parse_prefix(IRC_SERVER_REC *server, const char *sptr) } } -static void event_isupport(IRC_SERVER_REC *server, const char *data) +static void event_isupport(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; char **item, *sptr, *eptr; char **isupport; gpointer key, value; g_return_if_fail(server != NULL); - server->isupport_sent = TRUE; + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + + irc_server->isupport_sent = TRUE; sptr = strchr(data, ' '); if (sptr == NULL) @@ -838,13 +846,13 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data) } key = value = NULL; - if (!g_hash_table_lookup_extended(server->isupport, eptr, + if (!g_hash_table_lookup_extended(irc_server->isupport, eptr, &key, &value) && removed) continue; - g_hash_table_remove(server->isupport, eptr); + g_hash_table_remove(irc_server->isupport, eptr); if (!removed) { - g_hash_table_insert(server->isupport, g_strdup(eptr), + g_hash_table_insert(irc_server->isupport, g_strdup(eptr), g_strdup(sptr != NULL ? sptr : "")); } @@ -852,7 +860,7 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data) g_free(value); } g_strfreev(isupport); - irc_server_init_isupport(server); + irc_server_init_isupport(irc_server); } @@ -877,28 +885,41 @@ static void event_motd(SERVER_REC *server, const char *data, const char *from, c event_connected(server, data, from, NULL); } -static void event_end_of_motd(IRC_SERVER_REC *server, const char *data) +static void event_end_of_motd(SERVER_REC *server, const char *data, const char *u0, const char *u1) { - server->motd_got = TRUE; + IRC_SERVER_REC *irc_server; + + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + + irc_server->motd_got = TRUE; } -static void event_channels_formed(IRC_SERVER_REC *server, const char *data) +static void event_channels_formed(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; char *params, *channels; g_return_if_fail(server != NULL); + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + params = event_get_params(data, 2, NULL, &channels); - server->channels_formed = atoi(channels); + irc_server->channels_formed = atoi(channels); g_free(params); } -static void event_hosthidden(IRC_SERVER_REC *server, const char *data) +static void event_hosthidden(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; char *params, *newhost, *p, *newuserhost; g_return_if_fail(server != NULL); + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + params = event_get_params(data, 2, NULL, &newhost); /* do a sanity check */ if (!strchr(newhost, '*') && !strchr(newhost, '?') && @@ -909,49 +930,62 @@ static void event_hosthidden(IRC_SERVER_REC *server, const char *data) newhost[strlen(newhost) - 1] != '-') { if (strchr(newhost, '@')) { newuserhost = g_strdup(newhost); - g_free(server->userhost); - server->userhost = newuserhost; - } else if (server->userhost != NULL) { + g_free(irc_server->userhost); + irc_server->userhost = newuserhost; + } else if (irc_server->userhost != NULL) { /* no user@, only process if we know the user@ * already */ - p = strchr(server->userhost, '@'); + p = strchr(irc_server->userhost, '@'); if (p == NULL) - p = server->userhost; - newuserhost = g_strdup_printf("%.*s@%s", (int)(p - server->userhost), server->userhost, newhost); - g_free(server->userhost); - server->userhost = newuserhost; + p = irc_server->userhost; + newuserhost = g_strdup_printf("%.*s@%s", (int)(p - irc_server->userhost), irc_server->userhost, newhost); + g_free(irc_server->userhost); + irc_server->userhost = newuserhost; } } g_free(params); } -static void event_server_banned(IRC_SERVER_REC *server, const char *data) +static void event_server_banned(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; + g_return_if_fail(server != NULL); - server->banned = TRUE; + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + + irc_server->banned = TRUE; } -static void event_error(IRC_SERVER_REC *server, const char *data) +static void event_error(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; g_return_if_fail(server != NULL); - if (!server->connected && (stristr(data, "Unauthorized") != NULL || + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + + if (!irc_server->connected && (stristr(data, "Unauthorized") != NULL || stristr(data, "K-lined") != NULL || stristr(data, "Banned") != NULL || stristr(data, "Bad user info") != NULL)) - server->banned = TRUE; + irc_server->banned = TRUE; } -static void event_ping(IRC_SERVER_REC *server, const char *data) +static void event_ping(SERVER_REC *server, const char *data, const char *u0, const char *u1) { + IRC_SERVER_REC *irc_server; char *params, *origin, *target, *str; + if ((irc_server = IRC_SERVER(server)) == NULL) + return; + params = event_get_params(data, 2, &origin, &target); str = *target == '\0' ? g_strconcat("PONG :", origin, NULL) : g_strdup_printf("PONG %s :%s", target, origin); - irc_send_cmd_now(server, str); + irc_send_cmd_now(irc_server, str); g_free(str); g_free(params); } @@ -1051,14 +1085,14 @@ void irc_servers_init(void) signal_add__event_("004", event_server_info); signal_add__event_("005", event_isupport); signal_add__event_("375", event_motd); - signal_add_last__event_376(event_end_of_motd); - signal_add_last__event_422(event_end_of_motd); /* no motd */ + signal_add_last__event_("376", event_end_of_motd); + signal_add_last__event_("422", event_end_of_motd); /* no motd */ signal_add__event_("254", event_channels_formed); signal_add__event_("396", event_hosthidden); signal_add__event_("465", event_server_banned); signal_add__event_("error", event_error); signal_add__event_("ping", event_ping); - signal_add__event_("empty", event_empty); + signal_add__event_("empty", (signal_func_event__t) event_empty); irc_servers_setup_init(); irc_servers_reconnect_init(); @@ -1085,7 +1119,7 @@ void irc_servers_deinit(void) signal_remove__event_("465", event_server_banned); signal_remove__event_("error", event_error); signal_remove__event_("ping", event_ping); - signal_remove__event_("empty", event_empty); + signal_remove__event_("empty", (signal_func_event__t) event_empty); irc_servers_setup_deinit(); irc_servers_reconnect_deinit(); diff --git a/src/irc/core/signal-registry.h b/src/irc/core/signal-registry.h index 772c186f..e33a8d4c 100644 --- a/src/irc/core/signal-registry.h +++ b/src/irc/core/signal-registry.h @@ -20,6 +20,6 @@ typedef struct SERVER_DCC_REC SERVER_DCC_REC; typedef void *int_in_ptr; typedef void *uint_in_ptr; -#include "signal-registry.def" +#include "irc/core/signal-registry.def" #endif diff --git a/src/otr/Makefile.am b/src/otr/Makefile.am index 7cc02d6d..61ab22fd 100644 --- a/src/otr/Makefile.am +++ b/src/otr/Makefile.am @@ -40,3 +40,9 @@ noinst_HEADERS = \ otr-formats.h \ otr-fe.h \ otr.h + +BUILT_SOURCES = \ + signal-registry.def + +signal-registry.def: signal-registry.def.in + $(top_srcdir)/utils/signals-to-reg.pl $^ > $@ diff --git a/utils/Makefile.am b/utils/Makefile.am index 8af5c8f7..290839f7 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -3,4 +3,5 @@ EXTRA_DIST = \ irssi-version.sh \ syntax.pl \ tap-driver.sh \ - tap-test + tap-test \ + signals-to-reg.pl diff --git a/utils/signals-to-reg.pl b/utils/signals-to-reg.pl new file mode 100755 index 00000000..948d6c2e --- /dev/null +++ b/utils/signals-to-reg.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl +use strict; use warnings; + +while (<>) { + my $args = y/,//; + s{^\s* " ([^"]*?)(\s)? "(?:<([^>]+)>)? }{SIGNAL_REGISTER@{[ + $2 ? "_" : "" + ]}(@{[ $1 =~ s/_/__/gr =~ s/ /_/gr ]}, $args@{[ + $2 ? ", const char *\L$3" : ""]}}gx ; + my %X; + s{ (\w+)_REC(,|$) }{$1_REC *\L$1@{[ $X{"\L$1"}++ || "" ]}$2}gx ; + s{ CONFIG_(\w+)(,|$) }{CONFIG_$1 *\L$1@{[ $X{"\L$1"}++ || "" ]}$2}gx ; + /\(/ && s/$/)/ ; + s/ (u?)int (?![*])/ $1int_in_ptr /g; + s{ (SIGNAL_REGISTER(_)?\(\w+,\ (\d+))(,\ (.*?))?\) }{$1, (@{[ $4 ? $5 : "void" ]})@{[ + $4 + ? ",\n\t". $5 =~ s{[^,]* [*]*(\w+)\s*(?:/\*.*?\*/\s*)*(,|$)}{ $1$2}gr + : "" + ]})}gx ; + s{ SIGNAL_REGISTER_\(\w+,\ \d+,\ \([^,]+(?:,\ (.*?))?\),\K}{\n\t(@{[ $1 ? $1 : "void" ]}),}gx ; +} +continue { + print; +}