1 /**
2 * D header file for POSIX.
3 *
4 * Copyright: Copyright Alex Rønne Petersen 2011 - 2012.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
9
10 /* Copyright Alex Rønne Petersen 2011 - 2012.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
14 */
15 module core.sys.posix.sys.ioctl;
16
17 import core.stdc.config;
18 public import core.sys.posix.sys.ttycom;
19
20 version (OSX)
21 version = Darwin;
22 else version (iOS)
23 version = Darwin;
24 else version (TVOS)
25 version = Darwin;
26 else version (WatchOS)
27 version = Darwin;
28
version(Posix)29 version (Posix):
30
31 extern (C) nothrow @nogc:
32 @system:
33
34 version (linux)
35 {
36 import core.sys.posix.termios; // tcflag_t, speed_t, cc_t
37
38 enum _IOC_NRBITS = 8;
39 enum _IOC_TYPEBITS = 8;
40 enum _IOC_SIZEBITS = 14;
41 enum _IOC_DIRBITS = 2;
42
43 enum _IOC_NRMASK = (1 << _IOC_NRBITS) - 1;
44 enum _IOC_TYPEMASK = (1 << _IOC_TYPEBITS) - 1;
45 enum _IOC_SIZEMASK = (1 << _IOC_SIZEBITS) - 1;
46 enum _IOC_DIRMASK = (1 << _IOC_DIRBITS) - 1;
47
48 enum _IOC_NRSHIFT = 0;
49 enum _IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS;
50 enum _IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS;
51 enum _IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS;
52
53 enum _IOC_NONE = 0;
54 enum _IOC_WRITE = 1;
55 enum _IOC_READ = 2;
56
57 extern (D) int _IOC(T = typeof(null))(int dir, int type, int nr)
58 {
59 return (dir << _IOC_DIRSHIFT) |
60 (type << _IOC_TYPESHIFT) |
61 (nr << _IOC_NRSHIFT) |
62 (is(T == typeof(null)) ? 0 : T.sizeof << _IOC_SIZESHIFT);
63 }
64
65 extern (D) int _IO(int type, int nr)
66 {
67 return _IOC(_IOC_NONE, type, nr);
68 }
69
70 extern (D) int _IOR(T)(int type, int nr)
71 {
72 return _IOC!T(_IOC_READ, type, nr);
73 }
74
75 extern (D) int _IOW(T)(int type, int nr)
76 {
77 return _IOC!T(_IOC_WRITE, type, nr);
78 }
79
80 extern (D) int _IOWR(T)(int type, int nr)
81 {
82 return _IOC!T(_IOC_READ | _IOC_WRITE, type, nr);
83 }
84
85 extern (D) int _IOC_DIR(int nr)
86 {
87 return (nr >> _IOC_DIRSHIFT) & _IOC_DIRMASK;
88 }
89
90 extern (D) int _IOC_TYPE(int nr)
91 {
92 return (nr >> _IOC_TYPESHIFT) & _IOC_TYPEMASK;
93 }
94
95 extern (D) int _IOC_NR(int nr)
96 {
97 return (nr >> _IOC_NRSHIFT) & _IOC_NRMASK;
98 }
99
100 extern (D) int _IOC_SIZE(int nr)
101 {
102 return (nr >> _IOC_SIZESHIFT) & _IOC_SIZEMASK;
103 }
104
105 enum IOC_IN = _IOC_WRITE << _IOC_DIRSHIFT;
106 enum IOC_OUT = _IOC_READ << _IOC_DIRSHIFT;
107 enum IOC_INOUT = (_IOC_READ | _IOC_WRITE) << _IOC_DIRSHIFT;
108 enum IOCSIZE_MASK = _IOC_SIZEMASK << _IOC_DIRSHIFT;
109 enum IOCSIZE_SHIFT = _IOC_SIZESHIFT;
110
111 enum NCCS = 19;
112
113 struct termios2
114 {
115 tcflag_t c_iflag;
116 tcflag_t c_oflag;
117 tcflag_t c_cflag;
118 tcflag_t c_lflag;
119 cc_t c_line;
120 cc_t[NCCS] c_cc;
121 speed_t c_ispeed;
122 speed_t c_ospeed;
123 }
124
125 struct winsize
126 {
127 ushort ws_row;
128 ushort ws_col;
129 ushort ws_xpixel;
130 ushort ws_ypixel;
131 }
132
133 enum NCC = 8;
134
135 struct termio
136 {
137 ushort c_iflag;
138 ushort c_oflag;
139 ushort c_cflag;
140 ushort c_lflag;
141 ubyte c_line;
142 ubyte[NCC] c_cc;
143 }
144
145 enum TIOCM_LE = 0x001;
146 enum TIOCM_DTR = 0x002;
147 enum TIOCM_RTS = 0x004;
148 enum TIOCM_ST = 0x008;
149 enum TIOCM_SR = 0x010;
150 enum TIOCM_CTS = 0x020;
151 enum TIOCM_CAR = 0x040;
152 enum TIOCM_RNG = 0x080;
153 enum TIOCM_DSR = 0x100;
154 enum TIOCM_CD = TIOCM_CAR;
155 enum TIOCM_RI = TIOCM_RNG;
156
157 enum N_TTY = 0;
158 enum N_SLIP = 1;
159 enum N_MOUSE = 2;
160 enum N_PPP = 3;
161 enum N_STRIP = 4;
162 enum N_AX25 = 5;
163 enum N_X25 = 6;
164 enum N_6PACK = 7;
165 enum N_MASC = 8;
166 enum N_R3964 = 9;
167 enum N_PROFIBUS_FDL = 10;
168 enum N_IRDA = 11;
169 enum N_SMSBLOCK = 12;
170 enum N_HDLC = 13;
171 enum N_SYNC_PPP = 14;
172 enum N_HCI = 15;
173
174 enum TCGETS = 0x5401;
175 enum TCSETS = 0x5402;
176 enum TCSETSW = 0x5403;
177 enum TCSETSF = 0x5404;
178 enum TCGETA = 0x5405;
179 enum TCSETA = 0x5406;
180 enum TCSETAW = 0x5407;
181 enum TCSETAF = 0x5408;
182 enum TCSBRK = 0x5409;
183 enum TCXONC = 0x540A;
184 enum TCFLSH = 0x540B;
185 enum TIOCEXCL = 0x540C;
186 enum TIOCNXCL = 0x540D;
187 enum TIOCSCTTY = 0x540E;
188 enum TIOCGPGRP = 0x540F;
189 enum TIOCSPGRP = 0x5410;
190 enum TIOCOUTQ = 0x5411;
191 enum TIOCSTI = 0x5412;
192 enum TIOCGWINSZ = 0x5413;
193 enum TIOCSWINSZ = 0x5414;
194 enum TIOCMGET = 0x5415;
195 enum TIOCMBIS = 0x5416;
196 enum TIOCMBIC = 0x5417;
197 enum TIOCMSET = 0x5418;
198 enum TIOCGSOFTCAR = 0x5419;
199 enum TIOCSSOFTCAR = 0x541A;
200 enum FIONREAD = 0x541B;
201 enum TIOCINQ = FIONREAD;
202 enum TIOCLINUX = 0x541C;
203 enum TIOCCONS = 0x541D;
204 enum TIOCGSERIAL = 0x541E;
205 enum TIOCSSERIAL = 0x541F;
206 enum TIOCPKT = 0x5420;
207 enum FIONBIO = 0x5421;
208 enum TIOCNOTTY = 0x5422;
209 enum TIOCSETD = 0x5423;
210 enum TIOCGETD = 0x5424;
211 enum TCSBRKP = 0x5425;
212 enum TIOCSBRK = 0x5427;
213 enum TIOCCBRK = 0x5428;
214 enum TIOCGSID = 0x5429;
215
216 enum TCGETS2 = _IOR!termios2('T', 0x2A);
217 enum TCSETS2 = _IOW!termios2('T', 0x2B);
218 enum TCSETSW2 = _IOW!termios2('T', 0x2C);
219 enum TCSETSF2 = _IOW!termios2('T', 0x2D);
220
221 enum TIOCGRS485 = 0x542E;
222 enum TIOCSRS485 = 0x542F;
223
224 enum TIOCGPTN = _IOR!uint('T', 0x30);
225 enum TIOCSPTLCK = _IOW!int('T', 0x31);
226 enum TIOCGDEV = _IOR!uint('T', 0x32);
227
228 enum TCGETX = 0x5432;
229 enum TCSETX = 0x5433;
230 enum TCSETXF = 0x5434;
231 enum TCSETXW = 0x5435;
232
233 enum TIOCSIG = _IOW!int('T', 0x36);
234
235 enum TIOCVHANGUP = 0x5437;
236
237 enum FIONCLEX = 0x5450;
238 enum FIOCLEX = 0x5451;
239 enum FIOASYNC = 0x5452;
240 enum TIOCSERCONFIG = 0x5453;
241 enum TIOCSERGWILD = 0x5454;
242 enum TIOCSERSWILD = 0x5455;
243 enum TIOCGLCKTRMIOS = 0x5456;
244 enum TIOCSLCKTRMIOS = 0x5457;
245 enum TIOCSERGSTRUCT = 0x5458;
246 enum TIOCSERGETLSR = 0x5459;
247 enum TIOCSERGETMULTI = 0x545A;
248 enum TIOCSERSETMULTI = 0x545B;
249
250 enum TIOCMIWAIT = 0x545C;
251 enum TIOCGICOUNT = 0x545D;
252
253 enum FIOQSIZE = 0x5460;
254
255 enum TIOCPKT_DATA = 0;
256 enum TIOCPKT_FLUSHREAD = 1;
257 enum TIOCPKT_FLUSHWRITE = 2;
258 enum TIOCPKT_STOP = 4;
259 enum TIOCPKT_START = 8;
260 enum TIOCPKT_NOSTOP = 16;
261 enum TIOCPKT_DOSTOP = 32;
262 enum TIOCPKT_IOCTL = 64;
263
264 enum TIOCSER_TEMT = 0x01;
265
266 enum SIOCADDRT = 0x890B;
267 enum SIOCDELRT = 0x890C;
268 enum SIOCRTMSG = 0x890D;
269
270 enum SIOCGIFNAME = 0x8910;
271 enum SIOCSIFLINK = 0x8911;
272 enum SIOCGIFCONF = 0x8912;
273 enum SIOCGIFFLAGS = 0x8913;
274 enum SIOCSIFFLAGS = 0x8914;
275 enum SIOCGIFADDR = 0x8915;
276 enum SIOCSIFADDR = 0x8916;
277 enum SIOCGIFDSTADDR = 0x8917;
278 enum SIOCSIFDSTADDR = 0x8918;
279 enum SIOCGIFBRDADDR = 0x8919;
280 enum SIOCSIFBRDADDR = 0x891a;
281 enum SIOCGIFNETMASK = 0x891b;
282 enum SIOCSIFNETMASK = 0x891c;
283 enum SIOCGIFMETRIC = 0x891d;
284 enum SIOCSIFMETRIC = 0x891e;
285 enum SIOCGIFMEM = 0x891f;
286 enum SIOCSIFMEM = 0x8920;
287 enum SIOCGIFMTU = 0x8921;
288 enum SIOCSIFMTU = 0x8922;
289 enum SIOCSIFNAME = 0x8923;
290 enum SIOCSIFHWADDR = 0x8924;
291 enum SIOCGIFENCAP = 0x8925;
292 enum SIOCSIFENCAP = 0x8926;
293 enum SIOCGIFHWADDR = 0x8927;
294 enum SIOCGIFSLAVE = 0x8929;
295 enum SIOCSIFSLAVE = 0x8930;
296 enum SIOCADDMULTI = 0x8931;
297 enum SIOCDELMULTI = 0x8932;
298 enum SIOCGIFINDEX = 0x8933;
299 enum SIOGIFINDEX = SIOCGIFINDEX;
300 enum SIOCSIFPFLAGS = 0x8934;
301 enum SIOCGIFPFLAGS = 0x8935;
302 enum SIOCDIFADDR = 0x8936;
303 enum SIOCSIFHWBROADCAST = 0x8937;
304 enum SIOCGIFCOUNT = 0x8938;
305
306 enum SIOCGIFBR = 0x8940;
307 enum SIOCSIFBR = 0x8941;
308
309 enum SIOCGIFTXQLEN = 0x8942;
310 enum SIOCSIFTXQLEN = 0x8943;
311
312 enum SIOCDARP = 0x8953;
313 enum SIOCGARP = 0x8954;
314 enum SIOCSARP = 0x8955;
315
316 enum SIOCDRARP = 0x8960;
317 enum SIOCGRARP = 0x8961;
318 enum SIOCSRARP = 0x8962;
319
320 enum SIOCGIFMAP = 0x8970;
321 enum SIOCSIFMAP = 0x8971;
322
323 enum SIOCADDDLCI = 0x8980;
324 enum SIOCDELDLCI = 0x8981;
325
326 enum SIOCDEVPRIVATE = 0x89F0;
327
328 enum SIOCPROTOPRIVATE = 0x89E0;
329 }
version(Darwin)330 else version (Darwin)
331 {
332 import core.sys.posix.termios; // termios
333 import core.sys.posix.sys.time; // timeval
334
335 public import core.sys.posix.sys.ttycom; // Terminal related ioctls
336
337 struct ttysize
338 {
339 ushort ts_lines;
340 ushort ts_cols;
341 ushort ts_xxx;
342 ushort ts_yyy;
343 }
344
345 enum uint TIOCGSIZE = TIOCGWINSZ;
346 enum uint TIOCSSIZE = TIOCSWINSZ;
347
348 public import core.sys.posix.sys.filio; // File related ioctls
349 }
version(FreeBSD)350 else version (FreeBSD)
351 {
352 struct fiodgname_arg
353 {
354 int len;
355 void* buf;
356 }
357 }
358 else version (NetBSD)
359 {
360 struct winsize
361 {
362 ushort ws_row;
363 ushort ws_col;
364 ushort ws_xpixel;
365 ushort ws_ypixel;
366 }
367 }
368 else version (OpenBSD)
369 {
370 import core.sys.posix.termios; // termios
371 import core.sys.posix.sys.time; // timeval
372
373 public import core.sys.posix.sys.ttycom; // Terminal related ioctls
374
375 struct winsize
376 {
377 ushort ws_row;
378 ushort ws_col;
379 ushort ws_xpixel;
380 ushort ws_ypixel;
381 }
382
383 public import core.sys.posix.sys.filio; // File related ioctls
384 }
385 else version (DragonFlyBSD)
386 {
387 struct fiodgname_arg
388 {
389 int len;
390 void* buf;
391 }
392
393 struct winsize
394 {
395 ushort ws_row;
396 ushort ws_col;
397 ushort ws_xpixel;
398 ushort ws_ypixel;
399 }
400 }
401 else version (Solaris)
402 {
403 }
404 else
405 {
406 static assert(false, "Unsupported platform");
407 }
408
409 ///
410 version (CRuntime_Glibc)
411 {
412 int ioctl(int __fd, c_ulong __request, ...);
413 }
414 else version (Darwin)
415 {
416 int ioctl(int fildes, c_ulong request, ...);
417 }
418 else version (FreeBSD)
419 {
420 int ioctl(int, c_ulong, ...);
421 }
422 else version (NetBSD)
423 {
424 int ioctl(int, c_ulong, ...);
425 }
426 else version (OpenBSD)
427 {
428 int ioctl(int, c_ulong, ...);
429 }
430 else version (DragonFlyBSD)
431 {
432 int ioctl(int, c_ulong, ...);
433 }
434 else version (Solaris)
435 {
436 int ioctl(int fildes, int request, ...);
437 }
438 else version (CRuntime_Bionic)
439 {
440 int ioctl(int, int, ...);
441 }
442 else version (CRuntime_Musl)
443 {
444 int ioctl(int, int, ...);
445 }
446 else version (CRuntime_UClibc)
447 {
448 int ioctl(int __fd, c_ulong __request, ...);
449 }
450 else
451 {
452 static assert(false, "Unsupported platform");
453 }
454