POSIX requires that a process calling tcsetpgrp(3) from the background
authorschwarze <schwarze@openbsd.org>
Fri, 8 Jul 2016 20:41:13 +0000 (20:41 +0000)
committerschwarze <schwarze@openbsd.org>
Fri, 8 Jul 2016 20:41:13 +0000 (20:41 +0000)
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.

usr.bin/mandoc/tag.c

index 0c20f15..8e52eb9 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: tag.c,v 1.11 2015/11/20 21:58:32 schwarze Exp $    */
+/*      $OpenBSD: tag.c,v 1.12 2016/07/08 20:41:13 schwarze Exp $    */
 /*
  * Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -55,6 +55,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)
@@ -66,12 +84,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)