summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common.c5
-rw-r--r--src/socket/socket_linux.c6
-rw-r--r--src/socket/socket_windows.c5
-rw-r--r--src/util/error.c29
-rw-r--r--src/util/file/file_stdio.c18
-rw-r--r--subprojects/libalabaster.wrap4
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