Show More
@@ -431,15 +431,14 b' int main(int argc, const char *argv[], c' | |||||
431 |
|
431 | |||
432 | setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc)); |
|
432 | setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc)); | |
433 | const char *pagercmd = hgc_getpager(hgc, argv + 1, argc - 1); |
|
433 | const char *pagercmd = hgc_getpager(hgc, argv + 1, argc - 1); | |
434 | pagerpid = setuppager(pagercmd); |
|
434 | pid_t pagerpid = setuppager(pagercmd); | |
435 | if (pagerpid) |
|
435 | if (pagerpid) | |
436 | hgc_attachio(hgc); /* reattach to pager */ |
|
436 | hgc_attachio(hgc); /* reattach to pager */ | |
437 | int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1); |
|
437 | int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1); | |
438 | restoresignalhandler(); |
|
438 | restoresignalhandler(); | |
439 | hgc_close(hgc); |
|
439 | hgc_close(hgc); | |
440 | freecmdserveropts(&opts); |
|
440 | freecmdserveropts(&opts); | |
441 | if (pagerpid) |
|
441 | waitpager(); | |
442 | waitpager(pagerpid); |
|
|||
443 |
|
442 | |||
444 | return exitcode; |
|
443 | return exitcode; | |
445 | } |
|
444 | } |
@@ -159,6 +159,7 b' error:' | |||||
159 | * Return 0 if pager is not started, or pid of the pager */ |
|
159 | * Return 0 if pager is not started, or pid of the pager */ | |
160 | static pid_t setuppager(const char *pagercmd) |
|
160 | static pid_t setuppager(const char *pagercmd) | |
161 | { |
|
161 | { | |
|
162 | assert(pagerpid == 0); | |||
162 | if (!pagercmd) |
|
163 | if (!pagercmd) | |
163 | return 0; |
|
164 | return 0; | |
164 |
|
165 | |||
@@ -177,6 +178,7 b' static pid_t setuppager(const char *page' | |||||
177 | goto error; |
|
178 | goto error; | |
178 | } |
|
179 | } | |
179 | close(pipefds[1]); |
|
180 | close(pipefds[1]); | |
|
181 | pagerpid = pid; | |||
180 | return pid; |
|
182 | return pid; | |
181 | } else { |
|
183 | } else { | |
182 | dup2(pipefds[0], fileno(stdin)); |
|
184 | dup2(pipefds[0], fileno(stdin)); | |
@@ -197,13 +199,16 b' error:' | |||||
197 | return 0; |
|
199 | return 0; | |
198 | } |
|
200 | } | |
199 |
|
201 | |||
200 |
static void waitpager( |
|
202 | static void waitpager(void) | |
201 | { |
|
203 | { | |
|
204 | if (pagerpid == 0) | |||
|
205 | return; | |||
|
206 | ||||
202 | /* close output streams to notify the pager its input ends */ |
|
207 | /* close output streams to notify the pager its input ends */ | |
203 | fclose(stdout); |
|
208 | fclose(stdout); | |
204 | fclose(stderr); |
|
209 | fclose(stderr); | |
205 | while (1) { |
|
210 | while (1) { | |
206 | pid_t ret = waitpid(pid, NULL, 0); |
|
211 | pid_t ret = waitpid(pagerpid, NULL, 0); | |
207 | if (ret == -1 && errno == EINTR) |
|
212 | if (ret == -1 && errno == EINTR) | |
208 | continue; |
|
213 | continue; | |
209 | break; |
|
214 | break; |
General Comments 0
You need to be logged in to leave comments.
Login now