diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-11-08 14:37:26 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-11-08 14:37:26 +0800 |
commit | ee4bdbe1153dd347746b6631df137e03301e3b28 (patch) | |
tree | 57104e0af5960c93dab833d64dd8c595cac47f5a | |
parent | 3de77c9d1c5e103e0d63e8aa130ee9ec4255349e (diff) |
milkway: fixed ::get_native_size and ::to_native interface
-rw-r--r-- | milkway/mw-inet-socket-address.c | 34 |
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; } |