ioctl_list – list of ioctl calls in Linux/i386 kernel

NAME

ioctl_list - list of ioctl calls in Linux/i386 kernel

DESCRIPTION

This is Ioctl List 1.3.27, a list of ioctl calls in Linux/i386 kernel
1.3.27. It contains 421 ioctls from .
For each ioctl, its numerical value, its name, and its argument type
are given.
An argument type of const struct foo * means the argument is input to
the kernel. struct foo * means the kernel outputs the argument. If
the kernel uses the argument for both input and output, this is
marked with // I-O.
Some ioctls take more arguments or return more values than a single
structure. These are marked // MORE and documented further in a
separate section.
This list is very incomplete.

RETURN VALUE

Ioctl command values are 32-bit constants. In principle these
constants are completely arbitrary, but people have tried to build
some structure into them.
The old Linux situation was that of mostly 16-bit constants, where
the last byte is a serial number, and the preceding byte(s) give a
type indicating the driver. Sometimes the major number was used:
0x03 for the HDIO_* ioctls, 0x06 for the LP* ioctls. And sometimes
one or more ASCII letters were used. For example, TCGETS has value
0x00005401, with 0x54 = 'T' indicating the terminal driver, and
CYGETTIMEOUT has value 0x00435906, with 0x43 0x59 = 'C' 'Y'
indicating the cyclades driver.
Later (0.98p5) some more information was built into the number. One
has 2 direction bits (00: none, 01: write, 10: read, 11: read/write)
followed by 14 size bits (giving the size of the argument), followed
by an 8-bit type (collecting the ioctls in groups for a common
purpose or a common driver), and an 8-bit serial number.
The macros describing this structure live in and are
_IO(type,nr) and {_IOR,_IOW,_IOWR}(type,nr,size). They use
sizeof(size) so that size is a misnomer here: this third argument is
a data type.
Note that the size bits are very unreliable: in lots of cases they
are wrong, either because of buggy macros using
sizeof(sizeof(struct)), or because of legacy values.
Thus, it seems that the new structure only gave disadvantages: it
does not help in checking, but it causes varying values for the
various architectures.