int rpl_fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag) { # if FCHOWNAT_NOFOLLOW_BUG if (flag == AT_SYMLINK_NOFOLLOW) return local_lchownat (fd, file, owner, group); # endif # if FCHOWNAT_EMPTY_FILENAME_BUG if (file[0] == '\0') { errno = ENOENT; return -1; } # endif # if CHOWN_TRAILING_SLASH_BUG { size_t len = strlen (file); struct stat st; if (len && file[len - 1] == '/') { if (statat (fd, file, &st)) return -1; if (flag == AT_SYMLINK_NOFOLLOW) return fchownat (fd, file, owner, group, 0); } } # endif return fchownat (fd, file, owner, group, flag); }
/* Wrapper around fstatat to test stat behavior. */ static int do_stat (char const *name, struct stat *st) { return statat (dfd, name, st); }