1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) International Business Machines Corp., 2001 4 * Copyright (c) 2008 Vijay Kumar B. <vijaykumar@bravegnu.org> 5 * Copyright (c) Linux Test Project, 2008-2022 6 * Copyright (C) 2023 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> 7 */ 8 9/*\ 10 * [Description] 11 * 12 * Test whether readfd is set by select() when eventfd() counter value is 13 * non-zero, then check if readfd is not set when eventfd() counter value is 14 * zero. 15 */ 16 17#include <stdlib.h> 18#include <sys/eventfd.h> 19#include "tst_test.h" 20 21static void run(void) 22{ 23 int fd; 24 uint64_t val; 25 fd_set readfds; 26 uint64_t non_zero = 10; 27 struct timeval timeout = { 0, 0 }; 28 29 fd = TST_EXP_FD(eventfd(0, EFD_NONBLOCK)); 30 31 FD_ZERO(&readfds); 32 FD_SET(fd, &readfds); 33 34 SAFE_WRITE(0, fd, &non_zero, sizeof(non_zero)); 35 TEST(select(fd + 1, &readfds, NULL, NULL, &timeout)); 36 if (TST_RET == -1) 37 tst_brk(TBROK | TERRNO, "select"); 38 39 TST_EXP_EQ_LI(FD_ISSET(fd, &readfds), 1); 40 41 SAFE_READ(0, fd, &val, sizeof(val)); 42 TEST(select(fd + 1, &readfds, NULL, NULL, &timeout)); 43 if (TST_RET == -1) 44 tst_brk(TBROK | TERRNO, "select"); 45 46 TST_EXP_EQ_LI(FD_ISSET(fd, &readfds), 0); 47 48 SAFE_CLOSE(fd); 49} 50 51static struct tst_test test = { 52 .test_all = run, 53 .needs_kconfigs = (const char *[]) { 54 "CONFIG_EVENTFD", 55 NULL 56 }, 57}; 58