mirror of https://github.com/xemu-project/xemu.git
bsd-user: Implement stat related syscalls
Implement the following syscalls: fcntl(2) Signed-off-by: Stacey Son <sson@FreeBSD.org> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Warner Losh <imp@bsdimp.com>
This commit is contained in:
parent
213444529d
commit
c0023204cb
|
@ -351,4 +351,78 @@ static inline abi_long do_freebsd_getdirentries(abi_long arg1,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fcntl(2) */
|
||||||
|
static inline abi_long do_freebsd_fcntl(abi_long arg1, abi_long arg2,
|
||||||
|
abi_ulong arg3)
|
||||||
|
{
|
||||||
|
abi_long ret;
|
||||||
|
int host_cmd;
|
||||||
|
struct flock fl;
|
||||||
|
struct target_freebsd_flock *target_fl;
|
||||||
|
|
||||||
|
host_cmd = target_to_host_fcntl_cmd(arg2);
|
||||||
|
if (host_cmd < 0) {
|
||||||
|
return host_cmd;
|
||||||
|
}
|
||||||
|
switch (arg2) {
|
||||||
|
case TARGET_F_GETLK:
|
||||||
|
if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) {
|
||||||
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
__get_user(fl.l_type, &target_fl->l_type);
|
||||||
|
__get_user(fl.l_whence, &target_fl->l_whence);
|
||||||
|
__get_user(fl.l_start, &target_fl->l_start);
|
||||||
|
__get_user(fl.l_len, &target_fl->l_len);
|
||||||
|
__get_user(fl.l_pid, &target_fl->l_pid);
|
||||||
|
__get_user(fl.l_sysid, &target_fl->l_sysid);
|
||||||
|
unlock_user_struct(target_fl, arg3, 0);
|
||||||
|
ret = get_errno(safe_fcntl(arg1, host_cmd, &fl));
|
||||||
|
if (!is_error(ret)) {
|
||||||
|
if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) {
|
||||||
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
__put_user(fl.l_type, &target_fl->l_type);
|
||||||
|
__put_user(fl.l_whence, &target_fl->l_whence);
|
||||||
|
__put_user(fl.l_start, &target_fl->l_start);
|
||||||
|
__put_user(fl.l_len, &target_fl->l_len);
|
||||||
|
__put_user(fl.l_pid, &target_fl->l_pid);
|
||||||
|
__put_user(fl.l_sysid, &target_fl->l_sysid);
|
||||||
|
unlock_user_struct(target_fl, arg3, 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TARGET_F_SETLK:
|
||||||
|
case TARGET_F_SETLKW:
|
||||||
|
if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) {
|
||||||
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
__get_user(fl.l_type, &target_fl->l_type);
|
||||||
|
__get_user(fl.l_whence, &target_fl->l_whence);
|
||||||
|
__get_user(fl.l_start, &target_fl->l_start);
|
||||||
|
__get_user(fl.l_len, &target_fl->l_len);
|
||||||
|
__get_user(fl.l_pid, &target_fl->l_pid);
|
||||||
|
__get_user(fl.l_sysid, &target_fl->l_sysid);
|
||||||
|
unlock_user_struct(target_fl, arg3, 0);
|
||||||
|
ret = get_errno(safe_fcntl(arg1, host_cmd, &fl));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TARGET_F_DUPFD:
|
||||||
|
case TARGET_F_DUP2FD:
|
||||||
|
case TARGET_F_GETOWN:
|
||||||
|
case TARGET_F_SETOWN:
|
||||||
|
case TARGET_F_GETFD:
|
||||||
|
case TARGET_F_SETFD:
|
||||||
|
case TARGET_F_GETFL:
|
||||||
|
case TARGET_F_SETFL:
|
||||||
|
case TARGET_F_READAHEAD:
|
||||||
|
case TARGET_F_RDAHEAD:
|
||||||
|
case TARGET_F_ADD_SEALS:
|
||||||
|
case TARGET_F_GET_SEALS:
|
||||||
|
default:
|
||||||
|
ret = get_errno(safe_fcntl(arg1, host_cmd, arg3));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* BSD_USER_FREEBSD_OS_STAT_H */
|
#endif /* BSD_USER_FREEBSD_OS_STAT_H */
|
||||||
|
|
Loading…
Reference in New Issue