/* * 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 . */ #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; }