diff options
| -rw-r--r-- | src/stat/fstat.c | 13 | ||||
| -rw-r--r-- | src/stat/fstatat.c | 35 | ||||
| -rw-r--r-- | src/stat/lstat.c | 6 | ||||
| -rw-r--r-- | src/stat/stat.c | 6 | 
4 files changed, 37 insertions, 23 deletions
| diff --git a/src/stat/fstat.c b/src/stat/fstat.c index 4f13f4f0..d2a828f3 100644 --- a/src/stat/fstat.c +++ b/src/stat/fstat.c @@ -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); diff --git a/src/stat/fstatat.c b/src/stat/fstatat.c index 582db442..f5bc3685 100644 --- a/src/stat/fstatat.c +++ b/src/stat/fstatat.c @@ -1,9 +1,40 @@ +#define _BSD_SOURCE  #include <sys/stat.h> +#include <string.h> +#include <fcntl.h> +#include <errno.h>  #include "syscall.h" -int fstatat(int fd, const char *restrict path, struct stat *restrict buf, int flag) +int fstatat(int fd, const char *restrict path, struct stat *restrict st, int flag)  { -	return syscall(SYS_fstatat, fd, path, buf, flag); +	int ret; + +	if (flag==AT_EMPTY_PATH && fd>=0 && !*path) { +		ret = __syscall(SYS_fstat, fd, st); +		if (ret==-EBADF && __syscall(SYS_fcntl, fd, F_GETFD)>=0) { +			ret = __syscall(SYS_fstatat, fd, path, st, flag); +			if (ret==-EINVAL) { +				char buf[15+3*sizeof(int)]; +				__procfdname(buf, fd); +#ifdef SYS_stat +				ret = __syscall(SYS_stat, buf, st); +#else +				ret = __syscall(SYS_fstatat, AT_FDCWD, buf, st, 0); +#endif +			} +		} +	} +#ifdef SYS_lstat +	else if ((fd == AT_FDCWD || *path=='/') && flag==AT_SYMLINK_NOFOLLOW) +		ret = __syscall(SYS_lstat, path, st); +#endif +#ifdef SYS_stat +	else if ((fd == AT_FDCWD || *path=='/') && !flag) +		ret = __syscall(SYS_stat, path, st); +#endif +	else ret = __syscall(SYS_fstatat, fd, path, st, flag); + +	return __syscall_ret(ret);  }  weak_alias(fstatat, fstatat64); diff --git a/src/stat/lstat.c b/src/stat/lstat.c index 5b89f290..8b365ba2 100644 --- a/src/stat/lstat.c +++ b/src/stat/lstat.c @@ -4,11 +4,7 @@  int lstat(const char *restrict path, struct stat *restrict buf)  { -#ifdef SYS_lstat -	return syscall(SYS_lstat, path, buf); -#else -	return syscall(SYS_fstatat, AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW); -#endif +	return fstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);  }  weak_alias(lstat, lstat64); diff --git a/src/stat/stat.c b/src/stat/stat.c index 0bec9d6f..b4e62795 100644 --- a/src/stat/stat.c +++ b/src/stat/stat.c @@ -4,11 +4,7 @@  int stat(const char *restrict path, struct stat *restrict buf)  { -#ifdef SYS_stat -	return syscall(SYS_stat, path, buf); -#else -	return syscall(SYS_fstatat, AT_FDCWD, path, buf, 0); -#endif +	return fstatat(AT_FDCWD, path, buf, 0);  }  weak_alias(stat, stat64); | 
