Commit 8170f56baf6b146653246b8cbf7298fd228cbc75

Authored by ths
1 parent ccfa72b7

linux-user unlinkat() syscall, by Thayne Harbaugh.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3221 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 19 additions and 0 deletions
linux-user/syscall.c
... ... @@ -150,6 +150,7 @@ type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
150 150 #define __NR_sys_syslog __NR_syslog
151 151 #define __NR_sys_tgkill __NR_tgkill
152 152 #define __NR_sys_tkill __NR_tkill
  153 +#define __NR_sys_unlinkat __NR_unlinkat
153 154  
154 155 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
155 156 #define __NR__llseek __NR_lseek
... ... @@ -198,6 +199,9 @@ _syscall1(int,exit_group,int,error_code)
198 199 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
199 200 _syscall1(int,set_tid_address,int *,tidptr)
200 201 #endif
  202 +#if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
  203 +_syscall3(int,sys_unlinkat,int,dirfd,const char *,pathname,int,flags)
  204 +#endif
201 205  
202 206 extern int personality(int);
203 207 extern int flock(int, int);
... ... @@ -2577,6 +2581,21 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2577 2581 ret = get_errno(unlink(p));
2578 2582 unlock_user(p, arg1, 0);
2579 2583 break;
  2584 +#if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
  2585 + case TARGET_NR_unlinkat:
  2586 + if (!arg2) {
  2587 + ret = -EFAULT;
  2588 + goto fail;
  2589 + }
  2590 + p = lock_user_string(arg2);
  2591 + if (!access_ok(VERIFY_READ, p, 1))
  2592 + ret = -EFAULT;
  2593 + else
  2594 + ret = get_errno(sys_unlinkat(arg1, p, arg3));
  2595 + if (p)
  2596 + unlock_user(p, arg2, 0);
  2597 + break;
  2598 +#endif
2580 2599 case TARGET_NR_execve:
2581 2600 {
2582 2601 char **argp, **envp;
... ...