diff options
author | dchagin <dchagin@FreeBSD.org> | 2015-05-24 15:48:34 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2015-05-24 15:48:34 +0000 |
commit | 9e320cb48d75ef7f8df929c2aaccdfb1a4a3fc0b (patch) | |
tree | cbdb8f014ad731b5d9cbc6671486a18387d81a1b | |
parent | c714299c499d8af430581ce7ab2eff4efe8acac7 (diff) | |
download | FreeBSD-src-9e320cb48d75ef7f8df929c2aaccdfb1a4a3fc0b.zip FreeBSD-src-9e320cb48d75ef7f8df929c2aaccdfb1a4a3fc0b.tar.gz |
Add newfstatat system call for 64-bit Linuxulator.
Differential Revision: https://reviews.freebsd.org/D1071
Reviewed by: trasz
-rw-r--r-- | sys/compat/linux/linux_stats.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_stats.c b/sys/compat/linux/linux_stats.c index 8f2144c..9d44975 100644 --- a/sys/compat/linux/linux_stats.c +++ b/sys/compat/linux/linux_stats.c @@ -627,4 +627,34 @@ linux_fstatat64(struct thread *td, struct linux_fstatat64_args *args) return (error); } +#else /* __amd64__ && !COMPAT_LINUX32 */ + +int +linux_newfstatat(struct thread *td, struct linux_newfstatat_args *args) +{ + char *path; + int error, dfd, flag; + struct stat buf; + + if (args->flag & ~LINUX_AT_SYMLINK_NOFOLLOW) + return (EINVAL); + flag = (args->flag & LINUX_AT_SYMLINK_NOFOLLOW) ? + AT_SYMLINK_NOFOLLOW : 0; + + dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; + LCONVPATHEXIST_AT(td, args->pathname, &path, dfd); + +#ifdef DEBUG + if (ldebug(newfstatat)) + printf(ARGS(newfstatat, "%i, %s, %i"), args->dfd, path, args->flag); +#endif + + error = linux_kern_statat(td, flag, dfd, path, UIO_SYSSPACE, &buf); + if (error == 0) + error = newstat_copyout(&buf, args->statbuf); + LFREEPATH(path); + + return (error); +} + #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ |