From 6a13fb28754e8838b4c7e6e24bdcced8ef1fe4e7 Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Sun, 19 Oct 2025 17:51:06 +0200 Subject: [PATCH 1/5] Also log port for failed connect --- src/mod/server.mod/servmsg.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 7f39de982..f0b06501f 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -2030,8 +2030,8 @@ static void server_resolve_failure(int servidx) { serv = -1; resolvserv = 0; - putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, dcc[servidx].host, - IRC_DNSFAILED); + putlog(LOG_SERV, "*", "%s %s port %i (%s)", IRC_FAILEDCONNECT, + dcc[servidx].host, dcc[servidx].port, IRC_DNSFAILED); check_tcl_event("fail-server"); lostdcc(servidx); } @@ -2055,8 +2055,8 @@ static void server_resolve_success(int servidx) } else { errstr = strerror(errno); } - putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, dcc[servidx].host, - errstr); + putlog(LOG_SERV, "*", "%s %s port %i (%s)", IRC_FAILEDCONNECT, + dcc[servidx].host, dcc[servidx].port, errstr); check_tcl_event("fail-server"); lostdcc(servidx); return; @@ -2064,8 +2064,8 @@ static void server_resolve_success(int servidx) #ifdef TLS if (dcc[servidx].ssl && ssl_handshake(serv, TLS_CONNECT, tls_vfyserver, LOG_SERV, dcc[servidx].host, NULL)) { - putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, dcc[servidx].host, - "TLS negotiation failure"); + putlog(LOG_SERV, "*", "%s %s port %i (%s)", IRC_FAILEDCONNECT, + dcc[servidx].host, dcc[servidx].port, "TLS negotiation failure"); check_tcl_event("fail-server"); lostdcc(servidx); return; From f6bb63d767ee3e124ccc7f47dfca44534a34948b Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Sun, 19 Oct 2025 22:38:48 +0200 Subject: [PATCH 2/5] New function print_ip_ssl_port(), which makes it simple to print ip:[ssl]:port, aware of ipv6 and tls --- src/mod/server.mod/servmsg.c | 84 +++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 26 deletions(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index f0b06501f..6abff7a96 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -1921,15 +1921,39 @@ static cmd_t my_isupport_binds[] = { static void server_resolve_success(int); static void server_resolve_failure(int); +#ifdef TLS +static size_t print_ip_ssl_port(char *str, size_t size, char *ip, int ssl, + int port) { +#else +static size_t print_ip_ssl_port(char *str, size_t size, char *ip, int port) { +#endif + char buf[sizeof(struct in6_addr)]; + +#ifdef IPV6 + if (inet_pton(AF_INET6, ip, buf)) { +#ifdef TLS + return snprintf(str, size, "[%s]:%s%d", ip, use_ssl ? "+" : "", port); +#else + return snprintf(str, size, "[%s]:%d", ip, port); +#endif /* TLS */ + } else { +#endif /* IPV6 */ +#ifdef TLS + return snprintf(str, size, "%s:%s%d", ip, use_ssl ? "+" : "", port); +#else + return snprintf(str, size, "%s:%d", ip, port); +#endif +#ifdef IPV6 + } +#endif +} + /* Hook up to a server */ static void connect_server(void) { - char pass[NEWSERVERPASSMAX], botserver[NEWSERVERMAX], s[1024]; -#ifdef IPV6 - char buf[sizeof(struct in6_addr)]; -#endif - int servidx, len = 0; + char pass[NEWSERVERPASSMAX], botserver[NEWSERVERMAX], s[128]; + int servidx; unsigned int botserverport = 0; lastpingcheck = 0; @@ -1971,24 +1995,14 @@ static void connect_server(void) check_tcl_event("connect-server"); next_server(&curserv, botserver, &botserverport, pass); -#ifdef IPV6 - if (inet_pton(AF_INET6, botserver, buf)) { - len += egg_snprintf(s, sizeof s, "%s [%s]", IRC_SERVERTRY, botserver); - } else { -#endif - len += egg_snprintf(s, sizeof s, "%s %s", IRC_SERVERTRY, botserver); -#ifdef IPV6 - } -#endif - #ifdef TLS - len += egg_snprintf(s + len, sizeof s - len, ":%s%d", - use_ssl ? "+" : "", botserverport); + print_ip_ssl_port(s, sizeof s, botserver, use_ssl, botserverport); dcc[servidx].ssl = use_ssl; #else - len += egg_snprintf(s + len, sizeof s - len, ":%d", botserverport); + print_ip_ssl_port(s, sizeof s, botserver, botserverport); #endif - putlog(LOG_SERV, "*", "%s", s); + + putlog(LOG_SERV, "*", "%s %s", IRC_SERVERTRY, s); dcc[servidx].port = botserverport; strcpy(dcc[servidx].nick, "(server)"); strlcpy(dcc[servidx].host, botserver, UHOSTLEN); @@ -2028,17 +2042,24 @@ static void connect_server(void) static void server_resolve_failure(int servidx) { + char s[128]; serv = -1; resolvserv = 0; - putlog(LOG_SERV, "*", "%s %s port %i (%s)", IRC_FAILEDCONNECT, - dcc[servidx].host, dcc[servidx].port, IRC_DNSFAILED); +#ifdef TLS + print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + dcc[servidx].port); +#else + print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); +#endif + + putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, s, IRC_DNSFAILED); check_tcl_event("fail-server"); lostdcc(servidx); } static void server_resolve_success(int servidx) { - char pass[121]; + char pass[121], s[128]; resolvserv = 0; strlcpy(pass, dcc[servidx].u.dns->cbuf, sizeof pass); @@ -2055,8 +2076,13 @@ static void server_resolve_success(int servidx) } else { errstr = strerror(errno); } - putlog(LOG_SERV, "*", "%s %s port %i (%s)", IRC_FAILEDCONNECT, - dcc[servidx].host, dcc[servidx].port, errstr); +#ifdef TLS + print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + dcc[servidx].port); +#else + print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); +#endif + putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, s, errstr); check_tcl_event("fail-server"); lostdcc(servidx); return; @@ -2064,8 +2090,14 @@ static void server_resolve_success(int servidx) #ifdef TLS if (dcc[servidx].ssl && ssl_handshake(serv, TLS_CONNECT, tls_vfyserver, LOG_SERV, dcc[servidx].host, NULL)) { - putlog(LOG_SERV, "*", "%s %s port %i (%s)", IRC_FAILEDCONNECT, - dcc[servidx].host, dcc[servidx].port, "TLS negotiation failure"); +#ifdef TLS + print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + dcc[servidx].port); +#else + print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); +#endif + putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, s, + "TLS negotiation failure"); check_tcl_event("fail-server"); lostdcc(servidx); return; From 921a73e2e64d7469ecc32c903ed4555aeef51bfd Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Sun, 19 Oct 2025 23:23:06 +0200 Subject: [PATCH 3/5] ip can also be hostname, so rename and fix buffer size --- src/mod/server.mod/servmsg.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 6abff7a96..06bad2048 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -1922,26 +1922,26 @@ static void server_resolve_success(int); static void server_resolve_failure(int); #ifdef TLS -static size_t print_ip_ssl_port(char *str, size_t size, char *ip, int ssl, +static size_t print_host_ssl_port(char *str, size_t size, char *host, int ssl, int port) { #else -static size_t print_ip_ssl_port(char *str, size_t size, char *ip, int port) { +static size_t print_host_ssl_port(char *str, size_t size, char *host, int port) { #endif char buf[sizeof(struct in6_addr)]; #ifdef IPV6 - if (inet_pton(AF_INET6, ip, buf)) { + if (inet_pton(AF_INET6, host, buf)) { #ifdef TLS - return snprintf(str, size, "[%s]:%s%d", ip, use_ssl ? "+" : "", port); + return snprintf(str, size, "[%s]:%s%d", host, use_ssl ? "+" : "", port); #else - return snprintf(str, size, "[%s]:%d", ip, port); + return snprintf(str, size, "[%s]:%d", host, port); #endif /* TLS */ } else { #endif /* IPV6 */ #ifdef TLS - return snprintf(str, size, "%s:%s%d", ip, use_ssl ? "+" : "", port); + return snprintf(str, size, "%s:%s%d", host, use_ssl ? "+" : "", port); #else - return snprintf(str, size, "%s:%d", ip, port); + return snprintf(str, size, "%s:%d", host, port); #endif #ifdef IPV6 } @@ -1952,7 +1952,7 @@ static size_t print_ip_ssl_port(char *str, size_t size, char *ip, int port) { */ static void connect_server(void) { - char pass[NEWSERVERPASSMAX], botserver[NEWSERVERMAX], s[128]; + char pass[NEWSERVERPASSMAX], botserver[NEWSERVERMAX], s[512]; int servidx; unsigned int botserverport = 0; @@ -1996,10 +1996,10 @@ static void connect_server(void) next_server(&curserv, botserver, &botserverport, pass); #ifdef TLS - print_ip_ssl_port(s, sizeof s, botserver, use_ssl, botserverport); + print_host_ssl_port(s, sizeof s, botserver, use_ssl, botserverport); dcc[servidx].ssl = use_ssl; #else - print_ip_ssl_port(s, sizeof s, botserver, botserverport); + print_host_ssl_port(s, sizeof s, botserver, botserverport); #endif putlog(LOG_SERV, "*", "%s %s", IRC_SERVERTRY, s); @@ -2042,14 +2042,14 @@ static void connect_server(void) static void server_resolve_failure(int servidx) { - char s[128]; + char s[512]; serv = -1; resolvserv = 0; #ifdef TLS - print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, dcc[servidx].port); #else - print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); #endif putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, s, IRC_DNSFAILED); @@ -2059,7 +2059,7 @@ static void server_resolve_failure(int servidx) static void server_resolve_success(int servidx) { - char pass[121], s[128]; + char pass[121], s[512]; resolvserv = 0; strlcpy(pass, dcc[servidx].u.dns->cbuf, sizeof pass); @@ -2077,10 +2077,10 @@ static void server_resolve_success(int servidx) errstr = strerror(errno); } #ifdef TLS - print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, dcc[servidx].port); #else - print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); #endif putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, s, errstr); check_tcl_event("fail-server"); @@ -2091,10 +2091,10 @@ static void server_resolve_success(int servidx) if (dcc[servidx].ssl && ssl_handshake(serv, TLS_CONNECT, tls_vfyserver, LOG_SERV, dcc[servidx].host, NULL)) { #ifdef TLS - print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, dcc[servidx].port); #else - print_ip_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); #endif putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, s, "TLS negotiation failure"); From f2034bf41c2d50e0f79f1360bd204cb04a9faf7c Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Mon, 19 Jan 2026 02:51:49 +0100 Subject: [PATCH 4/5] Make it void --- src/mod/server.mod/servmsg.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 06bad2048..4a7d646bd 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -1922,26 +1922,26 @@ static void server_resolve_success(int); static void server_resolve_failure(int); #ifdef TLS -static size_t print_host_ssl_port(char *str, size_t size, char *host, int ssl, +static void print_host_ssl_port(char *str, size_t size, char *host, int ssl, int port) { #else -static size_t print_host_ssl_port(char *str, size_t size, char *host, int port) { +static void print_host_ssl_port(char *str, size_t size, char *host, int port) { #endif char buf[sizeof(struct in6_addr)]; #ifdef IPV6 if (inet_pton(AF_INET6, host, buf)) { #ifdef TLS - return snprintf(str, size, "[%s]:%s%d", host, use_ssl ? "+" : "", port); + snprintf(str, size, "[%s]:%s%d", host, use_ssl ? "+" : "", port); #else - return snprintf(str, size, "[%s]:%d", host, port); + snprintf(str, size, "[%s]:%d", host, port); #endif /* TLS */ } else { #endif /* IPV6 */ #ifdef TLS - return snprintf(str, size, "%s:%s%d", host, use_ssl ? "+" : "", port); + snprintf(str, size, "%s:%s%d", host, use_ssl ? "+" : "", port); #else - return snprintf(str, size, "%s:%d", host, port); + snprintf(str, size, "%s:%d", host, port); #endif #ifdef IPV6 } From 6602df67055f19a7d98efdb806e3b6ecf058b067 Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Sun, 25 Jan 2026 07:00:08 +0100 Subject: [PATCH 5/5] Propagate getsockopt error to errno error logging, and filter EINPROGRESS from error logging --- src/mod/server.mod/servmsg.c | 2 +- src/net.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index a76fefb2b..369e6a1df 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -2078,7 +2078,7 @@ static void server_resolve_success(int servidx) errstr = strerror(errno); snprintf(errstr2, sizeof errstr2, " prefer-ipv6 %i", pref_af); #endif - } else { + } else if (errno != EINPROGRESS) { errstr = strerror(errno); } #ifdef TLS diff --git a/src/net.c b/src/net.c index f10a4bcb4..ae90e8e1d 100644 --- a/src/net.c +++ b/src/net.c @@ -598,6 +598,7 @@ int open_telnet_raw(int sock, sockname_t *addr) } if (res != 0) { debug1("net: getsockopt error %d", res); + errno = res; return -1; } return sock; /* async success! */