(root)/
glibc-2.38/
misc/
tst-preadvwritev64.c
       1  /* Tests for pread64 and pwrite64.
       2     Copyright (C) 2016-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #define _FILE_OFFSET_BITS 64
      20  #include "tst-preadvwritev-common.c"
      21  
      22  static int
      23  do_test (void)
      24  {
      25    int ret;
      26  
      27    ret = do_test_with_offset (0);
      28  
      29    if (!temp_fd_supports_holes)
      30      {
      31        puts ("warning: partial test due to lack of support for holes");
      32        return ret;
      33      }
      34  
      35    /* Create a sparse file larger than 4GB to check if offset is handled
      36       correctly in p{write,read}v64. */
      37    off_t base_offset = UINT32_MAX + 2048LL;
      38    ret += do_test_with_offset (base_offset);
      39  
      40    struct stat st;
      41    if (fstat (temp_fd, &st) == -1)
      42      {
      43        printf ("error: fstat on temporary file failed: %m");
      44        return 1;
      45      }
      46  
      47    /* The total size should base_offset plus 2 * 96.  */
      48    off_t expected_value = base_offset + (2 * (96LL));
      49    if (st.st_size != expected_value)
      50      {
      51        printf ("error: file size different than expected (%jd != %jd)\n",
      52  	      (intmax_t) expected_value, (intmax_t) st.st_size);
      53        return 1;
      54      }
      55  
      56    return ret;
      57  }