diff --git a/contrib/chg/chg.c b/contrib/chg/chg.c --- a/contrib/chg/chg.c +++ b/contrib/chg/chg.c @@ -431,15 +431,14 @@ int main(int argc, const char *argv[], c setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc)); const char *pagercmd = hgc_getpager(hgc, argv + 1, argc - 1); - pagerpid = setuppager(pagercmd); + pid_t pagerpid = setuppager(pagercmd); if (pagerpid) hgc_attachio(hgc); /* reattach to pager */ int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1); restoresignalhandler(); hgc_close(hgc); freecmdserveropts(&opts); - if (pagerpid) - waitpager(pagerpid); + waitpager(); return exitcode; } diff --git a/contrib/chg/procutil.c b/contrib/chg/procutil.c --- a/contrib/chg/procutil.c +++ b/contrib/chg/procutil.c @@ -159,6 +159,7 @@ error: * Return 0 if pager is not started, or pid of the pager */ static pid_t setuppager(const char *pagercmd) { + assert(pagerpid == 0); if (!pagercmd) return 0; @@ -177,6 +178,7 @@ static pid_t setuppager(const char *page goto error; } close(pipefds[1]); + pagerpid = pid; return pid; } else { dup2(pipefds[0], fileno(stdin)); @@ -197,13 +199,16 @@ error: return 0; } -static void waitpager(pid_t pid) +static void waitpager(void) { + if (pagerpid == 0) + return; + /* close output streams to notify the pager its input ends */ fclose(stdout); fclose(stderr); while (1) { - pid_t ret = waitpid(pid, NULL, 0); + pid_t ret = waitpid(pagerpid, NULL, 0); if (ret == -1 && errno == EINTR) continue; break;