Mercurial > vim
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 */