diff --git a/mio/Makefile.in b/mio/Makefile.in index 71acc1c..c321188 100644 --- a/mio/Makefile.in +++ b/mio/Makefile.in @@ -164,8 +164,8 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/ac/ar-lib \ $(top_srcdir)/ac/compile $(top_srcdir)/ac/config.guess \ $(top_srcdir)/ac/config.sub $(top_srcdir)/ac/install-sh \ $(top_srcdir)/ac/ltmain.sh $(top_srcdir)/ac/missing ac/ar-lib \ - ac/compile ac/config.guess ac/config.sub ac/install-sh \ - ac/ltmain.sh ac/missing + ac/compile ac/config.guess ac/config.sub ac/depcomp \ + ac/install-sh ac/ltmain.sh ac/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/mio/lib/mio-skad.h b/mio/lib/mio-skad.h index e103f57..5ae3d89 100644 --- a/mio/lib/mio-skad.h +++ b/mio/lib/mio-skad.h @@ -147,6 +147,13 @@ MIO_EXPORT void mio_skad_init_for_ip6 ( int scope_id ); +MIO_EXPORT void mio_skad_init_for_ip_with_bytes ( + mio_skad_t* skad, + mio_uint16_t port, + const mio_uint8_t* bytes, + mio_oow_t len +); + MIO_EXPORT void mio_skad_init_for_eth ( mio_skad_t* skad, int ifindex, diff --git a/mio/lib/skad.c b/mio/lib/skad.c index 5b7c9e4..078a9a5 100644 --- a/mio/lib/skad.c +++ b/mio/lib/skad.c @@ -1385,11 +1385,10 @@ void mio_skad_init_for_ip4 (mio_skad_t* skad, mio_uint16_t port, mio_ip4ad_t* ip { #if (MIO_SIZEOF_STRUCT_SOCKADDR_IN > 0) struct sockaddr_in* sin = (struct sockaddr_in*)skad; - MIO_MEMSET (sin, 0, MIO_SIZEOF(*sin)); sin->sin_family = AF_INET; - sin->sin_port = htons(port); - if (ip4ad) MIO_MEMCPY (&sin->sin_addr, ip4ad, MIO_IP4ADDR_LEN); + sin->sin_port = mio_hton16(port); + if (ip4ad) MIO_MEMCPY (&sin->sin_addr, ip4ad->v, MIO_IP4ADDR_LEN); #endif } @@ -1397,15 +1396,46 @@ void mio_skad_init_for_ip6 (mio_skad_t* skad, mio_uint16_t port, mio_ip6ad_t* ip { #if (MIO_SIZEOF_STRUCT_SOCKADDR_IN6 > 0) struct sockaddr_in6* sin = (struct sockaddr_in6*)skad; - MIO_MEMSET (sin, 0, MIO_SIZEOF(*sin)); - sin->sin6_family = AF_INET; - sin->sin6_port = htons(port); + sin->sin6_family = AF_INET6; + sin->sin6_port = mio_hton16(port); sin->sin6_scope_id = scope_id; - if (ip6ad) MIO_MEMCPY (&sin->sin6_addr, ip6ad, MIO_IP6ADDR_LEN); + if (ip6ad) MIO_MEMCPY (&sin->sin6_addr, ip6ad->v, MIO_IP6ADDR_LEN); #endif } +void mio_skad_init_for_ip_with_bytes (mio_skad_t* skad, mio_uint16_t port, const mio_uint8_t* bytes, mio_oow_t len) +{ + switch (len) + { + #if (MIO_SIZEOF_STRUCT_SOCKADDR_IN > 0) + case MIO_IP4ADDR_LEN: + { + struct sockaddr_in* sin = (struct sockaddr_in*)skad; + MIO_MEMSET (sin, 0, MIO_SIZEOF(*sin)); + sin->sin_family = AF_INET; + sin->sin_port = mio_hton16(port); + MIO_MEMCPY (&sin->sin_addr, bytes, len); + break; + } + #endif + #if (MIO_SIZEOF_STRUCT_SOCKADDR_IN6 > 0) + case MIO_IP6ADDR_LEN: + { + struct sockaddr_in6* sin = (struct sockaddr_in6*)skad; + MIO_MEMSET (sin, 0, MIO_SIZEOF(*sin)); + sin->sin6_family = AF_INET6; + sin->sin6_port = mio_hton16(port); + MIO_MEMCPY (&sin->sin6_addr, bytes, len); + break; + } + #endif + default: + break; + } +} + + void mio_skad_init_for_eth (mio_skad_t* skad, int ifindex, mio_ethaddr_t* ethaddr) { #if defined(AF_PACKET) && (MIO_SIZEOF_STRUCT_SOCKADDR_LL > 0)