This patch adds the fchmodat syscall to linux-user.
Index: qemu/linux-user/syscall.c =================================================================== --- qemu.orig/linux-user/syscall.c 2007-09-19 06:27:29.000000000 -0600 +++ qemu/linux-user/syscall.c 2007-09-19 06:28:02.000000000 -0600 @@ -151,6 +151,7 @@ #define __NR_sys_uname __NR_uname +#define __NR_sys_fchmodat __NR_fchmodat #define __NR_sys_fchownat __NR_fchownat #define __NR_sys_futimesat __NR_futimesat #define __NR_sys_getcwd1 __NR_getcwd @@ -182,6 +183,10 @@ } #endif _syscall1(int,sys_uname,struct new_utsname *,buf) +#if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat) +_syscall4(int,sys_fchmodat,int,dirfd,const char *,pathname, + mode_t,mode,int,flags) +#endif #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) _syscall5(int,sys_fchownat,int,dirfd,const char *,pathname, uid_t,owner,gid_t,group,int,flags) @@ -3715,6 +3720,21 @@ case TARGET_NR_fchmod: ret = get_errno(fchmod(arg1, arg2)); break; +#if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat) + case TARGET_NR_fchmodat: + if (!arg2) { + ret = -EFAULT; + goto fail; + } + p = lock_user_string(arg2); + if (!access_ok(VERIFY_READ, p, 1)) + ret = -EFAULT; + else + ret = get_errno(sys_fchmodat(arg1, p, arg3, arg4)); + if (p) + unlock_user(p, arg2, 0); + break; +#endif case TARGET_NR_getpriority: ret = get_errno(getpriority(arg1, arg2)); break; Index: qemu/linux-user/arm/syscall_nr.h =================================================================== --- qemu.orig/linux-user/arm/syscall_nr.h 2007-09-19 06:26:57.000000000 -0600 +++ qemu/linux-user/arm/syscall_nr.h 2007-09-19 06:27:37.000000000 -0600 @@ -335,4 +335,5 @@ #define TARGET_NR_linkat 330 #define TARGET_NR_symlinkat 331 #define TARGET_NR_readlinkat 332 +#define TARGET_NR_fchmodat 333 #define TARGET_NR_utimensat 348