diff options
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; |