summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Heuer <kwzh@gnu.org>1996-01-09 23:40:33 +0000
committerKarl Heuer <kwzh@gnu.org>1996-01-09 23:40:33 +0000
commit41d5da4318f93e05aa86d633d4ab1dc2dba0293a (patch)
tree0d3eddcb4f0a6ac003486a495e8eac4198ca437d
parent30e5c14227d717ee6cdc27f4f50b2138413b45e2 (diff)
downloademacs-41d5da4318f93e05aa86d633d4ab1dc2dba0293a.tar.gz
(create_process): Restore the signal state
after vfork whether it succeeds or not.
-rw-r--r--src/process.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/process.c b/src/process.c
index edff00b1c94..f7af9450c33 100644
--- a/src/process.c
+++ b/src/process.c
@@ -1519,42 +1519,47 @@ create_process (process, new_argv, current_dir)
environ = save_environ;
}
+ /* This runs in the Emacs process. */
if (pid < 0)
{
if (forkin >= 0)
close (forkin);
if (forkin != forkout && forkout >= 0)
close (forkout);
- report_file_error ("Doing vfork", Qnil);
}
-
- XSETFASTINT (XPROCESS (process)->pid, pid);
+ else
+ {
+ /* vfork succeeded. */
+ XSETFASTINT (XPROCESS (process)->pid, pid);
#ifdef WINDOWSNT
- register_child (pid, inchannel);
+ register_child (pid, inchannel);
#endif /* WINDOWSNT */
- /* If the subfork execv fails, and it exits,
- this close hangs. I don't know why.
- So have an interrupt jar it loose. */
- stop_polling ();
- signal (SIGALRM, create_process_1);
- alarm (1);
- XPROCESS (process)->subtty = Qnil;
- if (forkin >= 0)
- close (forkin);
- alarm (0);
- start_polling ();
- if (forkin != forkout && forkout >= 0)
- close (forkout);
+ /* If the subfork execv fails, and it exits,
+ this close hangs. I don't know why.
+ So have an interrupt jar it loose. */
+ stop_polling ();
+ signal (SIGALRM, create_process_1);
+ alarm (1);
+ XPROCESS (process)->subtty = Qnil;
+ if (forkin >= 0)
+ close (forkin);
+ alarm (0);
+ start_polling ();
+ if (forkin != forkout && forkout >= 0)
+ close (forkout);
#ifdef HAVE_PTYS
- if (pty_flag)
- XPROCESS (process)->tty_name = build_string (pty_name);
- else
+ if (pty_flag)
+ XPROCESS (process)->tty_name = build_string (pty_name);
+ else
#endif
- XPROCESS (process)->tty_name = Qnil;
+ XPROCESS (process)->tty_name = Qnil;
+ }
+ /* Restore the signal state whether vfork succeeded or not.
+ (We will signal an error, below, if it failed.) */
#ifdef POSIX_SIGNALS
#ifdef HAVE_VFORK
/* Restore the parent's signal handlers. */
@@ -1585,6 +1590,10 @@ create_process (process, new_argv, current_dir)
#endif /* not BSD4_1 */
#endif /* SIGCHLD */
#endif /* !POSIX_SIGNALS */
+
+ /* Now generate the error if vfork failed. */
+ if (pid < 0)
+ report_file_error ("Doing vfork", Qnil);
}
#endif /* not VMS */