remove c_sa_len

This commit is contained in:
Sukchan Lee
2017-11-22 22:55:28 +09:00
parent a27f294f74
commit cfc352ea0d
5 changed files with 49 additions and 27 deletions

View File

@@ -64,8 +64,6 @@ typedef struct c_sockaddr_t c_sockaddr_t;
struct c_sockaddr_t { struct c_sockaddr_t {
c_sockaddr_t *next; c_sockaddr_t *next;
socklen_t c_sa_len;
socklen_t c_sa_port;
#define c_sa_family sa.sa_family #define c_sa_family sa.sa_family
#define c_sa_port sin.sin_port #define c_sa_port sin.sin_port
union { union {
@@ -177,6 +175,7 @@ CORE_DECLARE(const char *)core_inet_ntop(c_sockaddr_t *sockaddr,
CORE_DECLARE(status_t) core_inet_pton( CORE_DECLARE(status_t) core_inet_pton(
int family, const char *src, c_sockaddr_t *dst); int family, const char *src, c_sockaddr_t *dst);
CORE_DECLARE(socklen_t) sockaddr_len(const c_sockaddr_t *sa);
CORE_DECLARE(int) sockaddr_is_equal(c_sockaddr_t *a, c_sockaddr_t *b); CORE_DECLARE(int) sockaddr_is_equal(c_sockaddr_t *a, c_sockaddr_t *b);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -179,11 +179,15 @@ int core_sctp_sendmsg(sock_id id, const void *msg, size_t len,
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
int size; int size;
socklen_t addrlen = 0;
d_assert(id, return -1, ); d_assert(id, return -1, );
if (to)
addrlen = sockaddr_len(to);
size = sctp_sendmsg(sock->fd, msg, len, size = sctp_sendmsg(sock->fd, msg, len,
to ? &to->sa : NULL, to ? to->c_sa_len : 0, to ? &to->sa : NULL, addrlen,
htonl(ppid), htonl(ppid),
0, /* flags */ 0, /* flags */
stream_no, stream_no,
@@ -203,17 +207,20 @@ int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
int size; int size;
socklen_t addrlen = sizeof(struct sockaddr_storage); socklen_t addrlen = 0;
int flags = 0; int flags = 0;
struct sctp_sndrcvinfo sinfo; struct sctp_sndrcvinfo sinfo;
d_assert(id, return -1,); d_assert(id, return -1,);
if (from)
addrlen = sockaddr_len(from);
do do
{ {
size = sctp_recvmsg(sock->fd, msg, len, size = sctp_recvmsg(sock->fd, msg, len,
from ? &from->sa : NULL, from ? &addrlen : NULL, from ? &from->sa : NULL, addrlen,
&sinfo, &flags); &sinfo, &flags);
if (size < 0) if (size < 0)
{ {
@@ -222,8 +229,6 @@ int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
return size; return size;
} }
if (from)
from->c_sa_len = addrlen;
if (!(flags & MSG_NOTIFICATION)) if (!(flags & MSG_NOTIFICATION))
break; break;

View File

@@ -93,11 +93,15 @@ status_t sock_bind(sock_id id, c_sockaddr_t *sa)
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
char buf[CORE_ADDRSTRLEN]; char buf[CORE_ADDRSTRLEN];
socklen_t addrlen;
d_assert(sock, return CORE_ERROR,); d_assert(sock, return CORE_ERROR,);
d_assert(sa, return CORE_ERROR,); d_assert(sa, return CORE_ERROR,);
if (bind(sock->fd, &sa->sa, sa->c_sa_len) != 0) addrlen = sockaddr_len(sa);
d_assert(addrlen, return CORE_ERROR,);
if (bind(sock->fd, &sa->sa, addrlen) != 0)
{ {
d_error("socket bind(%s:%d) failed(%d:%s)", d_error("socket bind(%s:%d) failed(%d:%s)",
CORE_NTOP(sa, buf), sa->sin.sin_port, errno, strerror(errno)); CORE_NTOP(sa, buf), sa->sin.sin_port, errno, strerror(errno));
@@ -115,11 +119,15 @@ status_t sock_connect(sock_id id, c_sockaddr_t *sa)
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
char buf[CORE_ADDRSTRLEN]; char buf[CORE_ADDRSTRLEN];
socklen_t addrlen;
d_assert(sock, return CORE_ERROR,); d_assert(sock, return CORE_ERROR,);
d_assert(sa, return CORE_ERROR,); d_assert(sa, return CORE_ERROR,);
if (connect(sock->fd, &sa->sa, sa->c_sa_len) != 0) addrlen = sockaddr_len(sa);
d_assert(addrlen, return CORE_ERROR,);
if (connect(sock->fd, &sa->sa, addrlen) != 0)
{ {
d_error("socket connect(%s:%d) failed(%d:%s)", d_error("socket connect(%s:%d) failed(%d:%s)",
CORE_NTOP(sa, buf), sa->sin.sin_port, errno, strerror(errno)); CORE_NTOP(sa, buf), sa->sin.sin_port, errno, strerror(errno));
@@ -156,13 +164,14 @@ status_t sock_accept(sock_id *new, sock_id id)
int new_fd = -1; int new_fd = -1;
c_sockaddr_t sa; c_sockaddr_t sa;
socklen_t addrlen;
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
sa.c_sa_len = sizeof(sa.ss); addrlen = sizeof(sa.ss);
d_assert(id, return CORE_ERROR,); d_assert(id, return CORE_ERROR,);
new_fd = accept(sock->fd, &sa.sa, &sa.c_sa_len); new_fd = accept(sock->fd, &sa.sa, &addrlen);
if (new_fd < 0) if (new_fd < 0)
{ {
d_error("accept failed(%d:%s)", errno, strerror(errno)); d_error("accept failed(%d:%s)", errno, strerror(errno));
@@ -190,14 +199,14 @@ int sock_family_get(sock_id id)
return sock->family; return sock->family;
} }
c_sockaddr_t * sock_local_addr_get(sock_id id) c_sockaddr_t *sock_local_addr_get(sock_id id)
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
d_assert(id, return NULL,); d_assert(id, return NULL,);
return &sock->local_addr; return &sock->local_addr;
} }
c_sockaddr_t * sock_remote_addr_get(sock_id id) c_sockaddr_t *sock_remote_addr_get(sock_id id)
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
d_assert(id, return NULL,); d_assert(id, return NULL,);
@@ -227,11 +236,15 @@ ssize_t core_sendto(sock_id id,
{ {
sock_t *sock = (sock_t *)id; sock_t *sock = (sock_t *)id;
ssize_t size; ssize_t size;
socklen_t addrlen;
d_assert(id, return -1,); d_assert(id, return -1,);
d_assert(to, return -1,); d_assert(to, return -1,);
size = sendto(sock->fd, buf, len, flags, &to->sa, to->c_sa_len); addrlen = sockaddr_len(to);
d_assert(addrlen, return CORE_ERROR,);
size = sendto(sock->fd, buf, len, flags, &to->sa, addrlen);
if (size < 0) if (size < 0)
{ {
d_error("sock_sendto(len:%ld) failed(%d:%s)", d_error("sock_sendto(len:%ld) failed(%d:%s)",
@@ -268,14 +281,15 @@ ssize_t core_recvfrom(sock_id id,
d_assert(id, return -1,); d_assert(id, return -1,);
d_assert(from, return -1,); d_assert(from, return -1,);
addrlen = sizeof(from->ss); addrlen = sockaddr_len(from);
d_assert(addrlen, return -1,);
size = recvfrom(sock->fd, buf, len, flags, &from->sa, &addrlen); size = recvfrom(sock->fd, buf, len, flags, &from->sa, &addrlen);
if (size < 0) if (size < 0)
{ {
d_error("sock_recvfrom(len:%ld) failed(%d:%s)", d_error("sock_recvfrom(len:%ld) failed(%d:%s)",
len, errno, strerror(errno)); len, errno, strerror(errno));
} }
from->c_sa_len = addrlen;
return size; return size;
} }
@@ -471,7 +485,6 @@ status_t core_getaddrinfo(c_sockaddr_t **sa,
new_sa = core_calloc(1, sizeof(c_sockaddr_t)); new_sa = core_calloc(1, sizeof(c_sockaddr_t));
memcpy(&new_sa->sa, ai->ai_addr, ai->ai_addrlen); memcpy(&new_sa->sa, ai->ai_addr, ai->ai_addrlen);
new_sa->c_sa_len = ai->ai_addrlen;
new_sa->sin.sin_port = htons(port); new_sa->sin.sin_port = htons(port);
d_trace(3, "addr:%s, port:%d\n", CORE_NTOP(new_sa, buf), port); d_trace(3, "addr:%s, port:%d\n", CORE_NTOP(new_sa, buf), port);
@@ -539,11 +552,9 @@ status_t core_inet_pton(int family, const char *src, c_sockaddr_t *dst)
switch(family) switch(family)
{ {
case AF_INET: case AF_INET:
dst->c_sa_len = sizeof(struct sockaddr_in);
return inet_pton(family, src, &dst->sin.sin_addr) == 1 ? return inet_pton(family, src, &dst->sin.sin_addr) == 1 ?
CORE_OK : CORE_ERROR; CORE_OK : CORE_ERROR;
case AF_INET6: case AF_INET6:
dst->c_sa_len = sizeof(struct sockaddr_in6);
return inet_pton(family, src, &dst->sin6.sin6_addr) == 1 ? return inet_pton(family, src, &dst->sin6.sin6_addr) == 1 ?
CORE_OK : CORE_ERROR; CORE_OK : CORE_ERROR;
default: default:
@@ -551,6 +562,21 @@ status_t core_inet_pton(int family, const char *src, c_sockaddr_t *dst)
} }
} }
socklen_t sockaddr_len(const c_sockaddr_t *sa)
{
d_assert(sa, return 0,);
switch(sa->c_sa_family)
{
case AF_INET:
return sizeof(struct sockaddr_in);
case AF_INET6:
return sizeof(struct sockaddr_in6);
default:
d_assert(0, return 0, "Unknown family(%d)", sa->c_sa_family);
}
}
int sockaddr_is_equal(c_sockaddr_t *a, c_sockaddr_t *b) int sockaddr_is_equal(c_sockaddr_t *a, c_sockaddr_t *b)
{ {
d_assert(a, return 0,); d_assert(a, return 0,);

View File

@@ -135,7 +135,6 @@ static void sctp_test3(abts_case *tc, void *data)
size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL); size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in), sa.c_sa_len);
ABTS_INT_EQUAL(tc, PPID, ppid); ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&sa, buf));
@@ -191,7 +190,6 @@ static void sctp_test4(abts_case *tc, void *data)
size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL); size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in6), sa.c_sa_len);
ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf));
ABTS_INT_EQUAL(tc, PPID, ppid); ABTS_INT_EQUAL(tc, PPID, ppid);
@@ -223,7 +221,6 @@ static void *THREAD_FUNC test5_main(thread_id id, void *data)
rv = sctp_connect(sctp, "::1", PORT); rv = sctp_connect(sctp, "::1", PORT);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);
remote_addr = sock_remote_addr_get(sctp); remote_addr = sock_remote_addr_get(sctp);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in6), remote_addr->c_sa_len);
ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(remote_addr, buf)); ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(remote_addr, buf));
size = core_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), size = core_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR),
@@ -232,7 +229,6 @@ static void *THREAD_FUNC test5_main(thread_id id, void *data)
size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL); size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in6), sa.c_sa_len);
ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf));
ABTS_INT_EQUAL(tc, PPID, ppid); ABTS_INT_EQUAL(tc, PPID, ppid);
@@ -262,7 +258,6 @@ static void sctp_test5(abts_case *tc, void *data)
size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL); size = core_sctp_recvmsg(sctp, str, STRLEN, &sa, &ppid, NULL);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in6), sa.c_sa_len);
ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf));
ABTS_INT_EQUAL(tc, PPID, ppid); ABTS_INT_EQUAL(tc, PPID, ppid);

