From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:47876) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TsL7p-0000Gf-Dw for qemu-devel@nongnu.org; Mon, 07 Jan 2013 17:24:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TsL7n-0001iF-M7 for qemu-devel@nongnu.org; Mon, 07 Jan 2013 17:24:57 -0500 Received: from smtp6-g21.free.fr ([2a01:e0c:1:1599::15]:49786) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TsL7n-0001f3-3p for qemu-devel@nongnu.org; Mon, 07 Jan 2013 17:24:55 -0500 From: Laurent Vivier Date: Mon, 7 Jan 2013 23:24:46 +0100 Message-Id: <1357597486-19395-1-git-send-email-laurent@vivier.eu> Subject: [Qemu-devel] [PATCH] linux-user, alpha: l_type of fcntl() flock differs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Riku Voipio , Laurent Vivier , dillona@dillona.com, Richard Henderson on alpha, F_RDLCK, F_WRLCK, F_UNLCK, F_EXLCK, F_SHLCK are not the standard ones. This patch allows to run "dpkg" (database lock). Signed-off-by: Laurent Vivier --- linux-user/syscall.c | 50 +++++++++++++++++++++++++++++++++++++++------ linux-user/syscall_defs.h | 18 ++++++++++++++++ 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3167a87..2232bb8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4512,6 +4512,41 @@ static int target_to_host_fcntl_cmd(int cmd) return -TARGET_EINVAL; } +static short target_to_host_flock_type(short type) +{ + switch (type) { + case TARGET_F_RDLCK: + return F_RDLCK; + case TARGET_F_WRLCK: + return F_WRLCK; + case TARGET_F_UNLCK: + return F_UNLCK; + case TARGET_F_EXLCK: + return F_EXLCK; + case TARGET_F_SHLCK: + return F_SHLCK; + default: + return type; + } +} + +static short host_to_target_flock_type(short type) +{ + switch (type) { + case F_RDLCK: + return TARGET_F_RDLCK; + case F_WRLCK: + return TARGET_F_WRLCK; + case F_UNLCK: + return TARGET_F_UNLCK; + case F_EXLCK: + return TARGET_F_EXLCK; + case F_SHLCK: + return TARGET_F_SHLCK; + default: + return type; + } +} static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) { struct flock fl; @@ -4528,7 +4563,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_GETLK: if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1)) return -TARGET_EFAULT; - fl.l_type = tswap16(target_fl->l_type); + fl.l_type = target_to_host_flock_type(tswap16(target_fl->l_type)); fl.l_whence = tswap16(target_fl->l_whence); fl.l_start = tswapal(target_fl->l_start); fl.l_len = tswapal(target_fl->l_len); @@ -4538,7 +4573,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) if (ret == 0) { if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0)) return -TARGET_EFAULT; - target_fl->l_type = tswap16(fl.l_type); + target_fl->l_type = host_to_target_flock_type(tswap16(fl.l_type)); target_fl->l_whence = tswap16(fl.l_whence); target_fl->l_start = tswapal(fl.l_start); target_fl->l_len = tswapal(fl.l_len); @@ -4551,7 +4586,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_SETLKW: if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1)) return -TARGET_EFAULT; - fl.l_type = tswap16(target_fl->l_type); + fl.l_type = target_to_host_flock_type(tswap16(target_fl->l_type)); fl.l_whence = tswap16(target_fl->l_whence); fl.l_start = tswapal(target_fl->l_start); fl.l_len = tswapal(target_fl->l_len); @@ -4563,7 +4598,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_GETLK64: if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) return -TARGET_EFAULT; - fl64.l_type = tswap16(target_fl64->l_type) >> 1; + fl64.l_type = + target_to_host_flock_type(tswap16(target_fl64->l_type)) >> 1; fl64.l_whence = tswap16(target_fl64->l_whence); fl64.l_start = tswap64(target_fl64->l_start); fl64.l_len = tswap64(target_fl64->l_len); @@ -4573,7 +4609,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) if (ret == 0) { if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0)) return -TARGET_EFAULT; - target_fl64->l_type = tswap16(fl64.l_type) >> 1; + target_fl64->l_type = + host_to_target_flock_type(tswap16(fl64.l_type)) >> 1; target_fl64->l_whence = tswap16(fl64.l_whence); target_fl64->l_start = tswap64(fl64.l_start); target_fl64->l_len = tswap64(fl64.l_len); @@ -4585,7 +4622,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_SETLKW64: if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) return -TARGET_EFAULT; - fl64.l_type = tswap16(target_fl64->l_type) >> 1; + fl64.l_type = + target_to_host_flock_type(tswap16(target_fl64->l_type)) >> 1; fl64.l_whence = tswap16(target_fl64->l_whence); fl64.l_start = tswap64(target_fl64->l_start); fl64.l_len = tswap64(target_fl64->l_len); diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 69aa6b8..6095992 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -2017,6 +2017,12 @@ struct target_statfs64 { #define TARGET_F_SETLKW 9 #define TARGET_F_SETOWN 5 /* for sockets. */ #define TARGET_F_GETOWN 6 /* for sockets. */ + +#define TARGET_F_RDLCK 1 +#define TARGET_F_WRLCK 2 +#define TARGET_F_UNLCK 8 +#define TARGET_F_EXLCK 16 +#define TARGET_F_SHLCK 32 #elif defined(TARGET_MIPS) #define TARGET_F_GETLK 14 #define TARGET_F_SETLK 6 @@ -2031,6 +2037,18 @@ struct target_statfs64 { #define TARGET_F_GETOWN 9 /* for sockets. */ #endif +#ifndef TARGET_F_RDLCK +#define TARGET_F_RDLCK 0 +#define TARGET_F_WRLCK 1 +#define TARGET_F_UNLCK 2 +#endif + +#ifndef TARGET_F_EXLCK +#define TARGET_F_EXLCK 4 +#define TARGET_F_SHLCK 8 +#endif + + #define TARGET_F_SETSIG 10 /* for sockets. */ #define TARGET_F_GETSIG 11 /* for sockets. */ -- 1.7.10.4