This commit is contained in:
ailin-nemui 2018-11-24 19:59:48 +01:00
parent d46d83a3b0
commit 775c3186ea
13 changed files with 184 additions and 74 deletions

View File

@ -116,4 +116,12 @@ pkginc_core_HEADERS = \
window-item-def.h \ window-item-def.h \
tls.h \ tls.h \
write-buffer.h \ write-buffer.h \
signal-registry-macros.h \
signal-registry.h \
$(structure_headers) $(structure_headers)
BUILT_SOURCES = \
signal-registry.def
signal-registry.def: signal-registry.def.in
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@

View File

@ -162,7 +162,7 @@ SIGNAL_REGISTER(server_connect_failed, 2, (SERVER_REC *server, const char *msg),
server, msg) server, msg)
SIGNAL_REGISTER(server_disconnected, 1, (SERVER_REC *server), SIGNAL_REGISTER(server_disconnected, 1, (SERVER_REC *server),
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) server, msg)
SIGNAL_REGISTER(server_sendmsg, 4, (SERVER_REC *server, const char *target, const char *msg, int_in_ptr target_type), SIGNAL_REGISTER(server_sendmsg, 4, (SERVER_REC *server, const char *target, const char *msg, int_in_ptr target_type),
server, target, msg, target_type) server, target, msg, target_type)

View File

@ -97,7 +97,7 @@
"server connecting", SERVER_REC, mem_ptr ip "server connecting", SERVER_REC, mem_ptr ip
"server connect failed", SERVER_REC, const char *msg "server connect failed", SERVER_REC, const char *msg
"server disconnected", SERVER_REC "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 sendmsg", SERVER_REC, const char *target, const char *msg, int target_type
"server destroyed", SERVER_REC "server destroyed", SERVER_REC

View File

@ -69,3 +69,9 @@ pkginc_fe_common_core_HEADERS = \
window-items.h \ window-items.h \
windows-layout.h \ windows-layout.h \
fe-windows.h fe-windows.h
BUILT_SOURCES = \
signal-registry.def
signal-registry.def: signal-registry.def.in
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@

View File

@ -42,6 +42,12 @@ pkginc_fe_common_irc_HEADERS = \
module.h \ module.h \
module-formats.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) DISTFILES = $(DIST_COMMON) $(real_sources) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
distclean-generic: distclean-generic:

View File

@ -70,5 +70,11 @@ noinst_HEADERS = \
module.h \ module.h \
module-formats.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 = \ EXTRA_DIST = \
$(terminfo_sources) $(terminfo_sources)

View File

@ -58,4 +58,11 @@ pkginc_irc_core_HEADERS = \
module.h \ module.h \
netsplit.h \ netsplit.h \
servers-idle.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 $^ > $@

View File

