erlang (1:14.a-dfsg-3squeeze1) odbc.patch

Summary

 lib/odbc/c_src/odbcserver.c |   92 +++++++++++++++-----------------------------
 lib/odbc/src/odbc.erl       |    6 +-
 2 files changed, 37 insertions(+), 61 deletions(-)

    
download this patch

Patch contents

Author: Upstream
Description: Fixes connecting odbcserver back to Erlang VM in IPv6-only
 environment
Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=598525
Forwarded: not-needed
Last-updated: Sun, 14 Nov 2010 12:20:41 +0300

--- erlang-14.a-dfsg.orig/lib/odbc/src/odbc.erl
+++ erlang-14.a-dfsg/lib/odbc/src/odbc.erl
@@ -441,10 +441,12 @@ init(Args) ->
 
     {ok, ListenSocketSup} =
 	gen_tcp:listen(0, [Inet, binary, {packet, ?LENGTH_INDICATOR_SIZE},
-			   {active, false}, {nodelay, true}]),
+			   {active, false}, {nodelay, true},
+			   {ip, loopback}]),
     {ok, ListenSocketOdbc} =
 	gen_tcp:listen(0, [Inet, binary, {packet, ?LENGTH_INDICATOR_SIZE},
-			   {active, false}, {nodelay, true}]),
+			   {active, false}, {nodelay, true},
+			   {ip, loopback}]),
 
     %% Start the port program (a c program) that utilizes the odbc driver 
     case os:find_executable(?SERVERPROG, ?SERVERDIR) of
--- erlang-14.a-dfsg.orig/lib/odbc/c_src/odbcserver.c
+++ erlang-14.a-dfsg/lib/odbc/c_src/odbcserver.c
@@ -1727,74 +1727,48 @@ static byte * receive_erlang_port_msg(void)
 }
  
 /* ------------- Socket communication functions --------------------------*/
-#define USE_IPV4
-#ifdef UNIX
-#define SOCKET int   
-#endif
 
-#if defined WIN32 || defined USE_IPV4
-/* Currently only an old windows compiler is supported so we do not have ipv6
-  capabilities */
+#if defined(WIN32)
 static SOCKET connect_to_erlang(const char *port)
-{
-    SOCKET sock;
-    struct sockaddr_in sin;
-    
-    sock = socket(AF_INET, SOCK_STREAM, 0);
-    
-    memset(&sin, 0, sizeof(sin));
-    sin.sin_port = htons ((unsigned short)atoi(port));
-    sin.sin_family = AF_INET;
-    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
-    
-    if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) != 0) {
-        close_socket(sock);
-        DO_EXIT(EXIT_SOCKET_CONNECT);
-    }
-    return sock;
-}
 #elif defined(UNIX)
 static int connect_to_erlang(const char *port)
+#endif
 {
-    int sock;
-    
-    struct addrinfo hints;
-    struct addrinfo *erlang_ai, *first;
-    
-    memset(&hints, 0, sizeof(hints));
-    hints.ai_family = PF_UNSPEC; /* PF_INET or PF_INET6 */
-    hints.ai_socktype = SOCK_STREAM;
-    hints.ai_protocol = IPPROTO_TCP;
-    
-    if (getaddrinfo("localhost", port, &hints, &first) != 0) {
-  	DO_EXIT(EXIT_FAILURE);
-    }
+#if defined(WIN32)
+	SOCKET sock;
+#elif defined(UNIX)
+	int sock;
+#endif
+	struct sockaddr_in sin;
+
+#if defined(AF_INET6)
+	struct sockaddr_in6 sin6;
+
+	sock = socket(AF_INET6, SOCK_STREAM, 0);
+
+	memset(&sin6, 0, sizeof(sin6));
+	sin6.sin6_port = htons ((unsigned short)atoi(port));
+	sin6.sin6_family = AF_INET6;
+	sin6.sin6_addr = in6addr_loopback;
     
-    for (erlang_ai = first; erlang_ai; erlang_ai = erlang_ai->ai_next) {
+	if (connect(sock, (struct sockaddr*)&sin6, sizeof(sin6)) == 0) {
+		return sock;
+	}
+	close_socket(sock);
+#endif
+	sock = socket(AF_INET, SOCK_STREAM, 0);
+
+	memset(&sin, 0, sizeof(sin));
+	sin.sin_port = htons ((unsigned short)atoi(port));
+	sin.sin_family = AF_INET;
+	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
 	
-	sock = socket(erlang_ai->ai_family, erlang_ai->ai_socktype,
-		      erlang_ai->ai_protocol);
-	if (sock < 0)
-	    continue;
-	if (connect(sock,  (struct sockaddr*)erlang_ai->ai_addr,
-		    erlang_ai->ai_addrlen) < 0) {
-	    close(sock); 
-	    sock = -1;
-	    continue;
-	} else {
-	    break;
+	if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) != 0) {
+		close_socket(sock);
+		DO_EXIT(EXIT_SOCKET_CONNECT);
 	}
-    }
-    freeaddrinfo(first); 
-    
-    if (sock < 0){
-	close_socket(sock); 
-	DO_EXIT(EXIT_SOCKET_CONNECT); 
-    }
-    
-    return sock;
+	return sock;
 }
-#endif
 
 #ifdef WIN32
 static void close_socket(SOCKET socket)