Commit 8d5d3004 authored by Andreas Schwab's avatar Andreas Schwab Committed by Riku Voipio
Browse files

linux-user: implement F_[GS]ETOWN_EX



F_GETOWN is replaced by F_GETOWN_EX inside the glibc fcntl wrapper

Signed-off-by: default avatarAndreas Schwab <schwab@suse.de>
Signed-off-by: default avatarRiku Voipio <riku.voipio@linaro.org>
parent 3b899ea7
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -4421,6 +4421,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;
    }
@@ -4443,6 +4451,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);

@@ -4536,6 +4548,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:
+7 −0
Original line number Diff line number Diff line
@@ -2123,6 +2123,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
@@ -2305,6 +2307,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);