Patch 9.0.0803
Problem:    readblob() cannot read from character device.
Solution:   Use S_ISCHR() to not check the size. (Ken Takata, closes #11407)
Files:      runtime/doc/builtin.txt, src/blob.c, src/proto/blob.pro,
            src/testdir/test_blob.vim


*** ../vim-9.0.0802/runtime/doc/builtin.txt     2022-10-19 14:02:34.957276577 
+0100
--- runtime/doc/builtin.txt     2022-10-20 13:20:35.886088358 +0100
***************
*** 6858,6864 ****
                        readblob('file.bin', 0, 100)
  <             If {size} is -1 or omitted, the whole data starting from
                {offset} will be read.
!               When the file can't be opened an error message is given and
                the result is an empty |Blob|.
                When trying to read bytes beyond the end of the file the
                result is an empty blob.
--- 6857,6868 ----
                        readblob('file.bin', 0, 100)
  <             If {size} is -1 or omitted, the whole data starting from
                {offset} will be read.
!               This can be also used to read the data from a character device
!               on Unix when {size} is explicitly set.  Only if the device
!               supports seeking {offset} can be used.  Otherwise it should be
!               zero.  E.g. to read 10 bytes from a serial console: >
!                       readblob('/dev/ttyS0', 0, 10)
! <             When the file can't be opened an error message is given and
                the result is an empty |Blob|.
                When trying to read bytes beyond the end of the file the
                result is an empty blob.
*** ../vim-9.0.0802/src/blob.c  2022-10-19 14:02:34.961276576 +0100
--- src/blob.c  2022-10-20 13:20:35.886088358 +0100
***************
*** 212,220 ****
      }
      // Trying to read bytes that aren't there results in an empty blob, not an
      // error.
!     if (size < 0 || size > st.st_size)
        return OK;
!     if (vim_fseek(fd, offset, whence) != 0)
        return OK;
  
      if (ga_grow(&blob->bv_ga, (int)size) == FAIL)
--- 212,224 ----
      }
      // Trying to read bytes that aren't there results in an empty blob, not an
      // error.
!     if (size <= 0 || (
! #ifdef S_ISCHR
!               !S_ISCHR(st.st_mode) &&
! #endif
!               size > st.st_size))
        return OK;
!     if (offset != 0 && vim_fseek(fd, offset, whence) != 0)
        return OK;
  
      if (ga_grow(&blob->bv_ga, (int)size) == FAIL)
*** ../vim-9.0.0802/src/proto/blob.pro  2022-10-19 14:02:34.961276576 +0100
--- src/proto/blob.pro  2022-10-20 13:20:35.886088358 +0100
***************
*** 10,16 ****
  void blob_set(blob_T *blob, int idx, int byte);
  void blob_set_append(blob_T *blob, int idx, int byte);
  int blob_equal(blob_T *b1, blob_T *b2);
! int read_blob(FILE *fd, typval_T *rettv, off_T offset, off_T size);
  int write_blob(FILE *fd, blob_T *blob);
  char_u *blob2string(blob_T *blob, char_u **tofree, char_u *numbuf);
  blob_T *string2blob(char_u *str);
--- 10,16 ----
  void blob_set(blob_T *blob, int idx, int byte);
  void blob_set_append(blob_T *blob, int idx, int byte);
  int blob_equal(blob_T *b1, blob_T *b2);
! int read_blob(FILE *fd, typval_T *rettv, off_T offset, off_T size_arg);
  int write_blob(FILE *fd, blob_T *blob);
  char_u *blob2string(blob_T *blob, char_u **tofree, char_u *numbuf);
  blob_T *string2blob(char_u *str);
*** ../vim-9.0.0802/src/testdir/test_blob.vim   2022-10-19 14:02:34.961276576 
+0100
--- src/testdir/test_blob.vim   2022-10-20 13:26:30.446022155 +0100
***************
*** 508,513 ****
--- 508,518 ----
    END
    call v9.CheckLegacyAndVim9Success(lines)
  
+   if filereadable('/dev/random')
+     let b = readblob('/dev/random', 0, 10)
+     call assert_equal(10, len(b))
+   endif
+ 
    call assert_fails("call readblob('notexist')", 'E484:')
    " TODO: How do we test for the E485 error?
  
*** ../vim-9.0.0802/src/version.c       2022-10-20 13:11:12.234206115 +0100
--- src/version.c       2022-10-20 13:23:14.690058281 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     803,
  /**/

-- 
People who want to share their religious views with you
almost never want you to share yours with them.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20221020122923.D99E81C17E4%40moolenaar.net.

Raspunde prin e-mail lui