summaryrefslogtreecommitdiffhomepage
path: root/test/syscalls/linux/pty.cc
diff options
context:
space:
mode:
authorgystemd <gystemd@gmail.com>2021-08-16 16:37:00 +0200
committergystemd <gystemd@gmail.com>2021-08-17 23:40:24 +0200
commita5f2ef66d3c7e5ed1fd90cc8670b3e3891ad8af9 (patch)
treed35c0b4736e2a93f8de990709f4fc5aec8528a19 /test/syscalls/linux/pty.cc
parent7c5ab794f140dda031ba015d79892a79dd523d50 (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.cc51
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),