From: Egor Date: Thu, 12 Jun 2025 23:42:25 +0000 (+0300) Subject: netsock: getaddrinfo abstraction deux X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=b3e6e16f3c164c82a504eced390d303742d167ab;p=patchyircd.git netsock: getaddrinfo abstraction deux we just need one result, so simply copy it out also move setsockint back to main, to get rid of netsock.cpp --- diff --git a/Makefile.am b/Makefile.am index 14dc60c..4497393 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/src/main.cpp b/src/main.cpp index 127cebf..3663412 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 index 6d8c3b5..0000000 --- a/src/netsock.cpp +++ /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)); -} diff --git a/src/netsock.h b/src/netsock.h index 131483b..2213fc8 100644 --- a/src/netsock.h +++ b/src/netsock.h @@ -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