summaryrefslogtreecommitdiffstats
path: root/testsuite/syscalls01
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-11 16:44:48 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 13:18:47 +0100
commit468b08e5530412e0e54d0e8a91d9708e93ef0340 (patch)
treec77f2940d3072fe923a55822c065e5f2ba633130 /testsuite/syscalls01
parentUse shutdown() from FreeBSD (diff)
downloadrtems-libbsd-468b08e5530412e0e54d0e8a91d9708e93ef0340.tar.bz2
Use bind() from FreeBSD
Diffstat (limited to 'testsuite/syscalls01')
-rw-r--r--testsuite/syscalls01/test_main.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c
index 6f8dfcbf..6ea212a2 100644
--- a/testsuite/syscalls01/test_main.c
+++ b/testsuite/syscalls01/test_main.c
@@ -34,6 +34,7 @@
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
#include <assert.h>
#include <errno.h>
@@ -217,6 +218,18 @@ static socket_test socket_tests[] = {
};
static void
+init_addr(struct sockaddr_in *addr)
+{
+ int ok;
+
+ memset(addr, 0, sizeof(*addr));
+ addr->sin_family = AF_INET;
+ addr->sin_port = htons(1234);
+ ok = inet_aton("127.0.0.1", &addr->sin_addr);
+ assert(ok != 0);
+}
+
+static void
no_mem_task(rtems_task_argument arg)
{
const no_mem_test *self = (const no_mem_test *) arg;
@@ -445,6 +458,63 @@ test_socket_fstat_and_shutdown(void)
}
static void
+no_mem_socket_bind(int fd)
+{
+ struct sockaddr_in addr;
+ int rv;
+
+ errno = 0;
+ rv = bind(fd, (const struct sockaddr *) &addr, sizeof(addr));
+ assert(rv == -1);
+ assert(errno == ENOMEM);
+}
+
+static void
+test_socket_bind(void)
+{
+ rtems_resource_snapshot snapshot;
+ struct sockaddr_in addr;
+ int sd;
+ int rv;
+
+ puts("test socket bind");
+
+ rtems_resource_snapshot_take(&snapshot);
+
+ init_addr(&addr);
+
+ sd = socket(PF_INET, SOCK_DGRAM, 0);
+ assert(sd >= 0);
+
+ do_no_mem_test(no_mem_socket_bind, sd);
+
+ errno = 0;
+ rv = bind(sd, (const struct sockaddr *) &addr, SOCK_MAXADDRLEN + 1);
+ assert(rv == -1);
+ assert(errno == ENAMETOOLONG);
+
+ errno = 0;
+ rv = bind(sd, (const struct sockaddr *) &addr, 0);
+ assert(rv == -1);
+ assert(errno == EINVAL);
+
+ errno = 0;
+ rv = bind(sd, (const struct sockaddr *) &addr, sizeof(addr));
+ assert(rv == -1);
+ assert(errno == EADDRNOTAVAIL);
+
+ rv = close(sd);
+ assert(rv == 0);
+
+ errno = 0;
+ rv = bind(sd, (struct sockaddr *) &addr, sizeof(addr));
+ assert(rv == -1);
+ assert(errno == EBADF);
+
+ assert(rtems_resource_snapshot_check(&snapshot));
+}
+
+static void
test_main(void)
{
/* Must be first test to ensure resource checks work */
@@ -452,6 +522,7 @@ test_main(void)
test_socket_unsupported_ops();
test_socket_fstat_and_shutdown();
+ test_socket_bind();
puts("*** END OF " TEST_NAME " TEST ***");
exit(0);