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