From 9dee56a455edc0696d0f18f5b51f179e828ebb3f Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fl.fischer@fau.de>
Date: Thu, 11 Feb 2021 09:24:52 +0100
Subject: [PATCH] support ipv6

---
 src/emper-echo-server.c | 40 +++++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/emper-echo-server.c b/src/emper-echo-server.c
index b2702b2..a2877b1 100644
--- a/src/emper-echo-server.c
+++ b/src/emper-echo-server.c
@@ -2,7 +2,7 @@
 // Copyright © 2020 Florian Fischer
 /* #include <assert.h> */
 #include <errno.h>
-#include <netinet/in.h>
+#include <netdb.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -78,25 +78,38 @@ void client_func(void* arg) {
 
 #define BACKLOG 5
 static void welcome_func() {
-	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
-	if (sockfd == -1) {
-		die("socket failed");
+	int sockfd;
+	struct addrinfo* servaddr;
+
+	char* port_s;
+	if (asprintf(&port_s, "%d", port) < 0) {
+		die("asprintf failed");
+	}
+
+	int err = getaddrinfo("::", port_s, NULL, &servaddr);
+	if (err) {
+		if (err == EAI_SYSTEM) {
+			die("getaddrinfo failed");
+		}
+
+		fprintf(stderr, "error in getaddrinfo: %s", gai_strerror(err));
+		exit(EXIT_FAILURE);
 	}
 
-	struct sockaddr_in servaddr;
-	memset(&servaddr, 0, sizeof(servaddr));	 // NOLINT
+	free(port_s);
 
-	// assign IP, PORT
-	servaddr.sin_family = AF_INET;
-	servaddr.sin_addr.s_addr = INADDR_ANY;
-	servaddr.sin_port = htons(port);
+	// socket creation and verification
+	sockfd = socket(servaddr->ai_family, servaddr->ai_socktype, servaddr->ai_protocol);
+	if (sockfd == -1) {
+		die("listen socket creation failed");
+	}
 
 	int reuseaddr = 1;
 	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)) == -1) {
 		die("setsockopt failed");
 	}
 
-	if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
+	if (bind(sockfd, servaddr->ai_addr, servaddr->ai_addrlen) == -1) {
 		die("bind failed");
 	}
 
@@ -105,7 +118,7 @@ static void welcome_func() {
 	}
 
 	for (;;) {
-		int client_fd = async_accept(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr), UNSERIALIZED);
+		int client_fd = async_accept(sockfd, NULL, 0, UNSERIALIZED);
 		if (unlikely(client_fd < 0)) {
 			perror("accept failed");
 		}
@@ -127,9 +140,6 @@ int main(int argc, char* argv[]) {
 		exit(EXIT_FAILURE);
 	}
 
-	const int decimal = 10;
-	port = (int)strtol(argv[1], NULL, decimal);
-
 	init_runtime();
 
 	fiber* welcome_fiber = fiber_from0(welcome_func);
-- 
GitLab