version 1.39, 2007/04/20 08:36:00 |
version 1.40, 2007/05/11 02:37:31 |
|
|
char *argp[] = {"sh", "-c", NULL, NULL}, *p; |
char *argp[] = {"sh", "-c", NULL, NULL}, *p; |
sig_t sighup, sigint, sigquit; |
sig_t sighup, sigint, sigquit; |
pid_t pid; |
pid_t pid; |
int st; |
int saved_errno, st; |
|
|
(void)xasprintf(&p, "%s %s", cvs_editor, pathname); |
(void)xasprintf(&p, "%s %s", cvs_editor, pathname); |
argp[2] = p; |
argp[2] = p; |
|
|
top: |
|
sighup = signal(SIGHUP, SIG_IGN); |
sighup = signal(SIGHUP, SIG_IGN); |
sigint = signal(SIGINT, SIG_IGN); |
sigint = signal(SIGINT, SIG_IGN); |
sigquit = signal(SIGQUIT, SIG_IGN); |
sigquit = signal(SIGQUIT, SIG_IGN); |
if ((pid = fork()) == -1) { |
if ((pid = fork()) == -1) |
int saved_errno = errno; |
goto fail; |
|
|
(void)signal(SIGHUP, sighup); |
|
(void)signal(SIGINT, sigint); |
|
(void)signal(SIGQUIT, sigquit); |
|
if (saved_errno == EAGAIN) { |
|
sleep(1); |
|
goto top; |
|
} |
|
xfree(p); |
|
errno = saved_errno; |
|
return (-1); |
|
} |
|
if (pid == 0) { |
if (pid == 0) { |
execv(_PATH_BSHELL, argp); |
execv(_PATH_BSHELL, argp); |
_exit(127); |
_exit(127); |
} |
} |
|
while (waitpid(pid, &st, 0) == -1) |
|
if (errno != EINTR) |
|
goto fail; |
xfree(p); |
xfree(p); |
for (;;) { |
|
if (waitpid(pid, &st, WUNTRACED) == -1) { |
|
if (errno != EINTR) |
|
return (-1); |
|
} else if (WIFSTOPPED(st)) |
|
raise(WSTOPSIG(st)); |
|
else |
|
break; |
|
} |
|
(void)signal(SIGHUP, sighup); |
(void)signal(SIGHUP, sighup); |
(void)signal(SIGINT, sigint); |
(void)signal(SIGINT, sigint); |
(void)signal(SIGQUIT, sigquit); |
(void)signal(SIGQUIT, sigquit); |
if (!WIFEXITED(st) || WEXITSTATUS(st) != 0) { |
if (!WIFEXITED(st)) { |
errno = ECHILD; |
errno = EINTR; |
return (-1); |
return (-1); |
} |
} |
return (0); |
return (WEXITSTATUS(st)); |
|
|
|
fail: |
|
saved_errno = errno; |
|
(void)signal(SIGHUP, sighup); |
|
(void)signal(SIGINT, sigint); |
|
(void)signal(SIGQUIT, sigquit); |
|
xfree(p); |
|
errno = saved_errno; |
|
return (-1); |
} |
} |