diff --git a/lib/core/include/core_sock.h b/lib/core/include/core_sock.h index 2fd50ff2c..d27bfbe47 100644 --- a/lib/core/include/core_sock.h +++ b/lib/core/include/core_sock.h @@ -99,17 +99,6 @@ CORE_DECLARE(ssize_t) sock_read(sock_id id, void *buf, size_t len, int flags, c_sockaddr_t *src_addr, socklen_t *addrlen); -#define CORE_ADDRSTRLEN INET6_ADDRSTRLEN -#define SOCK_NTOP(__aDDR, __bUF) \ - sock_ntop((c_sockaddr_t *)__aDDR, buf, CORE_ADDRSTRLEN) -CORE_DECLARE(const char *)sock_ntop(c_sockaddr_t *sockaddr, - char *buf, int buflen); -CORE_DECLARE(status_t) sock_pton(const char *hostname, c_uint16_t port, - c_sockaddr_t *sockaddr); -CORE_DECLARE(socklen_t) sock_len(c_sockaddr_t *sockaddr); - -CORE_DECLARE(status_t) sock_setsockopt(sock_id id, c_int32_t opt, c_int32_t on); - CORE_DECLARE(status_t) sock_register(sock_id id, sock_handler handler, void *data); CORE_DECLARE(status_t) sock_unregister(sock_id id); @@ -117,6 +106,19 @@ CORE_DECLARE(int) sock_is_registered(sock_id id); CORE_DECLARE(int) sock_select_loop(c_time_t timeout); +#define CORE_ADDRSTRLEN INET6_ADDRSTRLEN +#define CORE_NTOP(__aDDR, __bUF) \ + core_ntop((c_sockaddr_t *)__aDDR, buf, CORE_ADDRSTRLEN) +CORE_DECLARE(const char *)core_ntop(c_sockaddr_t *sockaddr, + char *buf, int buflen); +CORE_DECLARE(status_t) core_pton(const char *hostname, c_uint16_t port, + c_sockaddr_t *sockaddr); + +CORE_DECLARE(socklen_t) sockaddr_len(c_sockaddr_t *sockaddr); +CORE_DECLARE(int) sockaddr_is_equal(c_sockaddr_t *a, c_sockaddr_t *b); + +CORE_DECLARE(status_t) sock_setsockopt(sock_id id, c_int32_t opt, c_int32_t on); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/lib/core/src/unix/sock.c b/lib/core/src/unix/sock.c index 4fb0ce9c2..d9feac0cc 100644 --- a/lib/core/src/unix/sock.c +++ b/lib/core/src/unix/sock.c @@ -125,7 +125,7 @@ status_t sock_bind(sock_id id, const char *host, c_uint16_t port) if (bind(sock->fd, rp->ai_addr, rp->ai_addrlen) == 0) { d_trace(1, "socket bind %s:%d\n", - SOCK_NTOP(rp->ai_addr, buf), port); + CORE_NTOP(rp->ai_addr, buf), port); break; } close(sock->fd); @@ -170,7 +170,7 @@ status_t sock_connect(sock_id id, const char *host, c_uint16_t port) if (rc == 0 || (rc != 0 && errno == EINPROGRESS)) { d_trace(1, "socket connect %s:%d\n", - SOCK_NTOP(rp->ai_addr, buf), port); + CORE_NTOP(rp->ai_addr, buf), port); break; } @@ -386,7 +386,7 @@ int sock_select_loop(c_time_t timeout) return 0; } -const char *sock_ntop(c_sockaddr_t *sockaddr, char *buf, int buflen) +const char *core_ntop(c_sockaddr_t *sockaddr, char *buf, int buflen) { int family; d_assert(buf, return NULL,); @@ -404,11 +404,12 @@ const char *sock_ntop(c_sockaddr_t *sockaddr, char *buf, int buflen) return inet_ntop(family, &sockaddr->sin6.sin6_addr, buf, INET6_ADDRSTRLEN); default: - d_assert(0, return NULL,); + d_assert(0, return NULL, + "Unknown family(%d)", sockaddr->sa.sa_family); } } -status_t sock_pton(const char *hostname, c_uint16_t port, +status_t core_pton(const char *hostname, c_uint16_t port, c_sockaddr_t *sockaddr) { struct addrinfo *result, *rp; @@ -445,7 +446,7 @@ status_t sock_pton(const char *hostname, c_uint16_t port, return CORE_OK; } -socklen_t sock_len(c_sockaddr_t *sockaddr) +socklen_t sockaddr_len(c_sockaddr_t *sockaddr) { d_assert(sockaddr, return CORE_ERROR,); d_assert(sockaddr->sa.sa_family == AF_INET || @@ -456,7 +457,28 @@ socklen_t sock_len(c_sockaddr_t *sockaddr) else if (sockaddr->sa.sa_family == AF_INET6) return sizeof(struct sockaddr_in6); else - d_assert(0, return CORE_ERROR,); + d_assert(0, return CORE_ERROR, + "Unknown family(%d)", sockaddr->sa.sa_family); +} + +int sockaddr_is_equal(c_sockaddr_t *a, c_sockaddr_t *b) +{ + d_assert(a, return 0,); + d_assert(b, return 0,); + + if (a->sa.sa_family != b->sa.sa_family) + return 0; + + if (a->sa.sa_family == AF_INET && memcmp( + &a->sin.sin_addr, &b->sin.sin_addr, sizeof(struct in_addr)) == 0) + return 1; + else if (a->sa.sa_family == AF_INET6 && memcmp( + &a->sin6.sin6_addr, &b->sin6.sin6_addr, sizeof(struct in6_addr)) == 0) + return 1; + else + d_assert(0, return 0, "Unknown family(%d)", a->sa.sa_family); + + return 0; } status_t sock_setsockopt(sock_id id, c_int32_t opt, c_int32_t on) diff --git a/lib/core/test/testsctp.c b/lib/core/test/testsctp.c index baff0166b..bc26a2e87 100644 --- a/lib/core/test/testsctp.c +++ b/lib/core/test/testsctp.c @@ -105,11 +105,11 @@ static void *THREAD_FUNC test3_main(thread_id id, void *data) rv = sctp_open(&sctp, AF_INET, SOCK_SEQPACKET, NULL, 0, NULL, 0, 0); ABTS_INT_EQUAL(tc, CORE_OK, rv); - rv = sock_pton("127.0.0.1", PORT, &to); + rv = core_pton("127.0.0.1", PORT, &to); ABTS_INT_EQUAL(tc, CORE_OK, rv); size = sctp_write(sctp, DATASTR, strlen(DATASTR), - &to, sock_len(&to), PPID, 0); + &to, sockaddr_len(&to), PPID, 0); ABTS_INT_EQUAL(tc, strlen(DATASTR), size); rv = sock_delete(sctp); @@ -141,7 +141,7 @@ static void sctp_test3(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in), fromlen); ABTS_INT_EQUAL(tc, PPID, ppid); - ABTS_STR_EQUAL(tc, "127.0.0.1", SOCK_NTOP(&from, buf)); + ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&from, buf)); thread_join(&rv, test3_thread); ABTS_INT_EQUAL(tc, strlen(DATASTR), rv); @@ -199,7 +199,7 @@ static void sctp_test4(abts_case *tc, void *data) size = sctp_read(sctp, str, STRLEN, &from, &fromlen, &ppid, NULL); ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in6), fromlen); - ABTS_STR_EQUAL(tc, "::1", SOCK_NTOP(&from, buf)); + ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&from, buf)); ABTS_INT_EQUAL(tc, PPID, ppid); size = sctp_write(sctp, DATASTR, strlen(DATASTR), &from, fromlen, PPID, 0); diff --git a/lib/core/test/testsock.c b/lib/core/test/testsock.c index a7e483672..c9037b8ce 100644 --- a/lib/core/test/testsock.c +++ b/lib/core/test/testsock.c @@ -100,11 +100,11 @@ static void *THREAD_FUNC test3_main(thread_id id, void *data) rv = udp_open(&udp, AF_INET, NULL, 0, NULL, 0, 0); ABTS_INT_EQUAL(tc, CORE_OK, rv); - rv = sock_pton("127.0.0.1", PORT, &dst_addr); + rv = core_pton("127.0.0.1", PORT, &dst_addr); ABTS_INT_EQUAL(tc, CORE_OK, rv); size = sock_write(udp, DATASTR, strlen(DATASTR), 0, - &dst_addr, sock_len(&dst_addr)); + &dst_addr, sockaddr_len(&dst_addr)); ABTS_INT_EQUAL(tc, strlen(DATASTR), size); rv = sock_delete(udp); @@ -133,7 +133,7 @@ static void sock_test3(abts_case *tc, void *data) size = sock_read(udp, str, STRLEN, 0, &src_addr, &addrlen); ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in), addrlen); - ABTS_STR_EQUAL(tc, "127.0.0.1", SOCK_NTOP(&src_addr, buf)); + ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&src_addr, buf)); thread_join(&rv, test3_thread); ABTS_INT_EQUAL(tc, strlen(DATASTR), rv); @@ -187,7 +187,7 @@ static void sock_test4(abts_case *tc, void *data) size = sock_read(udp, str, STRLEN, 0, &src_addr, &addrlen); ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in), addrlen); - ABTS_STR_EQUAL(tc, "127.0.0.1", SOCK_NTOP(&src_addr, buf)); + ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&src_addr, buf)); size = sock_write(udp, DATASTR, strlen(DATASTR), 0, &src_addr, addrlen); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);