@ -22,6 +22,8 @@
#include "commands.h" #include "commands.h"
#include "network.h" #include "network.h"
#include "signals.h" #include "signals.h"
#include "core/signal-registry.h"
#include "signal-registry.h"
#include "modes.h" #include "modes.h"
#include "irc-servers.h" #include "irc-servers.h"
@ -29,79 +31,89 @@
#include "settings.h" #include "settings.h"
static void sig_server_connect_copy(SERVER_CONNECT_REC **dest, 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); g_return_if_fail(dest != NULL);
if (!IS_IRC_SERVER_CONNECT(src)) if ((irc_src = IRC_SERVER_CONNECT(src)) == NULL)
return; return;
rec = g_new0(IRC_SERVER_CONNECT_REC, 1); rec = g_new0(IRC_SERVER_CONNECT_REC, 1);
rec->chat_type = IRC_PROTOCOL; rec->chat_type = IRC_PROTOCOL;
rec->max_cmds_at_once = src->max_cmds_at_once; rec->max_cmds_at_once = irc_src->max_cmds_at_once;
rec->cmd_queue_speed = src->cmd_queue_speed; rec->cmd_queue_speed = irc_src->cmd_queue_speed;
rec->max_query_chans = src->max_query_chans; rec->max_query_chans = irc_src->max_query_chans;
rec->max_kicks = src->max_kicks; rec->max_kicks = irc_src->max_kicks;
rec->max_modes = src->max_modes; rec->max_modes = irc_src->max_modes;
rec->max_msgs = src->max_msgs; rec->max_msgs = irc_src->max_msgs;
rec->max_whois = src->max_whois; rec->max_whois = irc_src->max_whois;
rec->usermode = g_strdup(src->usermode); rec->usermode = g_strdup(irc_src->usermode);
rec->alternate_nick = g_strdup(src->alternate_nick); rec->alternate_nick = g_strdup(irc_src->alternate_nick);
rec->sasl_mechanism = src->sasl_mechanism; rec->sasl_mechanism = irc_src->sasl_mechanism;
rec->sasl_username = src->sasl_username; rec->sasl_username = irc_src->sasl_username;
rec->sasl_password = src->sasl_password; rec->sasl_password = irc_src->sasl_password;
*dest = (SERVER_CONNECT_REC *) rec; *dest = (SERVER_CONNECT_REC *) rec;
} }
static void sig_server_reconnect_save_status(IRC_SERVER_CONNECT_REC *conn, static void sig_server_reconnect_save_status(SERVER_CONNECT_REC *conn,
IRC_SERVER_REC *server) 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) !server->connected)
return; return;
g_free_not_null(conn->channels); g_free_not_null(irc_conn->channels);
conn->channels = irc_server_get_channels(server); irc_conn->channels = irc_server_get_channels(irc_server);
g_free_not_null(conn->usermode); g_free_not_null(irc_conn->usermode);
conn->usermode = g_strdup(server->wanted_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; return;
if (server->connrec->away_reason != NULL) if (irc_server->connrec->away_reason != NULL)
irc_server_send_away(server, server->connrec->away_reason); 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; time_t new_connect;
if (!IS_IRC_SERVER(server)) if ((irc_server = IRC_SERVER(server)) == NULL)
return; return;
/* after server kills us because of nick collision, we want to /* after server kills us because of nick collision, we want to
connect back immediately. but no matter how hard they kill us, connect back immediately. but no matter how hard they kill us,
don't connect to the server more than once in every 10 seconds. */ 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; settings_get_time("server_reconnect_time")/1000;
if (server->connect_time > new_connect) if (irc_server->connect_time > new_connect)
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) 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) */ /* don't reconnect if we were killed by an oper (not server) */
server->no_reconnect = TRUE; irc_server->no_reconnect = TRUE;
} }
} }

View File

