diff options
Diffstat (limited to 'src/socket')
| -rw-r--r-- | src/socket/socket.h | 3 | ||||
| -rw-r--r-- | src/socket/socket_internal.h | 11 | ||||
| -rw-r--r-- | src/socket/socket_linux.c | 41 | ||||
| -rw-r--r-- | src/socket/socket_windows.c | 16 |
4 files changed, 32 insertions, 39 deletions
diff --git a/src/socket/socket.h b/src/socket/socket.h index 57e3212..5f16ec6 100644 --- a/src/socket/socket.h +++ b/src/socket/socket.h @@ -23,6 +23,9 @@ enum { NNWT_SOCKET_NODELAY = 1 << 1 }; +// @TODO: Guard against EINTR? +// https://github.com/kovidgoyal/kitty/blob/master/kitty/safe-wrappers.h + struct nn_socket { u8 type; #ifdef NAUNET_ON_WINDOWS diff --git a/src/socket/socket_internal.h b/src/socket/socket_internal.h index b79e888..41b48ca 100644 --- a/src/socket/socket_internal.h +++ b/src/socket/socket_internal.h @@ -10,15 +10,10 @@ static inline str *nn_socket_display_addr(str *addr) return addr ? addr : &ipany; } -#define nn_socket_fmt_addr(addr) al_str_fmt(nn_socket_display_addr(addr)) +#define nn_addr_x(addr) al_str_x(nn_socket_display_addr(addr)) static inline void nn_socket_apply_flags(struct nn_socket *sock, s32 flags) { - if (flags & NNWT_SOCKET_NONBLOCKING) { - nn_socket_set_blocking(sock, false); - } - - if (flags & NNWT_SOCKET_NODELAY) { - nn_socket_set_nodelay(sock, 1); - } + if (flags & NNWT_SOCKET_NONBLOCKING) nn_socket_set_blocking(sock, false); + if (flags & NNWT_SOCKET_NODELAY) nn_socket_set_nodelay(sock, 1); } diff --git a/src/socket/socket_linux.c b/src/socket/socket_linux.c index b8980be..b2d76a8 100644 --- a/src/socket/socket_linux.c +++ b/src/socket/socket_linux.c @@ -1,3 +1,4 @@ +#define AL_LOG_SECTION "socket" #include <al/log.h> #include <arpa/inet.h> #include <netdb.h> @@ -24,7 +25,7 @@ s32 nn_poll_fds(struct nn_pollfd *fds, nn_nfds nfds, s64 timeout_ns) struct timespec ts; ts.tv_sec = timeout_ns / NNWT_TIME_S_TO_NS(1); ts.tv_nsec = timeout_ns % NNWT_TIME_S_TO_NS(1); - struct timespec *tsp = timeout_ns >= 0 ? &ts : NULL; + struct timespec *tsp = (timeout_ns >= 0) ? &ts : NULL; return ppoll(fds, nfds, tsp, NULL); } @@ -45,14 +46,14 @@ bool nn_socket_init(struct nn_socket *sock, s32 flags) } if (sock->fd < 0) { - al_log_error("socket", "socket() failed: %s (%d).", nn_strerror(errno), errno); + error("socket() failed: %s (%d).", nn_strerror(errno), errno); return false; } - nn_socket_apply_flags(sock, flags); - sock->addrinfo = NULL; + nn_socket_apply_flags(sock, flags); + return true; } @@ -119,7 +120,7 @@ static bool parse_address(struct nn_socket *sock, str *addr, u16 port) s32 status = getaddrinfo(c_str, port_str, &hints, &sock->addrinfo); al_free(c_str); if (status != 0) { - al_log_error("socket", "Failed to parse address (%s).", gai_strerror(status)); + error("Failed to parse address (%s).", gai_strerror(status)); return false; } @@ -136,7 +137,6 @@ bool nn_socket_bind(struct nn_socket *sock, str *addr, u16 port) { struct sockaddr *saddr = NULL; socklen_t addrlen = 0; - switch (sock->type) { case NNWT_SOCKET_TCP: case NNWT_SOCKET_UDP: @@ -146,7 +146,7 @@ bool nn_socket_bind(struct nn_socket *sock, str *addr, u16 port) saddr = sock->addrinfo->ai_addr; addrlen = sock->addrinfo->ai_addrlen; break; - case NNWT_SOCKET_UNIX: { + case NNWT_SOCKET_UNIX: al_assert(addr); sock->addr_un.sun_family = AF_UNIX; char *c_str = al_str_to_c_str(addr); @@ -156,18 +156,16 @@ bool nn_socket_bind(struct nn_socket *sock, str *addr, u16 port) saddr = (struct sockaddr *)&sock->addr_un; addrlen = sizeof(sock->addr_un); break; - } default: al_assert_and_return(false); } if (bind(sock->fd, saddr, addrlen) < 0) { - al_log_error("socket", "bind(%.*s:%hu) failed: %s (%d).", - nn_socket_fmt_addr(addr), port, nn_strerror(errno), errno); + error("bind(%.*s:%hu) failed: %s (%d).", nn_addr_x(addr), port, nn_strerror(errno), errno); return false; } - al_log_info("socket", "Socket bound to %.*s:%hu.", nn_socket_fmt_addr(addr), port); + info("Socket bound to %.*s:%hu.", nn_addr_x(addr), port); return true; } @@ -177,11 +175,11 @@ bool nn_socket_listen(struct nn_socket *sock) al_assert(sock->type == NNWT_SOCKET_TCP || sock->type == NNWT_SOCKET_UNIX); if (listen(sock->fd, SOMAXCONN) < 0) { - al_log_error("socket", "listen() failed: %s (%d).", nn_strerror(errno), errno); + error("listen() failed: %s (%d).", nn_strerror(errno), errno); return false; } - al_log_info("socket", "Listening."); + info("Listening."); return true; } @@ -189,19 +187,19 @@ bool nn_socket_listen(struct nn_socket *sock) bool nn_socket_accept(struct nn_socket *sock, struct nn_socket *cl, s32 flags) { al_assert(sock->type == NNWT_SOCKET_TCP || sock->type == NNWT_SOCKET_UNIX); - cl->type = sock->type; + cl->type = sock->type; struct sockaddr_storage addr = { 0 }; socklen_t addrlen = sizeof(addr); if ((cl->fd = accept(sock->fd, (struct sockaddr *)&addr, &addrlen)) == -1) { - al_log_error("socket", "accept() failed: %s (%d).", nn_strerror(errno), errno); + error("accept() failed: %s (%d).", nn_strerror(errno), errno); return false; } - nn_socket_apply_flags(cl, flags); - cl->addrinfo = NULL; + nn_socket_apply_flags(cl, flags); + switch (cl->type) { case NNWT_SOCKET_TCP: { u16 port = 0; @@ -215,11 +213,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)); } - al_log_info("socket", "Connection from %s:%hu.", addr_str, port); + info("Connection from %s:%hu.", addr_str, port); break; } case NNWT_SOCKET_UNIX: - al_log_info("socket", "Connection on UNIX socket."); + info("Connection on UNIX socket."); break; } @@ -246,13 +244,10 @@ bool nn_socket_connect(struct nn_socket *sock, str *addr, u16 port) default: al_assert_and_return(false); } - if (ret != 0 && errno != EINPROGRESS) { - al_log_error("socket", "connect(%.*s:%hu) failed: %s (%d).", - nn_socket_fmt_addr(addr), port, nn_strerror(errno), errno); + error("connect(%.*s:%hu) failed: %s (%d).", nn_addr_x(addr), port, nn_strerror(errno), errno); return false; } - return true; } diff --git a/src/socket/socket_windows.c b/src/socket/socket_windows.c index 85c2853..68a7700 100644 --- a/src/socket/socket_windows.c +++ b/src/socket/socket_windows.c @@ -1,3 +1,4 @@ +#define AL_LOG_SECTION "socket" #include <al/log.h> #include "socket.h" @@ -15,7 +16,7 @@ bool nn_socket_init(struct nn_socket *sock, s32 flags) } if (sock->fd == INVALID_SOCKET) { - al_log_error("socket", "socket() failed: %d.", WSAGetLastError()); + error("socket() failed: %d.", WSAGetLastError()); return false; } @@ -56,12 +57,11 @@ bool nn_socket_bind(struct nn_socket *sock, str *addr, u16 port) s32 ret = bind(sock->fd, (SOCKADDR *)&sock->addr_in, sizeof(sock->addr_in)); if (ret == SOCKET_ERROR) { - al_log_error("socket", "bind(%.*s:%hu) failed: %d.", - nn_socket_fmt_addr(addr), port, WSAGetLastError()); + error("bind(%.*s:%hu) failed: %d.", nn_addr_x(addr), port, WSAGetLastError()); return false; } - al_log_info("socket", "Socket bound to %.*s:%hu.", nn_socket_fmt_addr(addr), port); + info("Socket bound to %.*s:%hu.", nn_addr_x(addr), port); return true; } @@ -69,11 +69,11 @@ bool nn_socket_bind(struct nn_socket *sock, str *addr, u16 port) bool nn_socket_listen(struct nn_socket *sock) { if (listen(sock->fd, SOMAXCONN) == SOCKET_ERROR) { - al_log_error("socket", "listen() failed: %d.", WSAGetLastError()); + error("listen() failed: %d.", WSAGetLastError()); return false; } - al_log_info("socket", "Listening."); + info("Listening."); return true; } @@ -82,7 +82,7 @@ bool nn_socket_accept(struct nn_socket *sock, struct nn_socket *cl, s32 flags) { cl->type = sock->type; if ((cl->fd = accept(sock->fd, NULL, NULL)) == INVALID_SOCKET) { - al_log_error("socket", "accept() failed: %d.", WSAGetLastError()); + error("accept() failed: %d.", WSAGetLastError()); return false; } @@ -105,7 +105,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) { - al_log_error("socket", "connect() failed: %d.", WSAGetLastError()); + error("connect() failed: %d.", WSAGetLastError()); return false; } |