]> PatchyGit - patchyircd.git/commitdiff
use getaddrinfo for creating sockets
authorEgor <egor@patchysicp.xyz>
Thu, 26 May 2022 21:12:33 +0000 (00:12 +0300)
committerEgor <egor@patchysicp.xyz>
Thu, 26 May 2022 21:12:33 +0000 (00:12 +0300)
config.h
main.c

index 2e81fb9..7b19556 100644 (file)
--- 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 (file)
--- 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();