(root)/
coreutils-9.4/
gnulib-tests/
test-utimens.c
       1  /* Tests of utimens.
       2     Copyright (C) 2009-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  /* Written by Eric Blake <ebb9@byu.net>, 2009.  */
      18  
      19  #include <config.h>
      20  
      21  #include "utimens.h"
      22  
      23  #include <stdio.h>
      24  #include <stdlib.h>
      25  
      26  #include "ignore-value.h"
      27  #include "macros.h"
      28  
      29  #define BASE "test-utimens.t"
      30  
      31  #include "test-futimens.h"
      32  #include "test-lutimens.h"
      33  #include "test-utimens.h"
      34  
      35  /* Wrap fdutimens to behave like futimens.  */
      36  static int
      37  do_futimens (int fd, struct timespec const times[2])
      38  {
      39    return fdutimens (fd, NULL, times);
      40  }
      41  
      42  /* Test the use of file descriptors alongside a name.  */
      43  static int
      44  do_fdutimens (char const *name, struct timespec const times[2])
      45  {
      46    int result;
      47    int fd = open (name, O_WRONLY);
      48    if (fd < 0)
      49      fd = open (name, O_RDONLY);
      50    errno = 0;
      51    result = fdutimens (fd, name, times);
      52    if (0 <= fd)
      53      {
      54        int saved_errno = errno;
      55        close (fd);
      56        errno = saved_errno;
      57      }
      58    return result;
      59  }
      60  
      61  int
      62  main (void)
      63  {
      64    int result1; /* Skip because of no symlink support.  */
      65    int result2; /* Skip because of no futimens support.  */
      66    int result3; /* Skip because of no lutimens support.  */
      67  
      68    /* Clean up any trash from prior testsuite runs.  */
      69    ignore_value (system ("rm -rf " BASE "*"));
      70  
      71    result1 = test_utimens (utimens, true);
      72    ASSERT (test_utimens (do_fdutimens, false) == result1);
      73    /* Print only one skip message.  */
      74    result2 = test_futimens (do_futimens, result1 == 0);
      75    result3 = test_lutimens (lutimens, (result1 + result2) == 0);
      76    /* We expect 0/0, 0/77, or 77/77, but not 77/0.  */
      77    ASSERT (result1 <= result3);
      78    return result1 | result2 | result3;
      79  }