summaryrefslogtreecommitdiff
path: root/src/os_unix.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-11-07 22:42:57 +0100
committerBram Moolenaar <Bram@vim.org>2016-11-07 22:42:57 +0100
commitc4d4ac22f78fb1394c79eccc8a1e6812c0c7d8a7 (patch)
tree351e8d0efdaa17efe2c676d2b5b60a75d6311c18 /src/os_unix.c
parent3f9ebf32a392a9cae1c3e4b6bf8cecad60e2a22a (diff)
downloadvim-git-c4d4ac22f78fb1394c79eccc8a1e6812c0c7d8a7.tar.gz
patch 8.0.0071v8.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 #1196)
Diffstat (limited to 'src/os_unix.c')
-rw-r--r--src/os_unix.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index c6beba2cc..5d5b15167 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -238,6 +238,10 @@ static volatile int deadly_signal = 0; /* The signal we caught */
/* 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