=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sdiff/edit.c,v retrieving revision 1.17 retrieving revision 1.18 diff -c -r1.17 -r1.18 *** src/usr.bin/sdiff/edit.c 2007/05/11 02:47:52 1.17 --- src/usr.bin/sdiff/edit.c 2007/10/17 20:02:33 1.18 *************** *** 1,4 **** ! /* $OpenBSD: edit.c,v 1.17 2007/05/11 02:47:52 ray Exp $ */ /* * Written by Raymond Lai . --- 1,4 ---- ! /* $OpenBSD: edit.c,v 1.18 2007/10/17 20:02:33 deraadt Exp $ */ /* * Written by Raymond Lai . *************** *** 33,41 **** editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; ! sig_t sighup, sigint, sigquit; pid_t pid; ! int saved_errno, st; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') --- 33,41 ---- editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; ! sig_t sighup, sigint, sigquit, sigchld; pid_t pid; ! int saved_errno, st, ret = -1; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') *************** *** 49,54 **** --- 49,55 ---- sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { *************** *** 58,81 **** while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; ! free(p); ! (void)signal(SIGHUP, sighup); ! (void)signal(SIGINT, sigint); ! (void)signal(SIGQUIT, sigquit); ! if (!WIFEXITED(st)) { errno = EINTR; ! return (-1); ! } ! return (WEXITSTATUS(st)); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); free(p); errno = saved_errno; ! return (-1); } /* --- 59,78 ---- while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; ! if (!WIFEXITED(st)) errno = EINTR; ! else ! ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; ! return (ret); } /*