aoutm68k_stat.c revision 1.7 1 /* $NetBSD: aoutm68k_stat.c,v 1.7 2003/01/18 07:21:14 thorpej 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.7 2003/01/18 07:21:14 thorpej 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] = st->st_qspare[0];
441 ast->st_qspare[1] = st->st_qspare[1];
442 }
443