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);
{
// 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
}
+++ /dev/null
-// 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));
-}