diff --git a/degesch.c b/degesch.c index b186125..2033497 100644 --- a/degesch.c +++ b/degesch.c @@ -6600,6 +6600,15 @@ irc_toggle_cap (struct server *s, const char *cap, bool 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 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) irc_send (s, "AUTHENTICATE EXTERNAL"); - else if (s->state == IRC_CONNECTED) - irc_send (s, "CAP END"); + else + irc_try_finish_cap_negotiation (s); } else if (!strcasecmp_ascii (subcommand, "NAK")) { log_server_error (s, s->buffer, "#s: #S", "Capabilities not acknowledged", args); - if (s->state == IRC_CONNECTED) - irc_send (s, "CAP END"); + irc_try_finish_cap_negotiation (s); } else if (!strcasecmp_ascii (subcommand, "DEL")) { @@ -8002,8 +8010,7 @@ irc_process_numeric (struct server *s, case IRC_ERR_SASLTOOLONG: case IRC_ERR_SASLABORTED: case IRC_ERR_SASLALREADY: - if (s->state == IRC_CONNECTED) - irc_send (s, "CAP END"); + irc_try_finish_cap_negotiation (s); break; case IRC_RPL_LIST: