diff options
Diffstat (limited to 'src/inet.c')
-rw-r--r-- | src/inet.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -352,8 +352,13 @@ static void inet_pushresolved(lua_State *L, struct hostent *hp) | |||
352 | /*-------------------------------------------------------------------------*\ | 352 | /*-------------------------------------------------------------------------*\ |
353 | * Tries to create a new inet socket | 353 | * Tries to create a new inet socket |
354 | \*-------------------------------------------------------------------------*/ | 354 | \*-------------------------------------------------------------------------*/ |
355 | const char *inet_trycreate(p_socket ps, int family, int type) { | 355 | const char *inet_trycreate(p_socket ps, int family, int type, int protocol) { |
356 | return socket_strerror(socket_create(ps, family, type, 0)); | 356 | const char *err = socket_strerror(socket_create(ps, family, type, protocol)); |
357 | if (err == NULL && family == AF_INET6) { | ||
358 | int yes = 1; | ||
359 | setsockopt(*ps, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&yes, sizeof(yes)); | ||
360 | } | ||
361 | return err; | ||
357 | } | 362 | } |
358 | 363 | ||
359 | /*-------------------------------------------------------------------------*\ | 364 | /*-------------------------------------------------------------------------*\ |
@@ -408,8 +413,8 @@ const char *inet_tryconnect(p_socket ps, int *family, const char *address, | |||
408 | * not enter this branch. */ | 413 | * not enter this branch. */ |
409 | if (current_family != iterator->ai_family || *ps == SOCKET_INVALID) { | 414 | if (current_family != iterator->ai_family || *ps == SOCKET_INVALID) { |
410 | socket_destroy(ps); | 415 | socket_destroy(ps); |
411 | err = socket_strerror(socket_create(ps, iterator->ai_family, | 416 | err = inet_trycreate(ps, iterator->ai_family, |
412 | iterator->ai_socktype, iterator->ai_protocol)); | 417 | iterator->ai_socktype, iterator->ai_protocol); |
413 | if (err) continue; | 418 | if (err) continue; |
414 | current_family = iterator->ai_family; | 419 | current_family = iterator->ai_family; |
415 | /* set non-blocking before connect */ | 420 | /* set non-blocking before connect */ |
@@ -466,8 +471,8 @@ const char *inet_trybind(p_socket ps, int *family, const char *address, | |||
466 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { | 471 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { |
467 | if (current_family != iterator->ai_family || *ps == SOCKET_INVALID) { | 472 | if (current_family != iterator->ai_family || *ps == SOCKET_INVALID) { |
468 | socket_destroy(ps); | 473 | socket_destroy(ps); |
469 | err = socket_strerror(socket_create(ps, iterator->ai_family, | 474 | err = inet_trycreate(ps, iterator->ai_family, |
470 | iterator->ai_socktype, iterator->ai_protocol)); | 475 | iterator->ai_socktype, iterator->ai_protocol); |
471 | if (err) continue; | 476 | if (err) continue; |
472 | current_family = iterator->ai_family; | 477 | current_family = iterator->ai_family; |
473 | } | 478 | } |