summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-11-08 14:37:26 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-11-08 14:37:26 +0800
commitee4bdbe1153dd347746b6631df137e03301e3b28 (patch)
tree57104e0af5960c93dab833d64dd8c595cac47f5a
parent3de77c9d1c5e103e0d63e8aa130ee9ec4255349e (diff)
milkway: fixed ::get_native_size and ::to_native interface
-rw-r--r--milkway/mw-inet-socket-address.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/milkway/mw-inet-socket-address.c b/milkway/mw-inet-socket-address.c
index 00dc73c..f43a583 100644
--- a/milkway/mw-inet-socket-address.c
+++ b/milkway/mw-inet-socket-address.c
@@ -84,8 +84,13 @@ static size_t
mw_inet_socket_address_get_native_size(mw_socket_address_t *super)
{
mw_inet_socket_address_t *self = (mw_inet_socket_address_t *)super;
+ mw_socket_family_t family = mw_inet_address_get_family(self->priv->addr);
- return mw_inet_address_get_native_size(self->priv->addr);
+ if (family == MW_SOCKET_FAMILY_INET)
+ return sizeof (struct sockaddr_in);
+ else if (family == MW_SOCKET_FAMILY_INET6)
+ return sizeof (struct sockaddr_in6);
+ return 0;
}
static mw_bool_t
@@ -95,7 +100,8 @@ mw_inet_socket_address_to_native(mw_socket_address_t *super,
mw_error_t **reterr)
{
mw_inet_socket_address_t *self = (mw_inet_socket_address_t *)super;
- size_t native_size = mw_inet_address_get_native_size(self->priv->addr);
+ mw_socket_family_t family = mw_inet_address_get_family(self->priv->addr);
+ size_t native_size = mw_inet_socket_address_get_native_size(super);
if (native_size > size) {
mw_error_set(reterr, "socket", MW_TOO_SMALL,
@@ -103,7 +109,29 @@ mw_inet_socket_address_to_native(mw_socket_address_t *super,
return MW_FALSE;
}
- memcpy(native, mw_inet_address_get_native(self->priv->addr), native_size);
+ if (family == MW_SOCKET_FAMILY_INET) {
+ struct sockaddr_in *inetaddr = native;
+
+ inetaddr->sin_family = AF_INET;
+ inetaddr->sin_port = mw_htons(self->priv->port);
+ memcpy(&inetaddr->sin_addr.s_addr,
+ mw_inet_address_get_native (self->priv->addr),
+ sizeof (inetaddr->sin_addr));
+ memset(inetaddr->sin_zero, 0, sizeof (inetaddr->sin_zero));
+ } else if (family == MW_SOCKET_FAMILY_INET6) {
+ struct sockaddr_in6 *inetaddr = native;
+
+ inetaddr->sin6_family = AF_INET6;
+ inetaddr->sin6_port = mw_htons(self->priv->port);
+ memcpy(&inetaddr->sin6_addr.s6_addr,
+ mw_inet_address_get_native (self->priv->addr),
+ sizeof (inetaddr->sin6_addr));
+ } else {
+ mw_error_set(reterr, "socket", MW_NOT_SUPPORTED,
+ "Unsupported socket family");
+ return MW_FALSE;
+ }
+
return MW_TRUE;
}