aboutsummaryrefslogtreecommitdiff
path: root/src/inet.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/inet.c')
-rw-r--r--src/inet.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/inet.c b/src/inet.c
index 1530fef..5bc6364 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -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\*-------------------------------------------------------------------------*/
399const char *inet_tryconnect(p_socket ps, const char *address, 399const 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\*-------------------------------------------------------------------------*/
427const char *inet_tryaccept(p_socket server, int family, p_socket client, p_timeout tm) 444const 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;