xref: /dflybsd-src/share/man/man9/ioctl.9 (revision 2352f0a1f698cd45b3e2f9dff7da146bcc5e0de5)
1f93b9c36SSascha Wildner.\" $NetBSD: ioctl.9,v 1.26 2008/11/12 12:35:54 ad Exp $
2f93b9c36SSascha Wildner.\"
3f93b9c36SSascha Wildner.\" Copyright (c) 1999  The NetBSD Foundation, Inc.
4f93b9c36SSascha Wildner.\" All rights reserved.
5f93b9c36SSascha Wildner.\"
6f93b9c36SSascha Wildner.\" This code is derived from software contributed to The NetBSD Foundation
7f93b9c36SSascha Wildner.\" by Heiko W.Rupp <hwr@pilhuhn.de>
8f93b9c36SSascha Wildner.\"
9f93b9c36SSascha Wildner.\" Redistribution and use in source and binary forms, with or without
10f93b9c36SSascha Wildner.\" modification, are permitted provided that the following conditions
11f93b9c36SSascha Wildner.\" are met:
12f93b9c36SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright
13f93b9c36SSascha Wildner.\"    notice, this list of conditions and the following disclaimer.
14f93b9c36SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright
15f93b9c36SSascha Wildner.\"    notice, this list of conditions and the following disclaimer in the
16f93b9c36SSascha Wildner.\"    documentation and/or other materials provided with the distribution.
17f93b9c36SSascha Wildner.\"
18f93b9c36SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19f93b9c36SSascha Wildner.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20f93b9c36SSascha Wildner.\" TO, THE  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21f93b9c36SSascha Wildner.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22f93b9c36SSascha Wildner.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23f93b9c36SSascha Wildner.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24f93b9c36SSascha Wildner.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25f93b9c36SSascha Wildner.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26f93b9c36SSascha Wildner.\" CONTRACT, STRICT  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27f93b9c36SSascha Wildner.\" ARISING IN ANY WAY  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28f93b9c36SSascha Wildner.\" POSSIBILITY OF SUCH DAMAGE.
29f93b9c36SSascha Wildner.\"
30*2352f0a1SSascha Wildner.Dd June 20, 2015
31f93b9c36SSascha Wildner.Dt IOCTL 9
32f93b9c36SSascha Wildner.Os
33f93b9c36SSascha Wildner.Sh NAME
34f93b9c36SSascha Wildner.Nm ioctl ,
35f93b9c36SSascha Wildner.Nm _IO ,
36f93b9c36SSascha Wildner.Nm _IOR ,
37f93b9c36SSascha Wildner.Nm _IOW ,
38f93b9c36SSascha Wildner.Nm _IOWR
39f93b9c36SSascha Wildner.Nd "how to implement a new ioctl call to access device drivers"
40f93b9c36SSascha Wildner.Sh SYNOPSIS
41f93b9c36SSascha Wildner.In sys/ioctl.h
42f93b9c36SSascha Wildner.In sys/ioccom.h
43f93b9c36SSascha Wildner.Ft int
44f93b9c36SSascha Wildner.Fn ioctl "int d" "unsigned long request" "..."
45f93b9c36SSascha Wildner.Fn _IO "g" "t"
46f93b9c36SSascha Wildner.Fn _IOR "g" "n" "t"
47f93b9c36SSascha Wildner.Fn _IOW "g" "n" "t"
48f93b9c36SSascha Wildner.Fn _IOWR "g" "n" "t"
49f93b9c36SSascha Wildner.Sh DESCRIPTION
50f93b9c36SSascha WildnerWhenever an
51f93b9c36SSascha Wildner.Xr ioctl 2
52f93b9c36SSascha Wildnercall is made, the kernel dispatches it to the device driver
53f93b9c36SSascha Wildnerwhich can then interpret the request number and data in a specialized
54f93b9c36SSascha Wildnermanner.
55f93b9c36SSascha WildnerIoctls are defined as:
56f93b9c36SSascha Wildner.Bd -literal
57f93b9c36SSascha Wildner#define MYDEVIOCTL   fun(g, n, t)
58f93b9c36SSascha Wildner.Ed
59f93b9c36SSascha Wildner.Pp
60f93b9c36SSascha Wildnerwhere the different symbols correspond to:
61f93b9c36SSascha Wildner.Bl -tag -width ".Dv MYDEVIOCTL"
62f93b9c36SSascha Wildner.It Dv MYDEVIOCTL
63f93b9c36SSascha WildnerThe name which will later be given in the
64f93b9c36SSascha Wildner.Xr ioctl 2
65f93b9c36SSascha Wildnersystem call as second argument, e.g.,
66f93b9c36SSascha Wildner.Bd -literal
67f93b9c36SSascha Wildnerioctl(fd, MYDEVIOCTL, ...)
68f93b9c36SSascha Wildner.Ed
69f93b9c36SSascha Wildner.It Fn fun
70f93b9c36SSascha WildnerA macro which can be one of:
71f93b9c36SSascha Wildner.Bl -tag -width ".Fn _IOWR"
72f93b9c36SSascha Wildner.It Fn  _IO
73f93b9c36SSascha WildnerThe call is a simple message to the kernel by itself.
74f93b9c36SSascha WildnerIt does not copy anything into the kernel, nor does it want anything back.
75f93b9c36SSascha Wildner.It Fn _IOR
76f93b9c36SSascha WildnerThe call only reads parameters from the kernel and does not
77f93b9c36SSascha Wildnerpass any to it.
78f93b9c36SSascha Wildner.It Fn _IOW
79f93b9c36SSascha WildnerThe call only writes parameters to the kernel, but does not want anything
80f93b9c36SSascha Wildnerback.
81f93b9c36SSascha Wildner.It Fn _IOWR
82f93b9c36SSascha WildnerThe call writes data to the kernel and wants information back.
83f93b9c36SSascha Wildner.El
84f93b9c36SSascha Wildner.Pp
85f93b9c36SSascha WildnerWe always consider reading or writing to the kernel, from the user perspective.
86f93b9c36SSascha Wildner.It Fa g
87f93b9c36SSascha WildnerThis integer describes to which subsystem the ioctl applies.
88f93b9c36SSascha WildnerHere are some examples:
89f93b9c36SSascha Wildner.Pp
90f93b9c36SSascha Wildner.Bl -tag -width xxxxx -compact
91f685c57dSSascha Wildner.It '5'
92f685c57dSSascha Wildner.Xr perfmon 4
93f685c57dSSascha Wildner.It '8'
94f685c57dSSascha Wildner.Xr aac 4
95f93b9c36SSascha Wildner.It 'a'
96f93b9c36SSascha Wildner.Xr nata 4
97f685c57dSSascha Wildner.It 'B'
98f93b9c36SSascha Wildner.Xr bpf 4
99f685c57dSSascha Wildner.It 'C'
100f685c57dSSascha Wildner.Xr ciss 4
101f685c57dSSascha Wildner.It 'd'
102f685c57dSSascha Wildner.Xr disklabel 5
103f685c57dSSascha Wildner.It 'd'
104f685c57dSSascha Wildnerdiskslice
105f685c57dSSascha Wildner.It 'f'
106f685c57dSSascha Wildnergeneric file-descriptor
107f685c57dSSascha Wildner.It 'F'
108f685c57dSSascha Wildnerframe buffer
109f93b9c36SSascha Wildner.It 'h'
110f93b9c36SSascha Wildner.Xr HAMMER 5
111f685c57dSSascha Wildner.It 'i'
112f685c57dSSascha Wildner.Xr iic 4
113f685c57dSSascha Wildner.It 'i'
114f685c57dSSascha Wildner.Xr carp 4
115f685c57dSSascha Wildner.It 'i'
116f685c57dSSascha Wildner.Xr gre 4
117f685c57dSSascha Wildner.It 'k'
118f685c57dSSascha Wildner.Xr keyboard 4
119f685c57dSSascha Wildnerand
120f685c57dSSascha Wildner.Xr syscons 4
121f685c57dSSascha Wildner.It 'm'
122f685c57dSSascha Wildner.Xr mem 4
123f685c57dSSascha Wildner.It 'm'
124f685c57dSSascha Wildner.Pa /dev/midi
125f685c57dSSascha Wildner.It 'm'
126f685c57dSSascha Wildner.Xr mtio 4
127f685c57dSSascha Wildner.It 'n'
128f685c57dSSascha Wildner.Xr smb 4
129f685c57dSSascha Wildner.It 'n'
130f685c57dSSascha WildnerNetWare volume mount
131f685c57dSSascha Wildner.It 'p'
132f685c57dSSascha Wildner.Pa /dev/dsp
133f685c57dSSascha Wildnerand
134f685c57dSSascha Wildner.Pa /dev/audio
135f685c57dSSascha Wildner.It 'p'
136f685c57dSSascha Wildner.Xr pci 4
137f685c57dSSascha Wildner.It 'p'
138f685c57dSSascha Wildner.Xr ppbus 4
139f685c57dSSascha Wildner.It 'P'
140*2352f0a1SSascha Wildner.Nm apm (deprecated)
141f685c57dSSascha Wildner.It 'q'
142f685c57dSSascha Wildner.Pa /dev/sequencer
143f685c57dSSascha Wildner.It 'r'
144f685c57dSSascha Wildnerrandom number generator
145f93b9c36SSascha Wildner.It 't'
146f685c57dSSascha Wildner.Xr tty 4
147f685c57dSSascha Wildner.It 't'
148f685c57dSSascha Wildner.Xr ppp 4
149f685c57dSSascha Wildner.It 't'
150f685c57dSSascha Wildner.Xr tap 4
151f685c57dSSascha Wildner.It 't'
152f685c57dSSascha Wildner.Xr tun 4
153f685c57dSSascha Wildner.It 't'
154f685c57dSSascha WildnerSLIP ttys
155f685c57dSSascha Wildner.It 'T'
156f685c57dSSascha Wildner.Xr snp 4
157f685c57dSSascha Wildner.\".It 'V'
158f685c57dSSascha Wildner.\"VMware
159f93b9c36SSascha Wildner.El
160f93b9c36SSascha Wildner.It Fa n
161f93b9c36SSascha WildnerThis number uniquely identifies the ioctl within the group.
162f93b9c36SSascha WildnerThat said, two subsystems may share the same
163f93b9c36SSascha Wildner.Fa g ,
164f93b9c36SSascha Wildnerbut there may be only one
165f93b9c36SSascha Wildner.Fa n
166f93b9c36SSascha Wildnerfor a given
167f93b9c36SSascha Wildner.Fa g .
168f93b9c36SSascha WildnerThis is an unsigned 8 bit number.
169f93b9c36SSascha Wildner.It Fa t
170f93b9c36SSascha WildnerThis specifies the type of the passed parameter.
171f93b9c36SSascha WildnerThis one gets internally transformed to the size of the parameter, so
172f93b9c36SSascha Wildnerfor example, if you want to pass a structure, then you have to specify that
173f93b9c36SSascha Wildnerstructure and not a pointer to it or sizeof(struct MYDEV).
174f93b9c36SSascha Wildner.El
175f93b9c36SSascha Wildner.Pp
176f93b9c36SSascha WildnerIn order for the new ioctl to be visible to the system, it is installed
177f93b9c36SSascha Wildnerin either
178f93b9c36SSascha Wildner.In sys/ioctl.h or one of the files that are reached from
179f93b9c36SSascha Wildner.In sys/ioctl.h .
180a68e0df0SSascha Wildner.Sh RETURN VALUES
181a68e0df0SSascha WildnerA distinction must be made at this point.
182a68e0df0SSascha WildnerAll
183a68e0df0SSascha Wildner.Fn *_ioctl
184a68e0df0SSascha Wildnerroutines from
185a68e0df0SSascha Wildner.Em within kernel
186a68e0df0SSascha Wildnershould return either 0 for success
187a68e0df0SSascha Wildneror a defined error code, as described in
188a68e0df0SSascha Wildner.In sys/errno.h .
189a68e0df0SSascha WildnerAt the libc level though a conversion takes place, so that eventually
190a68e0df0SSascha Wildner.Xr ioctl 2
191a68e0df0SSascha Wildnerreturns either 0 for success or -1 for failure, in which case the
192a68e0df0SSascha Wildner.Va errno
193a68e0df0SSascha Wildnervariable is set accordingly.
194a68e0df0SSascha Wildner.Pp
195a68e0df0SSascha WildnerThe use of magic numbers such as -1, to indicate that a given ioctl
196a68e0df0SSascha Wildnercode was not handled, is strongly discouraged.
197a68e0df0SSascha WildnerThe value -1 is bound to the
198a68e0df0SSascha Wildner.Er ERESTART
199a68e0df0SSascha Wildnerpseudo-error, which is returned inside kernel to modify return to process.
200f93b9c36SSascha Wildner.Sh EXAMPLES
201f93b9c36SSascha WildnerLet's suppose that we want to pass an integer value to the kernel.
202f93b9c36SSascha WildnerFrom the user point of view, this is like writing to the kernel.
203f93b9c36SSascha WildnerSo we define the ioctl as:
204f93b9c36SSascha Wildner.Bd -literal -offset indent
205f93b9c36SSascha Wildner#define	MYDEVIOCTL	_IOW('i', 25, int)
206f93b9c36SSascha Wildner.Ed
207f93b9c36SSascha Wildner.Pp
208f93b9c36SSascha WildnerWithin the
209f93b9c36SSascha Wildner.Fn *_ioctl
210f93b9c36SSascha Wildnerroutine of the driver, it can be then accessed like:
211f93b9c36SSascha Wildner.Bd -literal -offset indent
212f93b9c36SSascha Wildnerint
213f685c57dSSascha Wildnermydev_ioctl(struct dev_ioctl_args *ap)
214f93b9c36SSascha Wildner{
215f93b9c36SSascha Wildner	int error;
216f93b9c36SSascha Wildner	int *a;
217f93b9c36SSascha Wildner
218f93b9c36SSascha Wildner	switch (ap->a_cmd) {
219f93b9c36SSascha Wildner	case MYDEVIOCTL:
220f93b9c36SSascha Wildner		a = (int *)ap->data;
221f93b9c36SSascha Wildner		kprintf("Value passed from userspace: %d\\n", *a);
222f93b9c36SSascha Wildner		return (0);    /* Success */
223f93b9c36SSascha Wildner		break;
224f93b9c36SSascha Wildner
225f93b9c36SSascha Wildner	/* Handle other ioctls here */
226f93b9c36SSascha Wildner
227f93b9c36SSascha Wildner        default:
228f93b9c36SSascha Wildner                /* Inappropriate ioctl for device */
229f93b9c36SSascha Wildner                error = ENOTTY;
230f93b9c36SSascha Wildner		break;
231f93b9c36SSascha Wildner	}
232f93b9c36SSascha Wildner
233f93b9c36SSascha Wildner	return (error);
234f93b9c36SSascha Wildner}
235f93b9c36SSascha Wildner.Ed
236f93b9c36SSascha Wildner.Pp
237f93b9c36SSascha WildnerIn userspace:
238f93b9c36SSascha Wildner.Bd -literal -offset indent
239f93b9c36SSascha Wildnerint a = 101;
240f93b9c36SSascha Wildnerif (ioctl(fd, MYDEVIOCTL, \*[Am]a) == -1) {
241f93b9c36SSascha Wildner	/* Handle failure */
242f93b9c36SSascha Wildner}
243f93b9c36SSascha Wildner.Ed
244f93b9c36SSascha Wildner.Sh SEE ALSO
245f93b9c36SSascha Wildner.Xr ioctl 2
246