version 1.44, 2007/05/06 04:50:26 |
version 1.45, 2007/05/06 05:01:19 |
|
|
char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; |
char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; |
sig_t sighup, sigint, sigquit; |
sig_t sighup, sigint, sigquit; |
pid_t pid; |
pid_t pid; |
int st; |
int saved_errno, st; |
|
|
ed = getenv("VISUAL"); |
ed = getenv("VISUAL"); |
if (ed == NULL || ed[0] == '\0') |
if (ed == NULL || ed[0] == '\0') |
|
|
sigquit = signal(SIGQUIT, SIG_IGN); |
sigquit = signal(SIGQUIT, SIG_IGN); |
top: |
top: |
if ((pid = fork()) == -1) { |
if ((pid = fork()) == -1) { |
int saved_errno = errno; |
saved_errno = errno; |
|
|
if (saved_errno == EAGAIN) { |
if (saved_errno == EAGAIN) { |
sleep(1); |
sleep(1); |
|
|
free(p); |
free(p); |
for (;;) { |
for (;;) { |
if (waitpid(pid, &st, 0) == -1) { |
if (waitpid(pid, &st, 0) == -1) { |
if (errno != EINTR) |
if (errno != EINTR) { |
|
saved_errno = errno; |
|
(void)signal(SIGHUP, sighup); |
|
(void)signal(SIGINT, sigint); |
|
(void)signal(SIGQUIT, sigquit); |
|
errno = saved_errno; |
return (-1); |
return (-1); |
|
} |
} else |
} else |
break; |
break; |
} |
} |