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