@ -735,21 +735,25 @@ static void event_connected(SERVER_REC *server, const char *data, const char *fr
g_free(params); 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; char *params, *ircd_version, *usermodes, *chanmodes;
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
params = event_get_params(data, 5, NULL, NULL, &ircd_version, &usermodes, &chanmodes); 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 */ /* check if server understands I and e channel modes */
if (strchr(chanmodes, 'I') && strchr(chanmodes, 'e')) if (strchr(chanmodes, 'I') && strchr(chanmodes, 'e'))
server->emode_known = TRUE; irc_server->emode_known = TRUE;
/* save server version */ /* save server version */
g_free_not_null(server->version); g_free_not_null(irc_server->version);
server->version = g_strdup(ircd_version); irc_server->version = g_strdup(ircd_version);
g_free(params); 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 **item, *sptr, *eptr;
char **isupport; char **isupport;
gpointer key, value; gpointer key, value;
g_return_if_fail(server != NULL); 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, ' '); sptr = strchr(data, ' ');
if (sptr == NULL) if (sptr == NULL)
@ -838,13 +846,13 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
} }
key = value = NULL; 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) &key, &value) && removed)
continue; continue;
g_hash_table_remove(server->isupport, eptr); g_hash_table_remove(irc_server->isupport, eptr);
if (!removed) { 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 : "")); g_strdup(sptr != NULL ? sptr : ""));
} }
@ -852,7 +860,7 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
g_free(value); g_free(value);
} }
g_strfreev(isupport); 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); 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; char *params, *channels;
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, NULL, &channels); params = event_get_params(data, 2, NULL, &channels);
server->channels_formed = atoi(channels); irc_server->channels_formed = atoi(channels);
g_free(params); 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; char *params, *newhost, *p, *newuserhost;
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, NULL, &newhost); params = event_get_params(data, 2, NULL, &newhost);
/* do a sanity check */ /* do a sanity check */
if (!strchr(newhost, '*') && !strchr(newhost, '?') && if (!strchr(newhost, '*') && !strchr(newhost, '?') &&
@ -909,49 +930,62 @@ static void event_hosthidden(IRC_SERVER_REC *server, const char *data)
newhost[strlen(newhost) - 1] != '-') { newhost[strlen(newhost) - 1] != '-') {
if (strchr(newhost, '@')) { if (strchr(newhost, '@')) {
newuserhost = g_strdup(newhost); newuserhost = g_strdup(newhost);
g_free(server->userhost); g_free(irc_server->userhost);
server->userhost = newuserhost; irc_server->userhost = newuserhost;
} else if (server->userhost != NULL) { } else if (irc_server->userhost != NULL) {
/* no user@, only process if we know the user@ /* no user@, only process if we know the user@
* already * already
*/ */
p = strchr(server->userhost, '@'); p = strchr(irc_server->userhost, '@');
if (p == NULL) if (p == NULL)
p = server->userhost; p = irc_server->userhost;
newuserhost = g_strdup_printf("%.*s@%s", (int)(p - server->userhost), server->userhost, newhost); newuserhost = g_strdup_printf("%.*s@%s", (int)(p - irc_server->userhost), irc_server->userhost, newhost);
g_free(server->userhost); g_free(irc_server->userhost);
server->userhost = newuserhost; irc_server->userhost = newuserhost;
} }
} }
g_free(params); 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); 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); 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, "K-lined") != NULL ||
stristr(data, "Banned") != NULL || stristr(data, "Banned") != NULL ||
stristr(data, "Bad user info") != 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; char *params, *origin, *target, *str;
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, &origin, &target); params = event_get_params(data, 2, &origin, &target);
str = *target == '\0' ? g_strconcat("PONG :", origin, NULL) : str = *target == '\0' ? g_strconcat("PONG :", origin, NULL) :
g_strdup_printf("PONG %s :%s", target, origin); 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(str);
g_free(params); g_free(params);
} }
@ -1051,14 +1085,14 @@ void irc_servers_init(void)
signal_add__event_("004", event_server_info); signal_add__event_("004", event_server_info);
signal_add__event_("005", event_isupport); signal_add__event_("005", event_isupport);
signal_add__event_("375", event_motd); signal_add__event_("375", event_motd);
signal_add_last__event_376(event_end_of_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_("422", event_end_of_motd); /* no motd */
signal_add__event_("254", event_channels_formed); signal_add__event_("254", event_channels_formed);
signal_add__event_("396", event_hosthidden); signal_add__event_("396", event_hosthidden);
signal_add__event_("465", event_server_banned); signal_add__event_("465", event_server_banned);
signal_add__event_("error", event_error); signal_add__event_("error", event_error);
signal_add__event_("ping", event_ping); 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_setup_init();
irc_servers_reconnect_init(); irc_servers_reconnect_init();
@ -1085,7 +1119,7 @@ void irc_servers_deinit(void)
signal_remove__event_("465", event_server_banned); signal_remove__event_("465", event_server_banned);
signal_remove__event_("error", event_error); signal_remove__event_("error", event_error);
signal_remove__event_("ping", event_ping); 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_setup_deinit();
irc_servers_reconnect_deinit(); irc_servers_reconnect_deinit();

View File

@ -20,6 +20,6 @@ typedef struct SERVER_DCC_REC SERVER_DCC_REC;
typedef void *int_in_ptr; typedef void *int_in_ptr;
typedef void *uint_in_ptr; typedef void *uint_in_ptr;
#include "signal-registry.def" #include "irc/core/signal-registry.def"
#endif #endif

View File

@ -40,3 +40,9 @@ noinst_HEADERS = \
otr-formats.h \ otr-formats.h \
otr-fe.h \ otr-fe.h \
otr.h otr.h
BUILT_SOURCES = \
signal-registry.def
signal-registry.def: signal-registry.def.in
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@

View File

@ -3,4 +3,5 @@ EXTRA_DIST = \
irssi-version.sh \ irssi-version.sh \
syntax.pl \ syntax.pl \
tap-driver.sh \ tap-driver.sh \
tap-test tap-test \
signals-to-reg.pl

24
utils/signals-to-reg.pl Executable file
View File

@ -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;
}