1118bba45160462e11fa371598f423cbfe6e90393Jan Stancek/* 2118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd 3118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>, 4118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * Yumiko Sugita <yumiko.sugita.yf@hitachi.com>, 5118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp> 6118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * Copyright (c) 2016 Linux Test Project 7118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * 8118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * This program is free software; you can redistribute it and/or modify 9118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * it under the terms of the GNU General Public License as published by 10118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * the Free Software Foundation; either version 2 of the License, or 11118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * (at your option) any later version. 12118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * 13118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * This program is distributed in the hope that it will be useful, 14118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * but WITHOUT ANY WARRANTY; without even the implied warranty of 15118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 16118bba45160462e11fa371598f423cbfe6e90393Jan Stancek * the GNU General Public License for more details. 17118bba45160462e11fa371598f423cbfe6e90393Jan Stancek */ 18118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 192f765066f7902ba75b75574efdcc72b5eec38b50yaberauneya#ifndef _GNU_SOURCE 202f765066f7902ba75b75574efdcc72b5eec38b50yaberauneya#define _GNU_SOURCE 212f765066f7902ba75b75574efdcc72b5eec38b50yaberauneya#endif 222f765066f7902ba75b75574efdcc72b5eec38b50yaberauneya 23beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak#include <errno.h> 242f765066f7902ba75b75574efdcc72b5eec38b50yaberauneya#include <poll.h> 25118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#include <signal.h> 26118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#include <stdlib.h> 27118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#include <sys/types.h> 28118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#include <sys/wait.h> 29beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak#include "linux_syscall_numbers.h" 30118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#include "ltp_signal.h" 31118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#include "tst_test.h" 32beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 33fc7a2a57faa26636ed7a5551daf80bb79be0490eyaberauneya/* Older versions of glibc don't publish this constant's value. */ 34fc7a2a57faa26636ed7a5551daf80bb79be0490eyaberauneya#ifndef POLLRDHUP 35fc7a2a57faa26636ed7a5551daf80bb79be0490eyaberauneya#define POLLRDHUP 0x2000 36fc7a2a57faa26636ed7a5551daf80bb79be0490eyaberauneya#endif 37fc7a2a57faa26636ed7a5551daf80bb79be0490eyaberauneya 38118bba45160462e11fa371598f423cbfe6e90393Jan Stancek#define TYPE_NAME(x) .ttype = x, .desc = #x 39d07b595975578fe08e424d9875cb69ae5daf9f07subrata_modak 40118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstruct test_case { 41118bba45160462e11fa371598f423cbfe6e90393Jan Stancek int ttype; /* test type (enum) */ 42118bba45160462e11fa371598f423cbfe6e90393Jan Stancek const char *desc; /* test description (name) */ 43118bba45160462e11fa371598f423cbfe6e90393Jan Stancek int ret; /* expected ret code */ 44118bba45160462e11fa371598f423cbfe6e90393Jan Stancek int err; /* expected errno code */ 45118bba45160462e11fa371598f423cbfe6e90393Jan Stancek short expect_revents; /* expected revents value */ 46118bba45160462e11fa371598f423cbfe6e90393Jan Stancek unsigned int nfds; /* nfds ppoll parameter */ 47118bba45160462e11fa371598f423cbfe6e90393Jan Stancek sigset_t *sigmask; /* sigmask ppoll parameter */ 48118bba45160462e11fa371598f423cbfe6e90393Jan Stancek sigset_t *sigmask_cur; /* sigmask set for current process */ 49118bba45160462e11fa371598f423cbfe6e90393Jan Stancek struct timespec *ts; /* ts ppoll parameter */ 50118bba45160462e11fa371598f423cbfe6e90393Jan Stancek struct pollfd *fds; /* fds ppoll parameter */ 51118bba45160462e11fa371598f423cbfe6e90393Jan Stancek int sigint_count; /* if > 0, spawn process to send SIGINT */ 52118bba45160462e11fa371598f423cbfe6e90393Jan Stancek /* 'count' times to current process */ 53118bba45160462e11fa371598f423cbfe6e90393Jan Stancek unsigned int sigint_delay; /* delay between SIGINT signals */ 54118bba45160462e11fa371598f423cbfe6e90393Jan Stancek}; 55beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 56beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modakenum test_type { 57beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak NORMAL, 58ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya MASK_SIGNAL, 59ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya TIMEOUT, 60ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya FD_ALREADY_CLOSED, 61ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya SEND_SIGINT, 62ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya SEND_SIGINT_RACE_TEST, 63ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya INVALID_NFDS, 64ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya INVALID_FDS, 65beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak}; 66beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 67118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic int fd1 = -1; 68118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic sigset_t sigmask_empty, sigmask_sigint; 69118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic struct pollfd fds_good[1], fds_already_closed[1]; 70118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 71118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic struct timespec ts_short = { 72118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .tv_sec = 0, 73118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .tv_nsec = 200000000, 74118bba45160462e11fa371598f423cbfe6e90393Jan Stancek}; 75118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic struct timespec ts_long = { 76118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .tv_sec = 2, 77118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .tv_nsec = 0, 78beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak}; 79beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 80beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak/* Test cases 81beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * 82beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * test status of errors on man page 83beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * 84beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * EBADF can't check because EBADF never happen even though 85beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * fd was invalid. In this case, information of invalid 86beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * fd is set in revents 87beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * EFAULT v ('fds' array in the invalid address space) 88beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * EINTR v (a non blocked signal was caught) 89beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * EINVAL v ('nfds' is over the 'RLIMIT_NOFILE' value) 90beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak * ENOMEM can't check because it's difficult to create no-memory 91beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak */ 92beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 93beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modakstatic struct test_case tcase[] = { 94118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 95118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(NORMAL), 96118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .expect_revents = POLLIN | POLLOUT, 97118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = 1, 98118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = 0, 99118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 1, 100118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_long, 101118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_good, 102118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 103118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 104118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(MASK_SIGNAL), 105118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = 0, 106118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = 0, 107118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 0, 108118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigmask = &sigmask_sigint, 109118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_short, 110118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_good, 111118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigint_count = 4, 112118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigint_delay = 100000, 113118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 114118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 115118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(TIMEOUT), 116118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = 0, 117118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = 0, 118118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 0, 119118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_short, 120118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_good, 121118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 122118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 123118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(FD_ALREADY_CLOSED), 124118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .expect_revents = POLLNVAL, 125118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = 1, 126118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = 0, 127118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 1, 128118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_long, 129118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_already_closed, 130118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 131118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 132118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(SEND_SIGINT), 133118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = -1, 134118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = EINTR, 135118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 0, 136118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_long, 137118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_good, 138118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigint_count = 40, 139118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigint_delay = 100000, 140118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 141118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 142118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(SEND_SIGINT_RACE_TEST), 143118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = -1, 144118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = EINTR, 145118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 0, 146118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigmask = &sigmask_empty, 147118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigmask_cur = &sigmask_sigint, 148118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_long, 149118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_good, 150118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigint_count = 1, 151118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .sigint_delay = 0, 152118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 153118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 154118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(INVALID_NFDS), 155118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = -1, 156118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = EINVAL, 157118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = -1, 158118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_long, 159118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = fds_good, 160118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 161118bba45160462e11fa371598f423cbfe6e90393Jan Stancek { 162118bba45160462e11fa371598f423cbfe6e90393Jan Stancek TYPE_NAME(INVALID_FDS), 163118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ret = -1, 164118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .err = EFAULT, 165118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .nfds = 1, 166118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .ts = &ts_long, 167118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .fds = (struct pollfd *) -1, 168118bba45160462e11fa371598f423cbfe6e90393Jan Stancek }, 169354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}; 170beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 171118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic void sighandler(int sig LTP_ATTRIBUTE_UNUSED) 172118bba45160462e11fa371598f423cbfe6e90393Jan Stancek{ 173118bba45160462e11fa371598f423cbfe6e90393Jan Stancek} 174beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 175118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic void setup(void) 176118bba45160462e11fa371598f423cbfe6e90393Jan Stancek{ 177118bba45160462e11fa371598f423cbfe6e90393Jan Stancek int fd2; 178beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 179118bba45160462e11fa371598f423cbfe6e90393Jan Stancek SAFE_SIGNAL(SIGINT, sighandler); 180118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 181118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (sigemptyset(&sigmask_empty) == -1) 182118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_brk(TBROK | TERRNO, "sigemptyset"); 183118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (sigemptyset(&sigmask_sigint) == -1) 184118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_brk(TBROK | TERRNO, "sigemptyset"); 185118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (sigaddset(&sigmask_sigint, SIGINT) == -1) 186118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_brk(TBROK | TERRNO, "sigaddset"); 187118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 188118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fd1 = SAFE_OPEN("testfile1", O_CREAT | O_EXCL | O_RDWR, 189118bba45160462e11fa371598f423cbfe6e90393Jan Stancek S_IRUSR | S_IWUSR); 190118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fds_good[0].fd = fd1; 191118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fds_good[0].events = POLLIN | POLLPRI | POLLOUT | POLLRDHUP; 192118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fds_good[0].revents = 0; 193118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 194118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fd2 = SAFE_OPEN("testfile2", O_CREAT | O_EXCL | O_RDWR, 195118bba45160462e11fa371598f423cbfe6e90393Jan Stancek S_IRUSR | S_IWUSR); 196118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fds_already_closed[0].fd = fd2; 197118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fds_already_closed[0].events = POLLIN | POLLPRI | POLLOUT | POLLRDHUP; 198118bba45160462e11fa371598f423cbfe6e90393Jan Stancek fds_already_closed[0].revents = 0; 199118bba45160462e11fa371598f423cbfe6e90393Jan Stancek SAFE_CLOSE(fd2); 200118bba45160462e11fa371598f423cbfe6e90393Jan Stancek} 201118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 202118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic void cleanup(void) 203354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{ 204118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (fd1 != -1) 205118bba45160462e11fa371598f423cbfe6e90393Jan Stancek close(fd1); 206118bba45160462e11fa371598f423cbfe6e90393Jan Stancek} 207ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya 208118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic pid_t create_sig_proc(int sig, int count, unsigned int usec) 209118bba45160462e11fa371598f423cbfe6e90393Jan Stancek{ 210118bba45160462e11fa371598f423cbfe6e90393Jan Stancek pid_t pid, cpid; 211beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 212118bba45160462e11fa371598f423cbfe6e90393Jan Stancek pid = getpid(); 213118bba45160462e11fa371598f423cbfe6e90393Jan Stancek cpid = SAFE_FORK(); 214ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya 215118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (cpid == 0) { 216118bba45160462e11fa371598f423cbfe6e90393Jan Stancek while (count-- > 0) { 217118bba45160462e11fa371598f423cbfe6e90393Jan Stancek usleep(usec); 218118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (kill(pid, sig) == -1) 219118bba45160462e11fa371598f423cbfe6e90393Jan Stancek break; 220ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya } 221118bba45160462e11fa371598f423cbfe6e90393Jan Stancek exit(0); 222ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya } 223beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 224118bba45160462e11fa371598f423cbfe6e90393Jan Stancek return cpid; 225118bba45160462e11fa371598f423cbfe6e90393Jan Stancek} 226ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya 227118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic void do_test(unsigned int i) 228118bba45160462e11fa371598f423cbfe6e90393Jan Stancek{ 229118bba45160462e11fa371598f423cbfe6e90393Jan Stancek pid_t pid = 0; 230118bba45160462e11fa371598f423cbfe6e90393Jan Stancek int sys_ret, sys_errno = 0, dummy; 231118bba45160462e11fa371598f423cbfe6e90393Jan Stancek struct test_case *tc = &tcase[i]; 232ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya 233118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_res(TINFO, "case %s", tc->desc); 234118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 235118bba45160462e11fa371598f423cbfe6e90393Jan Stancek /* setup */ 236118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (tc->sigmask_cur) { 237118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (sigprocmask(SIG_SETMASK, tc->sigmask_cur, NULL) == -1) 238118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_brk(TBROK, "sigprocmask"); 239ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya } 240118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (tc->sigint_count > 0) { 241118bba45160462e11fa371598f423cbfe6e90393Jan Stancek pid = create_sig_proc(SIGINT, tc->sigint_count, 242118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tc->sigint_delay); 24376a720a381f351b33eb203c7c519e6f44bbe7219Subrata Modak } 244ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya 245118bba45160462e11fa371598f423cbfe6e90393Jan Stancek /* test */ 246118bba45160462e11fa371598f423cbfe6e90393Jan Stancek sys_ret = tst_syscall(__NR_ppoll, tc->fds, tc->nfds, tc->ts, 247118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tc->sigmask, SIGSETSIZE); 248118bba45160462e11fa371598f423cbfe6e90393Jan Stancek sys_errno = errno; 249118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 250118bba45160462e11fa371598f423cbfe6e90393Jan Stancek /* cleanup */ 251118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (tc->sigmask_cur) { 252118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (sigprocmask(SIG_SETMASK, &sigmask_empty, NULL) == -1) 253118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_brk(TBROK, "sigprocmask"); 254118bba45160462e11fa371598f423cbfe6e90393Jan Stancek } 255ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya if (pid > 0) { 256ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya kill(pid, SIGTERM); 257118bba45160462e11fa371598f423cbfe6e90393Jan Stancek SAFE_WAIT(&dummy); 258ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya } 259beedd5d3a2e0250ed53eec2acefa91a5ddebcffbsubrata_modak 260118bba45160462e11fa371598f423cbfe6e90393Jan Stancek /* result check */ 261118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (tc->expect_revents) { 262118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (tc->fds[0].revents == tc->expect_revents) 263118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_res(TPASS, "revents=0x%04x", tc->expect_revents); 264118bba45160462e11fa371598f423cbfe6e90393Jan Stancek else 265118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_res(TFAIL, "revents=0x%04x, expected=0x%04x", 266118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tc->fds[0].revents, tc->expect_revents); 267118bba45160462e11fa371598f423cbfe6e90393Jan Stancek } 268118bba45160462e11fa371598f423cbfe6e90393Jan Stancek if (tc->ret >= 0 && tc->ret == sys_ret) { 269118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_res(TPASS, "ret: %d", sys_ret); 270118bba45160462e11fa371598f423cbfe6e90393Jan Stancek } else if (tc->ret == -1 && sys_ret == -1 && sys_errno == tc->err) { 271118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_res(TPASS, "ret: %d, errno: %s (%d)", sys_ret, 272118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_strerrno(sys_errno), sys_errno); 273118bba45160462e11fa371598f423cbfe6e90393Jan Stancek } else { 274118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_res(TFAIL, "ret: %d, exp: %d, ret_errno: %s (%d)," 275118bba45160462e11fa371598f423cbfe6e90393Jan Stancek " exp_errno: %s (%d)", tc->ret, sys_ret, 276118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_strerrno(sys_errno), sys_errno, 277118bba45160462e11fa371598f423cbfe6e90393Jan Stancek tst_strerrno(tc->err), tc->err); 278ea695e4a871cdcc17c92495d148b0f842784e7e2yaberauneya } 2795262667a4c30c82180d439bae4d7787f45281289Garrett Cooper} 280118bba45160462e11fa371598f423cbfe6e90393Jan Stancek 281118bba45160462e11fa371598f423cbfe6e90393Jan Stancekstatic struct tst_test test = { 282118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .tid = "ppoll01", 283118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .tcnt = ARRAY_SIZE(tcase), 284118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .test = do_test, 285118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .setup = setup, 286118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .cleanup = cleanup, 287118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .forks_child = 1, 288118bba45160462e11fa371598f423cbfe6e90393Jan Stancek .needs_tmpdir = 1, 289118bba45160462e11fa371598f423cbfe6e90393Jan Stancek}; 290