summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2016-01-09 16:00:13 +0000
committerdchagin <dchagin@FreeBSD.org>2016-01-09 16:00:13 +0000
commitf1749dc5eabfb4c07da6e48e7a8cd0b3655b20a6 (patch)
tree8457b5aad56f931d27b7fc18808a36247ad68e7f /sys/compat
parentde7c911268b73d6b9e6b3583c413db9759b8320c (diff)
downloadFreeBSD-src-f1749dc5eabfb4c07da6e48e7a8cd0b3655b20a6.zip
FreeBSD-src-f1749dc5eabfb4c07da6e48e7a8cd0b3655b20a6.tar.gz
MFC r283420:
Add newfstatat system call for 64-bit Linuxulator.
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/linux/linux_stats.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_stats.c b/sys/compat/linux/linux_stats.c
index 21471b7..845ac67 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) */
OpenPOWER on IntegriCloud