diff --git a/main.c b/main.c index 9cb8f72..9973f69 100644 --- a/main.c +++ b/main.c @@ -25,9 +25,14 @@ static void create_socket(struct globals_t* g) { size_t good = 0; const int on = 1; - struct sockaddr_in sin; int res; + union { + struct sockaddr sa; + struct sockaddr_in sa_in; + struct sockaddr_in6 sa_in6; + } sin; + g->sockets = calloc(g->nsockets, sizeof(int)); if (!g->sockets) { perror("calloc"); @@ -37,23 +42,26 @@ static void create_socket(struct globals_t* g) uint16_t port = htons((uint16_t)atoi(g->bind_port)); for (size_t i=0; insockets; ++i) { memset(&sin, 0, sizeof(sin)); - sin.sin_port = port; - if (1 == inet_pton(AF_INET, g->bind_addresses[i], &sin.sin_addr)) { - sin.sin_family = AF_INET; + if (inet_pton(AF_INET, g->bind_addresses[i], &sin.sa_in.sin_addr) == 1) { + sin.sa_in.sin_family = AF_INET; + sin.sa_in.sin_port = htons(port); } - else if (1 == inet_pton(AF_INET6, g->bind_addresses[i], &sin.sin_addr)) { - sin.sin_family = AF_INET6; + else if (inet_pton(AF_INET6, g->bind_addresses[i], &sin.sa_in6.sin6_addr) == 1) { + sin.sa_in6.sin6_family = AF_INET6; + sin.sa_in6.sin6_port = htons(port); } else { g->sockets[i] = -1; fprintf(stderr, "ERROR: '%s' is not a valid address\n", g->bind_addresses[i]); + free(g->bind_addresses[i]); + g->bind_addresses[i] = NULL; continue; } #if defined(__linux__) && defined(SOCK_NONBLOCK) - g->sockets[i] = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + g->sockets[i] = socket(sin.sa.sa_family, SOCK_STREAM | SOCK_NONBLOCK, 0); #else - g->sockets[i] = socket(AF_INET, SOCK_STREAM, 0); + g->sockets[i] = socket(sin.sa.sa_family, SOCK_STREAM, 0); #endif if (-1 == g->sockets[i]) { fprintf(stderr, "ERROR: Failed to create socket: %s\n", strerror(errno)); @@ -77,7 +85,7 @@ static void create_socket(struct globals_t* g) } #endif - res = bind(g->sockets[i], (struct sockaddr*)&sin, sizeof(sin)); + res = bind(g->sockets[i], &sin.sa, sizeof(sin)); if (-1 == res) { fprintf(stderr, "ERROR: failed to bind(): %s\n", strerror(errno)); close(g->sockets[i]);