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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui