diff options
| author | Diego Nehab <diego@impa.br> | 2013-05-26 21:26:26 +0800 |
|---|---|---|
| committer | Diego Nehab <diego@impa.br> | 2013-05-26 21:26:26 +0800 |
| commit | 427220c7b177cdae2379ac419d975c69764ba8ee (patch) | |
| tree | b2690db3cb9cde4505ad51eaac83d3fe4a854ff5 /src/inet.c | |
| parent | 6d93fd7c8f04fecbcdc28994da8b8357f712463f (diff) | |
| download | luasocket-427220c7b177cdae2379ac419d975c69764ba8ee.tar.gz luasocket-427220c7b177cdae2379ac419d975c69764ba8ee.tar.bz2 luasocket-427220c7b177cdae2379ac419d975c69764ba8ee.zip | |
Merge tryconnect6 into inet_tryconnect.
Diffstat (limited to 'src/inet.c')
| -rw-r--r-- | src/inet.c | 22 |
1 files changed, 20 insertions, 2 deletions
| @@ -396,7 +396,7 @@ const char *inet_trydisconnect(p_socket ps, int family, p_timeout tm) | |||
| 396 | /*-------------------------------------------------------------------------*\ | 396 | /*-------------------------------------------------------------------------*\ |
| 397 | * Tries to connect to remote address (address, port) | 397 | * Tries to connect to remote address (address, port) |
| 398 | \*-------------------------------------------------------------------------*/ | 398 | \*-------------------------------------------------------------------------*/ |
| 399 | const char *inet_tryconnect(p_socket ps, const char *address, | 399 | const char *inet_tryconnect(p_socket ps, int *family, const char *address, |
| 400 | const char *serv, p_timeout tm, struct addrinfo *connecthints) | 400 | const char *serv, p_timeout tm, struct addrinfo *connecthints) |
| 401 | { | 401 | { |
| 402 | struct addrinfo *iterator = NULL, *resolved = NULL; | 402 | struct addrinfo *iterator = NULL, *resolved = NULL; |
| @@ -410,6 +410,23 @@ const char *inet_tryconnect(p_socket ps, const char *address, | |||
| 410 | } | 410 | } |
| 411 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { | 411 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { |
| 412 | timeout_markstart(tm); | 412 | timeout_markstart(tm); |
| 413 | /* create new socket if necessary. if there was no | ||
| 414 | * bind, we need to create one for every new family | ||
| 415 | * that shows up while iterating. if there was a | ||
| 416 | * bind, all families will be the same and we will | ||
| 417 | * not enter this branch. */ | ||
| 418 | if (*family != iterator->ai_family) { | ||
| 419 | socket_destroy(ps); | ||
| 420 | err = socket_strerror(socket_create(ps, iterator->ai_family, | ||
| 421 | iterator->ai_socktype, iterator->ai_protocol)); | ||
| 422 | if (err != NULL) { | ||
| 423 | freeaddrinfo(resolved); | ||
| 424 | return err; | ||
| 425 | } | ||
| 426 | *family = iterator->ai_family; | ||
| 427 | /* all sockets initially non-blocking */ | ||
| 428 | socket_setnonblocking(ps); | ||
| 429 | } | ||
| 413 | /* try connecting to remote address */ | 430 | /* try connecting to remote address */ |
| 414 | err = socket_strerror(socket_connect(ps, (SA *) iterator->ai_addr, | 431 | err = socket_strerror(socket_connect(ps, (SA *) iterator->ai_addr, |
| 415 | (socklen_t) iterator->ai_addrlen, tm)); | 432 | (socklen_t) iterator->ai_addrlen, tm)); |
| @@ -424,7 +441,8 @@ const char *inet_tryconnect(p_socket ps, const char *address, | |||
| 424 | /*-------------------------------------------------------------------------*\ | 441 | /*-------------------------------------------------------------------------*\ |
| 425 | * Tries to accept a socket | 442 | * Tries to accept a socket |
| 426 | \*-------------------------------------------------------------------------*/ | 443 | \*-------------------------------------------------------------------------*/ |
| 427 | const char *inet_tryaccept(p_socket server, int family, p_socket client, p_timeout tm) | 444 | const char *inet_tryaccept(p_socket server, int family, p_socket client, |
| 445 | p_timeout tm) | ||
| 428 | { | 446 | { |
| 429 | socklen_t len; | 447 | socklen_t len; |
| 430 | t_sockaddr_storage addr; | 448 | t_sockaddr_storage addr; |
