xref: /netbsd-src/sys/compat/aoutm68k/aoutm68k_stat.c (revision 23c8222edbfb0f0932d88a8351d3a0cf817dfb9e)
1 /*	$NetBSD: aoutm68k_stat.c,v 1.10 2003/06/29 22:29:12 fvdl 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.10 2003/06/29 22:29:12 fvdl 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/mount.h>
50 #include <sys/proc.h>
51 #include <sys/stat.h>
52 
53 #include <sys/syscall.h>
54 #include <sys/sa.h>
55 #include <sys/syscallargs.h>
56 
57 #include <compat/aoutm68k/aoutm68k_util.h>
58 #include <compat/aoutm68k/aoutm68k_stat.h>
59 #include <compat/aoutm68k/aoutm68k_syscall.h>
60 #include <compat/aoutm68k/aoutm68k_syscallargs.h>
61 
62 #ifdef COMPAT_43
63 static void aoutm68k_stat43_convert(struct stat43 *, struct aoutm68k_stat43 *);
64 #endif
65 #ifdef COMPAT_12
66 static void aoutm68k_stat12_convert(struct stat12 *, struct aoutm68k_stat12 *);
67 #endif
68 static void aoutm68k_stat13_convert(struct stat *, struct aoutm68k_stat *);
69 
70 
71 #ifdef COMPAT_43
72 int
73 aoutm68k_compat_43_sys_stat(l, v, retval)
74 	struct lwp *l;
75 	void *v;
76 	register_t *retval;
77 {
78 	struct aoutm68k_compat_43_sys_stat_args *uap = v;
79 	struct proc *p = l->l_proc;
80 	caddr_t sg = stackgap_init(p, 0);
81 	struct compat_43_sys_stat_args cup;
82 	struct aoutm68k_stat43 ast;
83 	struct stat43 st;
84 	int error;
85 
86 	SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st));
87 #ifdef COMPAT_AOUT_ALTPATH
88 	CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
89 #endif
90 	SCARG(&cup, path) = SCARG(uap, path);
91 
92 	if ((error = compat_43_sys_stat(l, &cup, retval)) != 0 ||
93 	    (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
94 		return (error);
95 
96 	aoutm68k_stat43_convert(&st, &ast);
97 
98 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast)));
99 }
100 
101 int
102 aoutm68k_compat_43_sys_fstat(l, v, retval)
103 	struct lwp *l;
104 	void *v;
105 	register_t *retval;
106 {
107 	struct aoutm68k_compat_43_sys_fstat_args *uap = v;
108 	struct proc *p = l->l_proc;
109 	caddr_t sg = stackgap_init(p, 0);
110 	struct compat_43_sys_fstat_args cup;
111 	struct aoutm68k_stat43 ast;
112 	struct stat43 st;
113 	int error;
114 
115 	SCARG(&cup, fd) = SCARG(uap, fd);
116 	SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st));
117 
118 	if ((error = compat_43_sys_fstat(l, &cup, retval)) != 0 ||
119 	    (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0)
120 		return (error);
121 
122 	aoutm68k_stat43_convert(&st, &ast);
123 
124 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast)));
125 }
126 
127 int
128 aoutm68k_compat_43_sys_lstat(l, v, retval)
129 	struct lwp *l;
130 	void *v;
131 	register_t *retval;
132 {
133 	struct aoutm68k_compat_43_sys_lstat_args *uap = v;
134 	struct proc *p = l->l_proc;
135 	caddr_t sg = stackgap_init(p, 0);
136 	struct compat_43_sys_lstat_args cup;
137 	struct aoutm68k_stat43 ast;
138 	struct stat43 st;
139 	int error;
140 
141 	SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st));
142 #ifdef COMPAT_AOUT_ALTPATH
143 	CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
144 #endif
145 	SCARG(&cup, path) = SCARG(uap, path);
146 
147 	if ((error = compat_43_sys_lstat(l, &cup, retval)) != 0 ||
148 	    (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
149 		return (error);
150 
151 	aoutm68k_stat43_convert(&st, &ast);
152 
153 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast)));
154 }
155 #endif /* COMPAT_43 */
156 
157 #ifdef COMPAT_12
158 int
159 aoutm68k_compat_12_sys_stat(l, v, retval)
160 	struct lwp *l;
161 	void *v;
162 	register_t *retval;
163 {
164 	struct aoutm68k_compat_12_sys_stat_args *uap = v;
165 	struct proc *p = l->l_proc;
166 	caddr_t sg = stackgap_init(p, 0);
167 	struct compat_12_sys_stat_args cup;
168 	struct aoutm68k_stat12 ast;
169 	struct stat12 st;
170 	int error;
171 
172 	SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st));
173 #ifdef COMPAT_AOUT_ALTPATH
174 	CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
175 #endif
176 	SCARG(&cup, path) = SCARG(uap, path);
177 
178 	if ((error = compat_12_sys_stat(l, &cup, retval)) != 0 ||
179 	    (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
180 		return (error);
181 
182 	aoutm68k_stat12_convert(&st, &ast);
183 
184 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast)));
185 }
186 
187 int
188 aoutm68k_compat_12_sys_fstat(l, v, retval)
189 	struct lwp *l;
190 	void *v;
191 	register_t *retval;
192 {
193 	struct aoutm68k_compat_12_sys_fstat_args *uap = v;
194 	struct proc *p = l->l_proc;
195 	caddr_t sg = stackgap_init(p, 0);
196 	struct compat_12_sys_fstat_args cup;
197 	struct aoutm68k_stat12 ast;
198 	struct stat12 st;
199 	int error;
200 
201 	SCARG(&cup, fd) = SCARG(uap, fd);
202 	SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st));
203 
204 	if ((error = compat_12_sys_fstat(l, &cup, retval)) != 0 ||
205 	    (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0)
206 		return (error);
207 
208 	aoutm68k_stat12_convert(&st, &ast);
209 
210 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast)));
211 }
212 
213 int
214 aoutm68k_compat_12_sys_lstat(l, v, retval)
215 	struct lwp *l;
216 	void *v;
217 	register_t *retval;
218 {
219 	struct aoutm68k_compat_12_sys_lstat_args *uap = v;
220 	struct proc *p = l->l_proc;
221 	caddr_t sg = stackgap_init(p, 0);
222 	struct compat_12_sys_lstat_args cup;
223 	struct aoutm68k_stat12 ast;
224 	struct stat12 st;
225 	int error;
226 
227 	SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st));
228 #ifdef COMPAT_AOUT_ALTPATH
229 	CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
230 #endif
231 	SCARG(&cup, path) = SCARG(uap, path);
232 
233 	if ((error = compat_12_sys_lstat(l, &cup, retval)) != 0 ||
234 	    (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
235 		return (error);
236 
237 	aoutm68k_stat12_convert(&st, &ast);
238 
239 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast)));
240 }
241 #endif /* COMPAT_12 */
242 
243 int
244 aoutm68k_sys___stat13(l, v, retval)
245 	struct lwp *l;
246 	void *v;
247 	register_t *retval;
248 {
249 	struct aoutm68k_sys___stat13_args *uap = v;
250 	struct proc *p = l->l_proc;
251 	caddr_t sg = stackgap_init(p, 0);
252 	struct sys___stat13_args cup;
253 	struct aoutm68k_stat ast;
254 	struct stat st;
255 	int error;
256 
257 	SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st));
258 #ifdef COMPAT_AOUT_ALTPATH
259 	CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
260 #endif
261 	SCARG(&cup, path) = SCARG(uap, path);
262 
263 	if ((error = sys___stat13(l, &cup, retval)) != 0 ||
264 	    (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
265 		return (error);
266 
267 	aoutm68k_stat13_convert(&st, &ast);
268 
269 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast)));
270 }
271 
272 int
273 aoutm68k_sys___fstat13(l, v, retval)
274 	struct lwp *l;
275 	void *v;
276 	register_t *retval;
277 {
278 	struct aoutm68k_sys___fstat13_args *uap = v;
279 	struct proc *p = l->l_proc;
280 	caddr_t sg = stackgap_init(p, 0);
281 	struct sys___fstat13_args cup;
282 	struct aoutm68k_stat ast;
283 	struct stat st;
284 	int error;
285 
286 	SCARG(&cup, fd) = SCARG(uap, fd);
287 	SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st));
288 
289 	if ((error = sys___fstat13(l, &cup, retval)) != 0 ||
290 	    (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0)
291 		return (error);
292 
293 	aoutm68k_stat13_convert(&st, &ast);
294 
295 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast)));
296 
297 }
298 
299 int
300 aoutm68k_sys___lstat13(l, v, retval)
301 	struct lwp *l;
302 	void *v;
303 	register_t *retval;
304 {
305 	struct aoutm68k_sys___lstat13_args *uap = v;
306 	struct proc *p = l->l_proc;
307 	caddr_t sg = stackgap_init(p, 0);
308 	struct sys___lstat13_args cup;
309 	struct aoutm68k_stat ast;
310 	struct stat st;
311 	int error;
312 
313 	SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st));
314 #ifdef COMPAT_AOUT_ALTPATH
315 	CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
316 #endif
317 	SCARG(&cup, path) = SCARG(uap, path);
318 
319 	if ((error = sys___lstat13(l, &cup, retval)) != 0 ||
320 	    (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
321 		return (error);
322 
323 	aoutm68k_stat13_convert(&st, &ast);
324 
325 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast)));
326 }
327 
328 int
329 aoutm68k_sys_fhstat(l, v, retval)
330 	struct lwp *l;
331 	void *v;
332 	register_t *retval;
333 {
334 	struct aoutm68k_sys_fhstat_args *uap = v;
335 	struct proc *p = l->l_proc;
336 	caddr_t sg = stackgap_init(p, 0);
337 	struct sys_fhstat_args cup;
338 	struct aoutm68k_stat ast;
339 	struct stat st;
340 	int error;
341 
342 	SCARG(&cup, fhp) = SCARG(uap, fhp);
343 	SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st));
344 
345 	if ((error = sys_fhstat(l, &cup, retval)) != 0 ||
346 	    (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0)
347 		return (error);
348 
349 	aoutm68k_stat13_convert(&st, &ast);
350 
351 	return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast)));
352 }
353 
354 #ifdef COMPAT_43
355 static void
356 aoutm68k_stat43_convert(st, ast)
357 	struct stat43 *st;
358 	struct aoutm68k_stat43 *ast;
359 {
360 
361 	memset(ast, 0, sizeof(*ast));
362 	ast->st_dev = st->st_dev;
363 	ast->st_ino = st->st_ino;
364 	ast->st_mode = st->st_mode;
365 	ast->st_nlink = st->st_nlink;
366 	ast->st_uid = st->st_uid;
367 	ast->st_gid = st->st_gid;
368 	ast->st_rdev = st->st_rdev;
369 	ast->st_size = st->st_size;
370 	ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec;
371 	ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec;
372 	ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec;
373 	ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec;
374 	ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec;
375 	ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec;
376 	ast->st_blksize = st->st_blksize;
377 	ast->st_blocks = st->st_blocks;
378 	ast->st_flags = st->st_flags;
379 	ast->st_gen = st->st_gen;
380 }
381 #endif /* COMPAT_43 */
382 
383 #ifdef COMPAT_12
384 static void
385 aoutm68k_stat12_convert(st, ast)
386 	struct stat12 *st;
387 	struct aoutm68k_stat12 *ast;
388 {
389 
390 	memset(ast, 0, sizeof(*ast));
391 	ast->st_dev = st->st_dev;
392 	ast->st_ino = st->st_ino;
393 	ast->st_mode = st->st_mode;
394 	ast->st_nlink = st->st_nlink;
395 	ast->st_uid = st->st_uid;
396 	ast->st_gid = st->st_gid;
397 	ast->st_rdev = st->st_rdev;
398 	ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec;
399 	ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec;
400 	ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec;
401 	ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec;
402 	ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec;
403 	ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec;
404 	ast->st_size = st->st_size;
405 	ast->st_blocks = st->st_blocks;
406 	ast->st_blksize = st->st_blksize;
407 	ast->st_flags = st->st_flags;
408 	ast->st_gen = st->st_gen;
409 	ast->st_lspare = st->st_lspare;
410 	ast->st_qspare[0] = st->st_qspare[0];
411 	ast->st_qspare[1] = st->st_qspare[1];
412 }
413 #endif /* COMPAT_12 */
414 
415 static void
416 aoutm68k_stat13_convert(st, ast)
417 	struct stat *st;
418 	struct aoutm68k_stat *ast;
419 {
420 
421 	memset(ast, 0, sizeof(*ast));
422 	ast->st_dev = st->st_dev;
423 	ast->st_ino = st->st_ino;
424 	ast->st_mode = st->st_mode;
425 	ast->st_nlink = st->st_nlink;
426 	ast->st_uid = st->st_uid;
427 	ast->st_gid = st->st_gid;
428 	ast->st_rdev = st->st_rdev;
429 	ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec;
430 	ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec;
431 	ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec;
432 	ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec;
433 	ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec;
434 	ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec;
435 	ast->st_size = st->st_size;
436 	ast->st_blocks = st->st_blocks;
437 	ast->st_blksize = st->st_blksize;
438 	ast->st_flags = st->st_flags;
439 	ast->st_gen = st->st_gen;
440 	ast->st_qspare[0] = 0;
441 	ast->st_qspare[1] = 0;
442 }
443