To: vim_dev@googlegroups.com Subject: Patch 7.4.1526 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1526 Problem: Writing to file and not connecting a channel doesn't work for MS-Windows. Solution: Make it work. (Yasuhiro Matsumoto) Files: src/os_win32.c, src/testdir/test_channel.vim *** ../vim-7.4.1525/src/os_win32.c 2016-03-08 18:40:47.220948931 +0100 --- src/os_win32.c 2016-03-09 20:39:03.997986956 +0100 *************** *** 4992,5032 **** } #if defined(FEAT_JOB) || defined(PROTO) - HANDLE - job_io_file_open( - char_u *fname, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes) - { - HANDLE h; - #ifdef FEAT_MBYTE - WCHAR *wn = NULL; - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - wn = enc_to_utf16(fname, NULL); - if (wn != NULL) - { - h = CreateFileW(wn, dwDesiredAccess, dwShareMode, - lpSecurityAttributes, dwCreationDisposition, - dwFlagsAndAttributes, NULL); - vim_free(wn); - if (h == INVALID_HANDLE_VALUE - && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - wn = NULL; - } - } - if (wn == NULL) - #endif - - h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode, - lpSecurityAttributes, dwCreationDisposition, - dwFlagsAndAttributes, NULL); - return h; - } - void mch_start_job(char *cmd, job_T *job, jobopt_T *options) { --- 4992,4997 ---- *************** *** 5034,5048 **** PROCESS_INFORMATION pi; HANDLE jo; # ifdef FEAT_CHANNEL ! channel_T *channel; ! int use_file_for_in = options->jo_io[PART_IN] == JIO_FILE; ! int use_file_for_out = options->jo_io[PART_OUT] == JIO_FILE; ! int use_file_for_err = options->jo_io[PART_ERR] == JIO_FILE; ! int use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT; HANDLE ifd[2]; HANDLE ofd[2]; HANDLE efd[2]; ! SECURITY_ATTRIBUTES saAttr; ifd[0] = INVALID_HANDLE_VALUE; ifd[1] = INVALID_HANDLE_VALUE; --- 4999,5020 ---- PROCESS_INFORMATION pi; HANDLE jo; # ifdef FEAT_CHANNEL ! SECURITY_ATTRIBUTES saAttr; ! channel_T *channel = NULL; HANDLE ifd[2]; HANDLE ofd[2]; HANDLE efd[2]; ! ! int use_null_for_in = options->jo_io[PART_IN] == JIO_NULL; ! int use_null_for_out = options->jo_io[PART_OUT] == JIO_NULL; ! int use_null_for_err = options->jo_io[PART_ERR] == JIO_NULL; ! int use_file_for_in = options->jo_io[PART_IN] == JIO_FILE; ! int use_file_for_out = options->jo_io[PART_OUT] == JIO_FILE; ! int use_file_for_err = options->jo_io[PART_ERR] == JIO_FILE; ! int use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT; ! ! if (use_out_for_err && use_null_for_out) ! use_null_for_err = TRUE; ifd[0] = INVALID_HANDLE_VALUE; ifd[1] = INVALID_HANDLE_VALUE; *************** *** 5050,5059 **** ofd[1] = INVALID_HANDLE_VALUE; efd[0] = INVALID_HANDLE_VALUE; efd[1] = INVALID_HANDLE_VALUE; - - channel = add_channel(); - if (channel == NULL) - return; # endif jo = CreateJobObject(NULL, NULL); --- 5022,5027 ---- *************** *** 5078,5132 **** { char_u *fname = options->jo_io_name[PART_IN]; ! ifd[0] = job_io_file_open(fname, GENERIC_READ, FILE_SHARE_READ, ! &saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); ! if (ifd[0] == INVALID_HANDLE_VALUE) { EMSG2(_(e_notopen), fname); goto failed; } } ! else if (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0) ! || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)) goto failed; if (use_file_for_out) { char_u *fname = options->jo_io_name[PART_OUT]; ! ofd[0] = job_io_file_open(fname, GENERIC_WRITE, FILE_SHARE_WRITE, ! &saAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL); ! if (ofd[0] == INVALID_HANDLE_VALUE) { EMSG2(_(e_notopen), fname); goto failed; } } ! else if (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0) ! || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)) goto failed; if (use_file_for_err) { char_u *fname = options->jo_io_name[PART_ERR]; ! efd[0] = job_io_file_open(fname, GENERIC_WRITE, FILE_SHARE_WRITE, ! &saAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL); ! if (efd[0] == INVALID_HANDLE_VALUE) { EMSG2(_(e_notopen), fname); goto failed; } } ! else if (!use_out_for_err ! && (!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 = use_file_for_out ? ofd[0] : ofd[1]; ! si.hStdError = use_out_for_err && !use_file_for_err ? ofd[1] : efd[1]; # endif if (!vim_create_process(cmd, TRUE, --- 5046,5109 ---- { char_u *fname = options->jo_io_name[PART_IN]; ! int fd = mch_open((char *)fname, O_RDONLY, 0); ! if (fd < 0) { EMSG2(_(e_notopen), fname); goto failed; } + ifd[0] = (HANDLE)_get_osfhandle(fd); } ! else if (!use_null_for_in && ! (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0) ! || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0))) goto failed; if (use_file_for_out) { char_u *fname = options->jo_io_name[PART_OUT]; ! int fd = mch_open((char *)fname, O_WRONLY | O_CREAT | O_TRUNC, 0644); ! if (fd < 0) { EMSG2(_(e_notopen), fname); goto failed; } + ofd[1] = (HANDLE)_get_osfhandle(fd); } ! else if (!use_null_for_out && ! (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0) ! || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0))) goto failed; if (use_file_for_err) { char_u *fname = options->jo_io_name[PART_ERR]; ! int fd = mch_open((char *)fname, O_WRONLY | O_CREAT | O_TRUNC, 0600); ! if (fd < 0) { EMSG2(_(e_notopen), fname); goto failed; } + efd[1] = (HANDLE)_get_osfhandle(fd); } ! else if (!use_out_for_err && !use_null_for_err && ! (!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 = use_out_for_err ? ofd[1] : efd[1]; ! ! if (!use_null_for_in || !use_null_for_out || !use_null_for_err) ! { ! channel = add_channel(); ! if (channel == NULL) ! goto failed; ! } # endif if (!vim_create_process(cmd, TRUE, *************** *** 5159,5176 **** CloseHandle(ifd[0]); if (!use_file_for_out) CloseHandle(ofd[1]); ! if (!use_out_for_err) CloseHandle(efd[1]); job->jv_channel = channel; ! channel_set_pipes(channel, ! use_file_for_in ? INVALID_FD : (sock_T)ifd[1], ! (sock_T)ofd[0], ! use_out_for_err ? INVALID_FD : (sock_T)efd[0]); ! channel_set_job(channel, job, options); # ifdef FEAT_GUI ! channel_gui_register(channel); # endif # endif return; --- 5136,5159 ---- CloseHandle(ifd[0]); if (!use_file_for_out) CloseHandle(ofd[1]); ! if (!use_out_for_err && !use_file_for_err) CloseHandle(efd[1]); job->jv_channel = channel; ! if (channel != NULL) ! { ! channel_set_pipes(channel, ! use_file_for_in || use_null_for_in ! ? INVALID_FD : (sock_T)ifd[1], ! use_file_for_out || use_null_for_out ! ? INVALID_FD : (sock_T)ofd[0], ! use_out_for_err || use_file_for_err || use_null_for_err ! ? INVALID_FD : (sock_T)efd[0]); ! channel_set_job(channel, job, options); # ifdef FEAT_GUI ! channel_gui_register(channel); # endif + } # endif return; *** ../vim-7.4.1525/src/testdir/test_channel.vim 2016-03-08 20:58:25.066925814 +0100 --- src/testdir/test_channel.vim 2016-03-09 20:30:10.723556229 +0100 *************** *** 550,559 **** if !has('job') return endif - " TODO: make this work for MS-Windows - if !has('unix') - return - endif call ch_log('Test_nl_write_out_file()') let job = job_start(s:python . " test_channel_pipe.py", \ {'out-io': 'file', 'out-name': 'Xoutput'}) --- 550,555 ---- *************** *** 575,584 **** if !has('job') return endif - " TODO: make this work for MS-Windows - if !has('unix') - return - endif call ch_log('Test_nl_write_err_file()') let job = job_start(s:python . " test_channel_pipe.py", \ {'err-io': 'file', 'err-name': 'Xoutput'}) --- 571,576 ---- *************** *** 600,609 **** if !has('job') return endif - " TODO: make this work for MS-Windows - if !has('unix') - return - endif call ch_log('Test_nl_write_both_file()') let job = job_start(s:python . " test_channel_pipe.py", \ {'out-io': 'file', 'out-name': 'Xoutput', 'err-io': 'out'}) --- 592,597 ---- *************** *** 838,847 **** if !has('job') return endif - " TODO: implement this for MS-Windows - if !has('unix') - return - endif call ch_log('Test_pipe_null()') " We cannot check that no I/O works, we only check that the job starts --- 826,831 ---- *** ../vim-7.4.1525/src/version.c 2016-03-08 22:47:05.622161011 +0100 --- src/version.c 2016-03-09 20:31:35.002675673 +0100 *************** *** 745,746 **** --- 745,748 ---- { /* Add new patch number below this line */ + /**/ + 1526, /**/ -- Computers are useless. They can only give you answers. -- Pablo Picasso /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///