version 1.16, 2007/09/10 14:29:53 |
version 1.17, 2007/10/17 20:02:33 |
|
|
editit(const char *ed, const char *pathname) |
editit(const char *ed, const char *pathname) |
{ |
{ |
char *argp[] = {"sh", "-c", NULL, NULL}, *p; |
char *argp[] = {"sh", "-c", NULL, NULL}, *p; |
sig_t sighup, sigint, sigquit; |
sig_t sighup, sigint, sigquit, sigchld; |
pid_t pid; |
pid_t pid; |
int saved_errno, st; |
int saved_errno, st, ret = -1; |
|
|
if (ed == NULL) |
if (ed == NULL) |
ed = getenv("VISUAL"); |
ed = getenv("VISUAL"); |
|
|
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); |
|
sigchld = signal(SIGCHLD, SIG_DFL); |
if ((pid = fork()) == -1) |
if ((pid = fork()) == -1) |
goto fail; |
goto fail; |
if (pid == 0) { |
if (pid == 0) { |
|
|
while (waitpid(pid, &st, 0) == -1) |
while (waitpid(pid, &st, 0) == -1) |
if (errno != EINTR) |
if (errno != EINTR) |
goto fail; |
goto fail; |
free(p); |
if (!WIFEXITED(st)) |
(void)signal(SIGHUP, sighup); |
|
(void)signal(SIGINT, sigint); |
|
(void)signal(SIGQUIT, sigquit); |
|
if (!WIFEXITED(st)) { |
|
errno = EINTR; |
errno = EINTR; |
return (-1); |
else |
} |
ret = WEXITSTATUS(st); |
return (WEXITSTATUS(st)); |
|
|
|
fail: |
fail: |
saved_errno = errno; |
saved_errno = errno; |
(void)signal(SIGHUP, sighup); |
(void)signal(SIGHUP, sighup); |
(void)signal(SIGINT, sigint); |
(void)signal(SIGINT, sigint); |
(void)signal(SIGQUIT, sigquit); |
(void)signal(SIGQUIT, sigquit); |
|
(void)signal(SIGCHLD, sigchld); |
free(p); |
free(p); |
errno = saved_errno; |
errno = saved_errno; |
return (-1); |
return (ret); |
} |
} |