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