1 /* $NetBSD: darwin_ioctl.c,v 1.11 2008/06/24 11:18:15 ad Exp $ */
2
3 /*-
4 * Copyright (c) 2003, 2008 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Emmanuel Dreyfus.
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 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: darwin_ioctl.c,v 1.11 2008/06/24 11:18:15 ad Exp $");
34
35 #include <sys/types.h>
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/mount.h>
39 #include <sys/file.h>
40 #include <sys/filedesc.h>
41 #include <sys/dirent.h>
42 #include <sys/vnode.h>
43 #include <sys/proc.h>
44
45 #include <sys/syscallargs.h>
46
47 #include <compat/sys/signal.h>
48
49 #include <compat/mach/mach_types.h>
50 #include <compat/mach/mach_vm.h>
51
52 #include <compat/darwin/darwin_audit.h>
53 #include <compat/darwin/darwin_ioctl.h>
54 #include <compat/darwin/darwin_syscallargs.h>
55
56 static int vtype_to_dtype(int);
57
58 int
59 darwin_sys_ioctl(struct lwp *l, const struct darwin_sys_ioctl_args *uap, register_t *retval)
60 {
61 /* {
62 syscallarg(int) fd;
63 syscallarg(u_long) com;
64 syscallarg(void *) data;
65 } */
66 struct sys_ioctl_args cup;
67 int error;
68
69 switch (SCARG(uap, com)) {
70 case DARWIN_FIODTYPE: { /* Get file d_type */
71 file_t *fp;
72 struct vnode *vp;
73 int *data = SCARG(uap, data);
74 int type;
75
76 /* fd_getvnode() will use the descriptor for us */
77 if ((error = fd_getvnode(SCARG(uap, fd), &fp)))
78 return (error);
79
80 vp = fp->f_data;
81 type = vtype_to_dtype(vp->v_type);
82 fd_putfile(SCARG(uap, fd));
83
84 error = copyout(&type, data, sizeof(*data));
85
86 return error;
87 break;
88 }
89
90 default:
91 /* Try native ioctl */
92 break;
93 }
94
95 SCARG(&cup, fd) = SCARG(uap, fd);
96 SCARG(&cup, com) = SCARG(uap, com);
97 SCARG(&cup, data) = SCARG(uap, data);
98
99 error = sys_ioctl(l, &cup, retval);
100
101 return error;
102 }
103
104 static int
105 vtype_to_dtype(int dtype)
106 {
107 switch (dtype) {
108 case VNON:
109 return DT_UNKNOWN;
110 break;
111 case VREG:
112 return DT_REG;
113 break;
114 case VDIR:
115 return DT_DIR;
116 break;
117 case VBLK:
118 return DT_BLK;
119 break;
120 case VCHR:
121 return DT_CHR;
122 break;
123 case VLNK:
124 return DT_LNK;
125 break;
126 case VSOCK:
127 return DT_SOCK;
128 break;
129 case VFIFO:
130 return DT_FIFO;
131 break;
132 case VBAD:
133 return DT_WHT;
134 break;
135 default:
136 break;
137 }
138
139 return DT_UNKNOWN;
140 }
Cache object: 401aece5c27672f5558f80b15d77dbbd
|