xref: /netbsd-src/sys/compat/aoutm68k/aoutm68k_stat.c (revision 7fa608457b817eca6e0977b37f758ae064f3c99c)
1 /*	$NetBSD: aoutm68k_stat.c,v 1.20 2007/04/30 14:05:47 dsl Exp $	*/
2 
3 /*-
4  * Copyright (c) 2000 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Steve C. Woodford.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #include <sys/cdefs.h>
40 __KERNEL_RCSID(0, "$NetBSD: aoutm68k_stat.c,v 1.20 2007/04/30 14:05:47 dsl Exp $");
41 
42 #if defined(_KERNEL_OPT)
43 #include "opt_compat_netbsd.h"
44 #include "opt_compat_43.h"
45 #endif
46 
47 #include <sys/param.h>
48 #include <sys/systm.h>
49 #include <sys/filedesc.h>
50 #include <sys/mount.h>
51 #include <sys/namei.h>
52 #include <sys/proc.h>
53 #include <sys/stat.h>
54 #include <sys/vfs_syscalls.h>
55 
56 #include <sys/syscall.h>
57 #include <sys/syscallargs.h>
58 
59 #include <compat/sys/stat.h>
60 
61 #include <compat/aoutm68k/aoutm68k_util.h>
62 #include <compat/aoutm68k/aoutm68k_stat.h>
63 #include <compat/aoutm68k/aoutm68k_syscall.h>
64 #include <compat/aoutm68k/aoutm68k_syscallargs.h>
65 
66 #ifdef COMPAT_43
67 static void aoutm68k_stat43_convert(struct stat *, struct aoutm68k_stat43 *);
68 #endif
69 #ifdef COMPAT_12
70 static void aoutm68k_stat12_convert(struct stat *, struct aoutm68k_stat12 *);
71 #endif
72 static void aoutm68k_stat13_convert(struct stat *, struct aoutm68k_stat *);
73 
74 
75 #ifdef COMPAT_43
76 int
77 aoutm68k_compat_43_sys_stat(l, v, retval)
78 	struct lwp *l;
79 	void *v;
80 	register_t *retval;
81 {
82 	struct aoutm68k_compat_43_sys_stat_args *uap = v;
83 	struct aoutm68k_stat43 ast;
84 	struct stat sb;
85 	int error;
86 
87 	error = do_sys_stat(l, SCARG(uap, path), FOLLOW, &sb);
88 	if (error)
89 		return error;
90 
91 	aoutm68k_stat43_convert(&sb, &ast);
92 
93 	return copyout(&ast, SCARG(uap, ub), sizeof(ast));
94 }
95 
96 int
97 aoutm68k_compat_43_sys_fstat(l, v, retval)
98 	struct lwp *l;
99 	void *v;
100 	register_t *retval;
101 {
102 	struct aoutm68k_compat_43_sys_fstat_args *uap = v;
103 	struct aoutm68k_stat43 ast;
104 	struct stat sb;
105 	int error;
106 
107 	error = do_sys_fstat(l, SCARG(uap, fd), &sb);
108 	if (error != 0)
109 		return error;
110 
111 	aoutm68k_stat43_convert(&sb, &ast);
112 
113 	return copyout(&ast, SCARG(uap, sb), sizeof(ast));
114 }
115 
116 int
117 aoutm68k_compat_43_sys_lstat(l, v, retval)
118 	struct lwp *l;
119 	void *v;
120 	register_t *retval;
121 {
122 	struct aoutm68k_compat_43_sys_lstat_args *uap = v;
123 	struct aoutm68k_stat43 ast;
124 	struct stat sb;
125 	int error;
126 
127 	error = do_sys_stat(l, SCARG(uap, path), NOFOLLOW, &sb);
128 	if (error)
129 		return error;
130 
131 	aoutm68k_stat43_convert(&sb, &ast);
132 
133 	return copyout(&ast, SCARG(uap, ub), sizeof(ast));
134 }
135 #endif /* COMPAT_43 */
136 
137 #ifdef COMPAT_12
138 int
139 aoutm68k_compat_12_sys_stat(l, v, retval)
140 	struct lwp *l;
141 	void *v;
142 	register_t *retval;
143 {
144 	struct aoutm68k_compat_12_sys_stat_args *uap = v;
145 	struct aoutm68k_stat12 ast;
146 	struct stat sb;
147 	int error;
148 
149 	error = do_sys_stat(l, SCARG(uap, path), FOLLOW, &sb);
150 	if (error)
151 		return error;
152 
153 	aoutm68k_stat12_convert(&sb, &ast);
154 
155 	return copyout(&ast, SCARG(uap, ub), sizeof(ast));
156 }
157 
158 int
159 aoutm68k_compat_12_sys_fstat(l, v, retval)
160 	struct lwp *l;
161 	void *v;
162 	register_t *retval;
163 {
164 	struct aoutm68k_compat_12_sys_fstat_args *uap = v;
165 	struct aoutm68k_stat12 ast;
166 	struct stat sb;
167 	int error;
168 
169 	error = do_sys_fstat(l, SCARG(uap, fd), &sb);
170 	if (error != 0)
171 		return error;
172 
173 	aoutm68k_stat12_convert(&sb, &ast);
174 
175 	return copyout(&ast, SCARG(uap, sb), sizeof(ast));
176 }
177 
178 int
179 aoutm68k_compat_12_sys_lstat(l, v, retval)
180 	struct lwp *l;
181 	void *v;
182 	register_t *retval;
183 {
184 	struct aoutm68k_compat_12_sys_lstat_args *uap = v;
185 	struct aoutm68k_stat12 ast;
186 	struct stat sb;
187 	int error;
188 
189 	error = do_sys_stat(l, SCARG(uap, path), NOFOLLOW, &sb);
190 	if (error)
191 		return error;
192 
193 	aoutm68k_stat12_convert(&sb, &ast);
194 
195 	return copyout(&ast, SCARG(uap, ub), sizeof(ast));
196 }
197 #endif /* COMPAT_12 */
198 
199 int
200 aoutm68k_sys___stat13(l, v, retval)
201 	struct lwp *l;
202 	void *v;
203 	register_t *retval;
204 {
205 	struct aoutm68k_sys___stat13_args *uap = v;
206 	struct aoutm68k_stat ast;
207 	struct stat sb;
208 	int error;
209 
210 	error = do_sys_stat(l, SCARG(uap, path), FOLLOW, &sb);
211 	if (error)
212 		return error;
213 
214 	aoutm68k_stat13_convert(&sb, &ast);
215 
216 	return copyout(&ast, SCARG(uap, ub), sizeof(ast));
217 }
218 
219 int
220 aoutm68k_sys___fstat13(l, v, retval)
221 	struct lwp *l;
222 	void *v;
223 	register_t *retval;
224 {
225 	struct aoutm68k_sys___fstat13_args *uap = v;
226 	struct aoutm68k_stat ast;
227 	struct stat sb;
228 	int error;
229 
230 	error = do_sys_fstat(l, SCARG(uap, fd), &sb);
231 	if (error != 0)
232 		return error;
233 
234 	aoutm68k_stat13_convert(&sb, &ast);
235 
236 	return copyout(&ast, SCARG(uap, sb), sizeof(ast));
237 
238 }
239 
240 int
241 aoutm68k_sys___lstat13(l, v, retval)
242 	struct lwp *l;
243 	void *v;
244 	register_t *retval;
245 {
246 	struct aoutm68k_sys___lstat13_args *uap = v;
247 	struct aoutm68k_stat ast;
248 	struct stat sb;
249 	int error;
250 
251 	error = do_sys_stat(l, SCARG(uap, path), NOFOLLOW, &sb);
252 	if (error)
253 		return error;
254 
255 	aoutm68k_stat13_convert(&sb, &ast);
256 
257 	return copyout(&ast, SCARG(uap, ub), sizeof(ast));
258 }
259 
260 int
261 aoutm68k_sys_fhstat(l, v, retval)
262 	struct lwp *l;
263 	void *v;
264 	register_t *retval;
265 {
266 	struct aoutm68k_sys_fhstat_args *uap = v;
267 	struct aoutm68k_stat ast;
268 	struct stat sb;
269 	int error;
270 
271 	error = do_fhstat(l, SCARG(uap, fhp), FHANDLE_SIZE_COMPAT, &sb);
272 	if (error)
273 		return error;
274 
275 	aoutm68k_stat13_convert(&sb, &ast);
276 	return copyout(&sb, SCARG(uap, sb), sizeof(sb));
277 }
278 
279 #ifdef COMPAT_43
280 static void
281 aoutm68k_stat43_convert(st, ast)
282 	struct stat *st;
283 	struct aoutm68k_stat43 *ast;
284 {
285 
286 	memset(ast, 0, sizeof(*ast));
287 	ast->st_dev = st->st_dev;
288 	ast->st_ino = st->st_ino;
289 	ast->st_mode = st->st_mode;
290 	ast->st_nlink = st->st_nlink;
291 	ast->st_uid = st->st_uid;
292 	ast->st_gid = st->st_gid;
293 	ast->st_rdev = st->st_rdev;
294 	if (st->st_size < (off_t)1 << 32)
295 		ast->st_size = st->st_size;
296 	else
297 		ast->st_size = -2;
298 	ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec;
299 	ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec;
300 	ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec;
301 	ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec;
302 	ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec;
303 	ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec;
304 	ast->st_blksize = st->st_blksize;
305 	ast->st_blocks = st->st_blocks;
306 	ast->st_flags = st->st_flags;
307 	ast->st_gen = st->st_gen;
308 }
309 #endif /* COMPAT_43 */
310 
311 #ifdef COMPAT_12
312 static void
313 aoutm68k_stat12_convert(st, ast)
314 	struct stat *st;
315 	struct aoutm68k_stat12 *ast;
316 {
317 
318 	memset(ast, 0, sizeof(*ast));
319 	ast->st_dev = st->st_dev;
320 	ast->st_ino = st->st_ino;
321 	ast->st_mode = st->st_mode;
322 	ast->st_nlink = st->st_nlink;
323 	ast->st_uid = st->st_uid;
324 	ast->st_gid = st->st_gid;
325 	ast->st_rdev = st->st_rdev;
326 	ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec;
327 	ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec;
328 	ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec;
329 	ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec;
330 	ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec;
331 	ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec;
332 	if (st->st_size < (off_t)1 << 32)
333 		ast->st_size = st->st_size;
334 	else
335 		ast->st_size = -2;
336 	ast->st_blocks = st->st_blocks;
337 	ast->st_blksize = st->st_blksize;
338 	ast->st_flags = st->st_flags;
339 	ast->st_gen = st->st_gen;
340 }
341 #endif /* COMPAT_12 */
342 
343 static void
344 aoutm68k_stat13_convert(st, ast)
345 	struct stat *st;
346 	struct aoutm68k_stat *ast;
347 {
348 
349 	memset(ast, 0, sizeof(*ast));
350 	ast->st_dev = st->st_dev;
351 	ast->st_ino = st->st_ino;
352 	ast->st_mode = st->st_mode;
353 	ast->st_nlink = st->st_nlink;
354 	ast->st_uid = st->st_uid;
355 	ast->st_gid = st->st_gid;
356 	ast->st_rdev = st->st_rdev;
357 	ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec;
358 	ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec;
359 	ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec;
360 	ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec;
361 	ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec;
362 	ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec;
363 	if (st->st_size < (off_t)1 << 32)
364 		ast->st_size = st->st_size;
365 	else
366 		ast->st_size = -2;
367 	ast->st_blocks = st->st_blocks;
368 	ast->st_blksize = st->st_blksize;
369 	ast->st_flags = st->st_flags;
370 	ast->st_gen = st->st_gen;
371 	ast->st_qspare[0] = 0;
372 	ast->st_qspare[1] = 0;
373 }
374