xref: /dflybsd-src/share/man/man9/ioctl.9 (revision 82b0523afa1e04e2e6184889c0ad54f05f346495)
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*82b0523aSSascha Wildner.Dd October 4, 2018
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/ioccom.h
42f93b9c36SSascha Wildner.Fn _IO "g" "t"
43f93b9c36SSascha Wildner.Fn _IOR "g" "n" "t"
44f93b9c36SSascha Wildner.Fn _IOW "g" "n" "t"
45f93b9c36SSascha Wildner.Fn _IOWR "g" "n" "t"
46f93b9c36SSascha Wildner.Sh DESCRIPTION
47f93b9c36SSascha WildnerWhenever an
48f93b9c36SSascha Wildner.Xr ioctl 2
49f93b9c36SSascha Wildnercall is made, the kernel dispatches it to the device driver
50f93b9c36SSascha Wildnerwhich can then interpret the request number and data in a specialized
51f93b9c36SSascha Wildnermanner.
52f93b9c36SSascha WildnerIoctls are defined as:
53f93b9c36SSascha Wildner.Bd -literal
54f93b9c36SSascha Wildner#define MYDEVIOCTL   fun(g, n, t)
55f93b9c36SSascha Wildner.Ed
56f93b9c36SSascha Wildner.Pp
57f93b9c36SSascha Wildnerwhere the different symbols correspond to:
58f93b9c36SSascha Wildner.Bl -tag -width ".Dv MYDEVIOCTL"
59f93b9c36SSascha Wildner.It Dv MYDEVIOCTL
60f93b9c36SSascha WildnerThe name which will later be given in the
61f93b9c36SSascha Wildner.Xr ioctl 2
62f93b9c36SSascha Wildnersystem call as second argument, e.g.,
63f93b9c36SSascha Wildner.Bd -literal
64f93b9c36SSascha Wildnerioctl(fd, MYDEVIOCTL, ...)
65f93b9c36SSascha Wildner.Ed
66f93b9c36SSascha Wildner.It Fn fun
67f93b9c36SSascha WildnerA macro which can be one of:
68f93b9c36SSascha Wildner.Bl -tag -width ".Fn _IOWR"
69f93b9c36SSascha Wildner.It Fn _IO
70f93b9c36SSascha WildnerThe call is a simple message to the kernel by itself.
71f93b9c36SSascha WildnerIt does not copy anything into the kernel, nor does it want anything back.
72f93b9c36SSascha Wildner.It Fn _IOR
73f93b9c36SSascha WildnerThe call only reads parameters from the kernel and does not
74f93b9c36SSascha Wildnerpass any to it.
75f93b9c36SSascha Wildner.It Fn _IOW
76f93b9c36SSascha WildnerThe call only writes parameters to the kernel, but does not want anything
77f93b9c36SSascha Wildnerback.
78f93b9c36SSascha Wildner.It Fn _IOWR
79f93b9c36SSascha WildnerThe call writes data to the kernel and wants information back.
80f93b9c36SSascha Wildner.El
81f93b9c36SSascha Wildner.Pp
82f93b9c36SSascha WildnerWe always consider reading or writing to the kernel, from the user perspective.
83f93b9c36SSascha Wildner.It Fa g
84f93b9c36SSascha WildnerThis integer describes to which subsystem the ioctl applies.
85f93b9c36SSascha WildnerHere are some examples:
86f93b9c36SSascha Wildner.Pp
87f93b9c36SSascha Wildner.Bl -tag -width xxxxx -compact
88f685c57dSSascha Wildner.It '8'
89f685c57dSSascha Wildner.Xr aac 4
90f93b9c36SSascha Wildner.It 'a'
91f93b9c36SSascha Wildner.Xr nata 4
92f685c57dSSascha Wildner.It 'B'
93f93b9c36SSascha Wildner.Xr bpf 4
94f685c57dSSascha Wildner.It 'C'
951501e71cSSascha Wildner.Xr cam 4
961501e71cSSascha Wildner.It 'C'
97f685c57dSSascha Wildner.Xr ciss 4
98f685c57dSSascha Wildner.It 'd'
99f685c57dSSascha Wildner.Xr disklabel 5
100f685c57dSSascha Wildner.It 'd'
101f685c57dSSascha Wildnerdiskslice
1028970d9e9SSascha Wildner.It 'd'
1038970d9e9SSascha Wildner.Xr drm 4
104f685c57dSSascha Wildner.It 'f'
105f685c57dSSascha Wildnergeneric file-descriptor
106f685c57dSSascha Wildner.It 'F'
107f685c57dSSascha Wildnerframe buffer
108f93b9c36SSascha Wildner.It 'h'
109f93b9c36SSascha Wildner.Xr HAMMER 5
110f685c57dSSascha Wildner.It 'i'
111f685c57dSSascha Wildner.Xr iic 4
112f685c57dSSascha Wildner.It 'i'
113f685c57dSSascha Wildner.Xr carp 4
114f685c57dSSascha Wildner.It 'i'
115f685c57dSSascha Wildner.Xr gre 4
116f685c57dSSascha Wildner.It 'k'
117f685c57dSSascha Wildner.Xr keyboard 4
118f685c57dSSascha Wildnerand
119f685c57dSSascha Wildner.Xr syscons 4
120f685c57dSSascha Wildner.It 'm'
121f685c57dSSascha Wildner.Xr mem 4
122f685c57dSSascha Wildner.It 'm'
123f685c57dSSascha Wildner.Pa /dev/midi
124f685c57dSSascha Wildner.It 'm'
125f685c57dSSascha Wildner.Xr mtio 4
1268970d9e9SSascha Wildner.It 'M'
1278970d9e9SSascha Wildner.Xr sound 4
1288970d9e9SSascha Wildnermixer
129f685c57dSSascha Wildner.It 'n'
130f685c57dSSascha Wildner.Xr smb 4
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
139d0981ce5SSascha Wildner.It 'p'
140d0981ce5SSascha Wildner.Xr procfs 5
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 tap 4
149f685c57dSSascha Wildner.It 't'
150f685c57dSSascha Wildner.Xr tun 4
151f685c57dSSascha Wildner.It 't'
152f685c57dSSascha WildnerSLIP ttys
153f685c57dSSascha Wildner.It 'T'
154f685c57dSSascha Wildner.Xr snp 4
155f93b9c36SSascha Wildner.El
156f93b9c36SSascha Wildner.It Fa n
157f93b9c36SSascha WildnerThis number uniquely identifies the ioctl within the group.
158f93b9c36SSascha WildnerThat said, two subsystems may share the same
159f93b9c36SSascha Wildner.Fa g ,
160f93b9c36SSascha Wildnerbut there may be only one
161f93b9c36SSascha Wildner.Fa n
162f93b9c36SSascha Wildnerfor a given
163f93b9c36SSascha Wildner.Fa g .
164f93b9c36SSascha WildnerThis is an unsigned 8 bit number.
165f93b9c36SSascha Wildner.It Fa t
166f93b9c36SSascha WildnerThis specifies the type of the passed parameter.
167f93b9c36SSascha WildnerThis one gets internally transformed to the size of the parameter, so
168f93b9c36SSascha Wildnerfor example, if you want to pass a structure, then you have to specify that
169f93b9c36SSascha Wildnerstructure and not a pointer to it or sizeof(struct MYDEV).
170f93b9c36SSascha Wildner.El
171f93b9c36SSascha Wildner.Pp
172f93b9c36SSascha WildnerIn order for the new ioctl to be visible to the system, it is installed
173f93b9c36SSascha Wildnerin either
174f93b9c36SSascha Wildner.In sys/ioctl.h or one of the files that are reached from
175f93b9c36SSascha Wildner.In sys/ioctl.h .
176a68e0df0SSascha Wildner.Sh RETURN VALUES
177a68e0df0SSascha WildnerA distinction must be made at this point.
178a68e0df0SSascha WildnerAll
179a68e0df0SSascha Wildner.Fn *_ioctl
180a68e0df0SSascha Wildnerroutines from
181a68e0df0SSascha Wildner.Em within kernel
182a68e0df0SSascha Wildnershould return either 0 for success
183a68e0df0SSascha Wildneror a defined error code, as described in
184a68e0df0SSascha Wildner.In sys/errno.h .
185a68e0df0SSascha WildnerAt the libc level though a conversion takes place, so that eventually
186a68e0df0SSascha Wildner.Xr ioctl 2
187a68e0df0SSascha Wildnerreturns either 0 for success or -1 for failure, in which case the
188a68e0df0SSascha Wildner.Va errno
189a68e0df0SSascha Wildnervariable is set accordingly.
190a68e0df0SSascha Wildner.Pp
191a68e0df0SSascha WildnerThe use of magic numbers such as -1, to indicate that a given ioctl
192a68e0df0SSascha Wildnercode was not handled, is strongly discouraged.
193a68e0df0SSascha WildnerThe value -1 is bound to the
194a68e0df0SSascha Wildner.Er ERESTART
195a68e0df0SSascha Wildnerpseudo-error, which is returned inside kernel to modify return to process.
196f93b9c36SSascha Wildner.Sh EXAMPLES
197f93b9c36SSascha WildnerLet's suppose that we want to pass an integer value to the kernel.
198f93b9c36SSascha WildnerFrom the user point of view, this is like writing to the kernel.
199f93b9c36SSascha WildnerSo we define the ioctl as:
200f93b9c36SSascha Wildner.Bd -literal -offset indent
201f93b9c36SSascha Wildner#define	MYDEVIOCTL	_IOW('i', 25, int)
202f93b9c36SSascha Wildner.Ed
203f93b9c36SSascha Wildner.Pp
204f93b9c36SSascha WildnerWithin the
205f93b9c36SSascha Wildner.Fn *_ioctl
206f93b9c36SSascha Wildnerroutine of the driver, it can be then accessed like:
207f93b9c36SSascha Wildner.Bd -literal -offset indent
208f93b9c36SSascha Wildnerint
209f685c57dSSascha Wildnermydev_ioctl(struct dev_ioctl_args *ap)
210f93b9c36SSascha Wildner{
211f93b9c36SSascha Wildner	int error;
212f93b9c36SSascha Wildner	int *a;
213f93b9c36SSascha Wildner
214f93b9c36SSascha Wildner	switch (ap->a_cmd) {
215f93b9c36SSascha Wildner	case MYDEVIOCTL:
216f93b9c36SSascha Wildner		a = (int *)ap->data;
217f93b9c36SSascha Wildner		kprintf("Value passed from userspace: %d\\n", *a);
218f93b9c36SSascha Wildner		return (0);    /* Success */
219f93b9c36SSascha Wildner		break;
220f93b9c36SSascha Wildner
221f93b9c36SSascha Wildner	/* Handle other ioctls here */
222f93b9c36SSascha Wildner
223f93b9c36SSascha Wildner        default:
224f93b9c36SSascha Wildner                /* Inappropriate ioctl for device */
225f93b9c36SSascha Wildner                error = ENOTTY;
226f93b9c36SSascha Wildner		break;
227f93b9c36SSascha Wildner	}
228f93b9c36SSascha Wildner
229f93b9c36SSascha Wildner	return (error);
230f93b9c36SSascha Wildner}
231f93b9c36SSascha Wildner.Ed
232f93b9c36SSascha Wildner.Pp
233f93b9c36SSascha WildnerIn userspace:
234f93b9c36SSascha Wildner.Bd -literal -offset indent
235f93b9c36SSascha Wildnerint a = 101;
236f93b9c36SSascha Wildnerif (ioctl(fd, MYDEVIOCTL, \*[Am]a) == -1) {
237f93b9c36SSascha Wildner	/* Handle failure */
238f93b9c36SSascha Wildner}
239f93b9c36SSascha Wildner.Ed
240f93b9c36SSascha Wildner.Sh SEE ALSO
241f93b9c36SSascha Wildner.Xr ioctl 2
242