/** * D header file for POSIX. * * Copyright: Copyright Alex Rønne Petersen 2011 - 2012. * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). * Authors: Alex Rønne Petersen * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition */ /* Copyright Alex Rønne Petersen 2011 - 2012. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE or copy at * http://www.boost.org/LICENSE_1_0.txt) */ module core.sys.posix.sys.ioctl; import core.stdc.config; public import core.sys.posix.sys.ttycom; version (OSX) version = Darwin; else version (iOS) version = Darwin; else version (TVOS) version = Darwin; else version (WatchOS) version = Darwin; version (Posix): extern (C) nothrow @nogc: version (linux) { import core.sys.posix.termios; // tcflag_t, speed_t, cc_t enum _IOC_NRBITS = 8; enum _IOC_TYPEBITS = 8; enum _IOC_SIZEBITS = 14; enum _IOC_DIRBITS = 2; enum _IOC_NRMASK = (1 << _IOC_NRBITS) - 1; enum _IOC_TYPEMASK = (1 << _IOC_TYPEBITS) - 1; enum _IOC_SIZEMASK = (1 << _IOC_SIZEBITS) - 1; enum _IOC_DIRMASK = (1 << _IOC_DIRBITS) - 1; enum _IOC_NRSHIFT = 0; enum _IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS; enum _IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS; enum _IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS; enum _IOC_NONE = 0; enum _IOC_WRITE = 1; enum _IOC_READ = 2; extern (D) int _IOC(T = typeof(null))(int dir, int type, int nr) { return (dir << _IOC_DIRSHIFT) | (type << _IOC_TYPESHIFT) | (nr << _IOC_NRSHIFT) | (is(T == typeof(null)) ? 0 : T.sizeof << _IOC_SIZESHIFT); } extern (D) int _IO(int type, int nr) { return _IOC(_IOC_NONE, type, nr); } extern (D) int _IOR(T)(int type, int nr) { return _IOC!T(_IOC_READ, type, nr); } extern (D) int _IOW(T)(int type, int nr) { return _IOC!T(_IOC_WRITE, type, nr); } extern (D) int _IOWR(T)(int type, int nr) { return _IOC!T(_IOC_READ | _IOC_WRITE, type, nr); } extern (D) int _IOC_DIR(int nr) { return (nr >> _IOC_DIRSHIFT) & _IOC_DIRMASK; } extern (D) int _IOC_TYPE(int nr) { return (nr >> _IOC_TYPESHIFT) & _IOC_TYPEMASK; } extern (D) int _IOC_NR(int nr) { return (nr >> _IOC_NRSHIFT) & _IOC_NRMASK; } extern (D) int _IOC_SIZE(int nr) { return (nr >> _IOC_SIZESHIFT) & _IOC_SIZEMASK; } enum IOC_IN = _IOC_WRITE << _IOC_DIRSHIFT; enum IOC_OUT = _IOC_READ << _IOC_DIRSHIFT; enum IOC_INOUT = (_IOC_READ | _IOC_WRITE) << _IOC_DIRSHIFT; enum IOCSIZE_MASK = _IOC_SIZEMASK << _IOC_DIRSHIFT; enum IOCSIZE_SHIFT = _IOC_SIZESHIFT; enum NCCS = 19; struct termios2 { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t c_line; cc_t[NCCS] c_cc; speed_t c_ispeed; speed_t c_ospeed; } struct winsize { ushort ws_row; ushort ws_col; ushort ws_xpixel; ushort ws_ypixel; } enum NCC = 8; struct termio { ushort c_iflag; ushort c_oflag; ushort c_cflag; ushort c_lflag; ubyte c_line; ubyte[NCC] c_cc; } enum TIOCM_LE = 0x001; enum TIOCM_DTR = 0x002; enum TIOCM_RTS = 0x004; enum TIOCM_ST = 0x008; enum TIOCM_SR = 0x010; enum TIOCM_CTS = 0x020; enum TIOCM_CAR = 0x040; enum TIOCM_RNG = 0x080; enum TIOCM_DSR = 0x100; enum TIOCM_CD = TIOCM_CAR; enum TIOCM_RI = TIOCM_RNG; enum N_TTY = 0; enum N_SLIP = 1; enum N_MOUSE = 2; enum N_PPP = 3; enum N_STRIP = 4; enum N_AX25 = 5; enum N_X25 = 6; enum N_6PACK = 7; enum N_MASC = 8; enum N_R3964 = 9; enum N_PROFIBUS_FDL = 10; enum N_IRDA = 11; enum N_SMSBLOCK = 12; enum N_HDLC = 13; enum N_SYNC_PPP = 14; enum N_HCI = 15; enum TCGETS = 0x5401; enum TCSETS = 0x5402; enum TCSETSW = 0x5403; enum TCSETSF = 0x5404; enum TCGETA = 0x5405; enum TCSETA = 0x5406; enum TCSETAW = 0x5407; enum TCSETAF = 0x5408; enum TCSBRK = 0x5409; enum TCXONC = 0x540A; enum TCFLSH = 0x540B; enum TIOCEXCL = 0x540C; enum TIOCNXCL = 0x540D; enum TIOCSCTTY = 0x540E; enum TIOCGPGRP = 0x540F; enum TIOCSPGRP = 0x5410; enum TIOCOUTQ = 0x5411; enum TIOCSTI = 0x5412; enum TIOCGWINSZ = 0x5413; enum TIOCSWINSZ = 0x5414; enum TIOCMGET = 0x5415; enum TIOCMBIS = 0x5416; enum TIOCMBIC = 0x5417; enum TIOCMSET = 0x5418; enum TIOCGSOFTCAR = 0x5419; enum TIOCSSOFTCAR = 0x541A; enum FIONREAD = 0x541B; enum TIOCINQ = FIONREAD; enum TIOCLINUX = 0x541C; enum TIOCCONS = 0x541D; enum TIOCGSERIAL = 0x541E; enum TIOCSSERIAL = 0x541F; enum TIOCPKT = 0x5420; enum FIONBIO = 0x5421; enum TIOCNOTTY = 0x5422; enum TIOCSETD = 0x5423; enum TIOCGETD = 0x5424; enum TCSBRKP = 0x5425; enum TIOCSBRK = 0x5427; enum TIOCCBRK = 0x5428; enum TIOCGSID = 0x5429; enum TCGETS2 = _IOR!termios2('T', 0x2A); enum TCSETS2 = _IOW!termios2('T', 0x2B); enum TCSETSW2 = _IOW!termios2('T', 0x2C); enum TCSETSF2 = _IOW!termios2('T', 0x2D); enum TIOCGRS485 = 0x542E; enum TIOCSRS485 = 0x542F; enum TIOCGPTN = _IOR!uint('T', 0x30); enum TIOCSPTLCK = _IOW!int('T', 0x31); enum TIOCGDEV = _IOR!uint('T', 0x32); enum TCGETX = 0x5432; enum TCSETX = 0x5433; enum TCSETXF = 0x5434; enum TCSETXW = 0x5435; enum TIOCSIG = _IOW!int('T', 0x36); enum TIOCVHANGUP = 0x5437; enum FIONCLEX = 0x5450; enum FIOCLEX = 0x5451; enum FIOASYNC = 0x5452; enum TIOCSERCONFIG = 0x5453; enum TIOCSERGWILD = 0x5454; enum TIOCSERSWILD = 0x5455; enum TIOCGLCKTRMIOS = 0x5456; enum TIOCSLCKTRMIOS = 0x5457; enum TIOCSERGSTRUCT = 0x5458; enum TIOCSERGETLSR = 0x5459; enum TIOCSERGETMULTI = 0x545A; enum TIOCSERSETMULTI = 0x545B; enum TIOCMIWAIT = 0x545C; enum TIOCGICOUNT = 0x545D; enum FIOQSIZE = 0x5460; enum TIOCPKT_DATA = 0; enum TIOCPKT_FLUSHREAD = 1; enum TIOCPKT_FLUSHWRITE = 2; enum TIOCPKT_STOP = 4; enum TIOCPKT_START = 8; enum TIOCPKT_NOSTOP = 16; enum TIOCPKT_DOSTOP = 32; enum TIOCPKT_IOCTL = 64; enum TIOCSER_TEMT = 0x01; enum SIOCADDRT = 0x890B; enum SIOCDELRT = 0x890C; enum SIOCRTMSG = 0x890D; enum SIOCGIFNAME = 0x8910; enum SIOCSIFLINK = 0x8911; enum SIOCGIFCONF = 0x8912; enum SIOCGIFFLAGS = 0x8913; enum SIOCSIFFLAGS = 0x8914; enum SIOCGIFADDR = 0x8915; enum SIOCSIFADDR = 0x8916; enum SIOCGIFDSTADDR = 0x8917; enum SIOCSIFDSTADDR = 0x8918; enum SIOCGIFBRDADDR = 0x8919; enum SIOCSIFBRDADDR = 0x891a; enum SIOCGIFNETMASK = 0x891b; enum SIOCSIFNETMASK = 0x891c; enum SIOCGIFMETRIC = 0x891d; enum SIOCSIFMETRIC = 0x891e; enum SIOCGIFMEM = 0x891f; enum SIOCSIFMEM = 0x8920; enum SIOCGIFMTU = 0x8921; enum SIOCSIFMTU = 0x8922; enum SIOCSIFNAME = 0x8923; enum SIOCSIFHWADDR = 0x8924; enum SIOCGIFENCAP = 0x8925; enum SIOCSIFENCAP = 0x8926; enum SIOCGIFHWADDR = 0x8927; enum SIOCGIFSLAVE = 0x8929; enum SIOCSIFSLAVE = 0x8930; enum SIOCADDMULTI = 0x8931; enum SIOCDELMULTI = 0x8932; enum SIOCGIFINDEX = 0x8933; enum SIOGIFINDEX = SIOCGIFINDEX; enum SIOCSIFPFLAGS = 0x8934; enum SIOCGIFPFLAGS = 0x8935; enum SIOCDIFADDR = 0x8936; enum SIOCSIFHWBROADCAST = 0x8937; enum SIOCGIFCOUNT = 0x8938; enum SIOCGIFBR = 0x8940; enum SIOCSIFBR = 0x8941; enum SIOCGIFTXQLEN = 0x8942; enum SIOCSIFTXQLEN = 0x8943; enum SIOCDARP = 0x8953; enum SIOCGARP = 0x8954; enum SIOCSARP = 0x8955; enum SIOCDRARP = 0x8960; enum SIOCGRARP = 0x8961; enum SIOCSRARP = 0x8962; enum SIOCGIFMAP = 0x8970; enum SIOCSIFMAP = 0x8971; enum SIOCADDDLCI = 0x8980; enum SIOCDELDLCI = 0x8981; enum SIOCDEVPRIVATE = 0x89F0; enum SIOCPROTOPRIVATE = 0x89E0; } else version (Darwin) { import core.sys.posix.termios; // termios import core.sys.posix.sys.time; // timeval public import core.sys.posix.sys.ttycom; // Terminal related ioctls struct ttysize { ushort ts_lines; ushort ts_cols; ushort ts_xxx; ushort ts_yyy; } enum uint TIOCGSIZE = TIOCGWINSZ; enum uint TIOCSSIZE = TIOCSWINSZ; public import core.sys.posix.sys.filio; // File related ioctls } else version (FreeBSD) { struct fiodgname_arg { int len; void* buf; } } else version (NetBSD) { struct winsize { ushort ws_row; ushort ws_col; ushort ws_xpixel; ushort ws_ypixel; } } else version (OpenBSD) { import core.sys.posix.termios; // termios import core.sys.posix.sys.time; // timeval public import core.sys.posix.sys.ttycom; // Terminal related ioctls struct winsize { ushort ws_row; ushort ws_col; ushort ws_xpixel; ushort ws_ypixel; } public import core.sys.posix.sys.filio; // File related ioctls } else version (DragonFlyBSD) { struct fiodgname_arg { int len; void* buf; } struct winsize { ushort ws_row; ushort ws_col; ushort ws_xpixel; ushort ws_ypixel; } } else version (Solaris) { } else { static assert(false, "Unsupported platform"); } /// version (CRuntime_Glibc) { int ioctl(int __fd, c_ulong __request, ...); } else version (Darwin) { int ioctl(int fildes, c_ulong request, ...); } else version (FreeBSD) { int ioctl(int, c_ulong, ...); } else version (NetBSD) { int ioctl(int, c_ulong, ...); } else version (OpenBSD) { int ioctl(int, c_ulong, ...); } else version (DragonFlyBSD) { int ioctl(int, c_ulong, ...); } else version (Solaris) { int ioctl(int fildes, int request, ...); } else version (CRuntime_Bionic) { int ioctl(int, int, ...); } else version (CRuntime_Musl) { int ioctl(int, int, ...); } else version (CRuntime_UClibc) { int ioctl(int __fd, c_ulong __request, ...); } else { static assert(false, "Unsupported platform"); }