/* Set sockaddr for local listener, and try to bind it. */
if (silc_net_set_sockaddr(&local, local_ip, 0))
- bind(sock, &local.sa, sizeof(local));
+ bind(sock, &local.sa, SIZEOF_SOCKADDR(local));
}
/* Connect to the host */
- rval = connect(sock, &desthost.sa, sizeof(desthost));
+ rval = connect(sock, &desthost.sa, SIZEOF_SOCKADDR(desthost));
if (rval < 0) {
+ /* retry using an IPv4 adress, if IPv6 didn't work */
+ if (prefer_ipv6 && silc_net_is_ip6(ip_addr)) {
+ shutdown(sock, 2);
+ close(sock);
+
+ prefer_ipv6 = FALSE;
+ goto retry;
+ }
SILC_LOG_ERROR(("Cannot connect to remote host: %s", strerror(errno)));
shutdown(sock, 2);
close(sock);
/* Set sockaddr for local listener, and try to bind it. */
if (silc_net_set_sockaddr(&local, local_ip, 0))
- bind(sock, &local.sa, sizeof(local));
+ bind(sock, &local.sa, SIZEOF_SOCKADDR(local));
}
/* Set the socket to non-blocking mode */
silc_net_set_socket_nonblock(sock);
/* Connect to the host */
- rval = connect(sock, &desthost.sa, sizeof(desthost));
+ rval = connect(sock, &desthost.sa, SIZEOF_SOCKADDR(desthost));
if (rval < 0) {
if (errno != EINPROGRESS) {
+ /* retry using an IPv4 adress, if IPv6 didn't work */
+ if (prefer_ipv6 && silc_net_is_ip6(ip_addr)) {
+ shutdown(sock, 2);
+ close(sock);
+
+ prefer_ipv6 = FALSE;
+ goto retry;
+ }
+
SILC_LOG_ERROR(("Cannot connect to remote host: %s", strerror(errno)));
shutdown(sock, 2);
close(sock);