diff options
author | Diego Nehab <diego.nehab@gmail.com> | 2015-08-25 15:41:40 -0300 |
---|---|---|
committer | Diego Nehab <diego.nehab@gmail.com> | 2015-08-25 15:41:40 -0300 |
commit | 77bba625d7aaa0f9e118879163687fcbcb0b5a7b (patch) | |
tree | bbb719610c306b0af3225784164b44e2c509eb7c /src/inet.c | |
parent | 96965b179c7311f850f72a8629b9ba6d3a31d117 (diff) | |
download | luasocket-77bba625d7aaa0f9e118879163687fcbcb0b5a7b.tar.gz luasocket-77bba625d7aaa0f9e118879163687fcbcb0b5a7b.tar.bz2 luasocket-77bba625d7aaa0f9e118879163687fcbcb0b5a7b.zip |
Fixes suggested by @Florob in #147.
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 | } |