From c8505d9515e240b816d67a5b4a08ccfd4268cb6a Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Mon, 9 Jan 2017 17:49:57 +0000 Subject: Use stdout rather than stdin for controlling the terminal such that "cat foo.mdoc | man -l" works. Issue reported by Christian Neukirchen and also tested by him on Void Linux with both glibc and musl. The patch makes sense to millert@. --- main.c | 12 ++++++------ tag.c | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/main.c b/main.c index 0aa714bb..b64b3be1 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.278 2017/01/09 01:37:03 schwarze Exp $ */ +/* $Id: main.c,v 1.279 2017/01/09 17:49:57 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2012, 2014-2017 Ingo Schwarze @@ -531,10 +531,10 @@ out: /* Stop here until moved to the foreground. */ - tc_pgid = tcgetpgrp(STDIN_FILENO); + tc_pgid = tcgetpgrp(tag_files->ofd); if (tc_pgid != man_pgid) { if (tc_pgid == pager_pid) { - (void)tcsetpgrp(STDIN_FILENO, + (void)tcsetpgrp(tag_files->ofd, man_pgid); if (signum == SIGTTIN) continue; @@ -547,7 +547,7 @@ out: /* Once in the foreground, activate the pager. */ if (pager_pid) { - (void)tcsetpgrp(STDIN_FILENO, pager_pid); + (void)tcsetpgrp(tag_files->ofd, pager_pid); kill(pager_pid, SIGCONT); } else pager_pid = spawn_pager(tag_files); @@ -1076,7 +1076,7 @@ spawn_pager(struct tag_files *tag_files) break; default: (void)setpgid(pager_pid, 0); - (void)tcsetpgrp(STDIN_FILENO, pager_pid); + (void)tcsetpgrp(tag_files->ofd, pager_pid); #if HAVE_PLEDGE if (pledge("stdio rpath tmppath tty proc", NULL) == -1) err((int)MANDOCLEVEL_SYSERR, "pledge"); @@ -1094,7 +1094,7 @@ spawn_pager(struct tag_files *tag_files) /* Do not start the pager before controlling the terminal. */ - while (tcgetpgrp(STDIN_FILENO) != getpid()) + while (tcgetpgrp(STDOUT_FILENO) != getpid()) nanosleep(&timeout, NULL); execvp(argv[0], argv); diff --git a/tag.c b/tag.c index a618c4a0..0fbd2e10 100644 --- a/tag.c +++ b/tag.c @@ -1,4 +1,4 @@ -/* $Id: tag.c,v 1.16 2016/11/08 16:23:58 schwarze Exp $ */ +/* $Id: tag.c,v 1.17 2017/01/09 17:49:58 schwarze Exp $ */ /* * Copyright (c) 2015, 2016 Ingo Schwarze * @@ -221,11 +221,11 @@ tag_unlink(void) pid_t tc_pgid; if (tag_files.tcpgid != -1) { - tc_pgid = tcgetpgrp(STDIN_FILENO); + tc_pgid = tcgetpgrp(tag_files.ofd); if (tc_pgid == tag_files.pager_pid || tc_pgid == getpgid(0) || getpgid(tc_pgid) == -1) - (void)tcsetpgrp(STDIN_FILENO, tag_files.tcpgid); + (void)tcsetpgrp(tag_files.ofd, tag_files.tcpgid); } if (*tag_files.ofn != '\0') unlink(tag_files.ofn); -- cgit v1.2.3