diff options
author | gystemd <gystemd@gmail.com> | 2021-08-16 16:37:00 +0200 |
---|---|---|
committer | gystemd <gystemd@gmail.com> | 2021-08-17 23:40:24 +0200 |
commit | a5f2ef66d3c7e5ed1fd90cc8670b3e3891ad8af9 (patch) | |
tree | d35c0b4736e2a93f8de990709f4fc5aec8528a19 /test/syscalls/linux/pty.cc | |
parent | 7c5ab794f140dda031ba015d79892a79dd523d50 (diff) |
added two system call tests for setForegroundProcessGroup
Test the correct sending of the SIGTTOU in setForegroundProcess
Diffstat (limited to 'test/syscalls/linux/pty.cc')
-rw-r--r-- | test/syscalls/linux/pty.cc | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/syscalls/linux/pty.cc b/test/syscalls/linux/pty.cc index 5ff1f12a0..2e0dc6b3e 100644 --- a/test/syscalls/linux/pty.cc +++ b/test/syscalls/linux/pty.cc @@ -1640,6 +1640,57 @@ TEST_F(JobControlTest, DISABLED_SetForegroundProcessGroup) { ASSERT_NO_ERRNO(res); } +// This test verify if a SIGTTOU signal is sent to the calling process'group +// when tcsetpgrp is called by a background process +TEST_F(JobControlTest, SetForegroundProcessGroupSIGTTOUBackground) { + auto res = RunInChild([=]() { + setsid(); + TEST_PCHECK(!ioctl(replica_.get(), TIOCSCTTY, 0)); + pid_t grandchild = fork(); + if (!grandchild) { + //assign a different pgid to the child so it will result as + //a background process + setpgid(grandchild, getpid()); + tcsetpgrp(replica_.get(), getpgid(0)); + // We should never reach this. + _exit(1); + } + int wstatus; + TEST_PCHECK(waitpid(grandchild, &wstatus, WSTOPPED) == grandchild); + TEST_PCHECK(WSTOPSIG(wstatus)==SIGTTOU); + }); + ASSERT_NO_ERRNO(res); +} + +// This test verify that a SIGTTOU signal is not delivered to +// a background process which calls tcsetpgrp and is ignoring SIGTTOU +TEST_F(JobControlTest, SetForegroundProcessGroupSIGTTOUIgnored) { + auto res = RunInChild([=]() { + setsid(); + TEST_PCHECK(!ioctl(replica_.get(), TIOCSCTTY, 0)); + pid_t grandchild = fork(); + if (!grandchild) { + // ignore SIGTTOU so the child in background won't + // be stopped when it will call tcsetpgrp + struct sigaction sa = {}; + sa.sa_handler = SIG_IGN; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(SIGTTOU, &sa, NULL); + //assign a different pgid to the child so it will result as + //a background process + setpgid(grandchild, getpid()); + tcsetpgrp(replica_.get(), getpgid(0)); + _exit(0); + } + int wstatus; + TEST_PCHECK(waitpid(grandchild, &wstatus, WSTOPPED) == grandchild); + TEST_PCHECK(WSTOPSIG(wstatus)!=SIGTTOU); + TEST_PCHECK(WIFEXITED(wstatus)); + }); + ASSERT_NO_ERRNO(res); +} + TEST_F(JobControlTest, SetForegroundProcessGroupWrongTTY) { pid_t pid = getpid(); ASSERT_THAT(ioctl(replica_.get(), TIOCSPGRP, &pid), |