diff src/os_win32.c @ 8059:19304db153bc v7.4.1324

commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Feb 15 21:56:54 2016 +0100 patch 7.4.1324 Problem: Channels with pipes don't work on MS-Windows. Solution: Add pipe I/O support. (Yasuhiro Matsumoto)
author Christian Brabandt <cb@256bit.org>
date Mon, 15 Feb 2016 22:00:04 +0100
parents 774d53057a23
children b6cb94ad97a4
line wrap: on
line diff
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -5041,6 +5041,17 @@ mch_start_job(char *cmd, job_T *job)
     HANDLE		jo;
 # ifdef FEAT_CHANNEL
     channel_T		*channel;
+    HANDLE		ifd[2];
+    HANDLE		ofd[2];
+    HANDLE		efd[2];
+    SECURITY_ATTRIBUTES saAttr;
+
+    ifd[0] = INVALID_HANDLE_VALUE;
+    ifd[1] = INVALID_HANDLE_VALUE;
+    ofd[0] = INVALID_HANDLE_VALUE;
+    ofd[1] = INVALID_HANDLE_VALUE;
+    efd[0] = INVALID_HANDLE_VALUE;
+    efd[1] = INVALID_HANDLE_VALUE;
 
     channel = add_channel();
     if (channel == NULL)
@@ -5057,10 +5068,25 @@ mch_start_job(char *cmd, job_T *job)
     ZeroMemory(&pi, sizeof(pi));
     ZeroMemory(&si, sizeof(si));
     si.cb = sizeof(si);
-    si.dwFlags = STARTF_USESHOWWINDOW;
+    si.dwFlags |= STARTF_USESHOWWINDOW;
     si.wShowWindow = SW_HIDE;
 
-    if (!vim_create_process(cmd, FALSE,
+    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
+    saAttr.bInheritHandle = TRUE;
+    saAttr.lpSecurityDescriptor = NULL;
+    if (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0)
+       || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)
+       || !CreatePipe(&ofd[0], &ofd[1], &saAttr, 0)
+       || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)
+       || !CreatePipe(&efd[0], &efd[1], &saAttr, 0)
+       || !pSetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0))
+	goto failed;
+    si.dwFlags |= STARTF_USESTDHANDLES;
+    si.hStdInput = ifd[0];
+    si.hStdOutput = ofd[1];
+    si.hStdError = efd[1];
+
+    if (!vim_create_process(cmd, TRUE,
 	    CREATE_SUSPENDED |
 	    CREATE_DEFAULT_ERROR_MODE |
 	    CREATE_NEW_PROCESS_GROUP |
@@ -5085,22 +5111,29 @@ mch_start_job(char *cmd, job_T *job)
     job->jv_job_object = jo;
     job->jv_status = JOB_STARTED;
 
+    CloseHandle(ifd[0]);
+    CloseHandle(ofd[1]);
+    CloseHandle(efd[1]);
+
 # ifdef FEAT_CHANNEL
-#  if 0
-    /* TODO: connect stdin/stdout/stderr */
     job->jv_channel = channel;
-    channel_set_pipes(channel, fd_in[1], fd_out[0], fd_err[0]);
+    channel_set_pipes(channel, (sock_T)ifd[1], (sock_T)ofd[0], (sock_T)efd[0]);
     channel_set_job(channel, job);
 
 #   ifdef FEAT_GUI
      channel_gui_register(channel);
 #   endif
-#  endif
 # endif
     return;
 
 failed:
 # ifdef FEAT_CHANNEL
+    CloseHandle(ifd[0]);
+    CloseHandle(ofd[0]);
+    CloseHandle(efd[0]);
+    CloseHandle(ifd[1]);
+    CloseHandle(ofd[1]);
+    CloseHandle(efd[1]);
     channel_free(channel);
 # else
     ;  /* make compiler happy */