[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 3/3] linux-user: Implement *listxattr syscalls
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH 3/3] linux-user: Implement *listxattr syscalls |
Date: |
Wed, 14 Dec 2011 15:37:19 +0000 |
Implement listxattr, flistxattr and llistxattr syscalls.
Signed-off-by: Peter Maydell <address@hidden>
---
linux-user/syscall.c | 36 +++++++++++++++++++++++++++++++++++-
1 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index a4596c0..17c8852 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -7644,9 +7644,43 @@ abi_long do_syscall(void *cpu_env, int num, abi_long
arg1,
#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) {
+ ret = -TARGET_EFAULT;
+ break;
+ }
+ }
+ 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);
+ break;
+ }
case TARGET_NR_flistxattr:
- ret = -TARGET_EOPNOTSUPP;
+ {
+ void *b = 0;
+ if (arg2) {
+ b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
+ if (!b) {
+ ret = -TARGET_EFAULT;
+ break;
+ }
+ }
+ ret = get_errno(flistxattr(arg1, b, arg3));
+ unlock_user(b, arg2, arg3);
break;
+ }
case TARGET_NR_setxattr:
case TARGET_NR_lsetxattr:
{
--
1.7.5.4