diff options
author | Nirbhay Choubey <nirbhay@mariadb.com> | 2015-01-26 11:44:39 -0500 |
---|---|---|
committer | Nirbhay Choubey <nirbhay@mariadb.com> | 2015-01-26 11:44:39 -0500 |
commit | f9e7f82d153e568c0d795b8f8a1d911fa4dbc9ab (patch) | |
tree | 55d2226b605a02b7a3920d8038b8e8ca38617279 /sql/wsrep_utils.cc | |
parent | fffc9f585ddaed46dc3d157ebde3c1aeeb8a8c8c (diff) | |
download | mariadb-git-f9e7f82d153e568c0d795b8f8a1d911fa4dbc9ab.tar.gz |
Backported changes done in wsrep_guess_ip() from 10.1.
Diffstat (limited to 'sql/wsrep_utils.cc')
-rw-r--r-- | sql/wsrep_utils.cc | 75 |
1 files changed, 29 insertions, 46 deletions
diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index f90d65da8cf..e6e58a433e7 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) |