xref: /haiku/headers/compatibility/bsd/sys/ioccom.h (revision 495060760727dd782c9f8a90db71e5d727f19748)
1 /**
2  * @file sys/ioccom.h
3  * @brief Definitions & maros common to ioctl
4  */
5 
6 #ifndef _SYS_IOCCOM_H
7 #define _SYS_IOCCOM_H
8 
9 #include <features.h>
10 
11 #ifdef _DEFAULT_SOURCE
12 
13 
14 /**
15  * @defgroup IOCTL_common sys/ioccom.h
16  * @brief Definitions & maros common to ioctl()
17  * @ingroup OpenBeOS_POSIX
18  * @ingroup IOCTL
19  * Ioctl values passed as the command (2nd) variable have the
20  * command encoded in the lower word and the size of any parameters
21  * in the upper word (in or out).
22  * The high 3 bits are used to encode whether it's in or out.
23  * Due to this you can't just give an ioctl value, you need to encode
24  * it using macros described in
25  * @ref IOCTL_macros
26  * @{
27  */
28 
29 /** @defgroup IOCTL_parm ioctl() parameter definitions
30  * @ingroup IOCTL_common
31  * @{
32  */
33 /** @def IOC_VOID */
34 #define IOC_VOID         (ulong)0x20000000
35 /** @def IOC_OUT ioctl expects data (output) */
36 #define IOC_OUT          (ulong)0x40000000
37 /** @def IOC_IN ioctl passes a value in */
38 #define IOC_IN           (ulong)0x80000000
39 /** @def IOC_INOUT ioctl passes data in and out */
40 #define IOC_INOUT        (IOC_IN|IOC_OUT)
41 /** @def IOC_DIRMASK */
42 #define IOC_DIRMASK      (ulong)0xe0000000
43 /** @} */
44 
45 /**
46  * @defgroup IOCTL_macros IOCTL macros
47  * These should be used to define the values passed in as cmd to
48  * ioctl()
49  * @ingroup IOCTL_common
50  * @{
51  */
52 /** @def IOCPARM_MASK mask used to for following macros */
53 #define IOCPARM_MASK     0x1fff
54 /** @def IOCPARM_LEN(x) length of the data passed as param */
55 #define IOCPARM_LEN(x)   (((x) >> 16) & IOCPARM_MASK)
56 /** @def IOCBASECMD(x) the base command encoded in the ioctl value */
57 #define IOCBASECMD(x)    ((x) & ~(IOCPARM_MASK << 16))
58 /** @def IOCGROUP(x) which group of ioctl() commands does this belong to? */
59 #define IOCGROUP(x)      (((x) >> 8) & 0xff)
60 /** @def IOCPARM_MAX Maximum size of parameter that can be passed (20 bytes) */
61 #define IOCPARM_MAX      20
62 
63 /**
64  * @defgroup IOCTL_createmacros macro's to create ioctl() values
65  * @brief these macro's should be used to create new ioctl() values
66  * @ingroup IOCTL_common
67  * @{
68  */
69 /** @def _IOC(inout, group, num , len) create a new ioctl */
70 #define _IOC(inout, group, num, len) \
71 	(inout | ((len & IOCPARM_MASK)<<16) | ((group) << 8) | (num))
72 /** @def _IO(g,n) create a new void ioctl for group g, number n */
73 #define _IO(g,n)          _IOC(IOC_VOID, (g), (n), 0)
74 /** @def _IOR(g,n,t) create a ioctl() that reads a value of type t*/
75 #define _IOR(g,n,t)       _IOC(IOC_OUT,  (g), (n), sizeof(t))
76 /** @def _IOW(g,n,t) ioctl() that writes value of type t, group g, number n */
77 #define _IOW(g,n,t)       _IOC(IOC_IN ,  (g), (n), sizeof(t))
78 /** @def _IOWR(g,n,t) ioctl() that reads/writes value of type t
79  * @note this isn't _IORW as this causes name conflicts on some systems */
80 #define _IOWR(g,n,t)      _IOC(IOC_INOUT,  (g), (n), sizeof(t))
81 /** @} */
82 
83 /** @} */
84 
85 
86 #endif
87 
88 
89 #endif /* _SYS_IOCCOM_H */
90