freebsd_file.c revision 1.24.4.1 1 /* $NetBSD: freebsd_file.c,v 1.24.4.1 2007/07/11 20:03:56 mjf Exp $ */
2
3 /*
4 * Copyright (c) 1995 Frank van der Linden
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed for the NetBSD Project
18 * by Frank van der Linden
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 * from: linux_file.c,v 1.3 1995/04/04 04:21:30 mycroft Exp
34 */
35
36 #include <sys/cdefs.h>
37 __KERNEL_RCSID(0, "$NetBSD: freebsd_file.c,v 1.24.4.1 2007/07/11 20:03:56 mjf Exp $");
38
39 #if defined(_KERNEL_OPT)
40 #include "fs_nfs.h"
41 #endif
42
43 #include <sys/param.h>
44 #include <sys/systm.h>
45 #include <sys/namei.h>
46 #include <sys/proc.h>
47 #include <sys/file.h>
48 #include <sys/stat.h>
49 #include <sys/filedesc.h>
50 #include <sys/ioctl.h>
51 #include <sys/kernel.h>
52 #include <sys/mount.h>
53 #include <sys/malloc.h>
54
55 #include <sys/syscallargs.h>
56
57 #include <compat/freebsd/freebsd_syscallargs.h>
58 #include <compat/common/compat_util.h>
59
60 #define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
61
62 static const char * convert_from_freebsd_mount_type __P((int));
63
64 static const char *
65 convert_from_freebsd_mount_type(type)
66 int type;
67 {
68 static const char * const netbsd_mount_type[] = {
69 NULL, /* 0 = MOUNT_NONE */
70 "ffs", /* 1 = "Fast" Filesystem */
71 "nfs", /* 2 = Network Filesystem */
72 "mfs", /* 3 = Memory Filesystem */
73 "msdos", /* 4 = MSDOS Filesystem */
74 "lfs", /* 5 = Log-based Filesystem */
75 "lofs", /* 6 = Loopback filesystem */
76 "fdesc", /* 7 = File Descriptor Filesystem */
77 "portal", /* 8 = Portal Filesystem */
78 "null", /* 9 = Minimal Filesystem Layer */
79 "umap", /* 10 = User/Group Identifier Remapping Filesystem */
80 "kernfs", /* 11 = Kernel Information Filesystem */
81 "procfs", /* 12 = /proc Filesystem */
82 "afs", /* 13 = Andrew Filesystem */
83 "cd9660", /* 14 = ISO9660 (aka CDROM) Filesystem */
84 "union", /* 15 = Union (translucent) Filesystem */
85 NULL, /* 16 = "devfs" - existing device Filesystem */
86 #if 0 /* These filesystems don't exist in FreeBSD */
87 "adosfs", /* ?? = AmigaDOS Filesystem */
88 #endif
89 };
90
91 if (type < 0 || type >= ARRAY_LENGTH(netbsd_mount_type))
92 return (NULL);
93 return (netbsd_mount_type[type]);
94 }
95
96 int
97 freebsd_sys_mount(l, v, retval)
98 struct lwp *l;
99 void *v;
100 register_t *retval;
101 {
102 struct freebsd_sys_mount_args /* {
103 syscallarg(int) type;
104 syscallarg(char *) path;
105 syscallarg(int) flags;
106 syscallarg(void *) data;
107 } */ *uap = v;
108 struct proc *p = l->l_proc;
109 int error;
110 const char *type;
111 char *s;
112 void *sg = stackgap_init(p, 0);
113 struct sys_mount_args bma;
114
115 if ((type = convert_from_freebsd_mount_type(SCARG(uap, type))) == NULL)
116 return ENODEV;
117 s = stackgap_alloc(p, &sg, MFSNAMELEN + 1);
118 if ((error = copyout(type, s, strlen(type) + 1)) != 0)
119 return error;
120 SCARG(&bma, type) = s;
121 SCARG(&bma, path) = SCARG(uap, path);
122 SCARG(&bma, flags) = SCARG(uap, flags);
123 SCARG(&bma, data) = SCARG(uap, data);
124 return sys_mount(l, &bma, retval);
125 }
126
127 /*
128 * The following syscalls are only here because of the alternate path check.
129 */
130
131 /* XXX - UNIX domain: int freebsd_sys_bind(int s, void *name, int namelen); */
132 /* XXX - UNIX domain: int freebsd_sys_connect(int s, void *name, int namelen); */
133
134
135 int
136 freebsd_sys_open(l, v, retval)
137 struct lwp *l;
138 void *v;
139 register_t *retval;
140 {
141 struct freebsd_sys_open_args /* {
142 syscallarg(char *) path;
143 syscallarg(int) flags;
144 syscallarg(int) mode;
145 } */ *uap = v;
146
147 return sys_open(l, uap, retval);
148 }
149
150 int
151 compat_43_freebsd_sys_creat(l, v, retval)
152 struct lwp *l;
153 void *v;
154 register_t *retval;
155 {
156 struct compat_43_freebsd_sys_creat_args /* {
157 syscallarg(char *) path;
158 syscallarg(int) mode;
159 } */ *uap = v;
160
161 return compat_43_sys_creat(l, uap, retval);
162 }
163
164 int
165 freebsd_sys_link(l, v, retval)
166 struct lwp *l;
167 void *v;
168 register_t *retval;
169 {
170 struct freebsd_sys_link_args /* {
171 syscallarg(char *) path;
172 syscallarg(char *) link;
173 } */ *uap = v;
174
175 return sys_link(l, uap, retval);
176 }
177
178 int
179 freebsd_sys_unlink(l, v, retval)
180 struct lwp *l;
181 void *v;
182 register_t *retval;
183 {
184 struct freebsd_sys_unlink_args /* {
185 syscallarg(char *) path;
186 } */ *uap = v;
187
188 return sys_unlink(l, uap, retval);
189 }
190
191 int
192 freebsd_sys_chdir(l, v, retval)
193 struct lwp *l;
194 void *v;
195 register_t *retval;
196 {
197 struct freebsd_sys_chdir_args /* {
198 syscallarg(char *) path;
199 } */ *uap = v;
200
201 return sys_chdir(l, uap, retval);
202 }
203
204 int
205 freebsd_sys_mknod(l, v, retval)
206 struct lwp *l;
207 void *v;
208 register_t *retval;
209 {
210 struct freebsd_sys_mknod_args /* {
211 syscallarg(char *) path;
212 syscallarg(int) mode;
213 syscallarg(int) dev;
214 } */ *uap = v;
215
216 return sys_mknod(l, uap, retval);
217 }
218
219 int
220 freebsd_sys_chmod(l, v, retval)
221 struct lwp *l;
222 void *v;
223 register_t *retval;
224 {
225 struct freebsd_sys_chmod_args /* {
226 syscallarg(char *) path;
227 syscallarg(int) mode;
228 } */ *uap = v;
229
230 return sys_chmod(l, uap, retval);
231 }
232
233 int
234 freebsd_sys_chown(l, v, retval)
235 struct lwp *l;
236 void *v;
237 register_t *retval;
238 {
239 struct freebsd_sys_chown_args /* {
240 syscallarg(char *) path;
241 syscallarg(int) uid;
242 syscallarg(int) gid;
243 } */ *uap = v;
244
245 return sys_chown(l, uap, retval);
246 }
247
248 int
249 freebsd_sys_lchown(l, v, retval)
250 struct lwp *l;
251 void *v;
252 register_t *retval;
253 {
254 struct freebsd_sys_lchown_args /* {
255 syscallarg(char *) path;
256 syscallarg(int) uid;
257 syscallarg(int) gid;
258 } */ *uap = v;
259
260 return sys_lchown(l, uap, retval);
261 }
262
263 int
264 freebsd_sys_unmount(l, v, retval)
265 struct lwp *l;
266 void *v;
267 register_t *retval;
268 {
269 struct freebsd_sys_unmount_args /* {
270 syscallarg(char *) path;
271 syscallarg(int) flags;
272 } */ *uap = v;
273
274 return sys_unmount(l, uap, retval);
275 }
276
277 int
278 freebsd_sys_access(l, v, retval)
279 struct lwp *l;
280 void *v;
281 register_t *retval;
282 {
283 struct freebsd_sys_access_args /* {
284 syscallarg(char *) path;
285 syscallarg(int) flags;
286 } */ *uap = v;
287
288 return sys_access(l, uap, retval);
289 }
290
291 int
292 freebsd_sys_chflags(l, v, retval)
293 struct lwp *l;
294 void *v;
295 register_t *retval;
296 {
297 struct freebsd_sys_chflags_args /* {
298 syscallarg(char *) path;
299 syscallarg(int) flags;
300 } */ *uap = v;
301
302 return sys_chflags(l, uap, retval);
303 }
304
305 int
306 compat_43_freebsd_sys_stat(l, v, retval)
307 struct lwp *l;
308 void *v;
309 register_t *retval;
310 {
311 struct compat_43_freebsd_sys_stat_args /* {
312 syscallarg(char *) path;
313 syscallarg(struct stat43 *) ub;
314 } */ *uap = v;
315
316 return compat_43_sys_stat(l, uap, retval);
317 }
318
319 int
320 compat_43_freebsd_sys_lstat(l, v, retval)
321 struct lwp *l;
322 void *v;
323 register_t *retval;
324 {
325 struct compat_43_freebsd_sys_lstat_args /* {
326 syscallarg(char *) path;
327 syscallarg(struct stat43 *) ub;
328 } */ *uap = v;
329
330 return compat_43_sys_lstat(l, uap, retval);
331 }
332
333 int
334 freebsd_sys_revoke(l, v, retval)
335 struct lwp *l;
336 void *v;
337 register_t *retval;
338 {
339 struct freebsd_sys_revoke_args /* {
340 syscallarg(char *) path;
341 } */ *uap = v;
342
343 return sys_revoke(l, uap, retval);
344 }
345
346 int
347 freebsd_sys_symlink(l, v, retval)
348 struct lwp *l;
349 void *v;
350 register_t *retval;
351 {
352 struct freebsd_sys_symlink_args /* {
353 syscallarg(char *) path;
354 syscallarg(char *) link;
355 } */ *uap = v;
356
357 return sys_symlink(l, uap, retval);
358 }
359
360 int
361 freebsd_sys_readlink(l, v, retval)
362 struct lwp *l;
363 void *v;
364 register_t *retval;
365 {
366 struct freebsd_sys_readlink_args /* {
367 syscallarg(char *) path;
368 syscallarg(char *) buf;
369 syscallarg(int) count;
370 } */ *uap = v;
371
372 return sys_readlink(l, uap, retval);
373 }
374
375 int
376 freebsd_sys_execve(l, v, retval)
377 struct lwp *l;
378 void *v;
379 register_t *retval;
380 {
381 struct freebsd_sys_execve_args /* {
382 syscallarg(char *) path;
383 syscallarg(char **) argp;
384 syscallarg(char **) envp;
385 } */ *uap = v;
386 struct sys_execve_args ap;
387
388 SCARG(&ap, path) = SCARG(uap, path);
389 SCARG(&ap, argp) = SCARG(uap, argp);
390 SCARG(&ap, envp) = SCARG(uap, envp);
391
392 return sys_execve(l, &ap, retval);
393 }
394
395 int
396 freebsd_sys_chroot(l, v, retval)
397 struct lwp *l;
398 void *v;
399 register_t *retval;
400 {
401 struct freebsd_sys_chroot_args /* {
402 syscallarg(char *) path;
403 } */ *uap = v;
404
405 return sys_chroot(l, uap, retval);
406 }
407
408 int
409 freebsd_sys_rename(l, v, retval)
410 struct lwp *l;
411 void *v;
412 register_t *retval;
413 {
414 struct freebsd_sys_rename_args /* {
415 syscallarg(char *) from;
416 syscallarg(char *) to;
417 } */ *uap = v;
418
419 return sys_rename(l, uap, retval);
420 }
421
422 int
423 compat_43_freebsd_sys_truncate(l, v, retval)
424 struct lwp *l;
425 void *v;
426 register_t *retval;
427 {
428 struct compat_43_freebsd_sys_truncate_args /* {
429 syscallarg(char *) path;
430 syscallarg(long) length;
431 } */ *uap = v;
432
433 return compat_43_sys_truncate(l, uap, retval);
434 }
435
436 int
437 freebsd_sys_mkfifo(l, v, retval)
438 struct lwp *l;
439 void *v;
440 register_t *retval;
441 {
442 struct freebsd_sys_mkfifo_args /* {
443 syscallarg(char *) path;
444 syscallarg(int) mode;
445 } */ *uap = v;
446
447 return sys_mkfifo(l, uap, retval);
448 }
449
450 int
451 freebsd_sys_mkdir(l, v, retval)
452 struct lwp *l;
453 void *v;
454 register_t *retval;
455 {
456 struct freebsd_sys_mkdir_args /* {
457 syscallarg(char *) path;
458 syscallarg(int) mode;
459 } */ *uap = v;
460
461 return sys_mkdir(l, uap, retval);
462 }
463
464 int
465 freebsd_sys_rmdir(l, v, retval)
466 struct lwp *l;
467 void *v;
468 register_t *retval;
469 {
470 struct freebsd_sys_rmdir_args /* {
471 syscallarg(char *) path;
472 } */ *uap = v;
473
474 return sys_rmdir(l, uap, retval);
475 }
476
477 int
478 freebsd_sys_statfs(l, v, retval)
479 struct lwp *l;
480 void *v;
481 register_t *retval;
482 {
483 struct freebsd_sys_stat_args /* {
484 syscallarg(char *) path;
485 syscallarg(struct statfs12 *) buf;
486 } */ *uap = v;
487
488 return compat_20_sys_statfs(l, uap, retval);
489 }
490
491 #ifdef NFS
492 int
493 freebsd_sys_getfh(l, v, retval)
494 struct lwp *l;
495 void *v;
496 register_t *retval;
497 {
498 struct freebsd_sys_getfh_args /* {
499 syscallarg(char *) fname;
500 syscallarg(fhandle_t *) fhp;
501 } */ *uap = v;
502
503 return compat_30_sys_getfh(l, uap, retval);
504 }
505 #endif /* NFS */
506
507 int
508 freebsd_sys_stat(l, v, retval)
509 struct lwp *l;
510 void *v;
511 register_t *retval;
512 {
513 struct freebsd_sys_stat_args /* {
514 syscallarg(char *) path;
515 syscallarg(struct stat12 *) ub;
516 } */ *uap = v;
517
518 return compat_12_sys_stat(l, uap, retval);
519 }
520
521 int
522 freebsd_sys_lstat(l, v, retval)
523 struct lwp *l;
524 void *v;
525 register_t *retval;
526 {
527 struct freebsd_sys_lstat_args /* {
528 syscallarg(char *) path;
529 syscallarg(struct stat12 *) ub;
530 } */ *uap = v;
531
532 return compat_12_sys_lstat(l, uap, retval);
533 }
534
535 int
536 freebsd_sys_pathconf(l, v, retval)
537 struct lwp *l;
538 void *v;
539 register_t *retval;
540 {
541 struct freebsd_sys_pathconf_args /* {
542 syscallarg(char *) path;
543 syscallarg(int) name;
544 } */ *uap = v;
545
546 return sys_pathconf(l, uap, retval);
547 }
548
549 int
550 freebsd_sys_truncate(l, v, retval)
551 struct lwp *l;
552 void *v;
553 register_t *retval;
554 {
555 struct freebsd_sys_truncate_args /* {
556 syscallarg(char *) path;
557 syscallarg(int) pad;
558 syscallarg(off_t) length;
559 } */ *uap = v;
560
561 return sys_truncate(l, uap, retval);
562 }
563