aoutm68k_stat.c revision 1.20 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