Commit e6f35f15 authored by Nirbhay Choubey's avatar Nirbhay Choubey

Backported changes done in wsrep_guess_ip() from 10.1.

parent 53b9f755
...@@ -34,6 +34,10 @@ ...@@ -34,6 +34,10 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h> // getaddrinfo() #include <netdb.h> // getaddrinfo()
#ifdef HAVE_GETIFADDRS
#include <ifaddrs.h>
#endif
extern char** environ; // environment variables extern char** environ; // environment variables
static wsp::string wsrep_PATH; static wsp::string wsrep_PATH;
...@@ -321,10 +325,6 @@ thd::~thd () ...@@ -321,10 +325,6 @@ thd::~thd ()
/* Returns INADDR_NONE, INADDR_ANY, INADDR_LOOPBACK or something else */ /* Returns INADDR_NONE, INADDR_ANY, INADDR_LOOPBACK or something else */
unsigned int wsrep_check_ip (const char* const addr) unsigned int wsrep_check_ip (const char* const addr)
{ {
#if 0
if (addr && 0 == strcasecmp(addr, MY_BIND_ALL_ADDRESSES)) return INADDR_ANY;
#endif
unsigned int ret = INADDR_NONE; unsigned int ret = INADDR_NONE;
struct addrinfo *res, hints; struct addrinfo *res, hints;
...@@ -371,16 +371,17 @@ size_t wsrep_guess_ip (char* buf, size_t buf_len) ...@@ -371,16 +371,17 @@ size_t wsrep_guess_ip (char* buf, size_t buf_len)
{ {
size_t ip_len = 0; 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); unsigned int const ip_type= wsrep_check_ip(my_bind_addr_str);
if (INADDR_NONE == ip_type) { if (INADDR_NONE == ip_type) {
WSREP_ERROR("Networking not configured, cannot receive state transfer."); WSREP_ERROR("Networking not configured, cannot receive state "
"transfer.");
return 0; return 0;
} }
if (INADDR_ANY != ip_type) {; if (INADDR_ANY != ip_type) {
strncpy (buf, my_bind_addr_str, buf_len); strncpy (buf, my_bind_addr_str, buf_len);
return strlen(buf); return strlen(buf);
} }
...@@ -405,53 +406,29 @@ size_t wsrep_guess_ip (char* buf, size_t buf_len) ...@@ -405,53 +406,29 @@ size_t wsrep_guess_ip (char* buf, size_t buf_len)
return ip_len; return ip_len;
} }
// try to find the address of the first one #if HAVE_GETIFADDRS
#if (TARGET_OS_LINUX == 1) struct ifaddrs *ifaddr, *ifa;
const char cmd[] = "ip addr show | grep -E '^[[:space:]]*inet' | grep -m1 global |" if (getifaddrs(&ifaddr) == 0)
" awk '{ print $2 }' | sed -e 's/\\/.*//'"; {
#elif defined(__sun__) for (ifa= ifaddr; ifa != NULL; ifa = ifa->ifa_next)
const char cmd[] = "/sbin/ifconfig -a | " {
"/usr/gnu/bin/grep -m1 -1 -E 'net[0-9]:' | tail -n 1 | awk '{ print $2 }'"; if (!ifa->ifa_addr || ifa->ifa_addr->sa_family != AF_INET) // TODO AF_INET6
#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) continue;
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 (vio_getnameinfo(ifa->ifa_addr, buf, buf_len, NULL, 0, NI_NUMERICHOST))
continue;
if (proc.wait()) return 0; if (strcmp(buf, "127.0.0.1") == 0) // lame
continue;
if (NULL == ret) { freeifaddrs(ifaddr);
WSREP_ERROR("Failed to read output of: '%s'", cmd); return strlen(buf);
return 0;
}
}
else {
WSREP_ERROR("Failed to execute: '%s'", cmd);
return 0;
} }
freeifaddrs(ifaddr);
// 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';
} }
#endif
if (INADDR_NONE == inet_addr(buf)) {
if (strlen(buf) != 0) {
WSREP_WARN("Shell command returned invalid address: '%s'", buf);
}
return 0; return 0;
}
return ip_len;
} }
size_t wsrep_guess_address(char* buf, size_t buf_len) size_t wsrep_guess_address(char* buf, size_t buf_len)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment