summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2010-01-22 02:47:11 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-01-22 05:21:43 -0800
commitdc7448e508fdba87d161be7695a2c449f2cb573d (patch)
treece229feb4818589b51b31cd26d6ff50b4e5bdf4a
parent813f9870d558512c377d4a116284d8abb58e9e63 (diff)
transport/socket: use appropriate address family macro when address family is inet-sdp.
- sa_family should be set to AF_INET_SDP only during call to socket system call. For all other calls, sa_family should be AF_INET. Signed-off-by: Raghavendra G <raghavendra@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 561 (with address family set to 'inet-sdp', transport/socket doesn't work correctly) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=561
-rw-r--r--transport/socket/src/name.c89
-rw-r--r--transport/socket/src/name.h5
-rw-r--r--transport/socket/src/socket.c21
3 files changed, 70 insertions, 45 deletions
diff --git a/transport/socket/src/name.c b/transport/socket/src/name.c
index 6d538ba3431..6a1a1b08afc 100644
--- a/transport/socket/src/name.c
+++ b/transport/socket/src/name.c
@@ -119,10 +119,15 @@ err:
return ret;
}
-static int32_t
-client_fill_address_family (transport_t *this, struct sockaddr *sockaddr)
+int32_t
+client_fill_address_family (transport_t *this, sa_family_t *sa_family)
{
- data_t *address_family_data = NULL;
+ data_t *address_family_data = NULL;
+ int32_t ret = -1;
+
+ if (sa_family == NULL) {
+ goto out;
+ }
address_family_data = dict_get (this->xl->options,
"transport.address-family");
@@ -141,43 +146,45 @@ client_fill_address_family (transport_t *this, struct sockaddr *sockaddr)
"transport.unix.connect-path:%s)",
data_to_str (remote_host_data),
data_to_str (connect_path_data));
- return -1;
+ goto out;
}
if (remote_host_data) {
gf_log (this->xl->name, GF_LOG_DEBUG,
"address-family not specified, guessing it "
"to be inet/inet6");
- sockaddr->sa_family = AF_UNSPEC;
+ *sa_family = AF_UNSPEC;
} else {
gf_log (this->xl->name, GF_LOG_DEBUG,
"address-family not specified, guessing it "
"to be unix");
- sockaddr->sa_family = AF_UNIX;
+ *sa_family = AF_UNIX;
}
} else {
char *address_family = data_to_str (address_family_data);
if (!strcasecmp (address_family, "unix")) {
- sockaddr->sa_family = AF_UNIX;
+ *sa_family = AF_UNIX;
} else if (!strcasecmp (address_family, "inet")) {
- sockaddr->sa_family = AF_INET;
+ *sa_family = AF_INET;
} else if (!strcasecmp (address_family, "inet6")) {
- sockaddr->sa_family = AF_INET6;
+ *sa_family = AF_INET6;
} else if (!strcasecmp (address_family, "inet-sdp")) {
- sockaddr->sa_family = AF_INET_SDP;
+ *sa_family = AF_INET_SDP;
} else if (!strcasecmp (address_family, "inet/inet6")
|| !strcasecmp (address_family, "inet6/inet")) {
- sockaddr->sa_family = AF_UNSPEC;
+ *sa_family = AF_UNSPEC;
} else {
gf_log (this->xl->name, GF_LOG_ERROR,
"unknown address-family (%s) specified",
address_family);
- return -1;
+ goto out;
}
}
- return 0;
+ ret = 0;
+out:
+ return ret;
}
static int32_t
@@ -459,9 +466,8 @@ socket_client_get_remote_sockaddr (transport_t *this,
socklen_t *sockaddr_len)
{
int32_t ret = 0;
- char is_inet_sdp = 0;
- ret = client_fill_address_family (this, sockaddr);
+ ret = client_fill_address_family (this, &sockaddr->sa_family);
if (ret) {
ret = -1;
goto err;
@@ -471,17 +477,11 @@ socket_client_get_remote_sockaddr (transport_t *this,
{
case AF_INET_SDP:
sockaddr->sa_family = AF_INET;
- is_inet_sdp = 1;
case AF_INET:
case AF_INET6:
case AF_UNSPEC:
ret = af_inet_client_get_remote_sockaddr (this, sockaddr, sockaddr_len);
-
- if (is_inet_sdp) {
- sockaddr->sa_family = AF_INET_SDP;
- }
-
break;
case AF_UNIX:
@@ -499,13 +499,14 @@ err:
}
int32_t
-socket_server_get_local_sockaddr (transport_t *this,
- struct sockaddr *addr,
- socklen_t *addr_len)
+server_fill_address_family (transport_t *this, sa_family_t *sa_family)
{
data_t *address_family_data = NULL;
- int32_t ret = 0;
- char is_inet_sdp = 0;
+ int32_t ret = -1;
+
+ if (sa_family == NULL) {
+ goto out;
+ }
address_family_data = dict_get (this->xl->options,
"transport.address-family");
@@ -514,41 +515,53 @@ socket_server_get_local_sockaddr (transport_t *this,
address_family = data_to_str (address_family_data);
if (!strcasecmp (address_family, "inet")) {
- addr->sa_family = AF_INET;
+ *sa_family = AF_INET;
} else if (!strcasecmp (address_family, "inet6")) {
- addr->sa_family = AF_INET6;
+ *sa_family = AF_INET6;
} else if (!strcasecmp (address_family, "inet-sdp")) {
- addr->sa_family = AF_INET_SDP;
+ *sa_family = AF_INET_SDP;
} else if (!strcasecmp (address_family, "unix")) {
- addr->sa_family = AF_UNIX;
+ *sa_family = AF_UNIX;
} else if (!strcasecmp (address_family, "inet/inet6")
|| !strcasecmp (address_family, "inet6/inet")) {
- addr->sa_family = AF_UNSPEC;
+ *sa_family = AF_UNSPEC;
} else {
gf_log (this->xl->name, GF_LOG_ERROR,
"unknown address family (%s) specified", address_family);
- ret = -1;
- goto err;
+ goto out;
}
} else {
gf_log (this->xl->name, GF_LOG_DEBUG,
"option address-family not specified, defaulting to inet/inet6");
- addr->sa_family = AF_UNSPEC;
+ *sa_family = AF_UNSPEC;
+ }
+
+ ret = 0;
+out:
+ return ret;
+}
+
+int32_t
+socket_server_get_local_sockaddr (transport_t *this,
+ struct sockaddr *addr,
+ socklen_t *addr_len)
+{
+ int32_t ret = -1;
+
+ ret = server_fill_address_family (this, &addr->sa_family);
+ if (ret == -1) {
+ goto err;
}
switch (addr->sa_family)
{
case AF_INET_SDP:
- is_inet_sdp = 1;
addr->sa_family = AF_INET;
case AF_INET:
case AF_INET6:
case AF_UNSPEC:
ret = af_inet_server_get_local_sockaddr (this, addr, addr_len);
- if (is_inet_sdp && !ret) {
- addr->sa_family = AF_INET_SDP;
- }
break;
case AF_UNIX:
diff --git a/transport/socket/src/name.h b/transport/socket/src/name.h
index 9266be242a6..019f988dd91 100644
--- a/transport/socket/src/name.h
+++ b/transport/socket/src/name.h
@@ -27,6 +27,11 @@ client_bind (transport_t *this,
struct sockaddr *sockaddr,
socklen_t *sockaddr_len,
int sock);
+int32_t
+client_fill_address_family (transport_t *this, sa_family_t *sa_family);
+
+int32_t
+server_fill_address_family (transport_t *this, sa_family_t *sa_family);
int32_t
socket_client_get_remote_sockaddr (transport_t *this,
diff --git a/transport/socket/src/socket.c b/transport/socket/src/socket.c
index cd8427a888f..23d5661ec4f 100644
--- a/transport/socket/src/socket.c
+++ b/transport/socket/src/socket.c
@@ -947,6 +947,7 @@ socket_connect (transport_t *this)
socklen_t sockaddr_len = 0;
glusterfs_ctx_t *ctx = NULL;
int on = 1;
+ sa_family_t sa_family = {0, };
priv = this->private;
ctx = this->xl->ctx;
@@ -970,6 +971,11 @@ socket_connect (transport_t *this)
goto err;
}
+ ret = client_fill_address_family (this, &sa_family);
+ if (ret == -1) {
+ goto err;
+ }
+
ret = socket_client_get_remote_sockaddr (this, SA (&sockaddr),
&sockaddr_len);
if (ret == -1) {
@@ -988,9 +994,7 @@ socket_connect (transport_t *this)
memcpy (&this->peerinfo.sockaddr, &sockaddr, sockaddr_len);
this->peerinfo.sockaddr_len = sockaddr_len;
- priv->sock = socket (SA (&sockaddr)->sa_family,
- SOCK_STREAM, 0);
-
+ priv->sock = socket (sa_family, SOCK_STREAM, 0);
if (priv->sock == -1) {
gf_log (this->xl->name, GF_LOG_ERROR,
"socket creation failed (%s)",
@@ -1097,6 +1101,7 @@ socket_listen (transport_t *this)
peer_info_t *myinfo = NULL;
glusterfs_ctx_t *ctx = NULL;
int on = 1;
+ sa_family_t sa_family = {0, };
priv = this->private;
myinfo = &this->myinfo;
@@ -1114,9 +1119,13 @@ socket_listen (transport_t *this)
return ret;
}
+ ret = server_fill_address_family (this, &sa_family);
+ if (ret == -1) {
+ return ret;
+ }
+
ret = socket_server_get_local_sockaddr (this, SA (&sockaddr),
&sockaddr_len);
-
if (ret == -1) {
return ret;
}
@@ -1132,9 +1141,7 @@ socket_listen (transport_t *this)
memcpy (&myinfo->sockaddr, &sockaddr, sockaddr_len);
myinfo->sockaddr_len = sockaddr_len;
- priv->sock = socket (SA (&sockaddr)->sa_family,
- SOCK_STREAM, 0);
-
+ priv->sock = socket (sa_family, SOCK_STREAM, 0);
if (priv->sock == -1) {
gf_log (this->xl->name, GF_LOG_ERROR,
"socket creation failed (%s)",