changeset 10353:72d92c31b9f7 v8.0.0071

commit https://github.com/vim/vim/commit/c4d4ac22f78fb1394c79eccc8a1e6812c0c7d8a7 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Nov 7 22:42:57 2016 +0100 patch 8.0.0071 Problem: Exit value from a shell command is wrong. (Hexchain Tong) Solution: Do not check for ended jobs while waiting for a shell command. (ichizok, closes https://github.com/vim/vim/issues/1196)
author Christian Brabandt <cb@256bit.org>
date Mon, 07 Nov 2016 22:45:04 +0100
parents 7cb9b1d055d5
children 1406a8ee653a
files src/os_unix.c src/version.c
diffstat 2 files changed, 21 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -238,6 +238,10 @@ static volatile int deadly_signal = 0;	 
 /* volatile because it is used in signal handler deathtrap(). */
 static volatile int in_mch_delay = FALSE;    /* sleeping in mch_delay() */
 
+#if defined(FEAT_JOB_CHANNEL) && !defined(USE_SYSTEM)
+static int dont_check_job_ended = 0;
+#endif
+
 static int curr_tmode = TMODE_COOK;	/* contains current terminal mode */
 
 #ifdef USE_XSMP
@@ -4485,7 +4489,9 @@ mch_call_shell(
 	    catch_signals(SIG_IGN, SIG_ERR);
 	    catch_int_signal();
 	    UNBLOCK_SIGNALS(&curset);
-
+# ifdef FEAT_JOB_CHANNEL
+	    ++dont_check_job_ended;
+# endif
 	    /*
 	     * For the GUI we redirect stdin, stdout and stderr to our window.
 	     * This is also used to pipe stdin/stdout to/from the external
@@ -5030,6 +5036,10 @@ finished:
 		wait4pid(wpid, NULL);
 	    }
 
+# ifdef FEAT_JOB_CHANNEL
+	    --dont_check_job_ended;
+# endif
+
 	    /*
 	     * Set to raw mode right now, otherwise a CTRL-C after
 	     * catch_signals() will kill Vim.
@@ -5363,6 +5373,14 @@ mch_detect_ended_job(job_T *job_list)
     pid_t	wait_pid = 0;
     job_T	*job;
 
+# ifndef USE_SYSTEM
+    /* Do not do this when waiting for a shell command to finish, we would get
+     * the exit value here (and discard it), the exit value obtained there
+     * would then be wrong.  */
+    if (dont_check_job_ended > 0)
+	return NULL;
+# endif
+
 # ifdef __NeXT__
     wait_pid = wait4(-1, &status, WNOHANG, (struct rusage *)0);
 # else
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    71,
+/**/
     70,
 /**/
     69,