From: Egor Date: Thu, 26 May 2022 21:12:33 +0000 (+0300) Subject: use getaddrinfo for creating sockets X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=004a3526a459efadd76532b3ed36f1a3a291e60f;p=patchyircd.git use getaddrinfo for creating sockets --- diff --git a/config.h b/config.h index 2e81fb9..7b19556 100644 --- a/config.h +++ b/config.h @@ -1,6 +1,3 @@ -#define LISTENING_PORT 6667 -#define LISTENING_PORT_TLS 6697 -#define LISTENING_BACKLOG SOMAXCONN #define CLIENTS 30 #define MAX_NICKLEN 32 #ifndef ADMINLOC1 diff --git a/main.c b/main.c index 37310ec..6effab4 100644 --- a/main.c +++ b/main.c @@ -71,18 +71,25 @@ struct client_data *clients[CLIENTS]; // FDSET List fd_set readfds; - -struct sockaddr_in serverAddrV4; -struct sockaddr_in6 serverAddrV6; FILE *fchanlog = NULL; -SOCKET create_listen_sock(int af, struct sockaddr *addr, size_t len) +SOCKET create_listen_sock(const char *ip, const char *port) { + struct addrinfo hints, *res; + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; + int err = getaddrinfo(ip, port, &hints, &res); + if (err) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err)); + exit(EXIT_FAILURE); + } + SOCKET sock; // Create socket - sock = socket(af, SOCK_STREAM, 0); + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if(sock == (SOCKET)INVALID_SOCKET) { net_perror("ERROR SOCKET"); + freeaddrinfo(res); exit(EXIT_FAILURE); } // Set socket options @@ -90,22 +97,24 @@ SOCKET create_listen_sock(int af, struct sockaddr *addr, size_t len) #ifndef _WIN32 if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(opt)) == -1) { net_perror("ERROR SOCKET"); + freeaddrinfo(res); exit(EXIT_FAILURE); } #endif - if(af == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&opt, sizeof(opt)) == -1) { + if(res->ai_family == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&opt, sizeof(opt)) == -1) { net_perror("ERROR SOCKET IPV6"); + freeaddrinfo(res); exit(EXIT_FAILURE); } - // Set nonblock - net_nonblock(sock); // Bind to socket - if(bind(sock, addr, len) == -1) { + if (bind(sock, res->ai_addr, res->ai_addrlen) == -1) { net_perror("ERROR BIND"); + freeaddrinfo(res); exit(EXIT_FAILURE); } + freeaddrinfo(res); // Listen to socket - if(listen(sock, LISTENING_BACKLOG) == -1) { + if(listen(sock, SOMAXCONN) == -1) { net_perror("ERROR LISTEN"); exit(EXIT_FAILURE); } @@ -186,19 +195,6 @@ int main() { // Zero stuff out memset(clients, 0, sizeof(clients)); - // Setup structs - memset(&serverAddrV4, 0, sizeof(struct sockaddr_in)); - serverAddrV4.sin_addr.s_addr = INADDR_ANY; - serverAddrV4.sin_port = htons(LISTENING_PORT); - serverAddrV4.sin_family = AF_INET; - listeners_tls[listener_count] = NULL; - listeners[listener_count++] = create_listen_sock(AF_INET, (struct sockaddr*)&serverAddrV4, sizeof(struct sockaddr_in)); - memset(&serverAddrV6, 0, sizeof(struct sockaddr_in6)); - serverAddrV6.sin6_addr = in6addr_any; - serverAddrV6.sin6_port = htons(LISTENING_PORT); - serverAddrV6.sin6_family = AF_INET6; - listeners_tls[listener_count] = NULL; - listeners[listener_count++] = create_listen_sock(AF_INET6, (struct sockaddr*)&serverAddrV6, sizeof(struct sockaddr_in6)); #ifdef HAS_TLS struct tls_config *tls_cfg; struct tls *tls_ctx; @@ -217,15 +213,22 @@ int main() { if (tls_configure(tls_ctx, tls_cfg) == -1) return fprintf(stderr, "tls_configure: %s\n", tls_error(tls_ctx)), 1; tls_config_free(tls_cfg); +#endif - serverAddrV4.sin_port = htons(LISTENING_PORT_TLS); + listeners_tls[listener_count] = NULL; + listeners[listener_count++] = create_listen_sock("0", "6667"); + listeners_tls[listener_count] = NULL; + listeners[listener_count++] = create_listen_sock("::", "6667"); +#ifdef HAS_TLS listeners_tls[listener_count] = tls_ctx; - listeners[listener_count++] = create_listen_sock(AF_INET, (struct sockaddr*)&serverAddrV4, sizeof(struct sockaddr_in)); - serverAddrV6.sin6_port = htons(LISTENING_PORT_TLS); + listeners[listener_count++] = create_listen_sock("0", "6697"); listeners_tls[listener_count] = tls_ctx; - listeners[listener_count++] = create_listen_sock(AF_INET6, (struct sockaddr*)&serverAddrV6, sizeof(struct sockaddr_in6)); + listeners[listener_count++] = create_listen_sock("::", "6697"); #endif + for (int i = 0; i < listener_count; i++) + net_nonblock(listeners[i]); + FILE *f = fopen("init.txt", "rb"); if (f) { struct client_data *fake = allocClient();