diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2016-07-08 20:42:15 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2016-07-08 20:42:15 +0000 |
commit | 79aa90b84e17a4ea5f76346ab96af632fafbc55a (patch) | |
tree | 18f43fc512023330c2c0a12010e2a339e8772771 /tag.c | |
parent | 388f247aa7b238c98c7a311949fe8fb8a08ad944 (diff) | |
download | mandoc-79aa90b84e17a4ea5f76346ab96af632fafbc55a.tar.gz |
POSIX requires that a process calling tcsetpgrp(3) from the background
gets a SIGTTOU signal. In that case, do not stop.
Portability issue found while testing on commercial Solaris 9/10/11.
Thanks to opencsw.org for providing me with a testing environment.
Diffstat (limited to 'tag.c')
-rw-r--r-- | tag.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -57,6 +57,24 @@ tag_init(void) tag_files.tfd = -1; tag_files.tcpgid = -1; + /* Clean up when dying from a signal. */ + + memset(&sa, 0, sizeof(sa)); + sigfillset(&sa.sa_mask); + sa.sa_handler = tag_signal; + sigaction(SIGHUP, &sa, NULL); + sigaction(SIGINT, &sa, NULL); + sigaction(SIGTERM, &sa, NULL); + + /* + * POSIX requires that a process calling tcsetpgrp(3) + * from the background gets a SIGTTOU signal. + * In that case, do not stop. + */ + + sa.sa_handler = SIG_IGN; + sigaction(SIGTTOU, &sa, NULL); + /* Save the original standard output for use by the pager. */ if ((tag_files.ofd = dup(STDOUT_FILENO)) == -1) @@ -68,12 +86,6 @@ tag_init(void) sizeof(tag_files.ofn)); (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX", sizeof(tag_files.tfn)); - memset(&sa, 0, sizeof(sa)); - sigfillset(&sa.sa_mask); - sa.sa_handler = tag_signal; - sigaction(SIGHUP, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - sigaction(SIGTERM, &sa, NULL); if ((ofd = mkstemp(tag_files.ofn)) == -1) goto fail; if ((tag_files.tfd = mkstemp(tag_files.tfn)) == -1) |