refactor all stat functions in terms of fstatat

equivalent logic for fstat+O_PATH fallback and direct use of
stat/lstat syscalls where appropriate is kept, now in the fstatat
function. this change both improves functionality (now, fstatat forms
equivalent to fstat/lstat/stat will work even on kernels too old to
have the at functions) and localizes direct interfacing with the
kernel stat structure to one file.
This commit is contained in:
Rich Felker
2019-07-18 19:36:23 -04:00
parent 62a73d9649
commit 9493892021
4 changed files with 37 additions and 23 deletions
+2 -11
View File
@@ -1,3 +1,4 @@
#define _BSD_SOURCE
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
@@ -5,17 +6,7 @@
int fstat(int fd, struct stat *st)
{
int ret = __syscall(SYS_fstat, fd, st);
if (ret != -EBADF || __syscall(SYS_fcntl, fd, F_GETFD) < 0)
return __syscall_ret(ret);
char buf[15+3*sizeof(int)];
__procfdname(buf, fd);
#ifdef SYS_stat
return syscall(SYS_stat, buf, st);
#else
return syscall(SYS_fstatat, AT_FDCWD, buf, st, 0);
#endif
return fstatat(fd, "", st, AT_EMPTY_PATH);
}
weak_alias(fstat, fstat64);