Commit ec86b0fb3aa854ea8cec28df15cbd43f30d21519

Authored by bellard
1 parent 1d346ae6

stat patches - path patches - added exit_group() syscall


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@95 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 25 additions and 12 deletions
linux-user/syscall.c
... ... @@ -105,6 +105,9 @@ _syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo,
105 105 _syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf)
106 106 _syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf)
107 107 _syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo)
  108 +#ifdef __NR_exit_group
  109 +_syscall1(int,exit_group,int,error_code)
  110 +#endif
108 111  
109 112 extern int personality(int);
110 113 extern int flock(int, int);
... ... @@ -1212,7 +1215,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1212 1215 ret = get_errno(write(arg1, (void *)arg2, arg3));
1213 1216 break;
1214 1217 case TARGET_NR_open:
1215   - ret = get_errno(open((const char *)arg1, arg2, arg3));
  1218 + ret = get_errno(open(path((const char *)arg1), arg2, arg3));
1216 1219 break;
1217 1220 case TARGET_NR_close:
1218 1221 ret = get_errno(close(arg1));
... ... @@ -1700,7 +1703,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1700 1703 case TARGET_NR_oldlstat:
1701 1704 goto unimplemented;
1702 1705 case TARGET_NR_readlink:
1703   - ret = get_errno(readlink((const char *)arg1, (char *)arg2, arg3));
  1706 + ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3));
1704 1707 break;
1705 1708 case TARGET_NR_uselib:
1706 1709 goto unimplemented;
... ... @@ -1779,7 +1782,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1779 1782 goto unimplemented;
1780 1783 case TARGET_NR_statfs:
1781 1784 stfs = (void *)arg2;
1782   - ret = get_errno(sys_statfs((const char *)arg1, stfs));
  1785 + ret = get_errno(sys_statfs(path((const char *)arg1), stfs));
1783 1786 convert_statfs:
1784 1787 if (!is_error(ret)) {
1785 1788 tswap32s(&stfs->f_type);
... ... @@ -1844,10 +1847,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1844 1847 }
1845 1848 break;
1846 1849 case TARGET_NR_stat:
1847   - ret = get_errno(stat((const char *)arg1, &st));
  1850 + ret = get_errno(stat(path((const char *)arg1), &st));
1848 1851 goto do_stat;
1849 1852 case TARGET_NR_lstat:
1850   - ret = get_errno(lstat((const char *)arg1, &st));
  1853 + ret = get_errno(lstat(path((const char *)arg1), &st));
1851 1854 goto do_stat;
1852 1855 case TARGET_NR_fstat:
1853 1856 {
... ... @@ -1857,7 +1860,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1857 1860 struct target_stat *target_st = (void *)arg2;
1858 1861 target_st->st_dev = tswap16(st.st_dev);
1859 1862 target_st->st_ino = tswapl(st.st_ino);
1860   - target_st->st_mode = tswap32(st.st_mode);
  1863 + target_st->st_mode = tswap16(st.st_mode);
1861 1864 target_st->st_nlink = tswap16(st.st_nlink);
1862 1865 target_st->st_uid = tswap16(st.st_uid);
1863 1866 target_st->st_gid = tswap16(st.st_gid);
... ... @@ -1930,6 +1933,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1930 1933 case TARGET_NR_clone:
1931 1934 ret = get_errno(do_fork(cpu_env, arg1, arg2));
1932 1935 break;
  1936 +#ifdef __NR_exit_group
  1937 + /* new thread calls */
  1938 + case TARGET_NR_exit_group:
  1939 + ret = get_errno(exit_group(arg1));
  1940 + break;
  1941 +#endif
1933 1942 case TARGET_NR_setdomainname:
1934 1943 ret = get_errno(setdomainname((const char *)arg1, arg2));
1935 1944 break;
... ... @@ -2235,10 +2244,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2235 2244 case TARGET_NR_ftruncate64:
2236 2245 goto unimplemented;
2237 2246 case TARGET_NR_stat64:
2238   - ret = get_errno(stat((const char *)arg1, &st));
  2247 + ret = get_errno(stat(path((const char *)arg1), &st));
2239 2248 goto do_stat64;
2240 2249 case TARGET_NR_lstat64:
2241   - ret = get_errno(lstat((const char *)arg1, &st));
  2250 + ret = get_errno(lstat(path((const char *)arg1), &st));
2242 2251 goto do_stat64;
2243 2252 case TARGET_NR_fstat64:
2244 2253 {
... ... @@ -2246,15 +2255,19 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2246 2255 do_stat64:
2247 2256 if (!is_error(ret)) {
2248 2257 struct target_stat64 *target_st = (void *)arg2;
  2258 + memset(target_st, 0, sizeof(struct target_stat64));
2249 2259 target_st->st_dev = tswap16(st.st_dev);
2250 2260 target_st->st_ino = tswapl(st.st_ino);
  2261 +#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
  2262 + target_st->__st_ino = tswapl(st.st_ino);
  2263 +#endif
2251 2264 target_st->st_mode = tswap32(st.st_mode);
2252   - target_st->st_nlink = tswap16(st.st_nlink);
2253   - target_st->st_uid = tswap16(st.st_uid);
2254   - target_st->st_gid = tswap16(st.st_gid);
  2265 + target_st->st_nlink = tswap32(st.st_nlink);
  2266 + target_st->st_uid = tswapl(st.st_uid);
  2267 + target_st->st_gid = tswapl(st.st_gid);
2255 2268 target_st->st_rdev = tswap16(st.st_rdev);
2256 2269 /* XXX: better use of kernel struct */
2257   - target_st->st_size = tswapl(st.st_size);
  2270 + target_st->st_size = tswap64(st.st_size);
2258 2271 target_st->st_blksize = tswapl(st.st_blksize);
2259 2272 target_st->st_blocks = tswapl(st.st_blocks);
2260 2273 target_st->target_st_atime = tswapl(st.st_atime);
... ...