degesch: factor out irc_try_finish_cap_negotiation()

Too much repeated, non-obvious code.
This commit is contained in:
Přemysl Eric Janouch 2021-05-28 04:25:38 +02:00
parent 5a0b2d1c57
commit ddffc71abe
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 13 additions and 6 deletions

View File

@ -6600,6 +6600,15 @@ irc_toggle_cap (struct server *s, const char *cap, bool active)
if (!strcasecmp_ascii (cap, "sasl")) s->cap_sasl = active; if (!strcasecmp_ascii (cap, "sasl")) s->cap_sasl = active;
} }
static void
irc_try_finish_cap_negotiation (struct server *s)
{
// It does not make sense to do this post-registration, although it would
// not hurt either, as the server must ignore it in that case
if (s->state == IRC_CONNECTED)
irc_send (s, "CAP END");
}
static void static void
irc_handle_cap (struct server *s, const struct irc_message *msg) irc_handle_cap (struct server *s, const struct irc_message *msg)
{ {
@ -6629,15 +6638,14 @@ irc_handle_cap (struct server *s, const struct irc_message *msg)
} }
if (s->cap_sasl && s->transport == &g_transport_tls) if (s->cap_sasl && s->transport == &g_transport_tls)
irc_send (s, "AUTHENTICATE EXTERNAL"); irc_send (s, "AUTHENTICATE EXTERNAL");
else if (s->state == IRC_CONNECTED) else
irc_send (s, "CAP END"); irc_try_finish_cap_negotiation (s);
} }
else if (!strcasecmp_ascii (subcommand, "NAK")) else if (!strcasecmp_ascii (subcommand, "NAK"))
{ {
log_server_error (s, s->buffer, log_server_error (s, s->buffer,
"#s: #S", "Capabilities not acknowledged", args); "#s: #S", "Capabilities not acknowledged", args);
if (s->state == IRC_CONNECTED) irc_try_finish_cap_negotiation (s);
irc_send (s, "CAP END");
} }
else if (!strcasecmp_ascii (subcommand, "DEL")) else if (!strcasecmp_ascii (subcommand, "DEL"))
{ {
@ -8002,8 +8010,7 @@ irc_process_numeric (struct server *s,
case IRC_ERR_SASLTOOLONG: case IRC_ERR_SASLTOOLONG:
case IRC_ERR_SASLABORTED: case IRC_ERR_SASLABORTED:
case IRC_ERR_SASLALREADY: case IRC_ERR_SASLALREADY:
if (s->state == IRC_CONNECTED) irc_try_finish_cap_negotiation (s);
irc_send (s, "CAP END");
break; break;
case IRC_RPL_LIST: case IRC_RPL_LIST: