From 354e63eb32b5833ab24dcba097c7099251371daa Mon Sep 17 00:00:00 2001 From: Bogdan Drutu Date: Sat, 4 Jun 2011 12:38:06 +0300 Subject: [PATCH] Fix transformation between string address to network address --- src/raw/swift_raw.c | 26 ++++++++++++++++++++++---- src/raw/test/test_sw_sendto.c | 7 +++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/raw/swift_raw.c b/src/raw/swift_raw.c index 12f8fb5..a8d8412 100644 --- a/src/raw/swift_raw.c +++ b/src/raw/swift_raw.c @@ -147,8 +147,11 @@ ssize_t sw_sendto(int __fd, __const void *__buf, size_t __n, errno = EAFNOSUPPORT; goto sock_err; } - - printf("=== ADDR: %s ===\n", ntohl(__sw_addr->sin_addr.s_addr)); + + char str[INET_ADDRSTRLEN]; + + inet_ntop(AF_INET, &(__sw_addr->sin_addr), str, INET_ADDRSTRLEN); + printf("=== ADDR: %s ===\n", str); /* Specify the components of the message in an "iovec". */ __iov[0].iov_base = (void *) __buf; @@ -182,10 +185,23 @@ ssize_t sw_recvfrom(int __fd, void *__restrict __buf, size_t __n, socklen_t *__restrict __addr_len) { ssize_t bytes_recv; + struct sock_list *list; + struct iovec __iov[1]; + struct msghdr __msgh; + struct sockaddr_sw *__sw_addr = (struct sockaddr_sw *) __addr; + list = list_elem_from_socket(__fd); + if (list != NULL && list->bind_state == STATE_NOTBOUND) { + errno = EAFNOSUPPORT; + goto sock_err; + } + /* TODO */ - return bytes_recv; + return recvmsg(__fd, &__msgh, 0); + +sock_err: + return -1; } /* @@ -200,6 +216,8 @@ ssize_t sw_sendmsg(int __fd, __const struct msghdr *__message, { ssize_t bytes_sent; + /* TODO */ + return sendmsg(__fd, __message, __flags); } @@ -216,7 +234,7 @@ ssize_t sw_recvmsg(int __fd, struct msghdr *__message, int __flags) /* TODO */ - return bytes_recv; + return recvmsg(__fd, __message, __flags); } /* diff --git a/src/raw/test/test_sw_sendto.c b/src/raw/test/test_sw_sendto.c index ae3284a..be50640 100644 --- a/src/raw/test/test_sw_sendto.c +++ b/src/raw/test/test_sw_sendto.c @@ -106,14 +106,17 @@ static void sendto_ok(void) DIE(rc < 0, "sw_bind"); bytes_sent = sw_sendto(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr)); + + perror("sw_sendto"); test( bytes_sent >= 0 ); + } static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address) { - local_addr->sin_addr.s_addr = htonl((int)local_address); + inet_pton(PF_INET, local_address, &(local_addr->sin_addr)); memcpy(&local_addr->sw_hash, hash, sizeof(struct sw_hash)); - remote_addr->sin_addr.s_addr = htonl((int)dest_address); + inet_pton(PF_INET, dest_address, &(remote_addr->sin_addr)); memcpy(&remote_addr->sw_hash, hash, sizeof(struct sw_hash)); } -- 2.20.1