diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2019-07-26 18:01:43 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2019-07-26 18:01:43 +0000 |
commit | 988ad129a018b6274430f8e0261b4a3dfea006b5 (patch) | |
tree | fa7e84e9007e5b1f342722c1c6f8402a461eee40 | |
parent | 52838f7dbb2f85b9b3c01e2c3762f63743598196 (diff) | |
download | mandoc-988ad129a018b6274430f8e0261b4a3dfea006b5.tar.gz |
Structural cleanup, no functional change:
Move process group management out of main() into its own function
because it has its own, self-contained logic and its own local variables.
-rw-r--r-- | main.c | 114 |
1 files changed, 60 insertions, 54 deletions
@@ -101,6 +101,7 @@ static int fs_search(const struct mansearch *, static void outdata_alloc(struct curparse *); static void parse(struct curparse *, int, const char *); static void passthrough(int, int); +static void run_pager(struct tag_files *); static pid_t spawn_pager(struct tag_files *); static void usage(enum argmode) __attribute__((__noreturn__)); static int woptions(struct curparse *, char *); @@ -130,9 +131,7 @@ main(int argc, char *argv[]) int show_usage; int options; int use_pager; - int status, signum; int c; - pid_t pager_pid, tc_pgid, man_pgid, pid; #if HAVE_PROGNAME progname = getprogname(); @@ -669,63 +668,12 @@ out: manconf_free(&conf); mansearch_free(res, sz); } - free(curp.os_s); - /* - * When using a pager, finish writing both temporary files, - * fork it, wait for the user to close it, and clean up. - */ - if (tag_files != NULL) { fclose(stdout); tag_write(); - man_pgid = getpgid(0); - tag_files->tcpgid = man_pgid == getpid() ? - getpgid(getppid()) : man_pgid; - pager_pid = 0; - signum = SIGSTOP; - for (;;) { - - /* Stop here until moved to the foreground. */ - - tc_pgid = tcgetpgrp(tag_files->ofd); - if (tc_pgid != man_pgid) { - if (tc_pgid == pager_pid) { - (void)tcsetpgrp(tag_files->ofd, - man_pgid); - if (signum == SIGTTIN) - continue; - } else - tag_files->tcpgid = tc_pgid; - kill(0, signum); - continue; - } - - /* Once in the foreground, activate the pager. */ - - if (pager_pid) { - (void)tcsetpgrp(tag_files->ofd, pager_pid); - kill(pager_pid, SIGCONT); - } else - pager_pid = spawn_pager(tag_files); - - /* Wait for the pager to stop or exit. */ - - while ((pid = waitpid(pager_pid, &status, - WUNTRACED)) == -1 && errno == EINTR) - continue; - - if (pid == -1) { - mandoc_msg(MANDOCERR_WAIT, 0, 0, - "%s", strerror(errno)); - break; - } - if (!WIFSTOPPED(status)) - break; - - signum = WSTOPSIG(status); - } + run_pager(tag_files); tag_unlink(); } else if (curp.outtype != OUTT_LINT && (search.argmode == ARG_FILE || sz > 0)) @@ -1151,6 +1099,64 @@ woptions(struct curparse *curp, char *arg) return 0; } +/* + * Wait until moved to the foreground, + * then fork the pager and wait for the user to close it. + */ +static void +run_pager(struct tag_files *tag_files) +{ + int signum, status; + pid_t man_pgid, tc_pgid; + pid_t pager_pid, wait_pid; + + man_pgid = getpgid(0); + tag_files->tcpgid = man_pgid == getpid() ? getpgid(getppid()) : + man_pgid; + pager_pid = 0; + signum = SIGSTOP; + + for (;;) { + /* Stop here until moved to the foreground. */ + + tc_pgid = tcgetpgrp(tag_files->ofd); + if (tc_pgid != man_pgid) { + if (tc_pgid == pager_pid) { + (void)tcsetpgrp(tag_files->ofd, man_pgid); + if (signum == SIGTTIN) + continue; + } else + tag_files->tcpgid = tc_pgid; + kill(0, signum); + continue; + } + + /* Once in the foreground, activate the pager. */ + + if (pager_pid) { + (void)tcsetpgrp(tag_files->ofd, pager_pid); + kill(pager_pid, SIGCONT); + } else + pager_pid = spawn_pager(tag_files); + + /* Wait for the pager to stop or exit. */ + + while ((wait_pid = waitpid(pager_pid, &status, + WUNTRACED)) == -1 && errno == EINTR) + continue; + + if (wait_pid == -1) { + mandoc_msg(MANDOCERR_WAIT, 0, 0, + "%s", strerror(errno)); + break; + } + if (!WIFSTOPPED(status)) + break; + + signum = WSTOPSIG(status); + } +} + static pid_t spawn_pager(struct tag_files *tag_files) { |