diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/socket/socket_linux.c | 13 | ||||
| -rw-r--r-- | src/socket/socket_windows.c | 22 | ||||
| -rw-r--r-- | src/util/thread/thread.h | 2 |
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 |