port to arm64
[lnanohttp.git] / ulinux / ioctl.h
blob161f068a047e601e4bcc1fb6a844700e5461de0f
1 #ifndef ULINUX_IOCTL_H
2 #define ULINUX_IOCTL_H
3 /*
4 * this code is protected by the GNU affero GPLv3
5 * author:Sylvain BERTRAND
6 */
8 /*
9 * ioctl command encoding: 32 bits total, command in lower 16 bits,
10 * size of the parameter structure in the lower 14 bits of the
11 * upper 16 bits.
12 * Encoding the size of the parameter structure in the ioctl request
13 * is useful for catching programs compiled with old versions
14 * and to avoid overwriting user space outside the user buffer area.
15 * The highest 2 bits are reserved for indicating the ``access mode''.
16 * NOTE: This limits the max parameter size to 16kB -1 !
18 * The following is for compatibility across the various Linux
19 * platforms. The generic ioctl numbering scheme doesn't really enforce
20 * a type field. De facto, however, the top 8 bits of the lower 16
21 * bits are indeed used as a type field, so we might just as well make
22 * this explicit here. Please be sure to use the decoding macros
23 * below from now on.
26 #define ULINUX_IOC_NRBITS 8
27 #define ULINUX_IOC_TYPEBITS 8
30 * Let any architecture override either of the following before
31 * including this file.
34 /*XXX:can be arch dependent*/
35 #define ULINUX_IOC_SIZEBITS 14
37 /*XXX:can be arch dependent*/
38 #define ULINUX_IOC_DIRBITS 2
40 #define ULINUX_IOC_NRMASK ((1<<ULINUX_IOC_NRBITS)-1)
41 #define ULINUX_IOC_TYPEMASK ((1<<ULINUX_IOC_TYPEBITS)-1)
42 #define ULINUX_IOC_SIZEMASK ((1<<ULINUX_IOC_SIZEBITS)-1)
43 #define ULINUX_IOC_DIRMASK ((1<<ULINUX_IOC_DIRBITS)-1)
45 #define ULINUX_IOC_NRSHIFT 0
46 #define ULINUX_IOC_TYPESHIFT (ULINUX_IOC_NRSHIFT+ULINUX_IOC_NRBITS)
47 #define ULINUX_IOC_SIZESHIFT (ULINUX_IOC_TYPESHIFT+ULINUX_IOC_TYPEBITS)
48 #define ULINUX_IOC_DIRSHIFT (ULINUX_IOC_SIZESHIFT+ULINUX_IOC_SIZEBITS)
51 * Direction bits, which any architecture can choose to override
52 * before including this file.
55 /*XXX:can be arch dependent*/
56 #define ULINUX_IOC_NONE 0U
58 /*XXX:can be arch dependent*/
59 #define ULINUX_IOC_WRITE 1U
61 /*XXX:can be arch dependent*/
62 #define ULINUX_IOC_READ 2U
64 #define ULINUX_IOC(dir,type,nr,size) \
65 (((dir)<<ULINUX_IOC_DIRSHIFT) | \
66 ((type)<<ULINUX_IOC_TYPESHIFT) | \
67 ((nr)<<ULINUX_IOC_NRSHIFT) | \
68 ((size)<<ULINUX_IOC_SIZESHIFT))
70 #define ULINUX_IOC_TYPECHECK(t) (sizeof(t))
72 /*used to create numbers*/
73 #define ULINUX_IO(type,nr) ULINUX_IOC(ULINUX_IOC_NONE,(type),(nr),0)
74 #define ULINUX_IOR(type,nr,size)\
75 ULINUX_IOC(ULINUX_IOC_READ,(type),(nr),(ULINUX_IOC_TYPECHECK(size)))
76 #define ULINUX_IOW(type,nr,size)\
77 ULINUX_IOC(ULINUX_IOC_WRITE,(type),(nr),(ULINUX_IOC_TYPECHECK(size)))
78 #define ULINUX_IOWR(type,nr,size)\
79 ULINUX_IOC(ULINUX_IOC_READ|ULINUX_IOC_WRITE,(type),(nr),\
80 (ULINUX_IOC_TYPECHECK(size)))
81 #define ULINUX_IOR_BAD(type,nr,size) ULINUX_IOC(ULINUX_IOC_READ,(type),(nr),\
82 sizeof(size))
83 #define ULINUX_IOW_BAD(type,nr,size) ULINUX_IOC(ULINUX_IOC_WRITE,(type),(nr),\
84 sizeof(size))
85 #define ULINUX_IOWR_BAD(type,nr,size)\
86 ULINUX_IOC(ULINUX_IOC_READ|ULINUX_IOC_WRITE,(type),(nr),sizeof(size))
88 /*used to decode ioctl numbers*/
89 #define ULINUX_IOC_DIR(nr) (((nr)>>ULINUX_IOC_DIRSHIFT)&ULINUX_IOC_DIRMASK)
90 #define ULINUX_IOC_TYPE(nr) (((nr)>>ULINUX_IOC_TYPESHIFT)&ULINUX_IOC_TYPEMASK)
91 #define ULINUX_IOC_NR(nr) (((nr)>>ULINUX_IOC_NRSHIFT)&ULINUX_IOC_NRMASK)
92 #define ULINUX_IOC_SIZE(nr) (((nr)>>ULINUX_IOC_SIZESHIFT)&ULINUX_IOC_SIZEMASK)
94 /*...and for the drivers/sound files...*/
95 #define ULINUX_IOC_IN (ULINUX_IOC_WRITE<<ULINUX_IOC_DIRSHIFT)
96 #define ULINUX_IOC_OUT (ULINUX_IOC_READ<<ULINUX_IOC_DIRSHIFT)
97 #define ULINUX_IOC_INOUT ((ULINUX_IOC_WRITE|ULINUX_IOC_READ)<<\
98 ULINUX_IOC_DIRSHIFT)
99 #define ULINUX_IOCSIZE_MASK (ULINUX_IOC_SIZEMASK<<ULINUX_IOC_SIZESHIFT)
100 #define ULINUX_IOCSIZE_SHIFT (ULINUX_IOC_SIZESHIFT)
101 #endif