From 09c0ec3bdf113dd507135237603bf0096e642172 Mon Sep 17 00:00:00 2001 From: Test_User Date: Wed, 24 Jul 2024 02:48:49 -0400 Subject: Probable outgoing IPv6 support --- general_network.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'general_network.c') diff --git a/general_network.c b/general_network.c index afc11fb..452b950 100644 --- a/general_network.c +++ b/general_network.c @@ -169,7 +169,7 @@ struct table channel_list = {0}; struct server_info *self; -int resolve(struct string address, struct string port, struct sockaddr *sockaddr) { +int resolve(struct string address, struct string port, struct sockaddr *sockaddr, socklen_t *len, int *family) { // NULL isn't really valid in this anyways so... just checking it and replacing with null-terminated for now for (size_t i = 0; i < address.len; i++) if (address.data[i] == 0) @@ -194,7 +194,7 @@ int resolve(struct string address, struct string port, struct sockaddr *sockaddr int success; struct addrinfo hints = { - .ai_family = AF_INET, + .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_protocol = IPPROTO_TCP, .ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG, @@ -204,7 +204,24 @@ int resolve(struct string address, struct string port, struct sockaddr *sockaddr success = getaddrinfo(addr_null, port_null, &hints, &info); if (success == 0) { - *sockaddr = *(info->ai_addr); + struct addrinfo *this = info; + while (1) { + if (this->ai_family == AF_INET +#ifdef USE_IPv6 + || this->ai_family == AF_INET6 +#endif + ) { + memcpy(sockaddr, this->ai_addr, this->ai_addrlen); + *len = this->ai_addrlen; + *family = this->ai_family; + break; + } else if (this->ai_next) { + this = this->ai_next; + } else { + success = 1; + break; + } + } freeaddrinfo(info); } -- cgit v1.2.3