summaryrefslogtreecommitdiff
path: root/src/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket')
-rw-r--r--src/socket/socket.h3
-rw-r--r--src/socket/socket_internal.h11
-rw-r--r--src/socket/socket_linux.c41
-rw-r--r--src/socket/socket_windows.c16
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;
}