(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-access.h
       1  /* Tests of access and euidaccess.
       2     Copyright (C) 2019-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  /* mingw and MSVC 9 lack geteuid, so setup a dummy value.  */
      18  #if !HAVE_GETEUID
      19  # define geteuid() ROOT_UID
      20  #endif
      21  
      22  static void
      23  test_access (int (*func) (const char * /*file*/, int /*mode*/))
      24  {
      25    /* Remove anything from prior partial run.  */
      26    unlink (BASE "f");
      27    unlink (BASE "f1");
      28    chmod (BASE "f2", 0600);
      29    unlink (BASE "f2");
      30    unlink (BASE "sl");
      31  
      32    {
      33      errno = 0;
      34      ASSERT (func (BASE "f", R_OK) == -1);
      35      ASSERT (errno == ENOENT);
      36  
      37      errno = 0;
      38      ASSERT (func (BASE "f", W_OK) == -1);
      39      ASSERT (errno == ENOENT);
      40  
      41      errno = 0;
      42      ASSERT (func (BASE "f", X_OK) == -1);
      43      ASSERT (errno == ENOENT);
      44    }
      45    {
      46      ASSERT (close (creat (BASE "f1", 0700)) == 0);
      47  
      48      ASSERT (func (BASE "f1", F_OK) == 0);
      49      ASSERT (func (BASE "f1", R_OK) == 0);
      50      ASSERT (func (BASE "f1", W_OK) == 0);
      51      ASSERT (func (BASE "f1", X_OK) == 0);
      52  
      53      ASSERT (func (BASE "f1/", F_OK) == -1);
      54      ASSERT (errno == ENOTDIR);
      55      ASSERT (func (BASE "f1/", R_OK) == -1);
      56      ASSERT (errno == ENOTDIR);
      57      ASSERT (func (BASE "f1/", W_OK) == -1);
      58      ASSERT (errno == ENOTDIR);
      59      ASSERT (func (BASE "f1/", X_OK) == -1);
      60      ASSERT (errno == ENOTDIR);
      61  
      62      if (symlink (BASE "f1", BASE "sl") == 0)
      63        {
      64          ASSERT (func (BASE "sl/", F_OK) == -1);
      65          ASSERT (errno == ENOTDIR);
      66          ASSERT (func (BASE "sl/", R_OK) == -1);
      67          ASSERT (errno == ENOTDIR);
      68          ASSERT (func (BASE "sl/", W_OK) == -1);
      69          ASSERT (errno == ENOTDIR);
      70          ASSERT (func (BASE "sl/", X_OK) == -1);
      71          ASSERT (errno == ENOTDIR);
      72        }
      73    }
      74    {
      75      ASSERT (close (creat (BASE "f2", 0600)) == 0);
      76      ASSERT (chmod (BASE "f2", 0400) == 0);
      77  
      78      ASSERT (func (BASE "f2", R_OK) == 0);
      79  
      80      if (geteuid () != ROOT_UID)
      81        {
      82          errno = 0;
      83          ASSERT (func (BASE "f2", W_OK) == -1);
      84          ASSERT (errno == EACCES);
      85        }
      86  
      87  #if defined _WIN32 && !defined __CYGWIN__
      88      /* X_OK works like R_OK.  */
      89      ASSERT (func (BASE "f2", X_OK) == 0);
      90  #else
      91      errno = 0;
      92      ASSERT (func (BASE "f2", X_OK) == -1);
      93      ASSERT (errno == EACCES);
      94  #endif
      95    }
      96  
      97    /* Cleanup.  */
      98    ASSERT (unlink (BASE "f1") == 0);
      99    ASSERT (chmod (BASE "f2", 0600) == 0);
     100    ASSERT (unlink (BASE "f2") == 0);
     101    unlink (BASE "sl");
     102  }