Commit 4add45b4f6695c2a2d61b5da0f750519fa400630

Authored by bellard
1 parent 4f101ad7

getdents for 64 bit cpus


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@212 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 42 additions and 1 deletions
linux-user/syscall.c
... ... @@ -2015,7 +2015,47 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2015 2015 case TARGET_NR_getdents:
2016 2016 #if TARGET_LONG_SIZE != 4
2017 2017 #error not supported
2018   -#endif
  2018 +#elif TARGET_LONG_SIZE == 4 && HOST_LONG_SIZE == 8
  2019 + {
  2020 + struct target_dirent *target_dirp = (void *)arg2;
  2021 + struct dirent *dirp;
  2022 + long count = arg3;
  2023 +
  2024 + dirp = malloc(count);
  2025 + if (!dirp)
  2026 + return -ENOMEM;
  2027 +
  2028 + ret = get_errno(sys_getdents(arg1, dirp, count));
  2029 + if (!is_error(ret)) {
  2030 + struct dirent *de;
  2031 + struct target_dirent *tde;
  2032 + int len = ret;
  2033 + int reclen, treclen;
  2034 + int count1, tnamelen;
  2035 +
  2036 + count1 = 0;
  2037 + de = dirp;
  2038 + tde = target_dirp;
  2039 + while (len > 0) {
  2040 + reclen = de->d_reclen;
  2041 + treclen = reclen - (2 * (sizeof(long) - sizeof(target_long)));
  2042 + tde->d_reclen = tswap16(treclen);
  2043 + tde->d_ino = tswapl(de->d_ino);
  2044 + tde->d_off = tswapl(de->d_off);
  2045 + tnamelen = treclen - (2 * sizeof(target_long) + 2);
  2046 + if (tnamelen > 256)
  2047 + tnamelen = 256;
  2048 + strncpy(tde->d_name, de->d_name, tnamelen);
  2049 + de = (struct dirent *)((char *)de + reclen);
  2050 + len -= reclen;
  2051 + tde = (struct dirent *)((char *)tde + treclen);
  2052 + count1 += treclen;
  2053 + }
  2054 + ret = count1;
  2055 + }
  2056 + free(dirp);
  2057 + }
  2058 +#else
2019 2059 {
2020 2060 struct dirent *dirp = (void *)arg2;
2021 2061 long count = arg3;
... ... @@ -2038,6 +2078,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2038 2078 }
2039 2079 }
2040 2080 }
  2081 +#endif
2041 2082 break;
2042 2083 case TARGET_NR_getdents64:
2043 2084 {
... ...