Skip to content

Commit

Permalink
fix: IPv6 handling
Browse files Browse the repository at this point in the history
  • Loading branch information
sjinks committed Apr 10, 2024
1 parent c245beb commit d0d9d06
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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; i<g->nsockets; ++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));
Expand All @@ -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]);
Expand Down

0 comments on commit d0d9d06

Please sign in to comment.