File 15000-3400114-bnc713687-Proper-fallback-to-ipv4-if-ipv6-is-disabled.patch of Package sblim-sfcb-sle11-sp2

From 08dbbd9ac687ef498f26c717719996e06bf83bd1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <kkaempf@suse.de>
Date: Mon, 29 Aug 2011 12:10:30 +0200
Subject: [PATCH] Proper fallback to ipv4 if ipv6 is disabled

While a proper fallback was implemented for socket() in getSocket()
(httpAdapter.c), it was missing for bind() in bindToPort()

This patch implements the ipv4 fallback for bind() and listen().

Upstream ref: ID 3400114
---
 httpAdapter.c |   92 ++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 59 insertions(+), 33 deletions(-)

diff --git a/httpAdapter.c b/httpAdapter.c
index 2717dfa..f77c722 100644
--- a/httpAdapter.c
+++ b/httpAdapter.c
@@ -148,6 +148,10 @@ typedef struct _buffer {
  #define USE_INET6
 #endif
 
+#ifdef USE_INET6
+static int fallback_ipv4;
+#endif
+
 void initHttpProcCtl(int p)
 {
    httpProcSemKey=ftok(SFCB_BINARY,'H');
@@ -1238,6 +1242,7 @@ getSocket()
   if (fd < 0) {
     mlogf(M_INFO, M_SHOW, "--- Using IPv4 address\n");
     fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+    fallback_ipv4 = 1;
   }
 #else
   fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
@@ -1246,53 +1251,74 @@ getSocket()
   return fd;
 }
 
-static int
-bindToPort(int sock, int port, void *ssin, socklen_t * sin_len)
-{
 
 #ifdef USE_INET6
+static struct sockaddr *
+prepSockAddr6(int port, void *ssin, socklen_t * sin_len)
+{
   struct sockaddr_in6 *sin = ssin;
-#else
-  struct sockaddr_in *sin = ssin;
-#endif
 
   *sin_len = sizeof(*sin);
-
   memset(sin, 0, *sin_len);
 
-  if (sock >= 0) {
-    if (getControlBool("httpLocalOnly", &httpLocalOnly))
-      httpLocalOnly = 0;
+  sin->sin6_family = AF_INET6;
+  if (httpLocalOnly)
+    sin->sin6_addr = in6addr_loopback;
+  else
+    sin->sin6_addr = in6addr_any;
+  sin->sin6_port = htons(port);
 
-#ifdef USE_INET6
-    sin->sin6_family = AF_INET6;
-    if (httpLocalOnly)
-      sin->sin6_addr = in6addr_loopback;
-    else
-      sin->sin6_addr = in6addr_any;
-    sin->sin6_port = htons(port);
-#else
-    sin->sin_family = AF_INET;
-    if (httpLocalOnly) {
-      const char     *loopback_int = "127.0.0.1";
-      inet_aton(loopback_int, &(sin->sin_addr));
-    } else
-      sin->sin_addr.s_addr = INADDR_ANY;
-    sin->sin_port = htons(port);
+  return (struct sockaddr *) sin;
+}
 #endif
 
-    if (bind(sock, (struct sockaddr *) sin, *sin_len) || listen(sock, 10)) {
-      mlogf(M_ERROR, M_SHOW, "--- Cannot listen on port %ld (%s)\n", port,
-            strerror(errno));
-      sleep(1);
-      return 1;
-    }
 
-    return 0;
+static struct sockaddr *
+prepSockAddr4(int port, void *ssin, socklen_t * sin_len)
+{
+  struct sockaddr_in *sin = ssin;
+
+  *sin_len = sizeof(*sin);
+  memset(sin, 0, *sin_len);
+	
+  sin->sin_family = AF_INET;
+  if (httpLocalOnly) {
+    const char *loopback_int = "127.0.0.1";
+    inet_aton(loopback_int, &(sin->sin_addr));
+  } else
+    sin->sin_addr.s_addr = INADDR_ANY;
+  sin->sin_port = htons(port);
+
+  return (struct sockaddr *) sin;
+}
+
+
+static int
+bindToPort(int sock, int port, void *ssin, socklen_t * sin_len)
+{
+  struct sockaddr *sin;
+
+  if (sock < 0)
+    return 1;
+
+  if (getControlBool("httpLocalOnly", &httpLocalOnly))
+    httpLocalOnly = 0;
 
+#ifdef USE_INET6
+  if (!fallback_ipv4)
+    sin = prepSockAddr6(port, ssin, sin_len);
+  else
+#endif
+    sin = prepSockAddr4(port, ssin, sin_len);
+
+  if (bind(sock, sin, *sin_len) || listen(sock, 10)) {
+    mlogf(M_ERROR, M_SHOW, "--- Cannot listen on port %ld (%s)\n", port,
+          strerror(errno));
+    sleep(1);
+    return 1;
   }
 
-  return 1;
+  return 0;
 }
 
 #ifdef HAVE_UDS
-- 
1.7.6.1

openSUSE Build Service is sponsored by