@@ -4992,6 +4992,41 @@ mch_call_shell(
49924992}
49934993
49944994#if defined(FEAT_JOB ) || defined(PROTO )
4995+ static 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+
49955030 void
49965031mch_start_job (char * cmd , job_T * job , jobopt_T * options )
49975032{
@@ -5046,13 +5081,14 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
50465081 {
50475082 char_u * fname = options -> jo_io_name [PART_IN ];
50485083
5049- int fd = mch_open ((char * )fname , O_RDONLY , 0 );
5050- if (fd < 0 )
5084+ ifd [0 ] = job_io_file_open (fname , GENERIC_READ ,
5085+ FILE_SHARE_READ | FILE_SHARE_WRITE ,
5086+ & saAttr , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL );
5087+ if (ifd [0 ] == INVALID_HANDLE_VALUE )
50515088 {
50525089 EMSG2 (_ (e_notopen ), fname );
50535090 goto failed ;
50545091 }
5055- ifd [0 ] = (HANDLE )_get_osfhandle (fd );
50565092 }
50575093 else if (!use_null_for_in &&
50585094 (!CreatePipe (& ifd [0 ], & ifd [1 ], & saAttr , 0 )
@@ -5063,13 +5099,14 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
50635099 {
50645100 char_u * fname = options -> jo_io_name [PART_OUT ];
50655101
5066- int fd = mch_open ((char * )fname , O_WRONLY | O_CREAT | O_TRUNC , 0644 );
5067- if (fd < 0 )
5102+ ofd [1 ] = job_io_file_open (fname , GENERIC_WRITE ,
5103+ FILE_SHARE_READ | FILE_SHARE_WRITE ,
5104+ & saAttr , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL );
5105+ if (ofd [1 ] == INVALID_HANDLE_VALUE )
50685106 {
50695107 EMSG2 (_ (e_notopen ), fname );
50705108 goto failed ;
50715109 }
5072- ofd [1 ] = (HANDLE )_get_osfhandle (fd );
50735110 }
50745111 else if (!use_null_for_out &&
50755112 (!CreatePipe (& ofd [0 ], & ofd [1 ], & saAttr , 0 )
@@ -5080,13 +5117,14 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
50805117 {
50815118 char_u * fname = options -> jo_io_name [PART_ERR ];
50825119
5083- int fd = mch_open ((char * )fname , O_WRONLY | O_CREAT | O_TRUNC , 0600 );
5084- if (fd < 0 )
5120+ efd [1 ] = job_io_file_open (fname , GENERIC_WRITE ,
5121+ FILE_SHARE_READ | FILE_SHARE_WRITE ,
5122+ & saAttr , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL );
5123+ if (efd [1 ] == INVALID_HANDLE_VALUE )
50855124 {
50865125 EMSG2 (_ (e_notopen ), fname );
50875126 goto failed ;
50885127 }
5089- efd [1 ] = (HANDLE )_get_osfhandle (fd );
50905128 }
50915129 else if (!use_out_for_err && !use_null_for_err &&
50925130 (!CreatePipe (& efd [0 ], & efd [1 ], & saAttr , 0 )
@@ -5126,7 +5164,7 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
51265164 jo = NULL ;
51275165 }
51285166 ResumeThread (pi .hThread );
5129- CloseHandle (job -> jv_proc_info .hThread );
5167+ CloseHandle (pi .hThread );
51305168 job -> jv_proc_info = pi ;
51315169 job -> jv_job_object = jo ;
51325170 job -> jv_status = JOB_STARTED ;
0 commit comments