To: vim_dev@googlegroups.com Subject: Patch 7.4.1519 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1519 (after 7.4.1514) Problem: Channel output to file not implemented for MS-Windows. Solution: Implement it. (Yasuhiro Matsumoto) Files: src/os_win32.c, src/testdir/test_channel.vim *** ../vim-7.4.1518/src/os_win32.c 2016-03-08 13:48:42.999473488 +0100 --- src/os_win32.c 2016-03-08 18:35:44.940076915 +0100 *************** *** 4992,4997 **** --- 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) { *************** *** 5001,5006 **** --- 5036,5043 ---- # 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]; *************** *** 5036,5064 **** saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; if (use_file_for_in) { char_u *fname = options->jo_io_name[PART_IN]; - #ifdef FEAT_MBYTE - WCHAR *wn = NULL; - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - wn = enc_to_utf16(fname, NULL); - if (wn != NULL) - { - ifd[0] = CreateFileW(wn, GENERIC_WRITE, FILE_SHARE_READ, - &saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - vim_free(wn); - if (ifd[0] == INVALID_HANDLE_VALUE - && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - wn = NULL; - } - } - if (wn == NULL) - #endif ! ifd[0] = CreateFile((LPCSTR)fname, GENERIC_READ, FILE_SHARE_READ, ! &saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (ifd[0] == INVALID_HANDLE_VALUE) { EMSG2(_(e_notopen), fname); --- 5073,5085 ---- saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; + if (use_file_for_in) { 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); *************** *** 5069,5086 **** || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)) goto failed; ! if (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0) || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)) goto failed; ! 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 = ofd[1]; ! si.hStdError = use_out_for_err ? ofd[1] : efd[1]; # endif if (!vim_create_process(cmd, TRUE, --- 5090,5132 ---- || !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, *************** *** 5111,5117 **** # ifdef FEAT_CHANNEL if (!use_file_for_in) CloseHandle(ifd[0]); ! CloseHandle(ofd[1]); if (!use_out_for_err) CloseHandle(efd[1]); --- 5157,5164 ---- # ifdef FEAT_CHANNEL if (!use_file_for_in) CloseHandle(ifd[0]); ! if (!use_file_for_out) ! CloseHandle(ofd[1]); if (!use_out_for_err) CloseHandle(efd[1]); *** ../vim-7.4.1518/src/testdir/test_channel.vim 2016-03-08 18:27:16.869343475 +0100 --- src/testdir/test_channel.vim 2016-03-08 18:35:44.940076915 +0100 *************** *** 547,556 **** 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'}) --- 547,552 ---- *************** *** 572,581 **** 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'}) --- 568,573 ---- *************** *** 597,606 **** 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'}) --- 589,594 ---- *** ../vim-7.4.1518/src/version.c 2016-03-08 18:27:16.873343434 +0100 --- src/version.c 2016-03-08 18:36:01.587904665 +0100 *************** *** 745,746 **** --- 745,748 ---- { /* Add new patch number below this line */ + /**/ + 1519, /**/ -- hundred-and-one symptoms of being an internet addict: 14. You start introducing yourself as "Jim at I-I-Net dot net dot au" /// 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 ///