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