Mercurial > vim
comparison src/os_win32.c @ 8457:20533e3de373 v7.4.1519
commit https://github.com/vim/vim/commit/13d6fb17a2c5d2ae02429e31fc8603a9caa4395e
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Mar 8 18:40:52 2016 +0100
patch 7.4.1519
Problem: Channel output to file not implemented for MS-Windows.
Solution: Implement it. (Yasuhiro Matsumoto)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 08 Mar 2016 18:45:04 +0100 |
parents | 6c421014a0b3 |
children | c1aae3a79279 |
comparison
equal
deleted
inserted
replaced
8456:8607f09b7f36 | 8457:20533e3de373 |
---|---|
4990 | 4990 |
4991 return x; | 4991 return x; |
4992 } | 4992 } |
4993 | 4993 |
4994 #if defined(FEAT_JOB) || defined(PROTO) | 4994 #if defined(FEAT_JOB) || defined(PROTO) |
4995 HANDLE | |
4996 job_io_file_open( | |
4997 char_u *fname, | |
4998 DWORD dwDesiredAccess, | |
4999 DWORD dwShareMode, | |
5000 LPSECURITY_ATTRIBUTES lpSecurityAttributes, | |
5001 DWORD dwCreationDisposition, | |
5002 DWORD dwFlagsAndAttributes) | |
5003 { | |
5004 HANDLE h; | |
5005 #ifdef FEAT_MBYTE | |
5006 WCHAR *wn = NULL; | |
5007 if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) | |
5008 { | |
5009 wn = enc_to_utf16(fname, NULL); | |
5010 if (wn != NULL) | |
5011 { | |
5012 h = CreateFileW(wn, dwDesiredAccess, dwShareMode, | |
5013 lpSecurityAttributes, dwCreationDisposition, | |
5014 dwFlagsAndAttributes, NULL); | |
5015 vim_free(wn); | |
5016 if (h == INVALID_HANDLE_VALUE | |
5017 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) | |
5018 wn = NULL; | |
5019 } | |
5020 } | |
5021 if (wn == NULL) | |
5022 #endif | |
5023 | |
5024 h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode, | |
5025 lpSecurityAttributes, dwCreationDisposition, | |
5026 dwFlagsAndAttributes, NULL); | |
5027 return h; | |
5028 } | |
5029 | |
4995 void | 5030 void |
4996 mch_start_job(char *cmd, job_T *job, jobopt_T *options) | 5031 mch_start_job(char *cmd, job_T *job, jobopt_T *options) |
4997 { | 5032 { |
4998 STARTUPINFO si; | 5033 STARTUPINFO si; |
4999 PROCESS_INFORMATION pi; | 5034 PROCESS_INFORMATION pi; |
5000 HANDLE jo; | 5035 HANDLE jo; |
5001 # ifdef FEAT_CHANNEL | 5036 # ifdef FEAT_CHANNEL |
5002 channel_T *channel; | 5037 channel_T *channel; |
5003 int use_file_for_in = options->jo_io[PART_IN] == JIO_FILE; | 5038 int use_file_for_in = options->jo_io[PART_IN] == JIO_FILE; |
5039 int use_file_for_out = options->jo_io[PART_OUT] == JIO_FILE; | |
5040 int use_file_for_err = options->jo_io[PART_ERR] == JIO_FILE; | |
5004 int use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT; | 5041 int use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT; |
5005 HANDLE ifd[2]; | 5042 HANDLE ifd[2]; |
5006 HANDLE ofd[2]; | 5043 HANDLE ofd[2]; |
5007 HANDLE efd[2]; | 5044 HANDLE efd[2]; |
5008 SECURITY_ATTRIBUTES saAttr; | 5045 SECURITY_ATTRIBUTES saAttr; |
5034 | 5071 |
5035 # ifdef FEAT_CHANNEL | 5072 # ifdef FEAT_CHANNEL |
5036 saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); | 5073 saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); |
5037 saAttr.bInheritHandle = TRUE; | 5074 saAttr.bInheritHandle = TRUE; |
5038 saAttr.lpSecurityDescriptor = NULL; | 5075 saAttr.lpSecurityDescriptor = NULL; |
5076 | |
5039 if (use_file_for_in) | 5077 if (use_file_for_in) |
5040 { | 5078 { |
5041 char_u *fname = options->jo_io_name[PART_IN]; | 5079 char_u *fname = options->jo_io_name[PART_IN]; |
5042 #ifdef FEAT_MBYTE | 5080 |
5043 WCHAR *wn = NULL; | 5081 ifd[0] = job_io_file_open(fname, GENERIC_READ, FILE_SHARE_READ, |
5044 if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) | 5082 &saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); |
5045 { | |
5046 wn = enc_to_utf16(fname, NULL); | |
5047 if (wn != NULL) | |
5048 { | |
5049 ifd[0] = CreateFileW(wn, GENERIC_WRITE, FILE_SHARE_READ, | |
5050 &saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); | |
5051 vim_free(wn); | |
5052 if (ifd[0] == INVALID_HANDLE_VALUE | |
5053 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) | |
5054 wn = NULL; | |
5055 } | |
5056 } | |
5057 if (wn == NULL) | |
5058 #endif | |
5059 | |
5060 ifd[0] = CreateFile((LPCSTR)fname, GENERIC_READ, FILE_SHARE_READ, | |
5061 &saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); | |
5062 if (ifd[0] == INVALID_HANDLE_VALUE) | 5083 if (ifd[0] == INVALID_HANDLE_VALUE) |
5063 { | 5084 { |
5064 EMSG2(_(e_notopen), fname); | 5085 EMSG2(_(e_notopen), fname); |
5065 goto failed; | 5086 goto failed; |
5066 } | 5087 } |
5067 } | 5088 } |
5068 else if (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0) | 5089 else if (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0) |
5069 || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)) | 5090 || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)) |
5070 goto failed; | 5091 goto failed; |
5071 | 5092 |
5072 if (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0) | 5093 if (use_file_for_out) |
5094 { | |
5095 char_u *fname = options->jo_io_name[PART_OUT]; | |
5096 | |
5097 ofd[0] = job_io_file_open(fname, GENERIC_WRITE, FILE_SHARE_WRITE, | |
5098 &saAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL); | |
5099 if (ofd[0] == INVALID_HANDLE_VALUE) | |
5100 { | |
5101 EMSG2(_(e_notopen), fname); | |
5102 goto failed; | |
5103 } | |
5104 } | |
5105 else if (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0) | |
5073 || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)) | 5106 || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)) |
5074 goto failed; | 5107 goto failed; |
5075 | 5108 |
5076 if (!use_out_for_err | 5109 if (use_file_for_err) |
5110 { | |
5111 char_u *fname = options->jo_io_name[PART_ERR]; | |
5112 | |
5113 efd[0] = job_io_file_open(fname, GENERIC_WRITE, FILE_SHARE_WRITE, | |
5114 &saAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL); | |
5115 if (efd[0] == INVALID_HANDLE_VALUE) | |
5116 { | |
5117 EMSG2(_(e_notopen), fname); | |
5118 goto failed; | |
5119 } | |
5120 } | |
5121 else if (!use_out_for_err | |
5077 && (!CreatePipe(&efd[0], &efd[1], &saAttr, 0) | 5122 && (!CreatePipe(&efd[0], &efd[1], &saAttr, 0) |
5078 || !pSetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0))) | 5123 || !pSetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0))) |
5079 goto failed; | 5124 goto failed; |
5125 | |
5080 si.dwFlags |= STARTF_USESTDHANDLES; | 5126 si.dwFlags |= STARTF_USESTDHANDLES; |
5081 si.hStdInput = ifd[0]; | 5127 si.hStdInput = ifd[0]; |
5082 si.hStdOutput = ofd[1]; | 5128 si.hStdOutput = use_file_for_out ? ofd[0] : ofd[1]; |
5083 si.hStdError = use_out_for_err ? ofd[1] : efd[1]; | 5129 si.hStdError = use_out_for_err && !use_file_for_err ? ofd[1] : efd[1]; |
5084 # endif | 5130 # endif |
5085 | 5131 |
5086 if (!vim_create_process(cmd, TRUE, | 5132 if (!vim_create_process(cmd, TRUE, |
5087 CREATE_SUSPENDED | | 5133 CREATE_SUSPENDED | |
5088 CREATE_DEFAULT_ERROR_MODE | | 5134 CREATE_DEFAULT_ERROR_MODE | |
5109 job->jv_status = JOB_STARTED; | 5155 job->jv_status = JOB_STARTED; |
5110 | 5156 |
5111 # ifdef FEAT_CHANNEL | 5157 # ifdef FEAT_CHANNEL |
5112 if (!use_file_for_in) | 5158 if (!use_file_for_in) |
5113 CloseHandle(ifd[0]); | 5159 CloseHandle(ifd[0]); |
5114 CloseHandle(ofd[1]); | 5160 if (!use_file_for_out) |
5161 CloseHandle(ofd[1]); | |
5115 if (!use_out_for_err) | 5162 if (!use_out_for_err) |
5116 CloseHandle(efd[1]); | 5163 CloseHandle(efd[1]); |
5117 | 5164 |
5118 job->jv_channel = channel; | 5165 job->jv_channel = channel; |
5119 channel_set_pipes(channel, | 5166 channel_set_pipes(channel, |