1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Copyright Sean Kelly 2005 - 2009.
5  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6  * Authors:   Sean Kelly, Alex Rønne Petersen
7  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8  */
9 
10 /*          Copyright Sean Kelly 2005 - 2009.
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.termios;
16 
17 import core.sys.posix.config;
18 public import core.sys.posix.sys.types; // for pid_t
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 extern (C):
31 
32 nothrow:
33 @nogc:
34 @system:
35 
36 //
37 // Required
38 //
39 /*
40 cc_t
41 speed_t
42 tcflag_t
43 
44 NCCS
45 
46 struct termios
47 {
48     tcflag_t   c_iflag;
49     tcflag_t   c_oflag;
50     tcflag_t   c_cflag;
51     tcflag_t   c_lflag;
52     cc_t[NCCS] c_cc;
53 }
54 
55 VEOF
56 VEOL
57 VERASE
58 VINTR
59 VKILL
60 VMIN
61 VQUIT
62 VSTART
63 VSTOP
64 VSUSP
65 VTIME
66 
67 BRKINT
68 ICRNL
69 IGNBRK
70 IGNCR
71 IGNPAR
72 INLCR
73 INPCK
74 ISTRIP
75 IXOFF
76 IXON
77 PARMRK
78 
79 OPOST
80 
81 B0
82 B50
83 B75
84 B110
85 B134
86 B150
87 B200
88 B300
89 B600
90 B1200
91 B1800
92 B2400
93 B4800
94 B9600
95 B19200
96 B38400
97 
98 CSIZE
99     CS5
100     CS6
101     CS7
102     CS8
103 CSTOPB
104 CREAD
105 PARENB
106 PARODD
107 HUPCL
108 CLOCAL
109 
110 ECHO
111 ECHOE
112 ECHOK
113 ECHONL
114 ICANON
115 IEXTEN
116 ISIG
117 NOFLSH
118 TOSTOP
119 
120 TCSANOW
121 TCSADRAIN
122 TCSAFLUSH
123 
124 TCIFLUSH
125 TCIOFLUSH
126 TCOFLUSH
127 
128 TCIOFF
129 TCION
130 TCOOFF
131 TCOON
132 
133 speed_t cfgetispeed(const scope termios*);
134 speed_t cfgetospeed(const scope termios*);
135 int     cfsetispeed(termios*, speed_t);
136 int     cfsetospeed(termios*, speed_t);
137 int     tcdrain(int);
138 int     tcflow(int, int);
139 int     tcflush(int, int);
140 int     tcgetattr(int, termios*);
141 int     tcsendbreak(int, int);
142 int     tcsetattr(int, int, const scope termios*);
143 */
144 
145 version (CRuntime_Glibc)
146 {
147     alias ubyte cc_t;
148     alias uint  speed_t;
149     alias uint  tcflag_t;
150 
151     enum NCCS   = 32;
152 
153     struct termios
154     {
155         tcflag_t   c_iflag;
156         tcflag_t   c_oflag;
157         tcflag_t   c_cflag;
158         tcflag_t   c_lflag;
159         cc_t       c_line;
160         cc_t[NCCS] c_cc;
161         speed_t    c_ispeed;
162         speed_t    c_ospeed;
163     }
164 
165     enum VEOF       = 4;
166     enum VEOL       = 11;
167     enum VERASE     = 2;
168     enum VINTR      = 0;
169     enum VKILL      = 3;
170     enum VMIN       = 6;
171     enum VQUIT      = 1;
172     enum VSTART     = 8;
173     enum VSTOP      = 9;
174     enum VSUSP      = 10;
175     enum VTIME      = 5;
176 
177     enum BRKINT     = 0x0000002; // 0000002
178     enum ICRNL      = 0x0000100; // 0000400
179     enum IGNBRK     = 0x0000001; // 0000001
180     enum IGNCR      = 0x0000080; // 0000200
181     enum IGNPAR     = 0x0000004; // 0000004
182     enum INLCR      = 0x0000040; // 0000100
183     enum INPCK      = 0x0000010; // 0000020
184     enum ISTRIP     = 0x0000020; // 0000040
185     enum IXOFF      = 0x0001000; // 0010000
186     enum IXON       = 0x0000400; // 0002000
187     enum PARMRK     = 0x0000008; // 0000010
188 
189     enum OPOST      = 0x0000001; // 0000001
190 
191     enum B0         = 0x0000000; // 0000000
192     enum B50        = 0x0000001; // 0000001
193     enum B75        = 0x0000002; // 0000002
194     enum B110       = 0x0000003; // 0000003
195     enum B134       = 0x0000004; // 0000004
196     enum B150       = 0x0000005; // 0000005
197     enum B200       = 0x0000006; // 0000006
198     enum B300       = 0x0000007; // 0000007
199     enum B600       = 0x0000008; // 0000010
200     enum B1200      = 0x0000009; // 0000011
201     enum B1800      = 0x000000A; // 0000012
202     enum B2400      = 0x000000B; // 0000013
203     enum B4800      = 0x000000C; // 0000014
204     enum B9600      = 0x000000D; // 0000015
205     enum B19200     = 0x000000E; // 0000016
206     enum B38400     = 0x000000F; // 0000017
207 
208     enum CSIZE      = 0x0000030; // 0000060
209     enum   CS5      = 0x0000000; // 0000000
210     enum   CS6      = 0x0000010; // 0000020
211     enum   CS7      = 0x0000020; // 0000040
212     enum   CS8      = 0x0000030; // 0000060
213     enum CSTOPB     = 0x0000040; // 0000100
214     enum CREAD      = 0x0000080; // 0000200
215     enum PARENB     = 0x0000100; // 0000400
216     enum PARODD     = 0x0000200; // 0001000
217     enum HUPCL      = 0x0000400; // 0002000
218     enum CLOCAL     = 0x0000800; // 0004000
219 
220     enum ECHO       = 0x0000008; // 0000010
221     enum ECHOE      = 0x0000010; // 0000020
222     enum ECHOK      = 0x0000020; // 0000040
223     enum ECHONL     = 0x0000040; // 0000100
224     enum ICANON     = 0x0000002; // 0000002
225     enum IEXTEN     = 0x0008000; // 0100000
226     enum ISIG       = 0x0000001; // 0000001
227     enum NOFLSH     = 0x0000080; // 0000200
228     enum TOSTOP     = 0x0000100; // 0000400
229 
230     enum TCSANOW    = 0;
231     enum TCSADRAIN  = 1;
232     enum TCSAFLUSH  = 2;
233 
234     enum TCIFLUSH   = 0;
235     enum TCOFLUSH   = 1;
236     enum TCIOFLUSH  = 2;
237 
238     enum TCIOFF     = 2;
239     enum TCION      = 3;
240     enum TCOOFF     = 0;
241     enum TCOON      = 1;
242 
243     speed_t cfgetispeed(const scope termios*);
244     speed_t cfgetospeed(const scope termios*);
245     int     cfsetispeed(termios*, speed_t);
246     int     cfsetospeed(termios*, speed_t);
247     int     tcdrain(int);
248     int     tcflow(int, int);
249     int     tcflush(int, int);
250     int     tcgetattr(int, termios*);
251     int     tcsendbreak(int, int);
252     int     tcsetattr(int, int, const scope termios*);
253 }
version(Darwin)254 else version (Darwin)
255 {
256     alias ubyte cc_t;
257     alias c_ulong  speed_t;
258     alias c_ulong  tcflag_t;
259 
260     enum NCCS   = 20;
261 
262     struct termios
263     {
264         tcflag_t   c_iflag;
265         tcflag_t   c_oflag;
266         tcflag_t   c_cflag;
267         tcflag_t   c_lflag;
268         cc_t[NCCS] c_cc;
269         speed_t    c_ispeed;
270         speed_t    c_ospeed;
271     }
272 
273     enum VEOF       = 0;
274     enum VEOL       = 1;
275     enum VERASE     = 3;
276     enum VINTR      = 8;
277     enum VKILL      = 5;
278     enum VMIN       = 16;
279     enum VQUIT      = 9;
280     enum VSTART     = 12;
281     enum VSTOP      = 13;
282     enum VSUSP      = 10;
283     enum VTIME      = 17;
284 
285     enum BRKINT     = 0x0000002;
286     enum ICRNL      = 0x0000100;
287     enum IGNBRK     = 0x0000001;
288     enum IGNCR      = 0x0000080;
289     enum IGNPAR     = 0x0000004;
290     enum INLCR      = 0x0000040;
291     enum INPCK      = 0x0000010;
292     enum ISTRIP     = 0x0000020;
293     enum IXOFF      = 0x0000400;
294     enum IXON       = 0x0000200;
295     enum PARMRK     = 0x0000008;
296 
297     enum OPOST      = 0x0000001;
298 
299     enum B0         = 0;
300     enum B50        = 50;
301     enum B75        = 75;
302     enum B110       = 110;
303     enum B134       = 134;
304     enum B150       = 150;
305     enum B200       = 200;
306     enum B300       = 300;
307     enum B600       = 600;
308     enum B1200      = 1200;
309     enum B1800      = 1800;
310     enum B2400      = 2400;
311     enum B4800      = 4800;
312     enum B9600      = 9600;
313     enum B19200     = 19200;
314     enum B38400     = 38400;
315 
316     enum CSIZE      = 0x0000300;
317     enum   CS5      = 0x0000000;
318     enum   CS6      = 0x0000100;
319     enum   CS7      = 0x0000200;
320     enum   CS8      = 0x0000300;
321     enum CSTOPB     = 0x0000400;
322     enum CREAD      = 0x0000800;
323     enum PARENB     = 0x0001000;
324     enum PARODD     = 0x0002000;
325     enum HUPCL      = 0x0004000;
326     enum CLOCAL     = 0x0008000;
327 
328     enum ECHO       = 0x00000008;
329     enum ECHOE      = 0x00000002;
330     enum ECHOK      = 0x00000004;
331     enum ECHONL     = 0x00000010;
332     enum ICANON     = 0x00000100;
333     enum IEXTEN     = 0x00000400;
334     enum ISIG       = 0x00000080;
335     enum NOFLSH     = 0x80000000;
336     enum TOSTOP     = 0x00400000;
337 
338     enum TCSANOW    = 0;
339     enum TCSADRAIN  = 1;
340     enum TCSAFLUSH  = 2;
341 
342     enum TCIFLUSH   = 1;
343     enum TCOFLUSH   = 2;
344     enum TCIOFLUSH  = 3;
345 
346     enum TCIOFF     = 3;
347     enum TCION      = 4;
348     enum TCOOFF     = 1;
349     enum TCOON      = 2;
350 
351     speed_t cfgetispeed(const scope termios*);
352     speed_t cfgetospeed(const scope termios*);
353     int     cfsetispeed(termios*, speed_t);
354     int     cfsetospeed(termios*, speed_t);
355     int     tcdrain(int);
356     int     tcflow(int, int);
357     int     tcflush(int, int);
358     int     tcgetattr(int, termios*);
359     int     tcsendbreak(int, int);
360     int     tcsetattr(int, int, const scope termios*);
361 
362 }
version(FreeBSD)363 else version (FreeBSD)
364 {
365     alias ubyte cc_t;
366     alias uint  speed_t;
367     alias uint  tcflag_t;
368 
369     enum NCCS   = 20;
370 
371     struct termios
372     {
373         tcflag_t   c_iflag;
374         tcflag_t   c_oflag;
375         tcflag_t   c_cflag;
376         tcflag_t   c_lflag;
377         cc_t[NCCS] c_cc;
378         speed_t    c_ispeed;
379         speed_t    c_ospeed;
380     }
381 
382     enum VEOF       = 0;
383     enum VEOL       = 1;
384     enum VERASE     = 3;
385     enum VINTR      = 8;
386     enum VKILL      = 5;
387     enum VMIN       = 16;
388     enum VQUIT      = 9;
389     enum VSTART     = 12;
390     enum VSTOP      = 13;
391     enum VSUSP      = 10;
392     enum VTIME      = 17;
393 
394     enum BRKINT     = 0x0000002;
395     enum ICRNL      = 0x0000100;
396     enum IGNBRK     = 0x0000001;
397     enum IGNCR      = 0x0000080;
398     enum IGNPAR     = 0x0000004;
399     enum INLCR      = 0x0000040;
400     enum INPCK      = 0x0000010;
401     enum ISTRIP     = 0x0000020;
402     enum IXOFF      = 0x0000400;
403     enum IXON       = 0x0000200;
404     enum PARMRK     = 0x0000008;
405 
406     enum OPOST      = 0x0000001;
407 
408     enum B0         = 0;
409     enum B50        = 50;
410     enum B75        = 75;
411     enum B110       = 110;
412     enum B134       = 134;
413     enum B150       = 150;
414     enum B200       = 200;
415     enum B300       = 300;
416     enum B600       = 600;
417     enum B1200      = 1200;
418     enum B1800      = 1800;
419     enum B2400      = 2400;
420     enum B4800      = 4800;
421     enum B9600      = 9600;
422     enum B19200     = 19200;
423     enum B38400     = 38400;
424 
425     enum CSIZE      = 0x0000300;
426     enum   CS5      = 0x0000000;
427     enum   CS6      = 0x0000100;
428     enum   CS7      = 0x0000200;
429     enum   CS8      = 0x0000300;
430     enum CSTOPB     = 0x0000400;
431     enum CREAD      = 0x0000800;
432     enum PARENB     = 0x0001000;
433     enum PARODD     = 0x0002000;
434     enum HUPCL      = 0x0004000;
435     enum CLOCAL     = 0x0008000;
436 
437     enum ECHO       = 0x00000008;
438     enum ECHOE      = 0x00000002;
439     enum ECHOK      = 0x00000004;
440     enum ECHONL     = 0x00000010;
441     enum ICANON     = 0x00000100;
442     enum IEXTEN     = 0x00000400;
443     enum ISIG       = 0x00000080;
444     enum NOFLSH     = 0x80000000;
445     enum TOSTOP     = 0x00400000;
446 
447     enum TCSANOW    = 0;
448     enum TCSADRAIN  = 1;
449     enum TCSAFLUSH  = 2;
450 
451     enum TCIFLUSH   = 1;
452     enum TCOFLUSH   = 2;
453     enum TCIOFLUSH  = 3;
454 
455     enum TCIOFF     = 3;
456     enum TCION      = 4;
457     enum TCOOFF     = 1;
458     enum TCOON      = 2;
459 
460     speed_t cfgetispeed(const scope termios*);
461     speed_t cfgetospeed(const scope termios*);
462     int     cfsetispeed(termios*, speed_t);
463     int     cfsetospeed(termios*, speed_t);
464     int     tcdrain(int);
465     int     tcflow(int, int);
466     int     tcflush(int, int);
467     int     tcgetattr(int, termios*);
468     int     tcsendbreak(int, int);
469     int     tcsetattr(int, int, const scope termios*);
470 }
version(DragonFlyBSD)471 else version (DragonFlyBSD)
472 {
473     alias ubyte cc_t;
474     alias uint  speed_t;
475     alias uint  tcflag_t;
476 
477     enum NCCS   = 20;
478 
479     struct termios
480     {
481         tcflag_t   c_iflag;
482         tcflag_t   c_oflag;
483         tcflag_t   c_cflag;
484         tcflag_t   c_lflag;
485         cc_t[NCCS] c_cc;
486         speed_t    c_ispeed;
487         speed_t    c_ospeed;
488     }
489 
490     enum VEOF       = 0;
491     enum VEOL       = 1;
492     enum VERASE     = 3;
493     enum VINTR      = 8;
494     enum VKILL      = 5;
495     enum VMIN       = 16;
496     enum VQUIT      = 9;
497     enum VSTART     = 12;
498     enum VSTOP      = 13;
499     enum VSUSP      = 10;
500     enum VTIME      = 17;
501 
502     enum BRKINT     = 0x0000002;
503     enum ICRNL      = 0x0000100;
504     enum IGNBRK     = 0x0000001;
505     enum IGNCR      = 0x0000080;
506     enum IGNPAR     = 0x0000004;
507     enum INLCR      = 0x0000040;
508     enum INPCK      = 0x0000010;
509     enum ISTRIP     = 0x0000020;
510     enum IXOFF      = 0x0000400;
511     enum IXON       = 0x0000200;
512     enum PARMRK     = 0x0000008;
513 
514     enum OPOST      = 0x0000001;
515 
516     enum B0         = 0;
517     enum B50        = 50;
518     enum B75        = 75;
519     enum B110       = 110;
520     enum B134       = 134;
521     enum B150       = 150;
522     enum B200       = 200;
523     enum B300       = 300;
524     enum B600       = 600;
525     enum B1200      = 1200;
526     enum B1800      = 1800;
527     enum B2400      = 2400;
528     enum B4800      = 4800;
529     enum B9600      = 9600;
530     enum B19200     = 19200;
531     enum B38400     = 38400;
532 
533     enum CSIZE      = 0x0000300;
534     enum   CS5      = 0x0000000;
535     enum   CS6      = 0x0000100;
536     enum   CS7      = 0x0000200;
537     enum   CS8      = 0x0000300;
538     enum CSTOPB     = 0x0000400;
539     enum CREAD      = 0x0000800;
540     enum PARENB     = 0x0001000;
541     enum PARODD     = 0x0002000;
542     enum HUPCL      = 0x0004000;
543     enum CLOCAL     = 0x0008000;
544 
545     enum ECHO       = 0x00000008;
546     enum ECHOE      = 0x00000002;
547     enum ECHOK      = 0x00000004;
548     enum ECHONL     = 0x00000010;
549     enum ICANON     = 0x00000100;
550     enum IEXTEN     = 0x00000400;
551     enum ISIG       = 0x00000080;
552     enum NOFLSH     = 0x80000000;
553     enum TOSTOP     = 0x00400000;
554 
555     enum TCSANOW    = 0;
556     enum TCSADRAIN  = 1;
557     enum TCSAFLUSH  = 2;
558 
559     enum TCIFLUSH   = 1;
560     enum TCOFLUSH   = 2;
561     enum TCIOFLUSH  = 3;
562 
563     enum TCIOFF     = 3;
564     enum TCION      = 4;
565     enum TCOOFF     = 1;
566     enum TCOON      = 2;
567 
568     speed_t cfgetispeed(const scope termios*);
569     speed_t cfgetospeed(const scope termios*);
570     int     cfsetispeed(termios*, speed_t);
571     int     cfsetospeed(termios*, speed_t);
572     int     tcdrain(int);
573     int     tcflow(int, int);
574     int     tcflush(int, int);
575     int     tcgetattr(int, termios*);
576     int     tcsendbreak(int, int);
577     int     tcsetattr(int, int, const scope termios*);
578 }
version(NetBSD)579 else version (NetBSD)
580 {
581     alias ubyte cc_t;
582     alias uint  speed_t;
583     alias uint  tcflag_t;
584 
585     enum NCCS   = 20;
586 
587     struct termios
588     {
589         tcflag_t   c_iflag;
590         tcflag_t   c_oflag;
591         tcflag_t   c_cflag;
592         tcflag_t   c_lflag;
593         cc_t[NCCS] c_cc;
594         speed_t    c_ispeed;
595         speed_t    c_ospeed;
596     }
597 
598     enum VEOF       = 0;
599     enum VEOL       = 1;
600     enum VERASE     = 3;
601     enum VINTR      = 8;
602     enum VKILL      = 5;
603     enum VMIN       = 16;
604     enum VQUIT      = 9;
605     enum VSTART     = 12;
606     enum VSTOP      = 13;
607     enum VSUSP      = 10;
608     enum VTIME      = 17;
609 
610     enum BRKINT     = 0x0000002;
611     enum ICRNL      = 0x0000100;
612     enum IGNBRK     = 0x0000001;
613     enum IGNCR      = 0x0000080;
614     enum IGNPAR     = 0x0000004;
615     enum INLCR      = 0x0000040;
616     enum INPCK      = 0x0000010;
617     enum ISTRIP     = 0x0000020;
618     enum IXOFF      = 0x0000400;
619     enum IXON       = 0x0000200;
620     enum PARMRK     = 0x0000008;
621 
622     enum OPOST      = 0x0000001;
623 
624     enum B0         = 0;
625     enum B50        = 50;
626     enum B75        = 75;
627     enum B110       = 110;
628     enum B134       = 134;
629     enum B150       = 150;
630     enum B200       = 200;
631     enum B300       = 300;
632     enum B600       = 600;
633     enum B1200      = 1200;
634     enum B1800      = 1800;
635     enum B2400      = 2400;
636     enum B4800      = 4800;
637     enum B9600      = 9600;
638     enum B19200     = 19200;
639     enum B38400     = 38400;
640 
641     enum CSIZE      = 0x0000300;
642     enum   CS5      = 0x0000000;
643     enum   CS6      = 0x0000100;
644     enum   CS7      = 0x0000200;
645     enum   CS8      = 0x0000300;
646     enum CSTOPB     = 0x0000400;
647     enum CREAD      = 0x0000800;
648     enum PARENB     = 0x0001000;
649     enum PARODD     = 0x0002000;
650     enum HUPCL      = 0x0004000;
651     enum CLOCAL     = 0x0008000;
652 
653     enum ECHO       = 0x00000008;
654     enum ECHOE      = 0x00000002;
655     enum ECHOK      = 0x00000004;
656     enum ECHONL     = 0x00000010;
657     enum ICANON     = 0x00000100;
658     enum IEXTEN     = 0x00000400;
659     enum ISIG       = 0x00000080;
660     enum NOFLSH     = 0x80000000;
661     enum TOSTOP     = 0x00400000;
662 
663     enum TCSANOW    = 0;
664     enum TCSADRAIN  = 1;
665     enum TCSAFLUSH  = 2;
666 
667     enum TCIFLUSH   = 1;
668     enum TCOFLUSH   = 2;
669     enum TCIOFLUSH  = 3;
670 
671     enum TCIOFF     = 3;
672     enum TCION      = 4;
673     enum TCOOFF     = 1;
674     enum TCOON      = 2;
675 
676     speed_t cfgetispeed(const scope termios*);
677     speed_t cfgetospeed(const scope termios*);
678     int     cfsetispeed(termios*, speed_t);
679     int     cfsetospeed(termios*, speed_t);
680     int     tcdrain(int);
681     int     tcflow(int, int);
682     int     tcflush(int, int);
683     int     tcgetattr(int, termios*);
684     int     tcsendbreak(int, int);
685     int     tcsetattr(int, int, const scope termios*);
686 }
version(OpenBSD)687 else version (OpenBSD)
688 {
689     alias uint  tcflag_t;
690     alias ubyte cc_t;
691     alias uint  speed_t;
692 
693     enum NCCS   = 20;
694 
695     struct termios
696     {
697         tcflag_t   c_iflag;
698         tcflag_t   c_oflag;
699         tcflag_t   c_cflag;
700         tcflag_t   c_lflag;
701         cc_t[NCCS] c_cc;
702         int        c_ispeed;
703         int        c_ospeed;
704     }
705 
706     enum VEOF       = 0;
707     enum VEOL       = 1;
708     enum VERASE     = 3;
709     enum VINTR      = 8;
710     enum VKILL      = 5;
711     enum VMIN       = 16;
712     enum VQUIT      = 9;
713     enum VSTART     = 12;
714     enum VSTOP      = 13;
715     enum VSUSP      = 10;
716     enum VTIME      = 17;
717 
718     enum BRKINT     = 0x0000002;
719     enum ICRNL      = 0x0000100;
720     enum IGNBRK     = 0x0000001;
721     enum IGNCR      = 0x0000080;
722     enum IGNPAR     = 0x0000004;
723     enum INLCR      = 0x0000040;
724     enum INPCK      = 0x0000010;
725     enum ISTRIP     = 0x0000020;
726     enum IXOFF      = 0x0000400;
727     enum IXON       = 0x0000200;
728     enum PARMRK     = 0x0000008;
729 
730     enum OPOST      = 0x0000001;
731 
732     enum B0         = 0;
733     enum B50        = 50;
734     enum B75        = 75;
735     enum B110       = 110;
736     enum B134       = 134;
737     enum B150       = 150;
738     enum B200       = 200;
739     enum B300       = 300;
740     enum B600       = 600;
741     enum B1200      = 1200;
742     enum B1800      = 1800;
743     enum B2400      = 2400;
744     enum B4800      = 4800;
745     enum B9600      = 9600;
746     enum B19200     = 19200;
747     enum B38400     = 38400;
748 
749     enum CSIZE      = 0x0000300;
750     enum   CS5      = 0x0000000;
751     enum   CS6      = 0x0000100;
752     enum   CS7      = 0x0000200;
753     enum   CS8      = 0x0000300;
754     enum CSTOPB     = 0x0000400;
755     enum CREAD      = 0x0000800;
756     enum PARENB     = 0x0001000;
757     enum PARODD     = 0x0002000;
758     enum HUPCL      = 0x0004000;
759     enum CLOCAL     = 0x0008000;
760 
761     enum ECHO       = 0x00000008;
762     enum ECHOE      = 0x00000002;
763     enum ECHOK      = 0x00000004;
764     enum ECHONL     = 0x00000010;
765     enum ICANON     = 0x00000100;
766     enum IEXTEN     = 0x00000400;
767     enum ISIG       = 0x00000080;
768     enum NOFLSH     = 0x80000000;
769     enum TOSTOP     = 0x00400000;
770 
771     enum TCSANOW    = 0;
772     enum TCSADRAIN  = 1;
773     enum TCSAFLUSH  = 2;
774 
775     enum TCIFLUSH   = 1;
776     enum TCOFLUSH   = 2;
777     enum TCIOFLUSH  = 3;
778 
779     enum TCIOFF     = 3;
780     enum TCION      = 4;
781     enum TCOOFF     = 1;
782     enum TCOON      = 2;
783 
784     speed_t cfgetispeed(const scope termios*);
785     speed_t cfgetospeed(const scope termios*);
786     int     cfsetispeed(termios*, speed_t);
787     int     cfsetospeed(termios*, speed_t);
788     int     tcdrain(int);
789     int     tcflow(int, int);
790     int     tcflush(int, int);
791     int     tcgetattr(int, termios*);
792     int     tcsendbreak(int, int);
793     int     tcsetattr(int, int, const scope termios*);
794 }
version(Solaris)795 else version (Solaris)
796 {
797     alias tcflag_t = uint;
798     alias cc_t = ubyte;
799     alias speed_t = uint;
800 
801     enum NCCS   = 19;
802 
803     struct termios
804     {
805         tcflag_t   c_iflag;    /* input modes */
806         tcflag_t   c_oflag;    /* output modes */
807         tcflag_t   c_cflag;    /* control modes */
808         tcflag_t   c_lflag;    /* line discipline modes */
809         cc_t[NCCS] c_cc;       /* control chars */
810     }
811 
812     /* control characters */
813     enum VINTR  = 0;
814     enum VQUIT  = 1;
815     enum VERASE = 2;
816     enum VKILL  = 3;
817     enum VEOF   = 4;
818     enum VEOL   = 5;
819     enum VMIN   = 4;
820     enum VTIME  = 5;
821     enum VSTART = 8;
822     enum VSTOP  = 9;
823     enum VSUSP  = 10;
824 
825     /* input modes */
826     enum IGNBRK = 0x000001;
827     enum BRKINT = 0x000002;
828     enum IGNPAR = 0x000004;
829     enum PARMRK = 0x000008;
830     enum INPCK  = 0x000010;
831     enum ISTRIP = 0x000020;
832     enum INLCR  = 0x000040;
833     enum IGNCR  = 0x000080;
834     enum ICRNL  = 0x000100;
835     enum IXON   = 0x000400;
836     enum IXOFF  = 0x001000;
837 
838     /* output modes */
839     enum OPOST  = 0x000001;
840 
841     /* control modes */
842     enum CSIZE  = 0x000030;
843     enum CS5    = 0x000000;
844     enum CS6    = 0x000010;
845     enum CS7    = 0x000020;
846     enum CS8    = 0x000030;
847     enum CSTOPB = 0x000040;
848     enum CREAD  = 0x000080;
849     enum PARENB = 0x000100;
850     enum PARODD = 0x000200;
851     enum HUPCL  = 0x000400;
852     enum CLOCAL = 0x000800;
853 
854     enum CRTSCTS = 0x10000000;
855 
856     /* line discipline 0 modes */
857     enum ISIG   = 0x000001;
858     enum ICANON = 0x000002;
859     enum ECHO   = 0x000008;
860     enum ECHOE  = 0x000010;
861     enum ECHOK  = 0x000020;
862     enum ECHONL = 0x000040;
863     enum NOFLSH = 0x000080;
864     enum TOSTOP = 0x000100;
865 
866     enum ECHOCTL = 0x000200;
867     enum ECHOPRT = 0x000400;
868     enum ECHOKE  = 0x000800;
869 
870     enum IEXTEN = 0x008000;  /* POSIX flag - enable POSIX extensions */
871 
872     enum _TIOC      = ('T'<<8);
873     enum TCSANOW    = (_TIOC|14);
874     enum TCSADRAIN  = (_TIOC|15);
875     enum TCSAFLUSH  = (_TIOC|16);
876 
877     /* termios option flags */
878     enum TCIFLUSH   = 0;  /* flush data received but not read */
879     enum TCOFLUSH   = 1;  /* flush data written but not transmitted */
880     enum TCIOFLUSH  = 2;  /* flush both data both input and output queues */
881 
882     enum TCOOFF     = 0;  /* suspend output */
883     enum TCOON      = 1;  /* restart suspended output */
884     enum TCIOFF     = 2;  /* suspend input */
885     enum TCION      = 3;  /* restart suspended input */
886 
887     /* Speeds */
888     enum B0      = 0;
889     enum B50     = 1;
890     enum B75     = 2;
891     enum B110    = 3;
892     enum B134    = 4;
893     enum B150    = 5;
894     enum B200    = 6;
895     enum B300    = 7;
896     enum B600    = 8;
897     enum B1200   = 9;
898     enum B1800   = 10;
899     enum B2400   = 11;
900     enum B4800   = 12;
901     enum B9600   = 13;
902     enum B19200  = 14;
903     enum B38400  = 15;
904     enum B57600  = 16;
905     enum B76800  = 17;
906     enum B115200 = 18;
907     enum B153600 = 19;
908     enum B230400 = 20;
909     enum B307200 = 21;
910     enum B460800 = 22;
911     enum B921600 = 23;
912 
913     /*
914      * POSIX termios functions
915      * These functions get mapped into ioctls.
916      */
917     speed_t cfgetospeed(const scope termios*);
918     int     cfsetospeed(termios*, speed_t);
919     speed_t cfgetispeed(const scope termios*);
920     int     cfsetispeed(termios*, speed_t);
921     int     tcgetattr(int, termios*);
922     int     tcsetattr(int, int, const scope termios*);
923     int     tcsendbreak(int, int);
924     int     tcdrain(int);
925     int     tcflush(int, int);
926     int     tcflow(int, int);
927 }
version(CRuntime_UClibc)928 else version (CRuntime_UClibc)
929 {
930     alias ubyte cc_t;
931     alias uint  speed_t;
932     alias uint  tcflag_t;
933 
934     enum NCCS   = 32;
935 
936     struct termios
937     {
938         tcflag_t   c_iflag;
939         tcflag_t   c_oflag;
940         tcflag_t   c_cflag;
941         tcflag_t   c_lflag;
942         cc_t       c_line;
943         cc_t[NCCS] c_cc;
944         speed_t    c_ispeed;
945         speed_t    c_ospeed;
946     }
947 
948     enum VINTR      = 0;
949     enum VQUIT      = 1;
950     enum VERASE     = 2;
951     enum VKILL      = 3;
952     enum VEOF       = 4;
953     enum VTIME      = 5;
954     enum VMIN       = 6;
955     enum VSWTC      = 7;
956     enum VSTART     = 8;
957     enum VSTOP      = 9;
958     enum VSUSP      = 10;
959     enum VEOL       = 11;
960     enum VREPRINT   = 12;
961     enum VDISCARD   = 13;
962     enum VWERASE    = 14;
963     enum VLNEXT     = 15;
964     enum VEOL2      = 16;
965 
966     enum BRKINT     = 0x0000002; // 0000002
967     enum ICRNL      = 0x0000100; // 0000400
968     enum IGNBRK     = 0x0000001; // 0000001
969     enum IGNCR      = 0x0000080; // 0000200
970     enum IGNPAR     = 0x0000004; // 0000004
971     enum INLCR      = 0x0000040; // 0000100
972     enum INPCK      = 0x0000010; // 0000020
973     enum ISTRIP     = 0x0000020; // 0000040
974     enum IXOFF      = 0x0001000; // 0010000
975     enum IXON       = 0x0000400; // 0002000
976     enum PARMRK     = 0x0000008; // 0000010
977 
978     enum OPOST      = 0x0000001; // 0000001
979 
980     enum B0         = 0x0000000; // 0000000
981     enum B50        = 0x0000001; // 0000001
982     enum B75        = 0x0000002; // 0000002
983     enum B110       = 0x0000003; // 0000003
984     enum B134       = 0x0000004; // 0000004
985     enum B150       = 0x0000005; // 0000005
986     enum B200       = 0x0000006; // 0000006
987     enum B300       = 0x0000007; // 0000007
988     enum B600       = 0x0000008; // 0000010
989     enum B1200      = 0x0000009; // 0000011
990     enum B1800      = 0x000000A; // 0000012
991     enum B2400      = 0x000000B; // 0000013
992     enum B4800      = 0x000000C; // 0000014
993     enum B9600      = 0x000000D; // 0000015
994     enum B19200     = 0x000000E; // 0000016
995     enum B38400     = 0x000000F; // 0000017
996 
997     enum CSIZE      = 0x0000030; // 0000060
998     enum   CS5      = 0x0000000; // 0000000
999     enum   CS6      = 0x0000010; // 0000020
1000     enum   CS7      = 0x0000020; // 0000040
1001     enum   CS8      = 0x0000030; // 0000060
1002     enum CSTOPB     = 0x0000040; // 0000100
1003     enum CREAD      = 0x0000080; // 0000200
1004     enum PARENB     = 0x0000100; // 0000400
1005     enum PARODD     = 0x0000200; // 0001000
1006     enum HUPCL      = 0x0000400; // 0002000
1007     enum CLOCAL     = 0x0000800; // 0004000
1008 
1009     enum ECHO       = 0x0000008; // 0000010
1010     enum ECHOE      = 0x0000010; // 0000020
1011     enum ECHOK      = 0x0000020; // 0000040
1012     enum ECHONL     = 0x0000040; // 0000100
1013     enum ICANON     = 0x0000002; // 0000002
1014     enum IEXTEN     = 0x0008000; // 0100000
1015     enum ISIG       = 0x0000001; // 0000001
1016     enum NOFLSH     = 0x0000080; // 0000200
1017     enum TOSTOP     = 0x0000100; // 0000400
1018 
1019     enum TCSANOW    = 0;
1020     enum TCSADRAIN  = 1;
1021     enum TCSAFLUSH  = 2;
1022 
1023     enum TCIFLUSH   = 0;
1024     enum TCOFLUSH   = 1;
1025     enum TCIOFLUSH  = 2;
1026 
1027     enum TCIOFF     = 2;
1028     enum TCION      = 3;
1029     enum TCOOFF     = 0;
1030     enum TCOON      = 1;
1031 
1032     speed_t cfgetispeed(const scope termios*);
1033     speed_t cfgetospeed(const scope termios*);
1034     int     cfsetispeed(termios*, speed_t);
1035     int     cfsetospeed(termios*, speed_t);
1036     int     tcdrain(int);
1037     int     tcflow(int, int);
1038     int     tcflush(int, int);
1039     int     tcgetattr(int, termios*);
1040     int     tcsendbreak(int, int);
1041     int     tcsetattr(int, int, const scope termios*);
1042 }
1043 
1044 //
1045 // XOpen (XSI)
1046 //
1047 /*
1048 IXANY
1049 
1050 ONLCR
1051 OCRNL
1052 ONOCR
1053 ONLRET
1054 OFILL
1055 NLDLY
1056     NL0
1057     NL1
1058 CRDLY
1059     CR0
1060     CR1
1061     CR2
1062     CR3
1063 TABDLY
1064     TAB0
1065     TAB1
1066     TAB2
1067     TAB3
1068 BSDLY
1069     BS0
1070     BS1
1071 VTDLY
1072     VT0
1073     VT1
1074 FFDLY
1075     FF0
1076     FF1
1077 
1078 pid_t   tcgetsid(int);
1079 */
1080 
version(CRuntime_Glibc)1081 version (CRuntime_Glibc)
1082 {
1083     enum IXANY      = 0x0000800; // 0004000
1084 
1085     enum ONLCR      = 0x0000004; // 0000004
1086     enum OCRNL      = 0x0000008; // 0000010
1087     enum ONOCR      = 0x0000010; // 0000020
1088     enum ONLRET     = 0x0000020; // 0000040
1089     enum OFILL      = 0x0000040; // 0000100
1090     enum NLDLY      = 0x0000100; // 0000400
1091     enum   NL0      = 0x0000000; // 0000000
1092     enum   NL1      = 0x0000100; // 0000400
1093     enum CRDLY      = 0x0000600; // 0003000
1094     enum   CR0      = 0x0000000; // 0000000
1095     enum   CR1      = 0x0000200; // 0001000
1096     enum   CR2      = 0x0000400; // 0002000
1097     enum   CR3      = 0x0000600; // 0003000
1098     enum TABDLY     = 0x0001800; // 0014000
1099     enum   TAB0     = 0x0000000; // 0000000
1100     enum   TAB1     = 0x0000800; // 0004000
1101     enum   TAB2     = 0x0001000; // 0010000
1102     enum   TAB3     = 0x0001800; // 0014000
1103     enum BSDLY      = 0x0002000; // 0020000
1104     enum   BS0      = 0x0000000; // 0000000
1105     enum   BS1      = 0x0002000; // 0020000
1106     enum VTDLY      = 0x0004000; // 0040000
1107     enum   VT0      = 0x0000000; // 0000000
1108     enum   VT1      = 0x0004000; // 0040000
1109     enum FFDLY      = 0x0008000; // 0100000
1110     enum   FF0      = 0x0000000; // 0000000
1111     enum   FF1      = 0x0008000; // 0100000
1112 
1113     pid_t   tcgetsid(int);
1114 }
1115 
version(Darwin)1116 else version (Darwin)
1117 {
1118     enum IXANY      = 0x00000800;
1119 
1120     enum ONLCR      = 0x00000002;
1121     enum OCRNL      = 0x00000010;
1122     enum ONOCR      = 0x00000020;
1123     enum ONLRET     = 0x00000040;
1124     enum OFILL      = 0x00000080;
1125     enum NLDLY      = 0x00000300;
1126     enum   NL0      = 0x00000000;
1127     enum   NL1      = 0x00000100;
1128     enum CRDLY      = 0x00003000;
1129     enum   CR0      = 0x00000000;
1130     enum   CR1      = 0x00001000;
1131     enum   CR2      = 0x00002000;
1132     enum   CR3      = 0x00003000;
1133     enum TABDLY     = 0x00000c04;
1134     enum   TAB0     = 0x00000000;
1135     enum   TAB1     = 0x00000400;
1136     enum   TAB2     = 0x00000800;
1137     enum   TAB3     = 0x00000004;
1138     enum BSDLY      = 0x00008000;
1139     enum   BS0      = 0x00000000;
1140     enum   BS1      = 0x00008000;
1141     enum VTDLY      = 0x00010000;
1142     enum   VT0      = 0x00000000;
1143     enum   VT1      = 0x00010000;
1144     enum FFDLY      = 0x00004000;
1145     enum   FF0      = 0x00000000;
1146     enum   FF1      = 0x00004000;
1147 
1148     pid_t tcgetsid (int);
1149 }
1150 
version(FreeBSD)1151 else version (FreeBSD)
1152 {
1153     enum IXANY      = 0x00000800;
1154 
1155     enum ONLCR      = 0x00000002;
1156     enum OCRNL      = 0x00000010;
1157     enum ONOCR      = 0x00000020;
1158     enum ONLRET     = 0x00000040;
1159     //enum OFILL
1160     //enum NLDLY
1161     //enum     NL0
1162     //enum     NL1
1163     //enum CRDLY
1164     //enum     CR0
1165     //enum     CR1
1166     //enum     CR2
1167     //enum     CR3
1168     enum TABDLY     = 0x00000004;
1169     enum     TAB0   = 0x00000000;
1170     //enum     TAB1
1171     //enum     TAB2
1172     enum     TAB3   = 0x00000004;
1173     //enum BSDLY
1174     //enum     BS0
1175     //enum     BS1
1176     //enum VTDLY
1177     //enum     VT0
1178     //enum     VT1
1179     //enum FFDLY
1180     //enum     FF0
1181     //enum     FF1
1182 
1183     pid_t   tcgetsid(int);
1184 }
version(DragonFlyBSD)1185 else version (DragonFlyBSD)
1186 {
1187     enum IXANY      = 0x00000800;
1188 
1189     enum ONLCR      = 0x00000002;
1190     enum OCRNL      = 0x00000010;
1191     enum ONOCR      = 0x00000020;
1192     enum ONLRET     = 0x00000040;
1193     //enum OFILL
1194     //enum NLDLY
1195     //enum     NL0
1196     //enum     NL1
1197     //enum CRDLY
1198     //enum     CR0
1199     //enum     CR1
1200     //enum     CR2
1201     //enum     CR3
1202     enum TABDLY     = 0x00000004;
1203     enum     TAB0   = 0x00000000;
1204     //enum     TAB1
1205     //enum     TAB2
1206     enum     TAB3   = 0x00000004;
1207     //enum BSDLY
1208     //enum     BS0
1209     //enum     BS1
1210     //enum VTDLY
1211     //enum     VT0
1212     //enum     VT1
1213     //enum FFDLY
1214     //enum     FF0
1215     //enum     FF1
1216 
1217     pid_t   tcgetsid(int);
1218 }
version(NetBSD)1219 else version (NetBSD)
1220 {
1221     enum IXANY      = 0x00000800;
1222 
1223     enum ONLCR      = 0x00000002;
1224     enum OCRNL      = 0x00000010;
1225     enum ONOCR      = 0x00000020;
1226     enum ONLRET     = 0x00000040;
1227     //enum OFILL
1228     //enum NLDLY
1229     //enum     NL0
1230     //enum     NL1
1231     //enum CRDLY
1232     //enum     CR0
1233     //enum     CR1
1234     //enum     CR2
1235     //enum     CR3
1236     enum TABDLY     = 0x00000004;
1237     enum     TAB0   = 0x00000000;
1238     //enum     TAB1
1239     //enum     TAB2
1240     enum     TAB3   = 0x00000004;
1241     //enum BSDLY
1242     //enum     BS0
1243     //enum     BS1
1244     //enum VTDLY
1245     //enum     VT0
1246     //enum     VT1
1247     //enum FFDLY
1248     //enum     FF0
1249     //enum     FF1
1250 
1251     pid_t   tcgetsid(int);
1252 }
version(OpenBSD)1253 else version (OpenBSD)
1254 {
1255     enum IXANY      = 0x00000800;
1256 
1257     enum ONLCR      = 0x00000002;
1258     enum OCRNL      = 0x00000010;
1259     enum ONOCR      = 0x00000040;
1260     enum ONLRET     = 0x00000080;
1261     //enum OFILL
1262     //enum NLDLY
1263     //enum   NL0
1264     //enum   NL1
1265     //enum CRDLY
1266     //enum   CR0
1267     //enum   CR1
1268     //enum   CR2
1269     //enum   CR3
1270     //enum TABDLY
1271     //enum   TAB0
1272     //enum   TAB1
1273     //enum   TAB2
1274     //enum   TAB3
1275     //enum BSDLY
1276     //enum   BS0
1277     //enum   BS1
1278     //enum VTDLY
1279     //enum   VT0
1280     //enum   VT1
1281     //enum FFDLY
1282     //enum   FF0
1283     //enum   FF1
1284 
1285     pid_t   tcgetsid(int);
1286 }
version(Solaris)1287 else version (Solaris)
1288 {
1289     enum IXANY      = 0x0000800;
1290 
1291     enum ONLCR      = 0x0000004;
1292     enum OCRNL      = 0x0000008;
1293     enum ONOCR      = 0x0000010;
1294     enum ONLRET     = 0x0000020;
1295     enum OFILL      = 0x0000040;
1296     enum OFDEL      = 0x0000080;
1297     enum NLDLY      = 0x0000100;
1298     enum NL0        = 0x0000000;
1299     enum NL1        = 0x0000100;
1300     enum CRDLY      = 0x0000600;
1301     enum CR0        = 0x0000000;
1302     enum CR1        = 0x0000200;
1303     enum CR2        = 0x0000400;
1304     enum CR3        = 0x0000600;
1305     enum TABDLY     = 0x0001800;
1306     enum TAB0       = 0x0000000;
1307     enum TAB1       = 0x0000800;
1308     enum TAB2       = 0x0001000;
1309     enum TAB3       = 0x0001800;
1310     enum BSDLY      = 0x0002000;
1311     enum BS0        = 0x0000000;
1312     enum BS1        = 0x0002000;
1313     enum VTDLY      = 0x0004000;
1314     enum VT0        = 0x0000000;
1315     enum VT1        = 0x0004000;
1316     enum FFDLY      = 0x0008000;
1317     enum FF0        = 0x0000000;
1318     enum FF1        = 0x0008000;
1319     enum XCASE      = 0x0000004;
1320 
1321     pid_t   tcgetsid(int);
1322 }
version(CRuntime_UClibc)1323 else version (CRuntime_UClibc)
1324 {
1325     enum IXANY      = 0x0000800; // 0004000
1326 
1327     enum ONLCR      = 0x0000004; // 0000004
1328     enum OCRNL      = 0x0000008; // 0000010
1329     enum ONOCR      = 0x0000010; // 0000020
1330     enum ONLRET     = 0x0000020; // 0000040
1331     enum OFILL      = 0x0000040; // 0000100
1332     enum NLDLY      = 0x0000100; // 0000400
1333     enum   NL0      = 0x0000000; // 0000000
1334     enum   NL1      = 0x0000100; // 0000400
1335     enum CRDLY      = 0x0000600; // 0003000
1336     enum   CR0      = 0x0000000; // 0000000
1337     enum   CR1      = 0x0000200; // 0001000
1338     enum   CR2      = 0x0000400; // 0002000
1339     enum   CR3      = 0x0000600; // 0003000
1340     enum TABDLY     = 0x0001800; // 0014000
1341     enum   TAB0     = 0x0000000; // 0000000
1342     enum   TAB1     = 0x0000800; // 0004000
1343     enum   TAB2     = 0x0001000; // 0010000
1344     enum   TAB3     = 0x0001800; // 0014000
1345     enum BSDLY      = 0x0002000; // 0020000
1346     enum   BS0      = 0x0000000; // 0000000
1347     enum   BS1      = 0x0002000; // 0020000
1348     enum VTDLY      = 0x0004000; // 0040000
1349     enum   VT0      = 0x0000000; // 0000000
1350     enum   VT1      = 0x0004000; // 0040000
1351     enum FFDLY      = 0x0008000; // 0100000
1352     enum   FF0      = 0x0000000; // 0000000
1353     enum   FF1      = 0x0008000; // 0100000
1354 
1355     pid_t   tcgetsid(int);
1356 }
1357