changeset 14131:7717b68abd2e

(create_process): Restore the signal state after vfork whether it succeeds or not.
author Karl Heuer <kwzh@gnu.org>
date Tue, 09 Jan 1996 23:40:33 +0000
parents 99ab26698ab0
children 85063feb159b
files src/process.c
diffstat 1 files changed, 31 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/process.c	Tue Jan 09 23:40:19 1996 +0000
+++ b/src/process.c	Tue Jan 09 23:40:33 1996 +0000
@@ -1519,42 +1519,47 @@
     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 @@
 #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 */