summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/socket/socket_linux.c13
-rw-r--r--src/socket/socket_windows.c22
-rw-r--r--src/util/thread/thread.h2
3 files changed, 24 insertions, 13 deletions
diff --git a/src/socket/socket_linux.c b/src/socket/socket_linux.c
index 3d141b7..4b2f56a 100644
--- a/src/socket/socket_linux.c
+++ b/src/socket/socket_linux.c
@@ -93,6 +93,10 @@ void aki_socket_set_recv_buf(struct aki_socket *s, u32 rcvbuf)
al_assert(aki_socket_get_recv_buf(s) == receive_queue_size);
}
+#define al_log_socket_err(func) \
+ al_log_error("socket", #func"(%.*s:%d) failed: %s (%d).", \
+ AL_STR_PRINTF(addr), port, aki_strerror(errno), errno);
+
bool aki_socket_listen(struct aki_socket *s, str *addr, s32 port)
{
struct sockaddr *saddr = NULL;
@@ -123,12 +127,12 @@ bool aki_socket_listen(struct aki_socket *s, str *addr, s32 port)
}
if (bind(s->sock, saddr, addrlen) < 0) {
- al_log_error("socket", "Failed to bind (%.*s:%d).", AL_STR_PRINTF(addr), port);
+ al_log_socket_err(bind)
return false;
}
if (listen(s->sock, SOMAXCONN) < 0) {
- al_log_error("socket", "Failed to listen (%.*s:%d).", AL_STR_PRINTF(addr), port);
+ al_log_socket_err(listen)
return false;
}
@@ -209,7 +213,7 @@ bool aki_socket_connect(struct aki_socket *s, str *addr, s32 port)
case AKI_SOCKET_UDP: {
s32 ret = connect(s->sock, (struct sockaddr *)&s->addr_in, sizeof(s->addr_in));
if (ret != 0 && errno != 115) {
- al_log_error("socket", "Failed to connect: %s (%d).", aki_strerror(errno), errno);
+ al_log_socket_err(connect)
return false;
}
break;
@@ -219,13 +223,14 @@ bool aki_socket_connect(struct aki_socket *s, str *addr, s32 port)
al_memcpy(s->addr_un.sun_path, addr->data, addr->len);
s->addr_un.sun_path[addr->len] = '\0';
if (connect(s->sock, (struct sockaddr *)&s->addr_un, sizeof(s->addr_un)) < 0) {
- al_log_error("socket", "Failed to connect: %s (%d).", aki_strerror(errno), errno);
+ al_log_socket_err(connect)
return false;
}
break;
}
default:
al_assert(false);
+ break;
}
signal(SIGPIPE, SIG_IGN);
diff --git a/src/socket/socket_windows.c b/src/socket/socket_windows.c
index b83ae52..e19c16f 100644
--- a/src/socket/socket_windows.c
+++ b/src/socket/socket_windows.c
@@ -26,7 +26,7 @@ bool aki_socket_init(struct aki_socket *s)
void aki_socket_set_blocking(struct aki_socket *s, bool blocking)
{
- u_long mode = (blocking) ? 0 : 1;
+ u_long mode = blocking ? 0 : 1;
ioctlsocket(s->sock, FIONBIO, &mode);
}
@@ -36,18 +36,22 @@ void aki_socket_set_no_delay(struct aki_socket *s, s32 no_delay)
(void)no_delay;
}
+#define al_log_socket_err(func) \
+ al_log_error("socket", #func"(%.*s:%d) failed: %d.", \
+ AL_STR_PRINTF(addr), port, WSAGetLastError());
+
bool aki_socket_listen(struct aki_socket *s, str *addr, s32 port)
{
s->addr_in.sin_family = AF_INET;
s->addr_in.sin_addr.s_addr = INADDR_ANY;
- s->addr_in.sin_port = htons(port);
- al_memset(&(s->addr_in.sin_zero), '\0', 8);
+ s->addr_in.sin_port = aki_htons(port);
+ al_memset(s->addr_in.sin_zero, '\0', 8);
if (bind(s->sock, (SOCKADDR *)&s->addr_in, sizeof(s->addr_in)) == SOCKET_ERROR) {
- al_log_error("socket", "Failed to bind (%.*s:%d).", AL_STR_PRINTF(addr), port);
+ al_log_socket_err(bind);
return false;
}
if (listen(s->sock, SOMAXCONN) == SOCKET_ERROR) {
- al_log_error("socket", "Failed to listen (%.*s:%d).", AL_STR_PRINTF(addr), port);
+ al_log_socket_err(listen);
return false;
}
return true;
@@ -70,9 +74,11 @@ bool aki_socket_connect(struct aki_socket *s, str *addr, s32 port)
char *c_str = al_str_to_c_str(addr);
InetPton(AF_INET, c_str, &s->addr_in.sin_addr.s_addr);
al_free(c_str);
- s->addr_in.sin_port = htons(port);
- al_memset(&(s->addr_in.sin_zero), '\0', 8);
- if (connect(s->sock, (SOCKADDR *)&s->addr_in, sizeof(s->addr_in)) == SOCKET_ERROR) {
+ s->addr_in.sin_port = aki_htons(port);
+ al_memset(s->addr_in.sin_zero, '\0', 8);
+ s32 ret = connect(s->sock, (SOCKADDR *)&s->addr_in, sizeof(s->addr_in));
+ if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) {
+ al_log_socket_err(connect);
return false;
}
return true;
diff --git a/src/util/thread/thread.h b/src/util/thread/thread.h
index eb63b8d..8860d2d 100644
--- a/src/util/thread/thread.h
+++ b/src/util/thread/thread.h
@@ -35,7 +35,7 @@ struct aki_cond {
typedef f64 aki_os_tstamp;
-#define AKI_TS_FROM_USEC(usec) (usec * 1e-6)
+#define AKI_TS_FROM_USEC(usec) ((usec) * 1e-6)
#ifndef _WIN32
#define AKI_THREADCALL