(root)/
tar-1.35/
gnu/
openat.h
       1  /* provide a replacement openat function
       2     Copyright (C) 2004-2006, 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  /* written by Jim Meyering */
      18  
      19  #ifndef _GL_HEADER_OPENAT
      20  #define _GL_HEADER_OPENAT
      21  
      22  /* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE, _Noreturn,
      23     _GL_ATTRIBUTE_DEPRECATED, HAVE_OPENAT.  */
      24  #if !_GL_CONFIG_H_INCLUDED
      25   #error "Please include config.h first."
      26  #endif
      27  
      28  #include <fcntl.h>
      29  
      30  #include <sys/types.h>
      31  #include <sys/stat.h>
      32  #include <unistd.h>
      33  
      34  _GL_INLINE_HEADER_BEGIN
      35  
      36  #if !HAVE_OPENAT
      37  
      38  int openat_permissive (int fd, char const *file, int flags, mode_t mode,
      39                         int *cwd_errno);
      40  bool openat_needs_fchdir (void);
      41  
      42  #else
      43  
      44  # define openat_permissive(Fd, File, Flags, Mode, Cwd_errno) \
      45      openat (Fd, File, Flags, Mode)
      46  # define openat_needs_fchdir() false
      47  
      48  #endif
      49  
      50  _Noreturn void openat_restore_fail (int);
      51  _Noreturn void openat_save_fail (int);
      52  
      53  /* Using these function names makes application code
      54     slightly more readable than it would be with
      55     fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW).  */
      56  
      57  #if GNULIB_CHOWNAT
      58  
      59  # ifndef CHOWNAT_INLINE
      60  #  define CHOWNAT_INLINE _GL_INLINE
      61  # endif
      62  
      63  CHOWNAT_INLINE int
      64  chownat (int fd, char const *file, uid_t owner, gid_t group)
      65  {
      66    return fchownat (fd, file, owner, group, 0);
      67  }
      68  
      69  CHOWNAT_INLINE int
      70  lchownat (int fd, char const *file, uid_t owner, gid_t group)
      71  {
      72    return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
      73  }
      74  
      75  #endif
      76  
      77  #if GNULIB_CHMODAT
      78  
      79  # ifndef CHMODAT_INLINE
      80  #  define CHMODAT_INLINE _GL_INLINE
      81  # endif
      82  
      83  CHMODAT_INLINE int
      84  chmodat (int fd, char const *file, mode_t mode)
      85  {
      86    return fchmodat (fd, file, mode, 0);
      87  }
      88  
      89  CHMODAT_INLINE int
      90  lchmodat (int fd, char const *file, mode_t mode)
      91  {
      92    return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
      93  }
      94  
      95  #endif
      96  
      97  #if GNULIB_STATAT
      98  
      99  # ifndef STATAT_INLINE
     100  #  define STATAT_INLINE _GL_INLINE
     101  # endif
     102  
     103  _GL_ATTRIBUTE_DEPRECATED
     104  STATAT_INLINE int
     105  statat (int fd, char const *name, struct stat *st)
     106  {
     107    return fstatat (fd, name, st, 0);
     108  }
     109  
     110  _GL_ATTRIBUTE_DEPRECATED
     111  STATAT_INLINE int
     112  lstatat (int fd, char const *name, struct stat *st)
     113  {
     114    return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
     115  }
     116  
     117  #endif
     118  
     119  /* For now, there are no wrappers named laccessat or leuidaccessat,
     120     since gnulib doesn't support faccessat(,AT_SYMLINK_NOFOLLOW) and
     121     since access rights on symlinks are of limited utility.  Likewise,
     122     wrappers are not provided for accessat or euidaccessat, so as to
     123     avoid dragging in -lgen on some platforms.  */
     124  
     125  _GL_INLINE_HEADER_END
     126  
     127  #endif /* _GL_HEADER_OPENAT */