From 96e9e61437713bb46573de4aec41ac697865ad7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 16 Mar 2025 10:38:04 +0800 Subject: [PATCH] Networking (Windows): print readable error message --- CMakeLists.txt | 1 + src/common/networking/networking_windows.c | 12 +++++----- src/util/debug.h | 2 ++ src/util/debug_windows.c | 28 ++++++++++++++++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 src/util/debug_windows.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 688328823..08c01ade2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1034,6 +1034,7 @@ elseif(WIN32) src/util/windows/version.c src/util/platform/FFPlatform_windows.c src/util/binary_windows.c + src/util/debug_windows.c ) elseif(SunOS) list(APPEND LIBFASTFETCH_SRC diff --git a/src/common/networking/networking_windows.c b/src/common/networking/networking_windows.c index 93ca13f6c..33a46c13b 100644 --- a/src/common/networking/networking_windows.c +++ b/src/common/networking/networking_windows.c @@ -109,7 +109,7 @@ const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* ho #ifdef TCP_NODELAY // Enable TCP_NODELAY to disable Nagle's algorithm if (setsockopt(state->sockfd, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag)) != 0) { - FF_DEBUG("Failed to set TCP_NODELAY: %d", WSAGetLastError()); + FF_DEBUG("Failed to set TCP_NODELAY: %s", ffDebugWin32Error((DWORD) WSAGetLastError())); } else { FF_DEBUG("Successfully disabled Nagle's algorithm"); } @@ -118,7 +118,7 @@ const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* ho #ifdef TCP_FASTOPEN // Set TCP Fast Open if (setsockopt(state->sockfd, IPPROTO_TCP, TCP_FASTOPEN, (char*)&flag, sizeof(flag)) != 0) { - FF_DEBUG("Failed to set TCP_FASTOPEN option: %d", WSAGetLastError()); + FF_DEBUG("Failed to set TCP_FASTOPEN option: %s", ffDebugWin32Error((DWORD) WSAGetLastError())); } else { FF_DEBUG("Successfully set TCP_FASTOPEN option"); } @@ -141,7 +141,7 @@ const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* ho .sin_addr.s_addr = INADDR_ANY, }, sizeof(struct sockaddr_in))) != 0) { - FF_DEBUG("bind() failed: %d", WSAGetLastError()); + FF_DEBUG("bind() failed: %s", ffDebugWin32Error((DWORD) WSAGetLastError())); closesocket(state->sockfd); freeaddrinfo(addr); state->sockfd = INVALID_SOCKET; @@ -177,7 +177,7 @@ const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* ho if(!result && WSAGetLastError() != WSA_IO_PENDING) { - FF_DEBUG("ConnectEx() failed: %d", WSAGetLastError()); + FF_DEBUG("ConnectEx() failed: %s", ffDebugWin32Error((DWORD) WSAGetLastError())); closesocket(state->sockfd); state->sockfd = INVALID_SOCKET; return "ConnectEx() failed"; @@ -213,7 +213,7 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf DWORD transfer, flags; if (!WSAGetOverlappedResult(state->sockfd, &state->overlapped, &transfer, TRUE, &flags)) { - FF_DEBUG("WSAGetOverlappedResult failed: %d", WSAGetLastError()); + FF_DEBUG("WSAGetOverlappedResult failed: %s", ffDebugWin32Error((DWORD) WSAGetLastError())); closesocket(state->sockfd); return "WSAGetOverlappedResult() failed"; } @@ -243,7 +243,7 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf if (received == 0) { FF_DEBUG("Connection closed (received=0)"); } else { - FF_DEBUG("Reception failed: %d", WSAGetLastError()); + FF_DEBUG("Reception failed: %s", ffDebugWin32Error((DWORD) WSAGetLastError())); } break; } diff --git a/src/util/debug.h b/src/util/debug.h index 70a990a68..9e6bf7228 100644 --- a/src/util/debug.h +++ b/src/util/debug.h @@ -24,3 +24,5 @@ static inline const char* ffFindFileName(const char* file) #endif #define FF_DEBUG(format, ...) FF_DEBUG_PRINT(__FILE__, __LINE__, format, ##__VA_ARGS__) + +const char* ffDebugWin32Error(unsigned long errorCode); diff --git a/src/util/debug_windows.c b/src/util/debug_windows.c new file mode 100644 index 000000000..e6bf3f786 --- /dev/null +++ b/src/util/debug_windows.c @@ -0,0 +1,28 @@ +#include "debug.h" + +#include + +const char* ffDebugWin32Error(DWORD errorCode) +{ + static char buffer[256]; + + DWORD len = FormatMessageA( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + (DWORD) errorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + buffer, + sizeof(buffer), + NULL); + + if (len == 0) { + snprintf(buffer, sizeof(buffer), "Unknown error code (%lu)", errorCode); + } else { + // Remove trailing newline + if (buffer[len - 1] == '\n') buffer[len - 1] = '\0'; + if (buffer[len - 2] == '\r') buffer[len - 2] = '\0'; + snprintf(buffer + len - 2, sizeof(buffer) - len + 2, " (%lu)", errorCode); + } + + return buffer; +}