1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

Make open_udp_socket() IPv6 clean. Trying to fix bug #6437 - Unable to join IPv6-only ads domain.

Avaiting feedback from submitter before backport to 3.4 and earlier.
Jeremy.
This commit is contained in:
Jeremy Allison 2009-06-08 13:26:39 -07:00
parent d2bb72d713
commit c736baf9f8

View File

@ -1414,24 +1414,39 @@ bool open_any_socket_out(struct sockaddr_storage *addrs, int num_addrs,
int open_udp_socket(const char *host, int port) int open_udp_socket(const char *host, int port)
{ {
int type = SOCK_DGRAM; struct sockaddr_storage ss;
struct sockaddr_in sock_out;
int res; int res;
struct in_addr addr;
addr = interpret_addr2(host); if (!interpret_string_addr(&ss, host, 0)) {
DEBUG(10,("open_udp_socket: can't resolve name %s\n",
host));
return -1;
}
res = socket(PF_INET, type, 0); res = socket(ss.ss_family, SOCK_DGRAM, 0);
if (res == -1) { if (res == -1) {
return -1; return -1;
} }
memset((char *)&sock_out,'\0',sizeof(sock_out)); #if defined(HAVE_IPV6)
putip((char *)&sock_out.sin_addr,(char *)&addr); if (ss.ss_family == AF_INET6) {
sock_out.sin_port = htons(port); struct sockaddr_in6 *psa6;
sock_out.sin_family = PF_INET; psa6 = (struct sockaddr_in6 *)&ss;
psa6->sin6_port = htons(port);
if (psa6->sin6_scope_id == 0
&& IN6_IS_ADDR_LINKLOCAL(&psa6->sin6_addr)) {
setup_linklocal_scope_id(
(struct sockaddr *)&ss);
}
}
#endif
if (ss.ss_family == AF_INET) {
struct sockaddr_in *psa;
psa = (struct sockaddr_in *)&ss;
psa->sin_port = htons(port);
}
if (sys_connect(res,(struct sockaddr *)&sock_out)) { if (sys_connect(res,(struct sockaddr *)&ss)) {
close(res); close(res);
return -1; return -1;
} }