diff options
| author | 2026-09-05 19:18:44 -0400 | |
|---|---|---|
| committer | 2026-09-05 19:18:44 -0400 | |
| commit | a27216c145b1b13ad863e49e5400778ad608640f (patch) | |
| tree | 2531f2337c5a99af8c3f93676ddf0eb86e3715f4 | |
| parent | 3a51988d764d54723288dc31a1779ece44cac1e9 (diff) | |
| download | libnaunet-a27216c145b1b13ad863e49e5400778ad608640f.tar.gz libnaunet-a27216c145b1b13ad863e49e5400778ad608640f.tar.bz2 libnaunet-a27216c145b1b13ad863e49e5400778ad608640f.zip | |
Fix Windows locale and error messages
Signed-off-by: Andrew Opalach <andrew@akon.city>
| -rw-r--r-- | src/common.c | 5 | ||||
| -rw-r--r-- | src/socket/socket_linux.c | 6 | ||||
| -rw-r--r-- | src/socket/socket_windows.c | 5 | ||||
| -rw-r--r-- | src/util/error.c | 29 | ||||
| -rw-r--r-- | src/util/file/file_stdio.c | 18 | ||||
| -rw-r--r-- | subprojects/libalabaster.wrap | 4 |
6 files changed, 52 insertions, 15 deletions
diff --git a/src/common.c b/src/common.c index 4358945..e772a2f 100644 --- a/src/common.c +++ b/src/common.c @@ -80,7 +80,12 @@ bool nn_common_init(const char *thread_name) { if (thread_name) nn_thread_set_name(thread_name); + // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170#utf-8-support +#if defined NAUNET_ON_WINDOWS && !defined NAUNET_WIN32_COMPAT_MODE + if (!setlocale(LC_ALL, ".UTF8")) return false; +#else if (!setlocale(LC_ALL, "")) return false; +#endif al_set_print(al_print_default, NULL); diff --git a/src/socket/socket_linux.c b/src/socket/socket_linux.c index e6947c3..2634fc2 100644 --- a/src/socket/socket_linux.c +++ b/src/socket/socket_linux.c @@ -223,11 +223,11 @@ bool nn_socket_accept(struct nn_socket *sock, struct nn_socket *cl, s32 flags) port = ntohs(saddr->sin6_port); inet_ntop(AF_INET6, &saddr->sin6_addr, addr_str, sizeof(addr_str)); } - log_info("Connection from %s:%hu.", addr_str, port); + log_debug("Connection from %s:%hu.", addr_str, port); break; } case NNWT_SOCKET_UNIX: - log_info("Connection on UNIX socket."); + log_debug("Connection on UNIX socket."); break; } @@ -285,7 +285,7 @@ ssize_t nn_socket_recvfrom(struct nn_socket *sock, void *buf, size_t size) bool nn_socket_check_error(ssize_t ret) { if (ret < 0) { - log_debug("Socket error: %s (%d).", nn_strerror(errno), errno); + log_debug("Error description: %s (%d).", nn_strerror(errno), errno); return true; } return false; diff --git a/src/socket/socket_windows.c b/src/socket/socket_windows.c index 9baa312..5e3386c 100644 --- a/src/socket/socket_windows.c +++ b/src/socket/socket_windows.c @@ -114,6 +114,7 @@ bool nn_socket_connect(struct nn_socket *sock, str *addr, u16 port) s32 ret = connect(sock->fd, (SOCKADDR *)&sock->addr_in, sizeof(sock->addr_in)); if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) { log_error("connect(%.*s:%hu) failed: %d.", nn_addr_x(addr), port, WSAGetLastError()); + nn_socket_check_error(ret); return false; } @@ -156,7 +157,9 @@ bool nn_socket_check_error(ssize_t ret) if (ret == SOCKET_ERROR) { s32 err = WSAGetLastError(); char *strerror = nn_win32_error_message(err); - log_debug("Socket error: %s (%d).", strerror ? strerror : "(None)", err); + if (strerror) { + log_error("Error description: %s (%d).", strerror, err); + } return true; } return false; diff --git a/src/util/error.c b/src/util/error.c index 46fd8e6..7f2e847 100644 --- a/src/util/error.c +++ b/src/util/error.c @@ -1,6 +1,9 @@ #include "error.h" static __thread char errorbuf[NNWT_ERROR_STR_MAXLEN]; +#ifdef NAUNET_ON_WINDOWS +static __thread wchar_t errorbufw[NNWT_ERROR_STR_MAXLEN]; +#endif char *nn_strerror(s32 errnum) { @@ -19,21 +22,31 @@ char *nn_strerror(s32 errnum) #ifdef NAUNET_ON_WINDOWS #include "../winwrap.h" -// @TODO: GetLastError() should be used in common places like file_stdio. +#include <wchar.h> // https://stackoverflow.com/a/46104456 char *nn_win32_error_message(s32 err) { - /* - DWORD ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + DWORD ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - errorbuf, + 0, + errorbufw, NNWT_ERROR_STR_MAXLEN, NULL); - return !ret ? NULL : errorbuf; - */ - return NULL; + if (!ret) { + return NULL; + } + errorbufw[ret] = L'\0'; + mbstate_t mbstate = { 0 }; + wchar_t *wc = errorbufw; + size_t length = wcsrtombs(NULL, (const wchar_t **)&wc, 0, &mbstate); + if (length == (size_t)-1) { + return NULL; + } + length = wcsrtombs(errorbuf, (const wchar_t **)&wc, length, &mbstate); + al_assert(length < NNWT_ERROR_STR_MAXLEN); + errorbuf[length] = L'\0'; + return errorbuf; } #endif diff --git a/src/util/file/file_stdio.c b/src/util/file/file_stdio.c index 5bdc7d9..6a30137 100644 --- a/src/util/file/file_stdio.c +++ b/src/util/file/file_stdio.c @@ -4,12 +4,27 @@ #ifdef NAUNET_ON_WINDOWS #include "../../winwrap.h" +#else +#include <unistd.h> #endif #include "../error.h" #include "file.h" +static void check_error_description(s32 err) +{ +#ifdef NAUNET_ON_WINDOWS + err = GetLastError(); + char *strerror = nn_win32_error_message(err); + if (strerror) { + log_error("Error description: %s.", strerror); + } +#else + log_error("Error description: %s.", nn_strerror(err)); +#endif +} + static inline bool open_stdio_file(FILE **file, str *path, const char *mode) { char *c_str = al_str_to_c_str(path); @@ -34,7 +49,8 @@ bool nn_file_open(struct nn_file *file, str *path, s32 flags) { const char *mode = (flags & NNWT_FILE_CREATE) ? "wb+" : "rb+"; if (!open_stdio_file(&file->file, path, mode)) { - log_error("fopen(%.*s) failed (%d: %s).", al_str_x(path), errno, nn_strerror(errno)); + log_error("fopen(%.*s) failed (%d).", al_str_x(path), errno); + check_error_description(errno); return false; } diff --git a/subprojects/libalabaster.wrap b/subprojects/libalabaster.wrap index 5323646..ae8b95c 100644 --- a/subprojects/libalabaster.wrap +++ b/subprojects/libalabaster.wrap @@ -1,5 +1,5 @@ [wrap-git] -directory = libalabaster-b617e3c +directory = libalabaster-98de33b url = https://git.akon.city/libalabaster.git -revision = b617e3ccb25a0ac3c22f8c02722c8108b2f78d6e +revision = 98de33b1f74a381f442773f1cc73d1b07288bee1 depth = 1 |