diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index d00779b2a..369e6a1df 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 void print_host_ssl_port(char *str, size_t size, char *host, int ssl, + int port) { +#else +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 + snprintf(str, size, "[%s]:%s%d", host, use_ssl ? "+" : "", port); +#else + snprintf(str, size, "[%s]:%d", host, port); +#endif /* TLS */ + } else { +#endif /* IPV6 */ +#ifdef TLS + snprintf(str, size, "%s:%s%d", host, use_ssl ? "+" : "", port); +#else + snprintf(str, size, "%s:%d", host, 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[512]; + 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_host_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_host_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[512]; serv = -1; resolvserv = 0; - putlog(LOG_SERV, "*", "%s %s (%s)", IRC_FAILEDCONNECT, dcc[servidx].host, - IRC_DNSFAILED); +#ifdef TLS + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + dcc[servidx].port); +#else + 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); check_tcl_event("fail-server"); lostdcc(servidx); } static void server_resolve_success(int servidx) { - char pass[121], errstr2[128]; + char pass[121], errstr2[128], s[512]; resolvserv = 0; strlcpy(pass, dcc[servidx].u.dns->cbuf, sizeof pass); @@ -2057,13 +2078,18 @@ 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); } - putlog(LOG_SERV, "*", "%s %s (%s ip %s port %i %s)", IRC_FAILEDCONNECT, - dcc[servidx].host, errstr, iptostr(&dcc[servidx].sockname.addr.sa), - dcc[servidx].port, errno == ENETUNREACH ? errstr2 : ""); - +#ifdef TLS + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + dcc[servidx].port); +#else + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].port); +#endif + putlog(LOG_SERV, "*", "%s %s (%s ip %s%s)", IRC_FAILEDCONNECT, + s, errstr, iptostr(&dcc[servidx].sockname.addr.sa), + errno == ENETUNREACH ? errstr2 : ""); check_tcl_event("fail-server"); lostdcc(servidx); return; @@ -2071,7 +2097,13 @@ 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, +#ifdef TLS + print_host_ssl_port(s, sizeof s, dcc[servidx].host, dcc[servidx].ssl, + dcc[servidx].port); +#else + 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"); check_tcl_event("fail-server"); lostdcc(servidx); 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! */