diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index e675581ed2c..e0dc706b2aa 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -128,8 +128,10 @@ glusterd_is_local_addr (char *hostname) struct ifconf buf = {0,}; int sd = -1; struct ifreq *ifr = NULL; + struct ifreq *ifr_end = NULL; int32_t size = 0; - int32_t num_req = 0; + char buff[1024] = {0,}; + gf_boolean_t need_free = _gf_false; ret = getaddrinfo (hostname, NULL, NULL, &result); @@ -146,13 +148,12 @@ glusterd_is_local_addr (char *hostname) } - sd = socket (PF_UNIX, SOCK_DGRAM, 0); + sd = socket (AF_INET, SOCK_DGRAM, 0); if (sd == -1) goto out; - buf.ifc_len = sizeof (struct ifreq); - buf.ifc_req = GF_CALLOC (1, sizeof (struct ifreq), - gf_gld_mt_ifreq); + buf.ifc_len = sizeof (buff); + buf.ifc_buf = buff; size = buf.ifc_len; ret = ioctl (sd, SIOCGIFCONF, &buf); @@ -163,18 +164,21 @@ glusterd_is_local_addr (char *hostname) while (size <= buf.ifc_len) { size += sizeof (struct ifreq); buf.ifc_len = size; - buf.ifc_req = GF_REALLOC (buf.ifc_req, size); + if (need_free) + GF_FREE (buf.ifc_req); + buf.ifc_req = GF_CALLOC (1, size, gf_gld_mt_ifreq); + need_free = 1; ret = ioctl (sd, SIOCGIFCONF, &buf); if (ret) { goto out; } } + ifr_end = (struct ifreq *)&buf.ifc_buf[buf.ifc_len]; + for (res = result; res != NULL; res = res->ai_next) { ifr = buf.ifc_req; - num_req = size / sizeof (struct ifreq) - 1; - - while (num_req--) { + while (ifr < ifr_end) { if ((ifr->ifr_addr.sa_family == res->ai_addr->sa_family) && (memcmp (&ifr->ifr_addr, res->ai_addr, res->ai_addrlen) == 0)) { @@ -192,7 +196,7 @@ out: if (result) freeaddrinfo (result); - if (buf.ifc_req) + if (need_free) GF_FREE (buf.ifc_req); if (found) |