| /* |
| * FreeBSD stat related conversion routines |
| * |
| * Copyright (c) 2013 Stacey D. Son |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, see <http://www.gnu.org/licenses/>. |
| */ |
| #include "qemu/osdep.h" |
| |
| #include "qemu.h" |
| |
| /* |
| * stat conversion |
| */ |
| abi_long h2t_freebsd11_stat(abi_ulong target_addr, |
| struct freebsd11_stat *host_st) |
| { |
| struct target_freebsd11_stat *target_st; |
| |
| if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) { |
| return -TARGET_EFAULT; |
| } |
| memset(target_st, 0, sizeof(*target_st)); |
| __put_user(host_st->st_dev, &target_st->st_dev); |
| __put_user(host_st->st_ino, &target_st->st_ino); |
| __put_user(host_st->st_mode, &target_st->st_mode); |
| __put_user(host_st->st_nlink, &target_st->st_nlink); |
| __put_user(host_st->st_uid, &target_st->st_uid); |
| __put_user(host_st->st_gid, &target_st->st_gid); |
| __put_user(host_st->st_rdev, &target_st->st_rdev); |
| __put_user(host_st->st_atim.tv_sec, &target_st->st_atim.tv_sec); |
| __put_user(host_st->st_atim.tv_nsec, &target_st->st_atim.tv_nsec); |
| __put_user(host_st->st_mtim.tv_sec, &target_st->st_mtim.tv_sec); |
| __put_user(host_st->st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); |
| __put_user(host_st->st_ctim.tv_sec, &target_st->st_ctim.tv_sec); |
| __put_user(host_st->st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); |
| __put_user(host_st->st_size, &target_st->st_size); |
| __put_user(host_st->st_blocks, &target_st->st_blocks); |
| __put_user(host_st->st_blksize, &target_st->st_blksize); |
| __put_user(host_st->st_flags, &target_st->st_flags); |
| __put_user(host_st->st_gen, &target_st->st_gen); |
| /* st_lspare not used */ |
| __put_user(host_st->st_birthtim.tv_sec, &target_st->st_birthtim.tv_sec); |
| __put_user(host_st->st_birthtim.tv_nsec, &target_st->st_birthtim.tv_nsec); |
| unlock_user_struct(target_st, target_addr, 1); |
| |
| return 0; |
| } |
| |
| abi_long h2t_freebsd_stat(abi_ulong target_addr, |
| struct stat *host_st) |
| { |
| struct target_stat *target_st; |
| |
| if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) { |
| return -TARGET_EFAULT; |
| } |
| memset(target_st, 0, sizeof(*target_st)); |
| __put_user(host_st->st_dev, &target_st->st_dev); |
| __put_user(host_st->st_ino, &target_st->st_ino); |
| __put_user(host_st->st_nlink, &target_st->st_nlink); |
| __put_user(host_st->st_mode, &target_st->st_mode); |
| __put_user(host_st->st_uid, &target_st->st_uid); |
| __put_user(host_st->st_gid, &target_st->st_gid); |
| __put_user(host_st->st_rdev, &target_st->st_rdev); |
| __put_user(host_st->st_atim.tv_sec, &target_st->st_atim.tv_sec); |
| __put_user(host_st->st_atim.tv_nsec, &target_st->st_atim.tv_nsec); |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT |
| /* __put_user(host_st->st_mtim_ext, &target_st->st_mtim_ext); XXX */ |
| #endif |
| __put_user(host_st->st_mtim.tv_sec, &target_st->st_mtim.tv_sec); |
| __put_user(host_st->st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT |
| /* __put_user(host_st->st_ctim_ext, &target_st->st_ctim_ext); XXX */ |
| #endif |
| __put_user(host_st->st_ctim.tv_sec, &target_st->st_ctim.tv_sec); |
| __put_user(host_st->st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT |
| /* __put_user(host_st->st_birthtim_ext, &target_st->st_birthtim_ext); XXX */ |
| #endif |
| __put_user(host_st->st_birthtim.tv_sec, &target_st->st_birthtim.tv_sec); |
| __put_user(host_st->st_birthtim.tv_nsec, &target_st->st_birthtim.tv_nsec); |
| |
| __put_user(host_st->st_size, &target_st->st_size); |
| __put_user(host_st->st_blocks, &target_st->st_blocks); |
| __put_user(host_st->st_blksize, &target_st->st_blksize); |
| __put_user(host_st->st_flags, &target_st->st_flags); |
| __put_user(host_st->st_gen, &target_st->st_gen); |
| unlock_user_struct(target_st, target_addr, 1); |
| |
| return 0; |
| } |
| |
| abi_long h2t_freebsd11_nstat(abi_ulong target_addr, |
| struct freebsd11_stat *host_st) |
| { |
| struct target_freebsd11_nstat *target_st; |
| |
| if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) { |
| return -TARGET_EFAULT; |
| } |
| memset(target_st, 0, sizeof(*target_st)); |
| __put_user(host_st->st_dev, &target_st->st_dev); |
| __put_user(host_st->st_ino, &target_st->st_ino); |
| __put_user(host_st->st_mode, &target_st->st_mode); |
| __put_user(host_st->st_nlink, &target_st->st_nlink); |
| __put_user(host_st->st_uid, &target_st->st_uid); |
| __put_user(host_st->st_gid, &target_st->st_gid); |
| __put_user(host_st->st_rdev, &target_st->st_rdev); |
| __put_user(host_st->st_atim.tv_sec, &target_st->st_atim.tv_sec); |
| __put_user(host_st->st_atim.tv_nsec, &target_st->st_atim.tv_nsec); |
| __put_user(host_st->st_mtim.tv_sec, &target_st->st_mtim.tv_sec); |
| __put_user(host_st->st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); |
| __put_user(host_st->st_ctim.tv_sec, &target_st->st_ctim.tv_sec); |
| __put_user(host_st->st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); |
| __put_user(host_st->st_size, &target_st->st_size); |
| __put_user(host_st->st_blocks, &target_st->st_blocks); |
| __put_user(host_st->st_blksize, &target_st->st_blksize); |
| __put_user(host_st->st_flags, &target_st->st_flags); |
| __put_user(host_st->st_gen, &target_st->st_gen); |
| __put_user(host_st->st_birthtim.tv_sec, &target_st->st_birthtim.tv_sec); |
| __put_user(host_st->st_birthtim.tv_nsec, &target_st->st_birthtim.tv_nsec); |
| unlock_user_struct(target_st, target_addr, 1); |
| |
| return 0; |
| } |
| |
| /* |
| * file handle conversion |
| */ |
| abi_long t2h_freebsd_fhandle(fhandle_t *host_fh, abi_ulong target_addr) |
| { |
| target_freebsd_fhandle_t *target_fh; |
| |
| if (!lock_user_struct(VERIFY_READ, target_fh, target_addr, 1)) { |
| return -TARGET_EFAULT; |
| } |
| __get_user(host_fh->fh_fsid.val[0], &target_fh->fh_fsid.val[0]); |
| __get_user(host_fh->fh_fsid.val[1], &target_fh->fh_fsid.val[0]); |
| __get_user(host_fh->fh_fid.fid_len, &target_fh->fh_fid.fid_len); |
| /* u_short fid_data0; */ |
| memcpy(host_fh->fh_fid.fid_data, target_fh->fh_fid.fid_data, |
| TARGET_MAXFIDSZ); |
| unlock_user_struct(target_fh, target_addr, 0); |
| return 0; |
| } |
| |
| abi_long h2t_freebsd_fhandle(abi_ulong target_addr, fhandle_t *host_fh) |
| { |
| target_freebsd_fhandle_t *target_fh; |
| |
| if (!lock_user_struct(VERIFY_WRITE, target_fh, target_addr, 0)) { |
| return -TARGET_EFAULT; |
| } |
| __put_user(host_fh->fh_fsid.val[0], &target_fh->fh_fsid.val[0]); |
| __put_user(host_fh->fh_fsid.val[1], &target_fh->fh_fsid.val[0]); |
| __put_user(host_fh->fh_fid.fid_len, &target_fh->fh_fid.fid_len); |
| /* u_short fid_data0; */ |
| memcpy(target_fh->fh_fid.fid_data, host_fh->fh_fid.fid_data, |
| TARGET_MAXFIDSZ); |
| unlock_user_struct(target_fh, target_addr, 1); |
| return 0; |
| } |
| |
| /* |
| * file system stat |
| */ |
| abi_long h2t_freebsd11_statfs(abi_ulong target_addr, |
| struct freebsd11_statfs *host_statfs) |
| { |
| struct target_freebsd11_statfs *target_statfs; |
| |
| if (!lock_user_struct(VERIFY_WRITE, target_statfs, target_addr, 0)) { |
| return -TARGET_EFAULT; |
| } |
| __put_user(host_statfs->f_version, &target_statfs->f_version); |
| __put_user(host_statfs->f_type, &target_statfs->f_type); |
| __put_user(host_statfs->f_flags, &target_statfs->f_flags); |
| __put_user(host_statfs->f_bsize, &target_statfs->f_bsize); |
| __put_user(host_statfs->f_iosize, &target_statfs->f_iosize); |
| __put_user(host_statfs->f_blocks, &target_statfs->f_blocks); |
| __put_user(host_statfs->f_bfree, &target_statfs->f_bfree); |
| __put_user(host_statfs->f_bavail, &target_statfs->f_bavail); |
| __put_user(host_statfs->f_files, &target_statfs->f_files); |
| __put_user(host_statfs->f_ffree, &target_statfs->f_ffree); |
| __put_user(host_statfs->f_syncwrites, &target_statfs->f_syncwrites); |
| __put_user(host_statfs->f_asyncwrites, &target_statfs->f_asyncwrites); |
| __put_user(host_statfs->f_syncreads, &target_statfs->f_syncreads); |
| __put_user(host_statfs->f_asyncreads, &target_statfs->f_asyncreads); |
| /* uint64_t f_spare[10]; */ |
| __put_user(host_statfs->f_namemax, &target_statfs->f_namemax); |
| __put_user(host_statfs->f_owner, &target_statfs->f_owner); |
| __put_user(host_statfs->f_fsid.val[0], &target_statfs->f_fsid.val[0]); |
| __put_user(host_statfs->f_fsid.val[1], &target_statfs->f_fsid.val[1]); |
| /* char f_charspace[80]; */ |
| strncpy(target_statfs->f_fstypename, host_statfs->f_fstypename, |
| sizeof(target_statfs->f_fstypename)); |
| strncpy(target_statfs->f_mntfromname, host_statfs->f_mntfromname, |
| sizeof(target_statfs->f_mntfromname)); |
| strncpy(target_statfs->f_mntonname, host_statfs->f_mntonname, |
| sizeof(target_statfs->f_mntonname)); |
| unlock_user_struct(target_statfs, target_addr, 1); |
| return 0; |
| } |
| |
| abi_long h2t_freebsd_statfs(abi_ulong target_addr, |
| struct statfs *host_statfs) |
| { |
| struct target_statfs *target_statfs; |
| |
| if (!lock_user_struct(VERIFY_WRITE, target_statfs, target_addr, 0)) { |
| return -TARGET_EFAULT; |
| } |
| __put_user(host_statfs->f_version, &target_statfs->f_version); |
| __put_user(host_statfs->f_type, &target_statfs->f_type); |
| __put_user(host_statfs->f_flags, &target_statfs->f_flags); |
| __put_user(host_statfs->f_bsize, &target_statfs->f_bsize); |
| __put_user(host_statfs->f_iosize, &target_statfs->f_iosize); |
| __put_user(host_statfs->f_blocks, &target_statfs->f_blocks); |
| __put_user(host_statfs->f_bfree, &target_statfs->f_bfree); |
| __put_user(host_statfs->f_bavail, &target_statfs->f_bavail); |
| __put_user(host_statfs->f_files, &target_statfs->f_files); |
| __put_user(host_statfs->f_ffree, &target_statfs->f_ffree); |
| __put_user(host_statfs->f_syncwrites, &target_statfs->f_syncwrites); |
| __put_user(host_statfs->f_asyncwrites, &target_statfs->f_asyncwrites); |
| __put_user(host_statfs->f_syncreads, &target_statfs->f_syncreads); |
| __put_user(host_statfs->f_asyncreads, &target_statfs->f_asyncreads); |
| /* uint64_t f_spare[10]; */ |
| __put_user(host_statfs->f_namemax, &target_statfs->f_namemax); |
| __put_user(host_statfs->f_owner, &target_statfs->f_owner); |
| __put_user(host_statfs->f_fsid.val[0], &target_statfs->f_fsid.val[0]); |
| __put_user(host_statfs->f_fsid.val[1], &target_statfs->f_fsid.val[1]); |
| /* char f_charspace[80]; */ |
| strncpy(target_statfs->f_fstypename, host_statfs->f_fstypename, |
| sizeof(target_statfs->f_fstypename)); |
| strncpy(target_statfs->f_mntfromname, host_statfs->f_mntfromname, |
| sizeof(target_statfs->f_mntfromname)); |
| strncpy(target_statfs->f_mntonname, host_statfs->f_mntonname, |
| sizeof(target_statfs->f_mntonname)); |
| unlock_user_struct(target_statfs, target_addr, 1); |
| return 0; |
| } |
| |
| /* |
| * fcntl cmd conversion |
| */ |
| abi_long target_to_host_fcntl_cmd(int cmd) |
| { |
| return cmd; |
| } |
| |