diff options
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/process.c b/src/process.c index 06d750d3368..dac7d0440fa 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -692,8 +692,7 @@ status_convert (int w) | |||
| 692 | if (WIFSTOPPED (w)) | 692 | if (WIFSTOPPED (w)) |
| 693 | return Fcons (Qstop, Fcons (make_fixnum (WSTOPSIG (w)), Qnil)); | 693 | return Fcons (Qstop, Fcons (make_fixnum (WSTOPSIG (w)), Qnil)); |
| 694 | else if (WIFEXITED (w)) | 694 | else if (WIFEXITED (w)) |
| 695 | return Fcons (Qexit, Fcons (make_fixnum (WEXITSTATUS (w)), | 695 | return Fcons (Qexit, Fcons (make_fixnum (WEXITSTATUS (w)), Qnil)); |
| 696 | WCOREDUMP (w) ? Qt : Qnil)); | ||
| 697 | else if (WIFSIGNALED (w)) | 696 | else if (WIFSIGNALED (w)) |
| 698 | return Fcons (Qsignal, Fcons (make_fixnum (WTERMSIG (w)), | 697 | return Fcons (Qsignal, Fcons (make_fixnum (WTERMSIG (w)), |
| 699 | WCOREDUMP (w) ? Qt : Qnil)); | 698 | WCOREDUMP (w) ? Qt : Qnil)); |
| @@ -2059,6 +2058,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 2059 | bool pty_flag = 0; | 2058 | bool pty_flag = 0; |
| 2060 | char pty_name[PTY_NAME_SIZE]; | 2059 | char pty_name[PTY_NAME_SIZE]; |
| 2061 | Lisp_Object lisp_pty_name = Qnil; | 2060 | Lisp_Object lisp_pty_name = Qnil; |
| 2061 | sigset_t oldset; | ||
| 2062 | 2062 | ||
| 2063 | inchannel = outchannel = -1; | 2063 | inchannel = outchannel = -1; |
| 2064 | 2064 | ||
| @@ -2139,13 +2139,16 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 2139 | setup_process_coding_systems (process); | 2139 | setup_process_coding_systems (process); |
| 2140 | char **env = make_environment_block (current_dir); | 2140 | char **env = make_environment_block (current_dir); |
| 2141 | 2141 | ||
| 2142 | block_input (); | ||
| 2143 | block_child_signal (&oldset); | ||
| 2144 | |||
| 2142 | pty_flag = p->pty_flag; | 2145 | pty_flag = p->pty_flag; |
| 2143 | eassert (pty_flag == ! NILP (lisp_pty_name)); | 2146 | eassert (pty_flag == ! NILP (lisp_pty_name)); |
| 2144 | 2147 | ||
| 2145 | vfork_errno | 2148 | vfork_errno |
| 2146 | = emacs_spawn (&pid, forkin, forkout, forkerr, new_argv, env, | 2149 | = emacs_spawn (&pid, forkin, forkout, forkerr, new_argv, env, |
| 2147 | SSDATA (current_dir), | 2150 | SSDATA (current_dir), |
| 2148 | pty_flag ? SSDATA (lisp_pty_name) : NULL); | 2151 | pty_flag ? SSDATA (lisp_pty_name) : NULL, &oldset); |
| 2149 | 2152 | ||
| 2150 | eassert ((vfork_errno == 0) == (0 < pid)); | 2153 | eassert ((vfork_errno == 0) == (0 < pid)); |
| 2151 | 2154 | ||
| @@ -2153,6 +2156,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 2153 | if (pid >= 0) | 2156 | if (pid >= 0) |
| 2154 | p->alive = 1; | 2157 | p->alive = 1; |
| 2155 | 2158 | ||
| 2159 | /* Stop blocking in the parent. */ | ||
| 2160 | unblock_child_signal (&oldset); | ||
| 2161 | unblock_input (); | ||
| 2162 | |||
| 2156 | /* Environment block no longer needed. */ | 2163 | /* Environment block no longer needed. */ |
| 2157 | unbind_to (count, Qnil); | 2164 | unbind_to (count, Qnil); |
| 2158 | 2165 | ||