2 * FreeBSD stat related conversion routines
4 * Copyright (c) 2013 Stacey D. Son
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
19 #include "qemu/osdep.h"
26 abi_long
h2t_freebsd11_stat(abi_ulong target_addr
,
27 struct freebsd11_stat
*host_st
)
29 struct target_freebsd11_stat
*target_st
;
31 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0)) {
32 return -TARGET_EFAULT
;
34 memset(target_st
, 0, sizeof(*target_st
));
35 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
36 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
37 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
38 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
39 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
40 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
41 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
42 __put_user(host_st
->st_atim
.tv_sec
, &target_st
->st_atim
.tv_sec
);
43 __put_user(host_st
->st_atim
.tv_nsec
, &target_st
->st_atim
.tv_nsec
);
44 __put_user(host_st
->st_mtim
.tv_sec
, &target_st
->st_mtim
.tv_sec
);
45 __put_user(host_st
->st_mtim
.tv_nsec
, &target_st
->st_mtim
.tv_nsec
);
46 __put_user(host_st
->st_ctim
.tv_sec
, &target_st
->st_ctim
.tv_sec
);
47 __put_user(host_st
->st_ctim
.tv_nsec
, &target_st
->st_ctim
.tv_nsec
);
48 __put_user(host_st
->st_size
, &target_st
->st_size
);
49 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
50 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
51 __put_user(host_st
->st_flags
, &target_st
->st_flags
);
52 __put_user(host_st
->st_gen
, &target_st
->st_gen
);
53 /* st_lspare not used */
54 __put_user(host_st
->st_birthtim
.tv_sec
, &target_st
->st_birthtim
.tv_sec
);
55 __put_user(host_st
->st_birthtim
.tv_nsec
, &target_st
->st_birthtim
.tv_nsec
);
56 unlock_user_struct(target_st
, target_addr
, 1);
61 abi_long
h2t_freebsd_stat(abi_ulong target_addr
,
64 struct target_stat
*target_st
;
66 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0)) {
67 return -TARGET_EFAULT
;
69 memset(target_st
, 0, sizeof(*target_st
));
70 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
71 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
72 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
73 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
74 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
75 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
76 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
77 __put_user(host_st
->st_atim
.tv_sec
, &target_st
->st_atim
.tv_sec
);
78 __put_user(host_st
->st_atim
.tv_nsec
, &target_st
->st_atim
.tv_nsec
);
79 #ifdef TARGET_HAS_STAT_TIME_T_EXT
80 /* __put_user(host_st->st_mtim_ext, &target_st->st_mtim_ext); XXX */
82 __put_user(host_st
->st_mtim
.tv_sec
, &target_st
->st_mtim
.tv_sec
);
83 __put_user(host_st
->st_mtim
.tv_nsec
, &target_st
->st_mtim
.tv_nsec
);
84 #ifdef TARGET_HAS_STAT_TIME_T_EXT
85 /* __put_user(host_st->st_ctim_ext, &target_st->st_ctim_ext); XXX */
87 __put_user(host_st
->st_ctim
.tv_sec
, &target_st
->st_ctim
.tv_sec
);
88 __put_user(host_st
->st_ctim
.tv_nsec
, &target_st
->st_ctim
.tv_nsec
);
89 #ifdef TARGET_HAS_STAT_TIME_T_EXT
90 /* __put_user(host_st->st_birthtim_ext, &target_st->st_birthtim_ext); XXX */
92 __put_user(host_st
->st_birthtim
.tv_sec
, &target_st
->st_birthtim
.tv_sec
);
93 __put_user(host_st
->st_birthtim
.tv_nsec
, &target_st
->st_birthtim
.tv_nsec
);
95 __put_user(host_st
->st_size
, &target_st
->st_size
);
96 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
97 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
98 __put_user(host_st
->st_flags
, &target_st
->st_flags
);
99 __put_user(host_st
->st_gen
, &target_st
->st_gen
);
100 unlock_user_struct(target_st
, target_addr
, 1);
105 abi_long
h2t_freebsd11_nstat(abi_ulong target_addr
,
106 struct freebsd11_stat
*host_st
)
108 struct target_freebsd11_nstat
*target_st
;
110 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0)) {
111 return -TARGET_EFAULT
;
113 memset(target_st
, 0, sizeof(*target_st
));
114 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
115 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
116 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
117 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
118 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
119 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
120 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
121 __put_user(host_st
->st_atim
.tv_sec
, &target_st
->st_atim
.tv_sec
);
122 __put_user(host_st
->st_atim
.tv_nsec
, &target_st
->st_atim
.tv_nsec
);
123 __put_user(host_st
->st_mtim
.tv_sec
, &target_st
->st_mtim
.tv_sec
);
124 __put_user(host_st
->st_mtim
.tv_nsec
, &target_st
->st_mtim
.tv_nsec
);
125 __put_user(host_st
->st_ctim
.tv_sec
, &target_st
->st_ctim
.tv_sec
);
126 __put_user(host_st
->st_ctim
.tv_nsec
, &target_st
->st_ctim
.tv_nsec
);
127 __put_user(host_st
->st_size
, &target_st
->st_size
);
128 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
129 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
130 __put_user(host_st
->st_flags
, &target_st
->st_flags
);
131 __put_user(host_st
->st_gen
, &target_st
->st_gen
);
132 __put_user(host_st
->st_birthtim
.tv_sec
, &target_st
->st_birthtim
.tv_sec
);
133 __put_user(host_st
->st_birthtim
.tv_nsec
, &target_st
->st_birthtim
.tv_nsec
);
134 unlock_user_struct(target_st
, target_addr
, 1);
140 * file handle conversion
142 abi_long
t2h_freebsd_fhandle(fhandle_t
*host_fh
, abi_ulong target_addr
)
144 target_freebsd_fhandle_t
*target_fh
;
146 if (!lock_user_struct(VERIFY_READ
, target_fh
, target_addr
, 1)) {
147 return -TARGET_EFAULT
;
149 __get_user(host_fh
->fh_fsid
.val
[0], &target_fh
->fh_fsid
.val
[0]);
150 __get_user(host_fh
->fh_fsid
.val
[1], &target_fh
->fh_fsid
.val
[0]);
151 __get_user(host_fh
->fh_fid
.fid_len
, &target_fh
->fh_fid
.fid_len
);
152 /* u_short fid_data0; */
153 memcpy(host_fh
->fh_fid
.fid_data
, target_fh
->fh_fid
.fid_data
,
155 unlock_user_struct(target_fh
, target_addr
, 0);
159 abi_long
h2t_freebsd_fhandle(abi_ulong target_addr
, fhandle_t
*host_fh
)
161 target_freebsd_fhandle_t
*target_fh
;
163 if (!lock_user_struct(VERIFY_WRITE
, target_fh
, target_addr
, 0)) {
164 return -TARGET_EFAULT
;
166 __put_user(host_fh
->fh_fsid
.val
[0], &target_fh
->fh_fsid
.val
[0]);
167 __put_user(host_fh
->fh_fsid
.val
[1], &target_fh
->fh_fsid
.val
[0]);
168 __put_user(host_fh
->fh_fid
.fid_len
, &target_fh
->fh_fid
.fid_len
);
169 /* u_short fid_data0; */
170 memcpy(target_fh
->fh_fid
.fid_data
, host_fh
->fh_fid
.fid_data
,
172 unlock_user_struct(target_fh
, target_addr
, 1);
179 abi_long
h2t_freebsd11_statfs(abi_ulong target_addr
,
180 struct freebsd11_statfs
*host_statfs
)
182 struct target_freebsd11_statfs
*target_statfs
;
184 if (!lock_user_struct(VERIFY_WRITE
, target_statfs
, target_addr
, 0)) {
185 return -TARGET_EFAULT
;
187 __put_user(host_statfs
->f_version
, &target_statfs
->f_version
);
188 __put_user(host_statfs
->f_type
, &target_statfs
->f_type
);
189 __put_user(host_statfs
->f_flags
, &target_statfs
->f_flags
);
190 __put_user(host_statfs
->f_bsize
, &target_statfs
->f_bsize
);
191 __put_user(host_statfs
->f_iosize
, &target_statfs
->f_iosize
);
192 __put_user(host_statfs
->f_blocks
, &target_statfs
->f_blocks
);
193 __put_user(host_statfs
->f_bfree
, &target_statfs
->f_bfree
);
194 __put_user(host_statfs
->f_bavail
, &target_statfs
->f_bavail
);
195 __put_user(host_statfs
->f_files
, &target_statfs
->f_files
);
196 __put_user(host_statfs
->f_ffree
, &target_statfs
->f_ffree
);
197 __put_user(host_statfs
->f_syncwrites
, &target_statfs
->f_syncwrites
);
198 __put_user(host_statfs
->f_asyncwrites
, &target_statfs
->f_asyncwrites
);
199 __put_user(host_statfs
->f_syncreads
, &target_statfs
->f_syncreads
);
200 __put_user(host_statfs
->f_asyncreads
, &target_statfs
->f_asyncreads
);
201 /* uint64_t f_spare[10]; */
202 __put_user(host_statfs
->f_namemax
, &target_statfs
->f_namemax
);
203 __put_user(host_statfs
->f_owner
, &target_statfs
->f_owner
);
204 __put_user(host_statfs
->f_fsid
.val
[0], &target_statfs
->f_fsid
.val
[0]);
205 __put_user(host_statfs
->f_fsid
.val
[1], &target_statfs
->f_fsid
.val
[1]);
206 /* char f_charspace[80]; */
207 strncpy(target_statfs
->f_fstypename
, host_statfs
->f_fstypename
,
208 sizeof(target_statfs
->f_fstypename
));
209 strncpy(target_statfs
->f_mntfromname
, host_statfs
->f_mntfromname
,
210 sizeof(target_statfs
->f_mntfromname
));
211 strncpy(target_statfs
->f_mntonname
, host_statfs
->f_mntonname
,
212 sizeof(target_statfs
->f_mntonname
));
213 unlock_user_struct(target_statfs
, target_addr
, 1);
217 abi_long
h2t_freebsd_statfs(abi_ulong target_addr
,
218 struct statfs
*host_statfs
)
220 struct target_statfs
*target_statfs
;
222 if (!lock_user_struct(VERIFY_WRITE
, target_statfs
, target_addr
, 0)) {
223 return -TARGET_EFAULT
;
225 __put_user(host_statfs
->f_version
, &target_statfs
->f_version
);
226 __put_user(host_statfs
->f_type
, &target_statfs
->f_type
);
227 __put_user(host_statfs
->f_flags
, &target_statfs
->f_flags
);
228 __put_user(host_statfs
->f_bsize
, &target_statfs
->f_bsize
);
229 __put_user(host_statfs
->f_iosize
, &target_statfs
->f_iosize
);
230 __put_user(host_statfs
->f_blocks
, &target_statfs
->f_blocks
);
231 __put_user(host_statfs
->f_bfree
, &target_statfs
->f_bfree
);
232 __put_user(host_statfs
->f_bavail
, &target_statfs
->f_bavail
);
233 __put_user(host_statfs
->f_files
, &target_statfs
->f_files
);
234 __put_user(host_statfs
->f_ffree
, &target_statfs
->f_ffree
);
235 __put_user(host_statfs
->f_syncwrites
, &target_statfs
->f_syncwrites
);
236 __put_user(host_statfs
->f_asyncwrites
, &target_statfs
->f_asyncwrites
);
237 __put_user(host_statfs
->f_syncreads
, &target_statfs
->f_syncreads
);
238 __put_user(host_statfs
->f_asyncreads
, &target_statfs
->f_asyncreads
);
239 /* uint64_t f_spare[10]; */
240 __put_user(host_statfs
->f_namemax
, &target_statfs
->f_namemax
);
241 __put_user(host_statfs
->f_owner
, &target_statfs
->f_owner
);
242 __put_user(host_statfs
->f_fsid
.val
[0], &target_statfs
->f_fsid
.val
[0]);
243 __put_user(host_statfs
->f_fsid
.val
[1], &target_statfs
->f_fsid
.val
[1]);
244 /* char f_charspace[80]; */
245 strncpy(target_statfs
->f_fstypename
, host_statfs
->f_fstypename
,
246 sizeof(target_statfs
->f_fstypename
));
247 strncpy(target_statfs
->f_mntfromname
, host_statfs
->f_mntfromname
,
248 sizeof(target_statfs
->f_mntfromname
));
249 strncpy(target_statfs
->f_mntonname
, host_statfs
->f_mntonname
,
250 sizeof(target_statfs
->f_mntonname
));
251 unlock_user_struct(target_statfs
, target_addr
, 1);
256 * fcntl cmd conversion
258 abi_long
target_to_host_fcntl_cmd(int cmd
)