1865695bbc89088b9526ea9045410e5afb70a985cplars/*
20468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * Copyright (c) 2016 Linux Test Project
3865695bbc89088b9526ea9045410e5afb70a985cplars *
40468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * This program is free software; you can redistribute it and/or
50468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * modify it under the terms of the GNU General Public License as
60468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * published by the Free Software Foundation; either version 2 of
70468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * the License, or (at your option) any later version.
8865695bbc89088b9526ea9045410e5afb70a985cplars *
90468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * This program is distributed in the hope that it would be useful,
100468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * but WITHOUT ANY WARRANTY; without even the implied warranty of
110468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
120468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * GNU General Public License for more details.
13865695bbc89088b9526ea9045410e5afb70a985cplars *
140468047ec1a0c53411389d66b0426775025c7e34Jan Stancek * Check that pause() returns on signal with errno == EINTR.
1532f179b82d007ec15c0aea9759bea580a9a8d4d4Cyril Hrubis */
16865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
17865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
180468047ec1a0c53411389d66b0426775025c7e34Jan Stancek#include <stdlib.h>
190468047ec1a0c53411389d66b0426775025c7e34Jan Stancek#include "tst_test.h"
20865695bbc89088b9526ea9045410e5afb70a985cplars
210468047ec1a0c53411389d66b0426775025c7e34Jan Stancekstatic void sig_handler(int sig LTP_ATTRIBUTE_UNUSED)
22865695bbc89088b9526ea9045410e5afb70a985cplars{
230468047ec1a0c53411389d66b0426775025c7e34Jan Stancek}
2456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
250468047ec1a0c53411389d66b0426775025c7e34Jan Stancekstatic void do_child(void)
260468047ec1a0c53411389d66b0426775025c7e34Jan Stancek{
270468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	SAFE_SIGNAL(SIGINT, sig_handler);
2832f179b82d007ec15c0aea9759bea580a9a8d4d4Cyril Hrubis
290468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	TST_CHECKPOINT_WAKE(0);
3056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
310468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	TEST(pause());
320468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	if (TEST_RETURN != -1)
330468047ec1a0c53411389d66b0426775025c7e34Jan Stancek		tst_res(TFAIL, "pause() succeeded unexpectedly");
340468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	else if (TEST_ERRNO == EINTR)
350468047ec1a0c53411389d66b0426775025c7e34Jan Stancek		tst_res(TPASS, "pause() interrupted with EINTR");
360468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	else
370468047ec1a0c53411389d66b0426775025c7e34Jan Stancek		tst_res(TFAIL | TTERRNO, "pause() unexpected errno");
38865695bbc89088b9526ea9045410e5afb70a985cplars
390468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	TST_CHECKPOINT_WAKE(0);
400468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	exit(0);
412c28215423293e443469a07ae7011135d058b671Garrett Cooper}
42865695bbc89088b9526ea9045410e5afb70a985cplars
430468047ec1a0c53411389d66b0426775025c7e34Jan Stancekstatic void do_test(void)
44bd774d343ec56c20363bb294f5157d31e4497fd5Cyril Hrubis{
450468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	int pid, status;
46bd774d343ec56c20363bb294f5157d31e4497fd5Cyril Hrubis
470468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	pid = SAFE_FORK();
480468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	if (pid == 0)
490468047ec1a0c53411389d66b0426775025c7e34Jan Stancek		do_child();
50865695bbc89088b9526ea9045410e5afb70a985cplars
510468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	TST_CHECKPOINT_WAIT(0);
520468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	TST_PROCESS_STATE_WAIT(pid, 'S');
530468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	kill(pid, SIGINT);
540468047ec1a0c53411389d66b0426775025c7e34Jan Stancek
550468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	/*
560468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	 * TST_CHECKPOINT_WAIT has built-in timeout, if pause() doesn't return,
570468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	 * this checkpoint call will reliably end the test.
580468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	 */
590468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	TST_CHECKPOINT_WAIT(0);
600468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	SAFE_WAIT(&status);
612c28215423293e443469a07ae7011135d058b671Garrett Cooper}
620468047ec1a0c53411389d66b0426775025c7e34Jan Stancek
630468047ec1a0c53411389d66b0426775025c7e34Jan Stancekstatic struct tst_test test = {
640468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	.forks_child = 1,
650468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	.needs_checkpoints = 1,
660468047ec1a0c53411389d66b0426775025c7e34Jan Stancek	.test_all = do_test,
670468047ec1a0c53411389d66b0426775025c7e34Jan Stancek};
68