(root)/
coreutils-9.4/
gnulib-tests/
test-fsync.c
       1  /* Test of fsync() function.
       2     Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  #include <unistd.h>
      20  
      21  #include "signature.h"
      22  SIGNATURE_CHECK (fsync, int, (int));
      23  
      24  #include <errno.h>
      25  #include <fcntl.h>
      26  
      27  #include "macros.h"
      28  
      29  int
      30  main (void)
      31  {
      32    int fd;
      33    const char *file = "test-fsync.txt";
      34  
      35    /* Assuming stdin and stdout are ttys, fsync is allowed to fail, but
      36       may succeed as an extension.  */
      37    for (fd = 0; fd < 2; fd++)
      38      if (fsync (fd) != 0)
      39        {
      40          ASSERT (errno == EINVAL /* POSIX */
      41                  || errno == ENOTSUP /* seen on Mac OS X 10.5 */
      42                  || errno == EBADF /* seen on AIX 7.1 */
      43                  || errno == EIO /* seen on mingw */
      44                  );
      45        }
      46  
      47    /* fsync must fail on invalid fd.  */
      48    {
      49      errno = 0;
      50      ASSERT (fsync (-1) == -1);
      51      ASSERT (errno == EBADF);
      52    }
      53    {
      54      close (99);
      55      errno = 0;
      56      ASSERT (fsync (99) == -1);
      57      ASSERT (errno == EBADF);
      58    }
      59  
      60    fd = open (file, O_WRONLY|O_CREAT|O_TRUNC, 0644);
      61    ASSERT (0 <= fd);
      62    ASSERT (write (fd, "hello", 5) == 5);
      63    ASSERT (fsync (fd) == 0);
      64    ASSERT (close (fd) == 0);
      65  
      66    /* For a read-only regular file input file descriptor, fsync should
      67       succeed (since at least atime changes can be synchronized).
      68       On AIX and Cygwin, this test would fail.  */
      69  #if !(defined _AIX || defined __CYGWIN__)
      70    fd = open (file, O_RDONLY);
      71    ASSERT (0 <= fd);
      72    {
      73      char buf[1];
      74      ASSERT (read (fd, buf, sizeof buf) == sizeof buf);
      75    }
      76    ASSERT (fsync (fd) == 0);
      77    ASSERT (close (fd) == 0);
      78  #endif
      79  
      80    ASSERT (unlink (file) == 0);
      81  
      82    return 0;
      83  }