Choose the address length passed to connect() based on the address family.
This fixes making IPv4 connections on BSD when the client is compiled with IPv6 enabled. Thanks to brabes on sourceforge and snadge@freenode for originally tracking this down. git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@176 13b04d17-f746-0410-82c6-800466cd88b0
This commit is contained in:
@@ -499,6 +499,7 @@ int BX_connect_by_number(char *hostn, unsigned short *portnum, int service, int
|
|||||||
else if (!is_unix && (service == SERVICE_CLIENT))
|
else if (!is_unix && (service == SERVICE_CLIENT))
|
||||||
{
|
{
|
||||||
struct sockaddr_foobar server;
|
struct sockaddr_foobar server;
|
||||||
|
int server_len;
|
||||||
struct hostent *hp;
|
struct hostent *hp;
|
||||||
#ifdef WINNT
|
#ifdef WINNT
|
||||||
char buf[BIG_BUFFER_SIZE+1];
|
char buf[BIG_BUFFER_SIZE+1];
|
||||||
@@ -536,9 +537,15 @@ int BX_connect_by_number(char *hostn, unsigned short *portnum, int service, int
|
|||||||
set_socket_options (fd);
|
set_socket_options (fd);
|
||||||
|
|
||||||
if ((server.sf_family = sf->sf_family) == AF_INET)
|
if ((server.sf_family = sf->sf_family) == AF_INET)
|
||||||
|
{
|
||||||
memcpy(&server.sf_addr, &sf->sf_addr, sizeof(struct in_addr));
|
memcpy(&server.sf_addr, &sf->sf_addr, sizeof(struct in_addr));
|
||||||
|
server_len = sizeof server.sins.sin;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
memcpy(&server.sf_addr6, &sf->sf_addr6, sizeof(struct in6_addr));
|
memcpy(&server.sf_addr6, &sf->sf_addr6, sizeof(struct in6_addr));
|
||||||
|
server_len = sizeof server.sins.sin6;
|
||||||
|
}
|
||||||
server.sf_port = htons(*portnum);
|
server.sf_port = htons(*portnum);
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(struct addrinfo));
|
memset(&hints, 0, sizeof(struct addrinfo));
|
||||||
@@ -566,6 +573,7 @@ int BX_connect_by_number(char *hostn, unsigned short *portnum, int service, int
|
|||||||
}
|
}
|
||||||
server.sf_family = AF_INET;
|
server.sf_family = AF_INET;
|
||||||
server.sf_port = htons(*portnum);
|
server.sf_port = htons(*portnum);
|
||||||
|
server_len = sizeof server.sins.sin;
|
||||||
#endif /* IPV6 */
|
#endif /* IPV6 */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -591,6 +599,7 @@ int BX_connect_by_number(char *hostn, unsigned short *portnum, int service, int
|
|||||||
else
|
else
|
||||||
server.sf_family = AF_INET;
|
server.sf_family = AF_INET;
|
||||||
server.sf_port = (unsigned short) htons(*portnum);
|
server.sf_port = (unsigned short) htons(*portnum);
|
||||||
|
server_len = sizeof server.sins.sin;
|
||||||
#endif /* WINNT */
|
#endif /* WINNT */
|
||||||
|
|
||||||
#ifdef NON_BLOCKING_CONNECTS
|
#ifdef NON_BLOCKING_CONNECTS
|
||||||
@@ -611,7 +620,7 @@ int BX_connect_by_number(char *hostn, unsigned short *portnum, int service, int
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
alarm(get_int_var(CONNECT_TIMEOUT_VAR));
|
alarm(get_int_var(CONNECT_TIMEOUT_VAR));
|
||||||
if (connect(fd, (struct sockaddr *)&server, sizeof(server)) < 0 && errno != EINPROGRESS)
|
if (connect(fd, (struct sockaddr *)&server, server_len) < 0 && errno != EINPROGRESS)
|
||||||
{
|
{
|
||||||
alarm(0);
|
alarm(0);
|
||||||
return close(fd), -4;
|
return close(fd), -4;
|
||||||
|
|||||||
Reference in New Issue
Block a user