diff --git a/oio.h b/oio.h index 577218ba..9c049ec5 100644 --- a/oio.h +++ b/oio.h @@ -69,6 +69,7 @@ typedef enum { OIO_ECONNREFUSED, OIO_ECONNRESET, OIO_EDESTADDRREQ, + OIO_EFAULT, OIO_EHOSTUNREACH, OIO_EINTR, OIO_EINVAL, diff --git a/test/test-bind-error.c b/test/test-bind-error.c index bc7bb146..ee9abf3b 100644 --- a/test/test-bind-error.c +++ b/test/test-bind-error.c @@ -36,6 +36,32 @@ static void close_cb(oio_handle* handle, int status) { } +TEST_IMPL(bind_error_access) { + struct sockaddr_in addr = oio_ip4_addr("255.255.255.255", TEST_PORT); + oio_handle server; + int r; + + oio_init(); + + r = oio_tcp_init(&server, close_cb, NULL); + ASSERT(r == 0); + r = oio_bind(&server, (struct sockaddr*) &addr); + ASSERT(r == 0); + r = oio_listen(&server, 128, NULL); + ASSERT(r == -1); + + ASSERT(oio_last_error().code == OIO_EACCESS); + + oio_close(&server); + + oio_run(); + + ASSERT(close_cb_called == 1); + + return 0; +} + + TEST_IMPL(bind_error_addrinuse) { struct sockaddr_in addr = oio_ip4_addr("0.0.0.0", TEST_PORT); oio_handle server1, server2; @@ -69,3 +95,103 @@ TEST_IMPL(bind_error_addrinuse) { return 0; } + + +TEST_IMPL(bind_error_addrnotavail) { + struct sockaddr_in addr = oio_ip4_addr("4.4.4.4", TEST_PORT); + oio_handle server; + int r; + + oio_init(); + + r = oio_tcp_init(&server, close_cb, NULL); + ASSERT(r == 0); + r = oio_bind(&server, (struct sockaddr*) &addr); + ASSERT(r == 0); + r = oio_listen(&server, 128, NULL); + ASSERT(r == -1); + + ASSERT(oio_last_error().code == OIO_EADDRNOTAVAIL); + + oio_close(&server); + + oio_run(); + + ASSERT(close_cb_called == 1); + + return 0; +} + + +TEST_IMPL(bind_error_fault_1) { + char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; + oio_handle server; + int r; + + oio_init(); + + r = oio_tcp_init(&server, close_cb, NULL); + ASSERT(r == 0); + r = oio_bind(&server, (struct sockaddr*) &garbage); + ASSERT(r == -1); + + ASSERT(oio_last_error().code == OIO_EFAULT); + + oio_close(&server); + + oio_run(); + + ASSERT(close_cb_called == 1); + + return 0; +} + + +TEST_IMPL(bind_error_fault_2) { + oio_handle server; + int r; + + oio_init(); + + r = oio_tcp_init(&server, close_cb, NULL); + ASSERT(r == 0); + r = oio_bind(&server, (struct sockaddr*) NULL); + ASSERT(r == -1); + + ASSERT(oio_last_error().code == OIO_EFAULT); + + oio_close(&server); + + oio_run(); + + ASSERT(close_cb_called == 1); + + return 0; +} + + +TEST_IMPL(bind_error_inval) { + struct sockaddr_in addr1 = oio_ip4_addr("0.0.0.0", TEST_PORT); + struct sockaddr_in addr2 = oio_ip4_addr("0.0.0.0", TEST_PORT_2); + oio_handle server; + int r; + + oio_init(); + + r = oio_tcp_init(&server, close_cb, NULL); + ASSERT(r == 0); + r = oio_bind(&server, (struct sockaddr*) &addr1); + ASSERT(r == 0); + r = oio_bind(&server, (struct sockaddr*) &addr2); + ASSERT(r == -1); + + ASSERT(oio_last_error().code == OIO_EINVAL); + + oio_close(&server); + + oio_run(); + + ASSERT(close_cb_called == 1); + + return 0; +} \ No newline at end of file diff --git a/test/test-list.h b/test/test-list.h index 00723d83..cc87e59e 100644 --- a/test/test-list.h +++ b/test/test-list.h @@ -22,7 +22,12 @@ TEST_DECLARE (ping_pong) TEST_DECLARE (delayed_accept) TEST_DECLARE (tcp_writealot) +TEST_DECLARE (bind_error_access) TEST_DECLARE (bind_error_addrinuse) +TEST_DECLARE (bind_error_addrnotavail) +TEST_DECLARE (bind_error_fault_1) +TEST_DECLARE (bind_error_fault_2) +TEST_DECLARE (bind_error_inval) TEST_DECLARE (connection_fail) TEST_DECLARE (close_cb_stack) TEST_DECLARE (timeout) @@ -41,8 +46,18 @@ TASK_LIST_START TEST_HELPER (tcp_writealot, echo_server) */ + TEST_ENTRY (bind_error_access) + TEST_ENTRY (bind_error_addrinuse) + TEST_ENTRY (bind_error_addrnotavail) + + TEST_ENTRY (bind_error_fault_1) + + TEST_ENTRY (bind_error_fault_2) + + TEST_ENTRY (bind_error_inval) + TEST_ENTRY (connection_fail) TEST_ENTRY (close_cb_stack)