#include <sys/ioccom.h>

sys/ioccom.h

includes: sys/_types.h
15 macros

macroIOCPARM_MASK

Ioctl's have the command encoded in the lower word, and the size of any in or out parameters in the upper word. The high 3 bits of the upper word are used to encode the in/out status of the parameter.
#define IOCPARM_MASK 0x1fff
parameter length, at most 13 bits

macroIOCPARM_LEN

#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)

macroIOCBASECMD

#define IOCBASECMD(x) ((x) & ~(IOCPARM_MASK << 16))

macroIOCGROUP

#define IOCGROUP(x) (((x) >> 8) & 0xff)

macroIOCPARM_MAX

#define IOCPARM_MAX (IOCPARM_MASK + 1)
max size of ioctl args

macroIOC_VOID

no parameters
#define IOC_VOID (__uint32_t)0x20000000

macroIOC_OUT

copy parameters out
#define IOC_OUT (__uint32_t)0x40000000

macroIOC_IN

copy parameters in
#define IOC_IN (__uint32_t)0x80000000

macroIOC_INOUT

copy parameters in and out
#define IOC_INOUT (IOC_IN|IOC_OUT)

macroIOC_DIRMASK

mask for IN/OUT/VOID
#define IOC_DIRMASK (__uint32_t)0xe0000000

macro_IOC

#define _IOC(inout, group, num, len) (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))

macro_IO

#define _IO(g, n) _IOC(IOC_VOID,	(g), (n), 0)

macro_IOR

#define _IOR(g, n, t) _IOC(IOC_OUT,	(g), (n), sizeof(t))

macro_IOW

#define _IOW(g, n, t) _IOC(IOC_IN,	(g), (n), sizeof(t))

macro_IOWR

this should be _IORW, but stdio got there first
#define _IOWR(g, n, t) _IOC(IOC_INOUT,	(g), (n), sizeof(t))