]> PatchyGit - patchyircd.git/commitdiff
net: set NONBLOCK at socket creation time
authorEgor <egor@patchysicp.xyz>
Thu, 12 Jun 2025 23:18:56 +0000 (02:18 +0300)
committerEgor <egor@patchysicp.xyz>
Thu, 12 Jun 2025 23:18:56 +0000 (02:18 +0300)
works on all relevant unices

src/main.cpp
src/netsock.cpp
src/netsock.h

index 3b9fc56..127cebf 100644 (file)
@@ -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);
        }
index 55404e8..6d8c3b5 100644 (file)
@@ -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));
index a4ae04a..131483b 100644 (file)
@@ -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;