diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-11 16:44:48 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 13:18:47 +0100 |
commit | 468b08e5530412e0e54d0e8a91d9708e93ef0340 (patch) | |
tree | c77f2940d3072fe923a55822c065e5f2ba633130 /testsuite/syscalls01 | |
parent | Use shutdown() from FreeBSD (diff) | |
download | rtems-libbsd-468b08e5530412e0e54d0e8a91d9708e93ef0340.tar.bz2 |
Use bind() from FreeBSD
Diffstat (limited to 'testsuite/syscalls01')
-rw-r--r-- | testsuite/syscalls01/test_main.c | 71 |
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); |