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,6 +150,7 @@ type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
150 #define __NR_sys_syslog __NR_syslog 150 #define __NR_sys_syslog __NR_syslog
151 #define __NR_sys_tgkill __NR_tgkill 151 #define __NR_sys_tgkill __NR_tgkill
152 #define __NR_sys_tkill __NR_tkill 152 #define __NR_sys_tkill __NR_tkill
  153 +#define __NR_sys_unlinkat __NR_unlinkat
153 154
154 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__) 155 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
155 #define __NR__llseek __NR_lseek 156 #define __NR__llseek __NR_lseek
@@ -198,6 +199,9 @@ _syscall1(int,exit_group,int,error_code) @@ -198,6 +199,9 @@ _syscall1(int,exit_group,int,error_code)
198 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address) 199 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
199 _syscall1(int,set_tid_address,int *,tidptr) 200 _syscall1(int,set_tid_address,int *,tidptr)
200 #endif 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 extern int personality(int); 206 extern int personality(int);
203 extern int flock(int, int); 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,6 +2581,21 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2577 ret = get_errno(unlink(p)); 2581 ret = get_errno(unlink(p));
2578 unlock_user(p, arg1, 0); 2582 unlock_user(p, arg1, 0);
2579 break; 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 case TARGET_NR_execve: 2599 case TARGET_NR_execve:
2581 { 2600 {
2582 char **argp, **envp; 2601 char **argp, **envp;