From 31d88376823b44c575d26577845fa6ed403efc5b Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Mon, 14 Sep 2020 13:05:10 +0200 Subject: [PATCH] RTP UDP: fallback format for unknown errors [Win] --- src/rtp/net_udp.cpp | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/rtp/net_udp.cpp b/src/rtp/net_udp.cpp index 88dcd4e34..1d98bec2a 100644 --- a/src/rtp/net_udp.cpp +++ b/src/rtp/net_udp.cpp @@ -64,6 +64,7 @@ #endif #include +#include #include #include #include @@ -71,6 +72,7 @@ #include #include // std::swap +using std::array; using std::condition_variable; using std::max; using std::mutex; @@ -88,6 +90,7 @@ static void *udp_reader(void *arg); #define IPv4 4 #define IPv6 6 +constexpr int ERRBUF_SIZE = 255; const constexpr char *MOD_NAME = "[RTP UDP] "; #ifdef WIN2K_IPV6 @@ -209,9 +212,9 @@ static void udp_clean_async_state(socket_udp *s); void socket_error(const char *msg, ...) { - char buffer[255]; - uint32_t blen = sizeof(buffer) / sizeof(buffer[0]); va_list ap; + array buffer{}; + array strerror_buf{"unknown"}; #ifdef WIN32 #define WSERR(x) {#x,x} @@ -233,26 +236,38 @@ void socket_error(const char *msg, ...) WSERR(0) }; - int i, e = WSAGetLastError(); - i = 0; + int i = 0; + int e = WSAGetLastError(); + if (e == WSAECONNRESET) { + return; + } while (ws_errs[i].errno_code && ws_errs[i].errno_code != e) { i++; } va_start(ap, msg); - _vsnprintf(buffer, blen, msg, ap); + _vsnprintf(buffer.data(), buffer.size(), static_cast(msg), ap); va_end(ap); - if (e != WSAECONNRESET) - log_msg(LOG_LEVEL_ERROR, "ERROR: %s, (%d - %s)\n", buffer, e, ws_errs[i].errname); + + if (i == 0) { // let system format the error message + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, // flags + NULL, // lpsource + e, // message id + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // languageid + strerror_buf.data(), // output buffer + strerror_buf.size(), // size of msgbuf, bytes + NULL); // va_list of arguments + } + const char *errname = i == 0 ? strerror_buf.data() : ws_errs[i].errname; + LOG(LOG_LEVEL_ERROR) << "ERROR: " << buffer.data() << ", (" << e << " - " << errname << ")\n"; #else va_start(ap, msg); - vsnprintf(buffer, blen, msg, ap); + vsnprintf(buffer.data(), buffer.size(), static_cast(msg), ap); va_end(ap); - char strerror_buf[255] = ""; #if ! defined _POSIX_C_SOURCE || (_POSIX_C_SOURCE >= 200112L && ! _GNU_SOURCE) - strerror_r(errno, strerror_buf, sizeof strerror_buf); // XSI version - log_msg(LOG_LEVEL_ERROR, "%s: %s\n", buffer, strerror_buf); + strerror_r(errno, strerror_buf.data(), strerror_buf.size()); // XSI version + LOG(LOG_LEVEL_ERROR) << buffer.data() << ": " << strerror_buf.data() << "\n"; #else // GNU strerror_r version - log_msg(LOG_LEVEL_ERROR, "%s: %s\n", buffer, strerror_r(errno, strerror_buf, sizeof strerror_buf)); + LOG(LOG_LEVEL_ERROR) << buffer.data() << ": " << strerror_r(errno, strerror_buf.data(), strerror_buf.size()) << "\n"; #endif #endif }