From d15564afd70e454c088c1179d0fae85b8a8af33f Mon Sep 17 00:00:00 2001 From: Egor Date: Fri, 13 Jun 2025 02:18:56 +0300 Subject: [PATCH] net: set NONBLOCK at socket creation time works on all relevant unices --- src/main.cpp | 7 ++----- src/netsock.cpp | 16 ---------------- src/netsock.h | 5 +---- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3b9fc56..127cebf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,7 +26,7 @@ static listener create_listen_sock(const char *ip, const char *port, struct tls if (ai.err) ai.perror("getaddrinfo"), exit(1); - SOCKET sock = socket(ai->ai_family, ai->ai_socktype|SOCK_CLOEXEC, ai->ai_protocol); + SOCKET sock = socket(ai->ai_family, ai->ai_socktype | SOCK_CLOEXEC | SOCK_NONBLOCK, ai->ai_protocol); if(sock == INVALID_SOCKET) net_perror("socket"), exit(1); if (net_setsockint(sock, SOL_SOCKET, SO_REUSEADDR, 1) == -1) @@ -45,14 +45,12 @@ static void accept_from_sock(struct listener *listener) for (;;) { struct sockaddr_storage addr; socklen_t len = sizeof(addr); - SOCKET newSocket = accept4(listener->sock, (struct sockaddr *)&addr, &len, SOCK_CLOEXEC); + SOCKET newSocket = accept4(listener->sock, (struct sockaddr *)&addr, &len, SOCK_CLOEXEC | SOCK_NONBLOCK); if (newSocket == INVALID_SOCKET) { if (!net_wouldblock()) net_perror("accept4"); break; } - // Set nonblock - net_nonblock(newSocket); { // enable keepalive @@ -265,7 +263,6 @@ int main(int argc, char *argv[]) // NOTE: don't push_back to listeners beyond this point for (listener &listener : listeners) { - net_nonblock(listener.sock); netpoll::add(listener.sock, SOCKTYPE_LISTENER, &listener); netpoll::reg(listener.sock, UV_READABLE); } diff --git a/src/netsock.cpp b/src/netsock.cpp index 55404e8..6d8c3b5 100644 --- a/src/netsock.cpp +++ b/src/netsock.cpp @@ -3,22 +3,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "netsock.h" -int net_nonblock(SOCKET fd) -{ - int f = fcntl(fd, F_GETFL); - if (f == -1) - return -1; - return fcntl(fd, F_SETFL, f | O_NONBLOCK); -} - -void net_perror(const char *p) -{ - if (p && *p) - fprintf(stderr, "%s: %s\n", p, net_strerror(net_errno())); - else - fprintf(stderr, "%s\n", net_strerror(net_errno())); -} - net_addrinfo::net_addrinfo(const char *node, const char *service, int ai_family, int ai_socktype, int ai_protocol, int ai_flags) { struct addrinfo hints; memset(&hints, 0, sizeof(hints)); diff --git a/src/netsock.h b/src/netsock.h index a4ae04a..131483b 100644 --- a/src/netsock.h +++ b/src/netsock.h @@ -53,8 +53,7 @@ typedef int SOCKET; #define PRISocket "d" #define INVALID_SOCKET (-1) -#define net_errno() ((int)errno) -#define net_strerror(e) strerror((e)) +#define net_perror(p) (perror((p))) #define net_wouldblock() (errno == EAGAIN || errno == EWOULDBLOCK) #define closesocket close #ifndef SOCK_CLOEXEC @@ -62,8 +61,6 @@ typedef int SOCKET; #endif #define FOPEN_CLOEXEC "e" -void net_perror(const char *p); -int net_nonblock(SOCKET fd); struct net_addrinfo { struct addrinfo *res; int err; -- 2.56.0