From f9e7f82d153e568c0d795b8f8a1d911fa4dbc9ab Mon Sep 17 00:00:00 2001
From: Nirbhay Choubey <nirbhay@mariadb.com>
Date: Mon, 26 Jan 2015 11:44:39 -0500
Subject: [PATCH] Backported changes done in wsrep_guess_ip() from 10.1.

---
 sql/wsrep_utils.cc | 75 ++++++++++++++++++----------------------------
 1 file changed, 29 insertions(+), 46 deletions(-)

diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc
index f90d65da8c..e6e58a433e 100644
--- a/sql/wsrep_utils.cc
+++ b/sql/wsrep_utils.cc
@@ -34,6 +34,10 @@
 #include <sys/socket.h>
 #include <netdb.h>    // getaddrinfo()
 
+#ifdef HAVE_GETIFADDRS
+#include <ifaddrs.h>
+#endif
+
 extern char** environ; // environment variables
 
 static wsp::string wsrep_PATH;
@@ -361,20 +365,23 @@ unsigned int wsrep_check_ip (const char* const addr)
   return ret;
 }
 
-extern const char* my_bind_addr_str;
-extern uint        mysqld_port;
+extern char* my_bind_addr_str;
 
 size_t wsrep_guess_ip (char* buf, size_t buf_len)
 {
   size_t ip_len = 0;
 
-  if (my_bind_addr_str && strlen(my_bind_addr_str))
+  if (my_bind_addr_str && my_bind_addr_str[0] != '\0')
   {
     unsigned int const ip_type= wsrep_check_ip(my_bind_addr_str);
 
     if (INADDR_NONE == ip_type) {
-      WSREP_ERROR("Node IP address not obtained from bind_address, trying alternate methods");
-    } else if (INADDR_ANY != ip_type) {
+      WSREP_ERROR("Networking not configured, cannot receive state "
+                  "transfer.");
+      return 0;
+    }
+
+    if (INADDR_ANY != ip_type) {
       strncpy (buf, my_bind_addr_str, buf_len);
       return strlen(buf);
     }
@@ -399,53 +406,29 @@ size_t wsrep_guess_ip (char* buf, size_t buf_len)
     return ip_len;
   }
 
-  // try to find the address of the first one
-#if (TARGET_OS_LINUX == 1)
-  const char cmd[] = "ip addr show | grep -E '^[[:space:]]*inet' | grep -m1 global |"
-                     " awk '{ print $2 }' | sed -e 's/\\/.*//'";
-#elif defined(__sun__)
-  const char cmd[] = "/sbin/ifconfig -a | "
-      "/usr/gnu/bin/grep -m1 -1 -E 'net[0-9]:' | tail -n 1 | awk '{ print $2 }'";
-#elif defined(__APPLE__) || defined(__FreeBSD__)
-  const char cmd[] = "/sbin/route -nv get 8.8.8.8 | tail -n1 | awk '{print $(NF)}'";
-#else
-  char *cmd;
-#error "OS not supported"
-#endif
-  wsp::process proc (cmd, "r");
-
-  if (NULL != proc.pipe()) {
-    char* ret;
-
-    ret = fgets (buf, buf_len, proc.pipe());
-
-    if (proc.wait()) return 0;
+#if HAVE_GETIFADDRS
+  struct ifaddrs *ifaddr, *ifa;
+  if (getifaddrs(&ifaddr) == 0)
+  {
+    for (ifa= ifaddr; ifa != NULL; ifa = ifa->ifa_next)
+    {
+      if (!ifa->ifa_addr || ifa->ifa_addr->sa_family != AF_INET) // TODO AF_INET6
+        continue;
 
-    if (NULL == ret) {
-      WSREP_ERROR("Failed to read output of: '%s'", cmd);
-      return 0;
-    }
-  }
-  else {
-    WSREP_ERROR("Failed to execute: '%s'", cmd);
-    return 0;
-  }
+      if (vio_getnameinfo(ifa->ifa_addr, buf, buf_len, NULL, 0, NI_NUMERICHOST))
+        continue;
 
-  // clear possible \n at the end of ip string left by fgets()
-  ip_len = strlen (buf);
-  if (ip_len > 0 && '\n' == buf[ip_len - 1]) {
-    ip_len--;
-    buf[ip_len] = '\0';
-  }
+      if (strcmp(buf, "127.0.0.1") == 0) // lame
+        continue;
 
-  if (INADDR_NONE == inet_addr(buf)) {
-    if (strlen(buf) != 0) {
-      WSREP_WARN("Shell command returned invalid address: '%s'", buf);
+      freeifaddrs(ifaddr);
+      return strlen(buf);
     }
-    return 0;
+    freeifaddrs(ifaddr);
   }
+#endif
 
-  return ip_len;
+  return 0;
 }
 
 size_t wsrep_guess_address(char* buf, size_t buf_len)
-- 
2.30.9