freebsd_file.c revision 1.26
1/*	$NetBSD: freebsd_file.c,v 1.26 2007/07/12 19:41:57 dsl 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.26 2007/07/12 19:41:57 dsl 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
62static const char * convert_from_freebsd_mount_type __P((int));
63
64static const char *
65convert_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
96int
97freebsd_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	const char *type;
109	struct vfsops *vfsops;
110	register_t dummy;
111
112	if ((type = convert_from_freebsd_mount_type(SCARG(uap, type))) == NULL)
113		return ENODEV;
114	vfsops = vfs_getopsbyname(type);
115	if (vfsops == NULL)
116		return ENODEV;
117
118	return do_sys_mount(l, vfsops, NULL, SCARG(uap, path),
119	    SCARG(uap, flags), SCARG(uap, data), UIO_USERSPACE, 0, &dummy);
120}
121
122/*
123 * The following syscalls are only here because of the alternate path check.
124 */
125
126/* XXX - UNIX domain: int freebsd_sys_bind(int s, void *name, int namelen); */
127/* XXX - UNIX domain: int freebsd_sys_connect(int s, void *name, int namelen); */
128
129
130int
131freebsd_sys_open(l, v, retval)
132	struct lwp *l;
133	void *v;
134	register_t *retval;
135{
136	struct freebsd_sys_open_args /* {
137		syscallarg(char *) path;
138		syscallarg(int) flags;
139		syscallarg(int) mode;
140	} */ *uap = v;
141
142	return sys_open(l, uap, retval);
143}
144
145int
146compat_43_freebsd_sys_creat(l, v, retval)
147	struct lwp *l;
148	void *v;
149	register_t *retval;
150{
151	struct compat_43_freebsd_sys_creat_args /* {
152		syscallarg(char *) path;
153		syscallarg(int) mode;
154	} */ *uap = v;
155
156	return compat_43_sys_creat(l, uap, retval);
157}
158
159int
160freebsd_sys_link(l, v, retval)
161	struct lwp *l;
162	void *v;
163	register_t *retval;
164{
165	struct freebsd_sys_link_args /* {
166		syscallarg(char *) path;
167		syscallarg(char *) link;
168	} */ *uap = v;
169
170	return sys_link(l, uap, retval);
171}
172
173int
174freebsd_sys_unlink(l, v, retval)
175	struct lwp *l;
176	void *v;
177	register_t *retval;
178{
179	struct freebsd_sys_unlink_args /* {
180		syscallarg(char *) path;
181	} */ *uap = v;
182
183	return sys_unlink(l, uap, retval);
184}
185
186int
187freebsd_sys_chdir(l, v, retval)
188	struct lwp *l;
189	void *v;
190	register_t *retval;
191{
192	struct freebsd_sys_chdir_args /* {
193		syscallarg(char *) path;
194	} */ *uap = v;
195
196	return sys_chdir(l, uap, retval);
197}
198
199int
200freebsd_sys_mknod(l, v, retval)
201	struct lwp *l;
202	void *v;
203	register_t *retval;
204{
205	struct freebsd_sys_mknod_args /* {
206		syscallarg(char *) path;
207		syscallarg(int) mode;
208		syscallarg(int) dev;
209	} */ *uap = v;
210
211	return sys_mknod(l, uap, retval);
212}
213
214int
215freebsd_sys_chmod(l, v, retval)
216	struct lwp *l;
217	void *v;
218	register_t *retval;
219{
220	struct freebsd_sys_chmod_args /* {
221		syscallarg(char *) path;
222		syscallarg(int) mode;
223	} */ *uap = v;
224
225	return sys_chmod(l, uap, retval);
226}
227
228int
229freebsd_sys_chown(l, v, retval)
230	struct lwp *l;
231	void *v;
232	register_t *retval;
233{
234	struct freebsd_sys_chown_args /* {
235		syscallarg(char *) path;
236		syscallarg(int) uid;
237		syscallarg(int) gid;
238	} */ *uap = v;
239
240	return sys_chown(l, uap, retval);
241}
242
243int
244freebsd_sys_lchown(l, v, retval)
245	struct lwp *l;
246	void *v;
247	register_t *retval;
248{
249	struct freebsd_sys_lchown_args /* {
250		syscallarg(char *) path;
251		syscallarg(int) uid;
252		syscallarg(int) gid;
253	} */ *uap = v;
254
255	return sys_lchown(l, uap, retval);
256}
257
258int
259freebsd_sys_unmount(l, v, retval)
260	struct lwp *l;
261	void *v;
262	register_t *retval;
263{
264	struct freebsd_sys_unmount_args /* {
265		syscallarg(char *) path;
266		syscallarg(int) flags;
267	} */ *uap = v;
268
269	return sys_unmount(l, uap, retval);
270}
271
272int
273freebsd_sys_access(l, v, retval)
274	struct lwp *l;
275	void *v;
276	register_t *retval;
277{
278	struct freebsd_sys_access_args /* {
279		syscallarg(char *) path;
280		syscallarg(int) flags;
281	} */ *uap = v;
282
283	return sys_access(l, uap, retval);
284}
285
286int
287freebsd_sys_chflags(l, v, retval)
288	struct lwp *l;
289	void *v;
290	register_t *retval;
291{
292	struct freebsd_sys_chflags_args /* {
293		syscallarg(char *) path;
294		syscallarg(int) flags;
295	} */ *uap = v;
296
297	return sys_chflags(l, uap, retval);
298}
299
300int
301compat_43_freebsd_sys_stat(l, v, retval)
302	struct lwp *l;
303	void *v;
304	register_t *retval;
305{
306	struct compat_43_freebsd_sys_stat_args /* {
307		syscallarg(char *) path;
308		syscallarg(struct stat43 *) ub;
309	} */ *uap = v;
310
311	return compat_43_sys_stat(l, uap, retval);
312}
313
314int
315compat_43_freebsd_sys_lstat(l, v, retval)
316	struct lwp *l;
317	void *v;
318	register_t *retval;
319{
320	struct compat_43_freebsd_sys_lstat_args /* {
321		syscallarg(char *) path;
322		syscallarg(struct stat43 *) ub;
323	} */ *uap = v;
324
325	return compat_43_sys_lstat(l, uap, retval);
326}
327
328int
329freebsd_sys_revoke(l, v, retval)
330	struct lwp *l;
331	void *v;
332	register_t *retval;
333{
334	struct freebsd_sys_revoke_args /* {
335		syscallarg(char *) path;
336	} */ *uap = v;
337
338	return sys_revoke(l, uap, retval);
339}
340
341int
342freebsd_sys_symlink(l, v, retval)
343	struct lwp *l;
344	void *v;
345	register_t *retval;
346{
347	struct freebsd_sys_symlink_args /* {
348		syscallarg(char *) path;
349		syscallarg(char *) link;
350	} */ *uap = v;
351
352	return sys_symlink(l, uap, retval);
353}
354
355int
356freebsd_sys_readlink(l, v, retval)
357	struct lwp *l;
358	void *v;
359	register_t *retval;
360{
361	struct freebsd_sys_readlink_args /* {
362		syscallarg(char *) path;
363		syscallarg(char *) buf;
364		syscallarg(int) count;
365	} */ *uap = v;
366
367	return sys_readlink(l, uap, retval);
368}
369
370int
371freebsd_sys_execve(l, v, retval)
372	struct lwp *l;
373	void *v;
374	register_t *retval;
375{
376	struct freebsd_sys_execve_args /* {
377		syscallarg(char *) path;
378		syscallarg(char **) argp;
379		syscallarg(char **) envp;
380	} */ *uap = v;
381	struct sys_execve_args ap;
382
383	SCARG(&ap, path) = SCARG(uap, path);
384	SCARG(&ap, argp) = SCARG(uap, argp);
385	SCARG(&ap, envp) = SCARG(uap, envp);
386
387	return sys_execve(l, &ap, retval);
388}
389
390int
391freebsd_sys_chroot(l, v, retval)
392	struct lwp *l;
393	void *v;
394	register_t *retval;
395{
396	struct freebsd_sys_chroot_args /* {
397		syscallarg(char *) path;
398	} */ *uap = v;
399
400	return sys_chroot(l, uap, retval);
401}
402
403int
404freebsd_sys_rename(l, v, retval)
405	struct lwp *l;
406	void *v;
407	register_t *retval;
408{
409	struct freebsd_sys_rename_args /* {
410		syscallarg(char *) from;
411		syscallarg(char *) to;
412	} */ *uap = v;
413
414	return sys_rename(l, uap, retval);
415}
416
417int
418compat_43_freebsd_sys_truncate(l, v, retval)
419	struct lwp *l;
420	void *v;
421	register_t *retval;
422{
423	struct compat_43_freebsd_sys_truncate_args /* {
424		syscallarg(char *) path;
425		syscallarg(long) length;
426	} */ *uap = v;
427
428	return compat_43_sys_truncate(l, uap, retval);
429}
430
431int
432freebsd_sys_mkfifo(l, v, retval)
433	struct lwp *l;
434	void *v;
435	register_t *retval;
436{
437	struct freebsd_sys_mkfifo_args /* {
438		syscallarg(char *) path;
439		syscallarg(int) mode;
440	} */ *uap = v;
441
442	return sys_mkfifo(l, uap, retval);
443}
444
445int
446freebsd_sys_mkdir(l, v, retval)
447	struct lwp *l;
448	void *v;
449	register_t *retval;
450{
451	struct freebsd_sys_mkdir_args /* {
452		syscallarg(char *) path;
453		syscallarg(int) mode;
454	} */ *uap = v;
455
456	return sys_mkdir(l, uap, retval);
457}
458
459int
460freebsd_sys_rmdir(l, v, retval)
461	struct lwp *l;
462	void *v;
463	register_t *retval;
464{
465	struct freebsd_sys_rmdir_args /* {
466		syscallarg(char *) path;
467	} */ *uap = v;
468
469	return sys_rmdir(l, uap, retval);
470}
471
472int
473freebsd_sys_statfs(l, v, retval)
474	struct lwp *l;
475	void *v;
476	register_t *retval;
477{
478	struct freebsd_sys_stat_args /* {
479		syscallarg(char *) path;
480		syscallarg(struct statfs12 *) buf;
481	} */ *uap = v;
482
483	return compat_20_sys_statfs(l, uap, retval);
484}
485
486#ifdef NFS
487int
488freebsd_sys_getfh(l, v, retval)
489	struct lwp *l;
490	void *v;
491	register_t *retval;
492{
493	struct freebsd_sys_getfh_args /* {
494		syscallarg(char *) fname;
495		syscallarg(fhandle_t *) fhp;
496	} */ *uap = v;
497
498	return compat_30_sys_getfh(l, uap, retval);
499}
500#endif /* NFS */
501
502int
503freebsd_sys_stat(l, v, retval)
504	struct lwp *l;
505	void *v;
506	register_t *retval;
507{
508	struct freebsd_sys_stat_args /* {
509		syscallarg(char *) path;
510		syscallarg(struct stat12 *) ub;
511	} */ *uap = v;
512
513	return compat_12_sys_stat(l, uap, retval);
514}
515
516int
517freebsd_sys_lstat(l, v, retval)
518	struct lwp *l;
519	void *v;
520	register_t *retval;
521{
522	struct freebsd_sys_lstat_args /* {
523		syscallarg(char *) path;
524		syscallarg(struct stat12 *) ub;
525	} */ *uap = v;
526
527	return compat_12_sys_lstat(l, uap, retval);
528}
529
530int
531freebsd_sys_pathconf(l, v, retval)
532	struct lwp *l;
533	void *v;
534	register_t *retval;
535{
536	struct freebsd_sys_pathconf_args /* {
537		syscallarg(char *) path;
538		syscallarg(int) name;
539	} */ *uap = v;
540
541	return sys_pathconf(l, uap, retval);
542}
543
544int
545freebsd_sys_truncate(l, v, retval)
546	struct lwp *l;
547	void *v;
548	register_t *retval;
549{
550	struct freebsd_sys_truncate_args /* {
551		syscallarg(char *) path;
552		syscallarg(int) pad;
553		syscallarg(off_t) length;
554	} */ *uap = v;
555
556	return sys_truncate(l, uap, retval);
557}
558