From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KpUfJ-0000iw-TH for qemu-devel@nongnu.org; Mon, 13 Oct 2008 17:09:22 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KpUfI-0000i7-V1 for qemu-devel@nongnu.org; Mon, 13 Oct 2008 17:09:21 -0400 Received: from [199.232.76.173] (port=50384 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KpUfI-0000hw-PA for qemu-devel@nongnu.org; Mon, 13 Oct 2008 17:09:20 -0400 Received: from hall.aurel32.net ([88.191.82.174]:33217) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KpUfI-0005se-1W for qemu-devel@nongnu.org; Mon, 13 Oct 2008 17:09:20 -0400 Date: Mon, 13 Oct 2008 23:09:12 +0200 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH] Fix getdents* syscalls Message-ID: <20081013210912.GE18008@volta.aurel32.net> References: <1223492074-5677-1-git-send-email-kirill@shutemov.name> <1223492074-5677-2-git-send-email-kirill@shutemov.name> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <1223492074-5677-2-git-send-email-kirill@shutemov.name> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: "Kirill A. Shutemov" Applied, thanks. On Wed, Oct 08, 2008 at 09:54:26PM +0300, Kirill A. Shutemov wrote: > glibc's structs dirent and dirent64 is different from in-kernel dirent > and dirent64. Kernel headers doesn't provide structs dirent(64) any > more. So we should add it to qemu headers. > > To avoid conflict with glibc it called struct linux_dirent(64). > > Signed-off-by: Kirill A. Shutemov > --- > linux-user/syscall.c | 27 +++++++++++++-------------- > linux-user/syscall_defs.h | 15 +++++++++++++++ > 2 files changed, 28 insertions(+), 14 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index dc7e561..40e985a 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -28,7 +28,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -94,8 +93,8 @@ > #endif > > //#include > -#define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct dirent [2]) > -#define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct dirent [2]) > +#define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2]) > +#define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2]) > > > #undef _syscall0 > @@ -216,10 +215,10 @@ _syscall3(int,sys_futimesat,int,dirfd,const char *,pathname, > #endif > _syscall2(int,sys_getcwd1,char *,buf,size_t,size) > #if TARGET_ABI_BITS == 32 > -_syscall3(int, sys_getdents, uint, fd, struct dirent *, dirp, uint, count); > +_syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count); > #endif > #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64) > -_syscall3(int, sys_getdents64, uint, fd, struct dirent64 *, dirp, uint, count); > +_syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint, count); > #endif > _syscall2(int, sys_getpriority, int, which, int, who); > #if !defined (__x86_64__) > @@ -4879,7 +4878,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 > { > struct target_dirent *target_dirp; > - struct dirent *dirp; > + struct linux_dirent *dirp; > abi_long count = arg3; > > dirp = malloc(count); > @@ -4890,7 +4889,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > > ret = get_errno(sys_getdents(arg1, dirp, count)); > if (!is_error(ret)) { > - struct dirent *de; > + struct linux_dirent *de; > struct target_dirent *tde; > int len = ret; > int reclen, treclen; > @@ -4912,7 +4911,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > tnamelen = 256; > /* XXX: may not be correct */ > strncpy(tde->d_name, de->d_name, tnamelen); > - de = (struct dirent *)((char *)de + reclen); > + de = (struct linux_dirent *)((char *)de + reclen); > len -= reclen; > tde = (struct target_dirent *)((char *)tde + treclen); > count1 += treclen; > @@ -4924,14 +4923,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > } > #else > { > - struct dirent *dirp; > + struct linux_dirent *dirp; > abi_long count = arg3; > > if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0))) > goto efault; > ret = get_errno(sys_getdents(arg1, dirp, count)); > if (!is_error(ret)) { > - struct dirent *de; > + struct linux_dirent *de; > int len = ret; > int reclen; > de = dirp; > @@ -4942,7 +4941,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > de->d_reclen = tswap16(reclen); > tswapls(&de->d_ino); > tswapls(&de->d_off); > - de = (struct dirent *)((char *)de + reclen); > + de = (struct linux_dirent *)((char *)de + reclen); > len -= reclen; > } > } > @@ -4953,13 +4952,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64) > case TARGET_NR_getdents64: > { > - struct dirent64 *dirp; > + struct linux_dirent64 *dirp; > abi_long count = arg3; > if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0))) > goto efault; > ret = get_errno(sys_getdents64(arg1, dirp, count)); > if (!is_error(ret)) { > - struct dirent64 *de; > + struct linux_dirent64 *de; > int len = ret; > int reclen; > de = dirp; > @@ -4970,7 +4969,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > de->d_reclen = tswap16(reclen); > tswap64s((uint64_t *)&de->d_ino); > tswap64s((uint64_t *)&de->d_off); > - de = (struct dirent64 *)((char *)de + reclen); > + de = (struct linux_dirent64 *)((char *)de + reclen); > len -= reclen; > } > } > diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h > index c30bb15..5a58010 100644 > --- a/linux-user/syscall_defs.h > +++ b/linux-user/syscall_defs.h > @@ -1963,6 +1963,21 @@ struct target_sysinfo { > char _f[20-2*sizeof(abi_long)-sizeof(int)]; /* Padding: libc5 uses this.. */ > }; > > +struct linux_dirent { > + long d_ino; > + unsigned long d_off; > + unsigned short d_reclen; > + char d_name[256]; /* We must not include limits.h! */ > +}; > + > +struct linux_dirent64 { > + uint64_t d_ino; > + int64_t d_off; > + unsigned short d_reclen; > + unsigned char d_type; > + char d_name[256]; > +}; > + > #include "socket.h" > > #include "errno_defs.h" > -- > 1.5.6.5.GIT > > > > -- .''`. Aurelien Jarno | GPG: 1024D/F1BCDB73 : :' : Debian developer | Electrical Engineer `. `' aurel32@debian.org | aurelien@aurel32.net `- people.debian.org/~aurel32 | www.aurel32.net