View File

@@ -132,7 +132,6 @@ static void sock_test3(abts_case *tc, void *data)
size = core_recvfrom(udp, str, STRLEN, 0, &sa); size = core_recvfrom(udp, str, STRLEN, 0, &sa);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in), sa.c_sa_len);
ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&sa, buf));
thread_join(&rv, test3_thread); thread_join(&rv, test3_thread);
@@ -185,7 +184,6 @@ static void sock_test4(abts_case *tc, void *data)
size = core_recvfrom(udp, str, STRLEN, 0, &sa); size = core_recvfrom(udp, str, STRLEN, 0, &sa);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in), sa.c_sa_len);
ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "127.0.0.1", CORE_NTOP(&sa, buf));
size = core_sendto(udp, DATASTR, strlen(DATASTR), 0, &sa); size = core_sendto(udp, DATASTR, strlen(DATASTR), 0, &sa);
@@ -247,7 +245,6 @@ static void sock_test5(abts_case *tc, void *data)
size = core_recvfrom(udp, str, STRLEN, 0, &sa); size = core_recvfrom(udp, str, STRLEN, 0, &sa);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size); ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, sizeof(struct sockaddr_in6), sa.c_sa_len);
ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf)); ABTS_STR_EQUAL(tc, "::1", CORE_NTOP(&sa, buf));
size = core_send(udp, DATASTR, strlen(DATASTR), 0); size = core_send(udp, DATASTR, strlen(DATASTR), 0);