qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Fix getdents* syscalls


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH] Fix getdents* syscalls
Date: Mon, 13 Oct 2008 23:09:12 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

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 <address@hidden>
> ---
>  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 <fcntl.h>
>  #include <time.h>
>  #include <limits.h>
> -#include <dirent.h>
>  #include <sys/types.h>
>  #include <sys/ipc.h>
>  #include <sys/msg.h>
> @@ -94,8 +93,8 @@
>  #endif
>  
>  //#include <linux/msdos_fs.h>
> -#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
 `. `'   address@hidden         | address@hidden
   `-    people.debian.org/~aurel32 | www.aurel32.net




reply via email to

[Prev in Thread] Current Thread [Next in Thread]