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,