[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-2155-gc736baf

Jeremy Allison jra at samba.org
Mon Jun 8 20:27:15 GMT 2009


The branch, master has been updated
       via  c736baf9f82e7246718d0b65a93e983a614ad0ed (commit)
      from  d2bb72d713d9c339c00536256f44dacf51e57414 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit c736baf9f82e7246718d0b65a93e983a614ad0ed
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Jun 8 13:26:39 2009 -0700

    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.

-----------------------------------------------------------------------

Summary of changes:
 source3/lib/util_sock.c |   35 +++++++++++++++++++++++++----------
 1 files changed, 25 insertions(+), 10 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index cf1bb79..31261af 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -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 type = SOCK_DGRAM;
-	struct sockaddr_in sock_out;
+	struct sockaddr_storage ss;
 	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) {
 		return -1;
 	}
 
-	memset((char *)&sock_out,'\0',sizeof(sock_out));
-	putip((char *)&sock_out.sin_addr,(char *)&addr);
-	sock_out.sin_port = htons(port);
-	sock_out.sin_family = PF_INET;
+#if defined(HAVE_IPV6)
+	if (ss.ss_family == AF_INET6) {
+		struct sockaddr_in6 *psa6;
+		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);
 		return -1;
 	}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list