summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rpc/block_svc_routines.c80
-rw-r--r--utils/utils.h1
2 files changed, 51 insertions, 30 deletions
diff --git a/rpc/block_svc_routines.c b/rpc/block_svc_routines.c
index 51b56ec..c8fb18d 100644
--- a/rpc/block_svc_routines.c
+++ b/rpc/block_svc_routines.c
@@ -299,50 +299,69 @@ blockRemoteCreateRespParse(char *output, blockRemoteCreateResp **savereply)
return -1;
}
+struct addrinfo *
+glusterBlockGetSockaddr(char *host)
+{
+ int ret;
+ struct addrinfo hints, *res;
+
+ memset(&hints, 0, sizeof hints);
+ hints.ai_family = AF_INET;
+ hints.ai_socktype = SOCK_STREAM;
+
+ ret = getaddrinfo(host, GB_TCP_PORT_STR, &hints, &res);
+ if (ret) {
+ LOG("mgmt", GB_LOG_ERROR, "getaddrinfo(%s) failed (%s)",
+ host, gai_strerror(ret));
+ goto out;
+ }
+
+ return res;
-static int glusterBlockHostConnect(char *host, struct sockaddr_in **sainptr)
+ out:
+ return NULL;
+}
+
+
+static int glusterBlockHostConnect(char *host)
{
int sockfd = -1;
- struct hostent *server;
- struct sockaddr_in sain = {0, };
int errsv = 0;
+ struct addrinfo *res = NULL;
- if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- errsv = errno;
- LOG("mgmt", GB_LOG_ERROR, "socket creation failed (%s)",
- strerror (errno));
+ if(!(res = glusterBlockGetSockaddr(host))) {
goto out;
}
- server = gethostbyname(host);
- if (!server) {
+ if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) {
errsv = errno;
- LOG("mgmt", GB_LOG_ERROR, "gethostbyname(%s) failed (%s)",
- host, strerror (errno));
+ LOG("mgmt", GB_LOG_ERROR, "socket creation failed (%s)",
+ strerror (errno));
goto out;
}
- sain.sin_family = AF_INET;
- bcopy((char *)server->h_addr, (char *)&sain.sin_addr.s_addr,
- server->h_length);
- sain.sin_port = htons(GB_TCP_PORT);
-
- if (connect(sockfd, (struct sockaddr *) &sain, sizeof(sain)) < 0) {
+ if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
errsv = errno;
LOG("mgmt", GB_LOG_ERROR, "connect on %s failed (%s)", host,
strerror (errno));
goto out;
}
- if (sainptr) {
- *sainptr = &sain;
+ if (res) {
+ freeaddrinfo(res);
}
- return sockfd;
+ close(sockfd);
+
+ return 0;
out:
+ if (res) {
+ freeaddrinfo(res);
+ }
+
if (sockfd != -1) {
close(sockfd);
}
@@ -361,20 +380,19 @@ glusterBlockCallRPC_1(char *host, void *cobj,
{
CLIENT *clnt = NULL;
int ret = -1;
- int sockfd;
+ int sockfd = -1;
int errsv = 0;
blockResponse reply = {0,};
- struct sockaddr_in *sain = NULL;
+ struct addrinfo *res = NULL;
*rpc_sent = FALSE;
- sockfd = glusterBlockHostConnect(host, &sain);
- if ( sockfd == -1) {
- errsv = errno;
+
+ if (!(res = glusterBlockGetSockaddr(host))) {
goto out;
}
- clnt = clnttcp_create (sain, GLUSTER_BLOCK, GLUSTER_BLOCK_VERS, &sockfd, 0, 0);
+ clnt = clnttcp_create ((struct sockaddr_in *)res->ai_addr, GLUSTER_BLOCK, GLUSTER_BLOCK_VERS, &sockfd, 0, 0);
if (!clnt) {
LOG("mgmt", GB_LOG_ERROR, "%son inet host %s",
clnt_spcreateerror("client create failed"), host);
@@ -430,6 +448,10 @@ glusterBlockCallRPC_1(char *host, void *cobj,
clnt_destroy (clnt);
}
+ if (res) {
+ freeaddrinfo(res);
+ }
+
if (sockfd != -1) {
close(sockfd);
}
@@ -502,6 +524,7 @@ blockServerParse(char *blkServers)
}
}
+ GB_FREE(base);
return list;
out:
@@ -765,10 +788,7 @@ glusterBlockDeleteHostConnect(void *data)
blockRemoteObj *args = (blockRemoteObj *)data;
- args->exit = ret = glusterBlockHostConnect(args->addr, NULL);
- if (ret > 0) {
- args->exit = 0;
- }
+ args->exit = ret = glusterBlockHostConnect(args->addr);
return NULL;
}
diff --git a/utils/utils.h b/utils/utils.h
index ce1ef52..bd073ad 100644
--- a/utils/utils.h
+++ b/utils/utils.h
@@ -31,6 +31,7 @@
# define GB_LOCK_FILE GB_INFODIR "/gluster-blockd.lock"
# define GB_UNIX_ADDRESS GB_INFODIR "/gluster-blockd.socket"
# define GB_TCP_PORT 24010
+# define GB_TCP_PORT_STR "24010"
# define GFAPI_LOG_LEVEL 7