]> PatchyGit - patchyircd.git/commitdiff
netsock: getaddrinfo abstraction deux
authorEgor <egor@patchysicp.xyz>
Thu, 12 Jun 2025 23:42:25 +0000 (02:42 +0300)
committerEgor <egor@patchysicp.xyz>
Thu, 12 Jun 2025 23:42:25 +0000 (02:42 +0300)
we just need one result, so simply copy it out

also move setsockint back to main, to get rid of netsock.cpp

Makefile.am
src/main.cpp
src/netsock.cpp [deleted file]
src/netsock.h

index 14dc60c..4497393 100644 (file)
@@ -12,7 +12,7 @@ ircd_SOURCES = \
        src/map.cpp            src/map.h            \
        src/net.cpp            src/net.h            \
        src/netpoll.cpp        src/netpoll.h        \
-       src/netsock.cpp        src/netsock.h        \
+                              src/netsock.h        \
        src/passwd.cpp         src/passwd.h         \
        src/util.cpp           src/util.h           \
        src/main.cpp
index 127cebf..3663412 100644 (file)
@@ -20,20 +20,45 @@ struct listener {
        struct tls *ctx;
 };
 
+static int getaddrinfo_one(const char *node, const char *service, int family, int socktype, int protocol, int flags, struct addrinfo *ai, struct sockaddr_storage *addr) {
+       struct addrinfo hints, *res;
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_flags = flags;
+       hints.ai_family = family;
+       hints.ai_socktype = socktype;
+       hints.ai_protocol = protocol;
+       int err = getaddrinfo(node, service, &hints, &res);
+       if (err)
+               return err;
+       *ai = *res;
+       memcpy(addr, ai->ai_addr, ai->ai_addrlen);
+       ai->ai_canonname = 0;
+       ai->ai_next = 0;
+       freeaddrinfo(res);
+       return 0;
+}
+
+static int setsockint(int sockfd, int level, int optname, int optval)
+{
+       return setsockopt(sockfd, level, optname, (void *)&optval, sizeof(optval));
+}
+
 static listener create_listen_sock(const char *ip, const char *port, struct tls *ctx)
 {
-       net_addrinfo ai(ip, port, 0, SOCK_STREAM, 0, AI_NUMERICHOST | AI_NUMERICSERV);
-       if (ai.err)
-               ai.perror("getaddrinfo"), exit(1);
+       struct sockaddr_storage addr;
+       struct addrinfo ai;
+       int err = getaddrinfo_one(ip, port, AF_UNSPEC, SOCK_STREAM, 0, AI_NUMERICHOST | AI_NUMERICSERV, &ai, &addr);
+       if (err)
+               fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err)), exit(1);
 
-       SOCKET sock = socket(ai->ai_family, ai->ai_socktype | SOCK_CLOEXEC | SOCK_NONBLOCK, 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)
+       if (setsockint(sock, SOL_SOCKET, SO_REUSEADDR, 1) == -1)
                net_perror("setsockopt(SO_REUSEADDR)"), exit(1);
-       if (ai->ai_family == AF_INET6 && net_setsockint(sock, IPPROTO_IPV6, IPV6_V6ONLY, 1) == -1)
+       if (ai.ai_family == AF_INET6 && setsockint(sock, IPPROTO_IPV6, IPV6_V6ONLY, 1) == -1)
                net_perror("setsockopt(IPV6_V6ONLY)"), exit(1);
-       if (bind(sock, ai->ai_addr, ai->ai_addrlen) == -1)
+       if (bind(sock, ai.ai_addr, ai.ai_addrlen) == -1)
                net_perror("bind"), exit(1);
        if (listen(sock, SOMAXCONN) == -1)
                net_perror("listen"), exit(1);
@@ -54,15 +79,15 @@ static void accept_from_sock(struct listener *listener)
 
                {
                        // enable keepalive
-                       net_setsockint(newSocket, SOL_SOCKET, SO_KEEPALIVE, 1);
+                       setsockint(newSocket, SOL_SOCKET, SO_KEEPALIVE, 1);
 #ifdef TCP_KEEPIDLE
-                       net_setsockint(newSocket, IPPROTO_TCP, TCP_KEEPIDLE, 30);
+                       setsockint(newSocket, IPPROTO_TCP, TCP_KEEPIDLE, 30);
 #endif
 #ifdef TCP_KEEPINTVL
-                       net_setsockint(newSocket, IPPROTO_TCP, TCP_KEEPINTVL, 1);
+                       setsockint(newSocket, IPPROTO_TCP, TCP_KEEPINTVL, 1);
 #endif
 #ifdef TCP_KEEPCNT
-                       net_setsockint(newSocket, IPPROTO_TCP, TCP_KEEPCNT, 10);
+                       setsockint(newSocket, IPPROTO_TCP, TCP_KEEPCNT, 10);
 #endif
                }
 
diff --git a/src/netsock.cpp b/src/netsock.cpp
deleted file mode 100644 (file)
index 6d8c3b5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2022 Sam Smith
-// Copyright (c) 2022-2023, 2025 Egor
-// SPDX-License-Identifier: GPL-2.0-or-later
-#include "netsock.h"
-
-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));
-       hints.ai_flags = ai_flags;
-       hints.ai_family = ai_family;
-       hints.ai_socktype = ai_socktype;
-       hints.ai_protocol = ai_protocol;
-       res = 0;
-       err = getaddrinfo(node, service, &hints, &res);
-}
-net_addrinfo::~net_addrinfo() {
-       if (err == 0)
-               freeaddrinfo(res);
-}
-void net_addrinfo::perror(const char *p) {
-       if (p && *p)
-               fprintf(stderr, "%s: %s\n", p, gai_strerror(err));
-       else
-               fprintf(stderr, " %s\n", gai_strerror(err));
-}
-struct addrinfo *net_addrinfo::operator->() {
-       return res;
-}
-
-int net_setsockint(int sockfd, int level, int optname, int optval)
-{
-       return setsockopt(sockfd, level, optname, (void *)&optval, sizeof(optval));
-}
index 131483b..2213fc8 100644 (file)
@@ -60,16 +60,4 @@ typedef int SOCKET;
 #error "SOCK_CLOEXEC is required"
 #endif
 #define FOPEN_CLOEXEC "e"
-
-struct net_addrinfo {
-       struct addrinfo *res;
-       int err;
-
-       net_addrinfo();
-       net_addrinfo(const char *node, const char *service, int ai_family, int ai_socktype, int ai_protocol, int ai_flags);
-       ~net_addrinfo();
-       void perror(const char *p);
-       struct addrinfo *operator->();
-};
-int net_setsockint(int sockfd, int level, int optname, int optval);
 #endif