Index: qemu/linux-user/syscall.c =================================================================== --- qemu.orig/linux-user/syscall.c 2007-09-19 06:22:58.000000000 -0600 +++ qemu/linux-user/syscall.c 2007-09-19 06:23:52.000000000 -0600 @@ -163,6 +163,7 @@ #define __NR_sys_syslog __NR_syslog #define __NR_sys_tgkill __NR_tgkill #define __NR_sys_tkill __NR_tkill +#define __NR_sys_unlinkat __NR_unlinkat #define __NR_sys_utimensat __NR_utimensat #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__) @@ -216,6 +217,9 @@ #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address) _syscall1(int,set_tid_address,int *,tidptr) #endif +#if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat) +_syscall3(int,sys_unlinkat,int,dirfd,const char *,pathname,int,flags) +#endif #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat) _syscall4(int,sys_utimensat,int,dirfd,const char *,pathname, const struct timespec *,tsp,int,flags) @@ -2762,6 +2766,21 @@ ret = get_errno(unlink(p)); unlock_user(p, arg1, 0); break; +#if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat) + case TARGET_NR_unlinkat: + 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_unlinkat(arg1, p, arg3)); + if (p) + unlock_user(p, arg2, 0); + break; +#endif case TARGET_NR_execve: { char **argp, **envp; Index: qemu/linux-user/arm/syscall_nr.h =================================================================== --- qemu.orig/linux-user/arm/syscall_nr.h 2007-09-19 06:22:15.000000000 -0600 +++ qemu/linux-user/arm/syscall_nr.h 2007-09-19 06:23:07.000000000 -0600 @@ -330,4 +330,5 @@ #define TARGET_NR_mknodat 324 #define TARGET_NR_fchownat 325 #define TARGET_NR_futimesat 326 +#define TARGET_NR_unlinkat 328 #define TARGET_NR_utimensat 348