aboutsummaryrefslogtreecommitdiff
path: root/server_network.c
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-07-24 06:26:14 -0400
committerTest_User <hax@andrewyu.org>2024-07-24 06:26:14 -0400
commit60819dbb04d65038e871e7d0b47cd91c6a6603dc (patch)
tree020748b88ed0268d6b0b1920840e6bd577b86069 /server_network.c
parent0bde62d4883de6e42047f86eedb08a1f21507383 (diff)
downloadhaxircd-60819dbb04d65038e871e7d0b47cd91c6a6603dc.tar.gz
haxircd-60819dbb04d65038e871e7d0b47cd91c6a6603dc.zip
sockaddr is verysane™
Diffstat (limited to 'server_network.c')
-rw-r--r--server_network.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/server_network.c b/server_network.c
index 0f22db2..cbe00a1 100644
--- a/server_network.c
+++ b/server_network.c
@@ -27,6 +27,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#include <arpa/inet.h>
+#include <netdb.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
@@ -171,19 +172,29 @@ void * server_accept_thread(void *type) {
}
{
- struct sockaddr sockaddr = {
- .sa_family = family,
+ struct sockaddr_storage sockaddr = {
+ .ss_family = family,
};
if (family == AF_INET) {
((struct sockaddr_in *)&sockaddr)->sin_port = htons(SERVER_PORTS[net][protocol]);
- inet_pton(AF_INET, "0.0.0.0", &(((struct sockaddr_in *)&sockaddr)->sin_addr));
#ifdef USE_IPv6
} else if (family == AF_INET6) {
- ((struct sockaddr_in6 *)&sockaddr)->sin6_port = htons(SERVER_PORTS[net][protocol]);
- inet_pton(AF_INET6, "::", &(((struct sockaddr_in6 *)&sockaddr)->sin6_addr));
int one = 1;
setsockopt(listen_fd, SOL_IPV6, IPV6_V6ONLY, &one, sizeof(one));
+ struct addrinfo hints = {
+ .ai_family = family,
+ .ai_socktype = SOCK_STREAM,
+ .ai_protocol = IPPROTO_TCP,
+ .ai_flags = AI_PASSIVE | AI_NUMERICSERV,
+ };
+ struct addrinfo *res;
+ int success = getaddrinfo(NULL, "0", &hints, &res);
+ if (success != 0)
+ return 0;
+ memcpy(&sockaddr, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ ((struct sockaddr_in6 *)&sockaddr)->sin6_port = htons(SERVER_PORTS[net][protocol]);
#endif
}