aboutsummaryrefslogtreecommitdiff
path: root/general_network.c
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-07-24 02:48:49 -0400
committerTest_User <hax@andrewyu.org>2024-07-24 02:48:49 -0400
commit09c0ec3bdf113dd507135237603bf0096e642172 (patch)
tree6d4b1d55e475d515af61456bc5aac332800f40a9 /general_network.c
parentae6d5cd81efaf533c46790bf5e39a6b563c24722 (diff)
downloadhaxircd-09c0ec3bdf113dd507135237603bf0096e642172.tar.gz
haxircd-09c0ec3bdf113dd507135237603bf0096e642172.zip
Probable outgoing IPv6 support
Diffstat (limited to 'general_network.c')
-rw-r--r--general_network.c23
1 files changed, 20 insertions, 3 deletions
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);
}