[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 087/108] linux-user: Split out xattr syscalls
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 087/108] linux-user: Split out xattr syscalls |
Date: |
Sat, 9 Jun 2018 17:01:59 -1000 |
This includes fgetxattr, flistxattr, fremovexattr, fsetxattr,
getxattr, lgetxattr, listxattr, llistxattr, lremovexattr,
lsetxattr, removexattr, setxattr.
All targets define all of these; simplify the ifdefs.
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/syscall.c | 453 +++++++++++++++++++++++++++----------------
1 file changed, 291 insertions(+), 162 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0897449273..c37af32bb6 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8328,6 +8328,46 @@ IMPL(fdatasync)
return get_errno(fdatasync(arg1));
}
+#ifdef CONFIG_ATTR
+IMPL(fgetxattr)
+{
+ void *n, *v = 0;
+ abi_long ret;
+
+ if (arg3) {
+ v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ }
+ n = lock_user_string(arg2);
+ if (n) {
+ ret = get_errno(fgetxattr(arg1, n, v, arg4));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(n, arg2, 0);
+ unlock_user(v, arg3, arg4);
+ return ret;
+}
+
+IMPL(flistxattr)
+{
+ void *b = 0;
+ abi_long ret;
+
+ if (arg2) {
+ b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
+ if (!b) {
+ return -TARGET_EFAULT;
+ }
+ }
+ ret = get_errno(flistxattr(arg1, b, arg3));
+ unlock_user(b, arg2, arg3);
+ return ret;
+}
+#endif
+
IMPL(flock)
{
/* The flock constant seems to be the same for every Linux platform. */
@@ -8341,6 +8381,45 @@ IMPL(fork)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(fremovexattr)
+{
+ void *n;
+ abi_long ret;
+
+ n = lock_user_string(arg2);
+ if (n) {
+ ret = get_errno(fremovexattr(arg1, n));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(n, arg2, 0);
+ return ret;
+}
+
+IMPL(fsetxattr)
+{
+ void *n, *v = 0;
+ abi_long ret;
+
+ if (arg3) {
+ v = lock_user(VERIFY_READ, arg3, arg4, 1);
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ }
+ n = lock_user_string(arg2);
+ if (n) {
+ ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(n, arg2, 0);
+ unlock_user(v, arg3, 0);
+ return ret;
+}
+#endif
+
IMPL(fstat)
{
struct stat st;
@@ -8981,6 +9060,32 @@ IMPL(getuid32)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(getxattr)
+{
+ void *p, *n, *v = 0;
+ abi_long ret;
+
+ if (arg3) {
+ v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ }
+ p = lock_user_string(arg1);
+ n = lock_user_string(arg2);
+ if (p && n) {
+ ret = get_errno(getxattr(p, n, v, arg4));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(p, arg1, 0);
+ unlock_user(n, arg2, 0);
+ unlock_user(v, arg3, arg4);
+ return ret;
+}
+#endif
+
#if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
IMPL(getxgid)
{
@@ -9212,6 +9317,32 @@ IMPL(lchown32)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(lgetxattr)
+{
+ void *p, *n, *v = 0;
+ abi_long ret;
+
+ if (arg3) {
+ v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ }
+ p = lock_user_string(arg1);
+ n = lock_user_string(arg2);
+ if (p && n) {
+ ret = get_errno(lgetxattr(p, n, v, arg4));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(p, arg1, 0);
+ unlock_user(n, arg2, 0);
+ unlock_user(v, arg3, arg4);
+ return ret;
+}
+#endif
+
#ifdef TARGET_NR_link
IMPL(link)
{
@@ -9249,6 +9380,50 @@ IMPL(listen)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(listxattr)
+{
+ void *p = lock_user_string(arg1);
+ void *b = 0;
+ abi_long ret;
+
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ if (arg2) {
+ b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
+ if (!b) {
+ return -TARGET_EFAULT;
+ }
+ }
+ ret = get_errno(listxattr(p, b, arg3));
+ unlock_user(p, arg1, 0);
+ unlock_user(b, arg2, arg3);
+ return ret;
+}
+
+IMPL(llistxattr)
+{
+ void *p = lock_user_string(arg1);
+ void *b = 0;
+ abi_long ret;
+
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ if (arg2) {
+ b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
+ if (!b) {
+ return -TARGET_EFAULT;
+ }
+ }
+ ret = get_errno(llistxattr(p, b, arg3));
+ unlock_user(p, arg1, 0);
+ unlock_user(b, arg2, arg3);
+ return ret;
+}
+#endif
+
/* Older kernel ports have _llseek() instead of llseek() */
#if defined(TARGET_NR__llseek) && !defined(TARGET_NR_llseek)
#define TARGET_NR_llseek TARGET_NR__llseek
@@ -9270,11 +9445,54 @@ IMPL(llseek)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(lremovexattr)
+{
+ char *p = lock_user_string(arg1);
+ char *n = lock_user_string(arg2);
+ abi_long ret = -TARGET_EFAULT;
+
+ if (p && n) {
+ ret = get_errno(lremovexattr(p, n));
+ }
+ unlock_user(p, arg1, 0);
+ unlock_user(n, arg2, 0);
+ return ret;
+}
+#endif
+
IMPL(lseek)
{
return get_errno(lseek(arg1, arg2, arg3));
}
+#ifdef CONFIG_ATTR
+IMPL(lsetxattr)
+{
+ char *p, *n;
+ void *v = 0;
+ abi_long ret;
+
+ if (arg3) {
+ v = lock_user(VERIFY_READ, arg3, arg4, 1);
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ }
+ p = lock_user_string(arg1);
+ n = lock_user_string(arg2);
+ if (p && n) {
+ ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(p, arg1, 0);
+ unlock_user(n, arg2, 0);
+ unlock_user(v, arg3, 0);
+ return ret;
+}
+#endif
+
#ifdef TARGET_NR_lstat
IMPL(lstat)
{
@@ -10428,6 +10646,22 @@ IMPL(recvmsg)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(removexattr)
+{
+ char *p = lock_user_string(arg1);
+ char *n = lock_user_string(arg2);
+ abi_long ret = -TARGET_EFAULT;
+
+ if (p && n) {
+ ret = get_errno(removexattr(p, n));
+ }
+ unlock_user(p, arg1, 0);
+ unlock_user(n, arg2, 0);
+ return ret;
+}
+#endif
+
#ifdef TARGET_NR_rename
IMPL(rename)
{
@@ -11277,6 +11511,33 @@ IMPL(setuid32)
}
#endif
+#ifdef CONFIG_ATTR
+IMPL(setxattr)
+{
+ char *p, *n;
+ void *v = 0;
+ abi_long ret;
+
+ if (arg3) {
+ v = lock_user(VERIFY_READ, arg3, arg4, 1);
+ if (!v) {
+ return -TARGET_EFAULT;
+ }
+ }
+ p = lock_user_string(arg1);
+ n = lock_user_string(arg2);
+ if (p && n) {
+ ret = get_errno(setxattr(p, n, v, arg4, arg5));
+ } else {
+ ret = -TARGET_EFAULT;
+ }
+ unlock_user(p, arg1, 0);
+ unlock_user(n, arg2, 0);
+ unlock_user(v, arg3, 0);
+ return ret;
+}
+#endif
+
#ifdef TARGET_NR_sigaction
IMPL(sigaction)
{
@@ -12203,168 +12464,6 @@ static abi_long do_syscall1(void *cpu_env, unsigned
num, abi_long arg1,
void *p;
switch(num) {
-#ifdef CONFIG_ATTR
-#ifdef TARGET_NR_setxattr
- case TARGET_NR_listxattr:
- case TARGET_NR_llistxattr:
- {
- void *p, *b = 0;
- if (arg2) {
- b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
- if (!b) {
- return -TARGET_EFAULT;
- }
- }
- p = lock_user_string(arg1);
- if (p) {
- if (num == TARGET_NR_listxattr) {
- ret = get_errno(listxattr(p, b, arg3));
- } else {
- ret = get_errno(llistxattr(p, b, arg3));
- }
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(p, arg1, 0);
- unlock_user(b, arg2, arg3);
- return ret;
- }
- case TARGET_NR_flistxattr:
- {
- void *b = 0;
- if (arg2) {
- b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
- if (!b) {
- return -TARGET_EFAULT;
- }
- }
- ret = get_errno(flistxattr(arg1, b, arg3));
- unlock_user(b, arg2, arg3);
- return ret;
- }
- case TARGET_NR_setxattr:
- case TARGET_NR_lsetxattr:
- {
- void *p, *n, *v = 0;
- if (arg3) {
- v = lock_user(VERIFY_READ, arg3, arg4, 1);
- if (!v) {
- return -TARGET_EFAULT;
- }
- }
- p = lock_user_string(arg1);
- n = lock_user_string(arg2);
- if (p && n) {
- if (num == TARGET_NR_setxattr) {
- ret = get_errno(setxattr(p, n, v, arg4, arg5));
- } else {
- ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
- }
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(p, arg1, 0);
- unlock_user(n, arg2, 0);
- unlock_user(v, arg3, 0);
- }
- return ret;
- case TARGET_NR_fsetxattr:
- {
- void *n, *v = 0;
- if (arg3) {
- v = lock_user(VERIFY_READ, arg3, arg4, 1);
- if (!v) {
- return -TARGET_EFAULT;
- }
- }
- n = lock_user_string(arg2);
- if (n) {
- ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(n, arg2, 0);
- unlock_user(v, arg3, 0);
- }
- return ret;
- case TARGET_NR_getxattr:
- case TARGET_NR_lgetxattr:
- {
- void *p, *n, *v = 0;
- if (arg3) {
- v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
- if (!v) {
- return -TARGET_EFAULT;
- }
- }
- p = lock_user_string(arg1);
- n = lock_user_string(arg2);
- if (p && n) {
- if (num == TARGET_NR_getxattr) {
- ret = get_errno(getxattr(p, n, v, arg4));
- } else {
- ret = get_errno(lgetxattr(p, n, v, arg4));
- }
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(p, arg1, 0);
- unlock_user(n, arg2, 0);
- unlock_user(v, arg3, arg4);
- }
- return ret;
- case TARGET_NR_fgetxattr:
- {
- void *n, *v = 0;
- if (arg3) {
- v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
- if (!v) {
- return -TARGET_EFAULT;
- }
- }
- n = lock_user_string(arg2);
- if (n) {
- ret = get_errno(fgetxattr(arg1, n, v, arg4));
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(n, arg2, 0);
- unlock_user(v, arg3, arg4);
- }
- return ret;
- case TARGET_NR_removexattr:
- case TARGET_NR_lremovexattr:
- {
- void *p, *n;
- p = lock_user_string(arg1);
- n = lock_user_string(arg2);
- if (p && n) {
- if (num == TARGET_NR_removexattr) {
- ret = get_errno(removexattr(p, n));
- } else {
- ret = get_errno(lremovexattr(p, n));
- }
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(p, arg1, 0);
- unlock_user(n, arg2, 0);
- }
- return ret;
- case TARGET_NR_fremovexattr:
- {
- void *n;
- n = lock_user_string(arg2);
- if (n) {
- ret = get_errno(fremovexattr(arg1, n));
- } else {
- ret = -TARGET_EFAULT;
- }
- unlock_user(n, arg2, 0);
- }
- return ret;
-#endif
-#endif /* CONFIG_ATTR */
#ifdef TARGET_NR_set_thread_area
case TARGET_NR_set_thread_area:
#if defined(TARGET_MIPS)
@@ -13253,9 +13352,17 @@ static impl_fn *syscall_table(unsigned num)
SYSCALL(fcntl64);
#endif
SYSCALL(fdatasync);
+#ifdef CONFIG_ATTR
+ SYSCALL(fgetxattr);
+ SYSCALL(flistxattr);
+#endif
SYSCALL(flock);
#ifdef TARGET_NR_fork
SYSCALL(fork);
+#endif
+#ifdef CONFIG_ATTR
+ SYSCALL(fremovexattr);
+ SYSCALL(fsetxattr);
#endif
SYSCALL(fstat);
#ifdef TARGET_NR_fstat64
@@ -13354,6 +13461,9 @@ static impl_fn *syscall_table(unsigned num)
#ifdef TARGET_NR_getuid32
SYSCALL(getuid32);
#endif
+#ifdef CONFIG_ATTR
+ SYSCALL(getxattr);
+#endif
#if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
SYSCALL(getxgid);
#endif
@@ -13374,17 +13484,30 @@ static impl_fn *syscall_table(unsigned num)
#ifdef TARGET_NR_lchown32
SYSCALL(lchown32);
#endif
+#ifdef CONFIG_ATTR
+ SYSCALL(lgetxattr);
+#endif
#ifdef TARGET_NR_link
SYSCALL(link);
#endif
SYSCALL(linkat);
+#ifdef CONFIG_ATTR
+ SYSCALL(listxattr);
+ SYSCALL(llistxattr);
+#endif
#ifdef TARGET_NR_listen
SYSCALL(listen);
#endif
#ifdef TARGET_NR_llseek
SYSCALL(llseek);
+#endif
+#ifdef CONFIG_ATTR
+ SYSCALL(lremovexattr);
#endif
SYSCALL(lseek);
+#ifdef CONFIG_ATTR
+ SYSCALL(lsetxattr);
+#endif
#ifdef TARGET_NR_lstat
SYSCALL(lstat);
#endif
@@ -13498,6 +13621,9 @@ static impl_fn *syscall_table(unsigned num)
#ifdef TARGET_NR_recvmsg
SYSCALL(recvmsg);
#endif
+#ifdef CONFIG_ATTR
+ SYSCALL(removexattr);
+#endif
#ifdef TARGET_NR_rename
SYSCALL(rename);
#endif
@@ -13629,6 +13755,9 @@ static impl_fn *syscall_table(unsigned num)
#ifdef TARGET_NR_setuid32
SYSCALL(setuid32);
#endif
+#ifdef CONFIG_ATTR
+ SYSCALL(setxattr);
+#endif
#ifdef TARGET_NR_sigaction
SYSCALL(sigaction);
#endif
--
2.17.1
- [Qemu-devel] [PATCH v2 077/108] linux-user: Split out getuid32, getxgid, getxuid, lchown32, (continued)
- [Qemu-devel] [PATCH v2 077/108] linux-user: Split out getuid32, getxgid, getxuid, lchown32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 079/108] linux-user: Split out getegid32, geteuid32, getgid32, setregid32, setreuid32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 080/108] linux-user: Split out fchown32, getgroups32, setgroups32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 078/108] linux-user: Split out osf_getsysinfo, osf_setsysinfo, osf_sigprocmask, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 081/108] linux-user: Split out getresgid32, getresuid32, setresgid32, setresuid32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 082/108] linux-user: Split out chown32, setfsgid32, setfsuid32, setgid32, setuid32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 083/108] linux-user: Split out mincore, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 084/108] linux-user: Split out fadvise64, fadvise64_64, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 085/108] linux-user: Split out cacheflush, fcntl64, getpagesize, madvise, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 086/108] linux-user: Split out gettid, readahead, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 087/108] linux-user: Split out xattr syscalls,
Richard Henderson <=
- [Qemu-devel] [PATCH v2 089/108] linux-user: Split out clock syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 090/108] linux-user: Fix clock_nanosleep, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 088/108] linux-user: Split out getdomainname, get_thread_area, set_thread_area, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 091/108] linux-user: Split out set_tid_address, tgkill, tkill, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 092/108] linux-user: Split out futex, utimensat, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 093/108] linux-user: Remove sys_futex, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 094/108] linux-user: Split out inotify syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 095/108] linux-user: Split out mq syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 096/108] linux-user: Split out splice, tee, vmsplice, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 097/108] linux-user: Split out eventfd, eventfd2, Richard Henderson, 2018/06/09