Commit 4add45b4f6695c2a2d61b5da0f750519fa400630
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 | { | ... | ... |