linux-user: implement F_[GS]ETOWN_EX
PATCH 1/1 linux-user: implement F_[GS]ETOWN_EX
F_GETOWN is replaced by F_GETOWN_EX inside the glibc fcntl wrapper
Signed-off-by Andreas Schwab <[email protected]>
---
Only tested so far with the gnulib test-fcntl module, which mainly tests proper error handling only.
--- linux-user/syscall.c | 36 ++++++++++++++++++++++++++++++++++++ linux-user/syscall_defs.h | 7 +++++++ 2 files changed, 43 insertions(+)
linux-user/syscall.c +36 -0
@@ -4366,6 +4366,14 @@ static int target_to_host_fcntl_cmd(int cmd)#endif case TARGET_F_NOTIFY :return F_NOTIFY ; +#ifdef F_GETOWN_EX +case TARGET_F_GETOWN_EX : +return F_GETOWN_EX ; +#endif +#ifdef F_SETOWN_EX +case TARGET_F_SETOWN_EX : +return F_SETOWN_EX ; +#endif default :return -TARGET_EINVAL ; }
@@ -4388,6 +4396,10 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)struct target_flock *target_fl;struct flock64 fl64;struct target_flock64 *target_fl64; +#ifdef F_GETOWN_EX +struct f_owner_ex fox; +struct target_f_owner_ex *target_fox; +#endif abi_long ret;int host_cmd =target_to_host_fcntl_cmd (cmd);
@@ -4481,6 +4493,30 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) ret =get_errno (fcntl (fd, host_cmd,target_to_host_bitmask (arg, fcntl_flags_tbl)));break ; +#ifdef F_GETOWN_EX +case TARGET_F_GETOWN_EX : + ret =get_errno (fcntl (fd, host_cmd, &fox)); +if (ret >=0 ) { +if (!lock_user_struct (VERIFY_WRITE , target_fox, arg,0 )) +return -TARGET_EFAULT ; + target_fox->type =tswap32 (fox.type); + target_fox->pid =tswap32 (fox.pid); +unlock_user_struct (target_fox, arg,1 ); + } +break ; +#endif + +#ifdef F_SETOWN_EX +case TARGET_F_SETOWN_EX : +if (!lock_user_struct (VERIFY_READ , target_fox, arg,1 )) +return -TARGET_EFAULT ; + fox.type =tswap32 (target_fox->type); + fox.pid =tswap32 (target_fox->pid); +unlock_user_struct (target_fox, arg,0 ); + ret =get_errno (fcntl (fd, host_cmd, &fox)); +break ; +#endif +case TARGET_F_SETOWN :case TARGET_F_GETOWN :case TARGET_F_SETSIG :
linux-user/syscall_defs.h +7 -0
@@ -2118,6 +2118,8 @@ struct target_statfs64 {#define TARGET_F_SETOWN 8/* for sockets. */ #define TARGET_F_GETOWN 9/* for sockets. */ #endif +#define TARGET_F_SETOWN_EX 15 +#define TARGET_F_GETOWN_EX 16#ifndef TARGET_F_RDLCK #define TARGET_F_RDLCK 0
@@ -2300,6 +2302,11 @@ struct target_eabi_flock64 { } QEMU_PACKED;#endif +struct target_f_owner_ex { +int type;/* Owner type of ID. */ +int pid;/* ID of owner. */ +}; +/* soundcard defines */ /* XXX: convert them all to arch indepedent entries */ #define TARGET_SNDCTL_COPR_HALT TARGET_IOWR('C', 7, int);
Signature · 7 lines
1.9.0 -- Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."