summaryrefslogtreecommitdiffstats
path: root/testsuite/syscalls01
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-14 16:14:19 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 13:18:48 +0100
commit9d9bfaff8d8d573eb900c5a34eb73f5a6fa7a125 (patch)
treef2493863c4e43544c16dbb6f7842ba293c24653f /testsuite/syscalls01
parentUse socket read() and write() from FreeBSD (diff)
downloadrtems-libbsd-9d9bfaff8d8d573eb900c5a34eb73f5a6fa7a125.tar.bz2
Use send/recv functions from FreeBSD
Use recvfrom(), recvmsg(), sendto() and sendmsg() from FreeBSD.
Diffstat (limited to 'testsuite/syscalls01')
-rw-r--r--testsuite/syscalls01/test_main.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c
index 1b2c1846..cfac1354 100644
--- a/testsuite/syscalls01/test_main.c
+++ b/testsuite/syscalls01/test_main.c
@@ -231,6 +231,20 @@ init_addr(struct sockaddr_in *addr)
}
static void
+init_msg(struct msghdr *msg, struct sockaddr_in *addr, struct iovec *iov,
+ void *buf, size_t n)
+{
+ memset(msg, 0, sizeof(*msg));
+ memset(iov, 0, sizeof(*iov));
+ iov->iov_base = buf;
+ iov->iov_len = n;
+ msg->msg_name = addr;
+ msg->msg_namelen = sizeof(*addr);
+ msg->msg_iov = iov;
+ msg->msg_iovlen = 1;
+}
+
+static void
no_mem_task(rtems_task_argument arg)
{
const no_mem_test *self = (const no_mem_test *) arg;
@@ -997,6 +1011,197 @@ test_socket_read_and_write(void)
}
static void
+no_mem_socket_send_and_sendto_and_sendmsg(int fd)
+{
+ struct sockaddr_in addr;
+ struct iovec iov;
+ struct msghdr msg;
+ ssize_t n;
+ char buf[1];
+
+ init_addr(&addr);
+ init_msg(&msg, &addr, &iov, &buf[0], sizeof(buf));
+
+ errno = 0;
+ n = send(fd, &buf[0], sizeof(buf), 0);
+ assert(n == -1);
+ assert(errno == ENOMEM);
+
+ errno = 0;
+ n = sendto(fd, &buf[0], sizeof(buf), 0,
+ (const struct sockaddr *) &addr, sizeof(addr));
+ assert(n == -1);
+ assert(errno == ENOMEM);
+
+ errno = 0;
+ n = sendmsg(fd, &msg, 0);
+ assert(n == -1);
+ assert(errno == ENOMEM);
+}
+
+static void
+test_socket_send_and_sendto_and_sendmsg(void)
+{
+ rtems_resource_snapshot snapshot;
+ struct sockaddr_in addr;
+ struct iovec iov;
+ struct msghdr msg;
+ int sd;
+ int rv;
+ ssize_t n;
+ char buf[1];
+
+ puts("test socket send, sendto and sendmsg");
+
+ rtems_resource_snapshot_take(&snapshot);
+
+ init_addr(&addr);
+ init_msg(&msg, &addr, &iov, &buf[0], sizeof(buf));
+
+ sd = socket(PF_INET, SOCK_DGRAM, 0);
+ assert(sd >= 0);
+
+ do_no_mem_test(no_mem_socket_send_and_sendto_and_sendmsg, sd);
+
+ errno = 0;
+ n = send(sd, &buf[0], sizeof(buf), 0);
+ assert(n == -1);
+ assert(errno == EDESTADDRREQ);
+
+ errno = 0;
+ n = sendto(sd, &buf[0], sizeof(buf), 0,
+ (const struct sockaddr *) &addr, sizeof(addr));
+ assert(n == -1);
+ assert(errno == ENETUNREACH);
+
+ errno = 0;
+ n = sendmsg(sd, &msg, 0);
+ assert(n == -1);
+ assert(errno == ENETUNREACH);
+
+ rv = close(sd);
+ assert(rv == 0);
+
+ errno = 0;
+ n = send(sd, &buf[0], sizeof(buf), 0);
+ assert(n == -1);
+ assert(errno == EBADF);
+
+ errno = 0;
+ n = sendto(sd, &buf[0], sizeof(buf), 0,
+ (const struct sockaddr *) &addr, sizeof(addr));
+ assert(n == -1);
+ assert(errno == EBADF);
+
+ errno = 0;
+ n = sendmsg(sd, &msg, 0);
+ assert(n == -1);
+ assert(errno == EBADF);
+
+ assert(rtems_resource_snapshot_check(&snapshot));
+}
+
+static void
+no_mem_socket_recv_and_recvfrom_and_recvmsg(int fd)
+{
+ struct sockaddr_in addr;
+ socklen_t addr_len;
+ struct iovec iov;
+ struct msghdr msg;
+ ssize_t n;
+ char buf[1];
+
+ init_addr(&addr);
+ init_msg(&msg, &addr, &iov, &buf[0], sizeof(buf));
+
+ errno = 0;
+ n = recv(fd, &buf[0], sizeof(buf), 0);
+ assert(n == -1);
+ assert(errno == ENOMEM);
+
+ errno = 0;
+ addr_len = sizeof(addr);
+ n = recvfrom(fd, &buf[0], sizeof(buf), 0,
+ (struct sockaddr *) &addr, &addr_len);
+ assert(n == -1);
+ assert(errno == ENOMEM);
+
+ errno = 0;
+ n = recvmsg(fd, &msg, 0);
+ assert(n == -1);
+ assert(errno == ENOMEM);
+}
+
+static void
+test_socket_recv_and_recvfrom_and_recvmsg(void)
+{
+ rtems_resource_snapshot snapshot;
+ struct sockaddr_in addr;
+ socklen_t addr_len;
+ struct iovec iov;
+ struct msghdr msg;
+ int sd;
+ int rv;
+ ssize_t n;
+ char buf[1];
+ int enable = 1;
+
+ puts("test socket recv, recvfrom and recvmsg");
+
+ rtems_resource_snapshot_take(&snapshot);
+
+ init_addr(&addr);
+ init_msg(&msg, &addr, &iov, &buf[0], sizeof(buf));
+
+ sd = socket(PF_INET, SOCK_DGRAM, 0);
+ assert(sd >= 0);
+
+ rv = ioctl(sd, FIONBIO, &enable);
+ assert(rv == 0);
+
+ do_no_mem_test(no_mem_socket_recv_and_recvfrom_and_recvmsg, sd);
+
+ errno = 0;
+ n = recv(sd, &buf[0], sizeof(buf), 0);
+ assert(n == -1);
+ assert(errno == EAGAIN);
+
+ errno = 0;
+ addr_len = sizeof(addr);
+ n = recvfrom(sd, &buf[0], sizeof(buf), 0,
+ (struct sockaddr *) &addr, &addr_len);
+ assert(n == -1);
+ assert(errno == EAGAIN);
+
+ errno = 0;
+ n = recvmsg(sd, &msg, 0);
+ assert(n == -1);
+ assert(errno == EAGAIN);
+
+ rv = close(sd);
+ assert(rv == 0);
+
+ errno = 0;
+ n = recv(sd, &buf[0], sizeof(buf), 0);
+ assert(n == -1);
+ assert(errno == EBADF);
+
+ errno = 0;
+ addr_len = sizeof(addr);
+ n = recvfrom(sd, &buf[0], sizeof(buf), 0,
+ (struct sockaddr *) &addr, &addr_len);
+ assert(n == -1);
+ assert(errno == EBADF);
+
+ errno = 0;
+ n = recvmsg(sd, &msg, 0);
+ assert(n == -1);
+ assert(errno == EBADF);
+
+ assert(rtems_resource_snapshot_check(&snapshot));
+}
+
+static void
test_main(void)
{
/* Must be first test to ensure resource checks work */
@@ -1013,6 +1218,8 @@ test_main(void)
test_socket_getpeername();
test_socket_getsockname();
test_socket_read_and_write();
+ test_socket_send_and_sendto_and_sendmsg();
+ test_socket_recv_and_recvfrom_and_recvmsg();
puts("*** END OF " TEST_NAME " TEST ***");
exit(0);