summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2015-03-10 13:48:58 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2015-03-10 13:48:58 +0000
commitab9e66e0e4fe328104ceca79ddd5f8e53ddb65bc (patch)
tree96e655d295a4d637b5f898d71ea3aa8f9ce1e3cf /usr.bin
parent816f97ebc01aace35c3937452b8d4b8f62f1ca3f (diff)
We can keep track of the pager PID without additional complexity.
No functional change for now, but more robust in case anybody should ever add additional child processes.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/mandoc/main.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/usr.bin/mandoc/main.c b/usr.bin/mandoc/main.c
index fd62433c6fd..876dfaad1d0 100644
--- a/usr.bin/mandoc/main.c
+++ b/usr.bin/mandoc/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.129 2015/03/10 03:00:48 schwarze Exp $ */
+/* $OpenBSD: main.c,v 1.130 2015/03/10 13:48:57 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -93,7 +93,7 @@ static void mmsg(enum mandocerr, enum mandoclevel,
static void parse(struct curparse *, int,
const char *, enum mandoclevel *);
static enum mandoclevel passthrough(const char *, int, int);
-static void spawn_pager(void);
+static pid_t spawn_pager(void);
static int toptions(struct curparse *, char *);
static void usage(enum argmode) __attribute__((noreturn));
static int woptions(struct curparse *, char *);
@@ -122,9 +122,9 @@ main(int argc, char *argv[])
enum outmode outmode;
int fd;
int show_usage;
- int use_pager;
int options;
int c;
+ pid_t pager_pid; /* 0: don't use; 1: not yet spawned. */
if (argc < 1)
progname = "mandoc";
@@ -165,7 +165,7 @@ main(int argc, char *argv[])
options = MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1;
defos = NULL;
- use_pager = 1;
+ pager_pid = 1;
show_usage = 0;
synopsis_only = 0;
outmode = OUTMODE_DEF;
@@ -180,7 +180,7 @@ main(int argc, char *argv[])
conf_file = optarg;
break;
case 'c':
- use_pager = 0;
+ pager_pid = 0;
break;
case 'f':
search.argmode = ARG_WORD;
@@ -188,7 +188,7 @@ main(int argc, char *argv[])
case 'h':
(void)strlcat(curp.outopts, "synopsis,", BUFSIZ);
synopsis_only = 1;
- use_pager = 0;
+ pager_pid = 0;
outmode = OUTMODE_ALL;
break;
case 'I':
@@ -263,7 +263,7 @@ main(int argc, char *argv[])
switch (search.argmode) {
case ARG_FILE:
outmode = OUTMODE_ALL;
- use_pager = 0;
+ pager_pid = 0;
break;
case ARG_NAME:
outmode = OUTMODE_ONE;
@@ -397,8 +397,8 @@ main(int argc, char *argv[])
mparse_keep(curp.mp);
if (argc < 1) {
- if (use_pager && isatty(STDOUT_FILENO))
- spawn_pager();
+ if (pager_pid == 1 && isatty(STDOUT_FILENO))
+ pager_pid = spawn_pager();
parse(&curp, STDIN_FILENO, "<stdin>", &rc);
}
@@ -409,9 +409,8 @@ main(int argc, char *argv[])
rc = rctmp;
if (fd != -1) {
- if (use_pager && isatty(STDOUT_FILENO))
- spawn_pager();
- use_pager = 0;
+ if (pager_pid == 1 && isatty(STDOUT_FILENO))
+ pager_pid = spawn_pager();
if (resp == NULL)
parse(&curp, fd, *argv, &rc);
@@ -460,19 +459,15 @@ out:
free(defos);
/*
- * Flush the output and signal end of file.
- * If a pager is attached, it allows browsing to the end.
- * Otherwise, it does no harm, we are about to exit anyway.
+ * If a pager is attached, flush the pipe leading to it
+ * and signal end of file such that the user can browse
+ * to the end. Then wait for the user to close the pager.
*/
- fclose(stdout);
-
- /*
- * If we spawned a pager, wait for the user to close it.
- * Otherwise, this call fails with no adverse effect.
- */
-
- wait(NULL);
+ if (pager_pid != 0 && pager_pid != 1) {
+ fclose(stdout);
+ waitpid(pager_pid, NULL, 0);
+ }
return((int)rc);
}
@@ -920,7 +915,7 @@ mmsg(enum mandocerr t, enum mandoclevel lvl,
fputc('\n', stderr);
}
-static void
+static pid_t
spawn_pager(void)
{
#define MAX_PAGER_ARGS 16
@@ -929,14 +924,15 @@ spawn_pager(void)
char *cp;
int fildes[2];
int argc;
+ pid_t pager_pid;
if (pipe(fildes) == -1) {
fprintf(stderr, "%s: pipe: %s\n",
progname, strerror(errno));
- return;
+ return(0);
}
- switch (fork()) {
+ switch (pager_pid = fork()) {
case -1:
fprintf(stderr, "%s: fork: %s\n",
progname, strerror(errno));
@@ -951,7 +947,7 @@ spawn_pager(void)
exit((int)MANDOCLEVEL_SYSERR);
}
close(fildes[1]);
- return;
+ return(pager_pid);
}
/* The child process becomes the pager. */