// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Ulrich Drepper * Copyright (c) International Business Machines Corp., 2009 */ /* * Test Name: socketpair02 * * Description: * This Program tests the new flag SOCK_CLOEXEC and SOCK_NONBLOCK introduced * in socketpair() in kernel 2.6.27. */ #include #include #include #include #include #include #include #include "lapi/fcntl.h" #include "tst_test.h" static int fds[2]; static struct tcase { int type; int flag; int fl_flag; char *des; } tcases[] = { {SOCK_STREAM, 0, F_GETFD, "no close-on-exec"}, {SOCK_STREAM | SOCK_CLOEXEC, FD_CLOEXEC, F_GETFD, "close-on-exec"}, {SOCK_STREAM, 0, F_GETFL, "no non-blocking"}, {SOCK_STREAM | SOCK_NONBLOCK, O_NONBLOCK, F_GETFL, "non-blocking"} }; static void verify_socketpair(unsigned int n) { int res, i; struct tcase *tc = &tcases[n]; TEST(socketpair(PF_UNIX, tc->type, 0, fds)); if (TST_RET == -1) tst_brk(TFAIL | TTERRNO, "socketpair() failed"); for (i = 0; i < 2; i++) { res = SAFE_FCNTL(fds[i], tc->fl_flag); if (tc->flag != 0 && (res & tc->flag) == 0) { tst_res(TFAIL, "socketpair() failed to set %s flag for fds[%d]", tc->des, i); goto ret; } if (tc->flag == 0 && (res & tc->flag) != 0) { tst_res(TFAIL, "socketpair() failed to set %s flag for fds[%d]", tc->des, i); goto ret; } } tst_res(TPASS, "socketpair() passed to set %s flag", tc->des); ret: SAFE_CLOSE(fds[0]); SAFE_CLOSE(fds[1]); } static void cleanup(void) { if (fds[0] > 0) SAFE_CLOSE(fds[0]); if (fds[1] > 0) SAFE_CLOSE(fds[1]); } static struct tst_test test = { .tcnt = ARRAY_SIZE(tcases), .test = verify_socketpair, .min_kver = "2.6.27", .cleanup = cleanup };