Module Name: src Committed By: jruoho Date: Wed Mar 7 07:24:06 UTC 2012
Modified Files: src/tests/lib/libc/sys: t_listen.c Log Message: Check the error values from listen(2), incl. case for standards/46150. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libc/sys/t_listen.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/sys/t_listen.c diff -u src/tests/lib/libc/sys/t_listen.c:1.1 src/tests/lib/libc/sys/t_listen.c:1.2 --- src/tests/lib/libc/sys/t_listen.c:1.1 Sat Nov 5 18:19:02 2011 +++ src/tests/lib/libc/sys/t_listen.c Wed Mar 7 07:24:05 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: t_listen.c,v 1.1 2011/11/05 18:19:02 jruoho Exp $ */ +/* $NetBSD: t_listen.c,v 1.2 2012/03/07 07:24:05 jruoho Exp $ */ /* * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. @@ -26,22 +26,82 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <atf-c.h> #include <err.h> #include <errno.h> +#include <fcntl.h> #include <string.h> #include <unistd.h> +#include <arpa/inet.h> #include <netinet/in.h> -#include <atf-c.h> +static const char *path = "listen"; + +ATF_TC_WITH_CLEANUP(listen_err); +ATF_TC_HEAD(listen_err, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks errors from listen(2)"); +} + +ATF_TC_BODY(listen_err, tc) +{ + static const size_t siz = sizeof(struct sockaddr_in); + struct sockaddr_in sina, sinb; + int fda, fdb, fdc; + + (void)memset(&sina, 0, sizeof(struct sockaddr_in)); + (void)memset(&sinb, 0, sizeof(struct sockaddr_in)); + + sina.sin_family = AF_INET; + sina.sin_port = htons(31522); + sina.sin_addr.s_addr = inet_addr("127.0.0.1"); + + sinb.sin_family = AF_INET; + sinb.sin_port = htons(31522); + sinb.sin_addr.s_addr = inet_addr("127.0.0.1"); + + fda = socket(AF_INET, SOCK_STREAM, 0); + fdb = socket(AF_INET, SOCK_STREAM, 0); + fdc = open("listen", O_RDWR | O_CREAT, 0600); + + ATF_REQUIRE(fda >= 0 && fdb >= 0 && fdc >= 0); + ATF_REQUIRE_ERRNO(ENOTSOCK, listen(fdc, 1) == -1); + + (void)close(fdc); + (void)unlink(path); + + ATF_REQUIRE(bind(fda, (struct sockaddr *)&sina, siz) == 0); + ATF_REQUIRE(listen(fda, 1) == 0); + + /* + * According to IEEE Std 1003.1-2008: if the socket is + * already connected, the call should fail with EINVAL. + */ + atf_tc_expect_fail("PR standards/46150"); + + ATF_REQUIRE(connect(fdb, (struct sockaddr *)&sinb, siz) == 0); + ATF_REQUIRE_ERRNO(EINVAL, listen(fdb, 1) == -1); + + (void)close(fda); + (void)close(fdb); + + ATF_REQUIRE_ERRNO(EBADF, connect(fdb, + (struct sockaddr *)&sinb, siz) == -1); +} + +ATF_TC_CLEANUP(listen_err, tc) +{ + (void)unlink(path); +} ATF_TC(listen_low_port); ATF_TC_HEAD(listen_low_port, tc) { - atf_tc_set_md_var(tc, "descr", "Checks that low-port allocation " - "works"); + atf_tc_set_md_var(tc, "descr", "Does low-port allocation work?"); atf_tc_set_md_var(tc, "require.user", "root"); } + ATF_TC_BODY(listen_low_port, tc) { int sd, val; @@ -68,6 +128,7 @@ ATF_TC_BODY(listen_low_port, tc) ATF_TP_ADD_TCS(tp) { + ATF_TP_ADD_TC(tp, listen_err); ATF_TP_ADD_TC(tp, listen_low_port); return 0;