1{
2   This file is part of the Free Pascal run time library.
3   (c) 2000-2003 by Marco van de Voort
4   member of the Free Pascal development team.
5
6   See the file COPYING.FPC, included in this distribution,
7   for details about the copyright.
8
9   Termios header for FreeBSD
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY;without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14}
15
16CONST
17
18{
19 * Special Control Characters
20 *
21 * Index into c_cc[] character array.
22 *
23 *      Name         Subscript  Enabled by
24 }
25 { control characters }
26VINTR	= 0;
27VQUIT	= 1;
28VERASE	= 2;
29VKILL	= 3;
30VEOF	= 4;
31VEOL	= 5;
32VMIN	= 4;
33VTIME	= 5;
34VEOL2	= 6;
35VSWTCH	= 7;
36VSTART  = 8;
37VSTOP   = 9;
38VSUSP   = 10;
39
40{ number of control characters }
41 NCC	= 11;
42 NCCS           =NCC;
43
44Type
45  winsize = packed record
46    ws_row,
47    ws_col,
48    ws_xpixel,
49    ws_ypixel : word;
50  end;
51  TWinSize=winsize;
52
53// typedef unsigned long tcflag_t;
54// typedef unsigned char speed_t;
55// typedef unsigned char cc_t;
56 tcflag_t = Cardinal;
57 speed_t = byte;
58 cc_t = char;
59
60type
61  Termios = packed record
62    c_iflag,
63    c_oflag,
64    c_cflag,
65    c_lflag  : tcflag_t;
66    c_line   : char;
67    c_ixxxxx : speed_t;
68    c_oxxxxx : speed_t;
69    c_cc     : array[0..NCCS-1] of speed_t;
70  end;
71  TTermios=Termios;
72
73CONST
74
75
76 POSIX_VDISABLE=Chr($ff);
77{
78
79#define CCEQ(val, c)    ((c) == (val) ? (val) != _POSIX_VDISABLE : 0)
80}
81
82{ * Input flags - software input processing}
83
84        IGNBRK          =       $1;     { ignore BREAK condition }
85        BRKINT          =       $2;     { map BREAK to SIGINTR }
86        IGNPAR          =       $4;     { ignore (discard) parity errors }
87        PARMRK          =       $8;     { mark parity and framing errors }
88        INPCK           =      $10;     { enable checking of parity errors }
89        ISTRIP          =      $20;     { strip 8th bit off chars }
90        INLCR           =      $40;     { map NL into CR }
91        IGNCR           =      $80;     { ignore CR }
92        ICRNL           =     $100;     { map CR to NL (ala CRMOD) }
93        IUCLC			=	  $200;		{ maps all upper case to lower }
94        IXON            =     $400;     { enable output flow control }
95        IXANY           =     $800;     { enable input flow control }
96        IXOFF           =    $1000;	    { any char will restart after stop }
97
98{
99 * Output flags - software output processing
100}
101
102OPOST		= $01;		{ enable postprocessing of output }
103OLCUC		= $02;		{ maps lowercase to uppercase }
104ONLCR		= $04;		{ maps NL to CR-NL on output }
105OCRNL		= $08;		{ maps CR to NL on output }
106ONOCR		= $10;		{ no CR output when at column 0 }
107ONLRET		= $20;		{ newline performs CR function }
108OFILL		= $40;		{ uses fill characters for delays }
109OFDEL		= $80;		{ Fills are DEL, otherwise NUL }
110NLDLY		= $100;		{ Newline delays: }
111NL0			= $000;
112NL1			= $100;
113CRDLY		= $600;		{ Carriage return delays: }
114CR0			= $000;
115CR1			= $200;
116CR2			= $400;
117CR3			= $600;
118TABDLY		= $1800;		{ Tab delays: }
119TAB0		= $0000;
120TAB1		= $0800;
121TAB2		= $1000;
122TAB3		= $1800;
123BSDLY		= $2000;		{ Backspace delays: }
124BS0			= $0000;
125BS1			= $2000;
126VTDLY		= $4000;		{ Vertical tab delays: }
127VT0			= $0000;
128VT1			= $4000;
129FFDLY		= $8000;		{ Form feed delays: }
130FF0			= $0000;
131FF1			= $8000;
132
133{
134  c_cflag - control modes
135}
136
137CBAUD		= $1F;			{ line speed definitions }
138
139B0			= $00;
140B50			= $01;
141B75			= $02;
142B110		= $03;
143B134		= $04;
144B150		= $05;
145B200		= $06;
146B300		= $07;
147B600		= $08;
148B1200		= $09;
149B1800		= $0A;
150B2400		= $0B;
151B4800		= $0C;
152B9600		= $0D;
153B19200		= $0E;
154B38400		= $0F;
155B57600		= $10;
156B115200		= $11;
157B230400		= $12;
158B31250		= $13;			{ for MIDI }
159
160CSIZE		= $20;			{ character size }
161CS5			= $00;			{ only 7 and 8 bits supported }
162CS6			= $00;
163CS7			= $00;
164CS8			= $20;
165CSTOPB		= $40;			{ send 2 stop bits, not 1 }
166CREAD		= $80;			{ enables receiver }
167PARENB		= $100;			{ xmit parity enable }
168PARODD		= $200;			{ odd parity, else even }
169HUPCL		= $400;			{ hangs up on last close }
170CLOCAL		= $800;			{ indicates local line }
171XLOBLK		= $1000;			{ block layer output ?}
172CTSFLOW		= $2000;			{ enable CTS flow }
173RTSFLOW		= $4000;			{ enable RTS flow }
174CRTSCTS		= RTSFLOW or CTSFLOW;
175
176
177
178{
179 * "Local" flags - dumping ground for other state
180 *
181 * Warning: some flags in this structure begin with
182 * the letter "I" and look like they belong in the
183 * input flag.
184 }
185
186{
187  c_lflag - local modes
188}
189
190ISIG		= $01;			{ enable signals }
191ICANON		= $02;			{ Canonical input }
192XCASE		= $04;			{ Canonical u/l case }
193ECHO		= $08;			{ Enable echo }
194ECHOE		= $10;			{ Echo erase as bs-sp-bs }
195ECHOK		= $20;			{ Echo nl after kill }
196ECHONL		= $40;			{ Echo nl }
197NOFLSH		= $80;			{ Disable flush after int or quit }
198TOSTOP      = $100;         { stop bg processes that write to tty }
199IEXTEN      = $200;         { implementation defined extensions }
200
201{
202  Event codes.  Returned from TCWAITEVENT
203}
204EV_RING			= $0001;
205EV_BREAK		= $0002;
206EV_CARRIER		= $0004;
207EV_CARRIERLOST	= $0008;
208
209{
210 * Commands passed to tcsetattr() for setting the termios structure.
211}
212
213CONST
214
215        TCSANOW         = $01;             { make change immediate }
216        TCSADRAIN       = $02;             { drain output, then change }
217        TCSAFLUSH       = $04;             { drain output, flush input }
218
219        // TCASOFT undefined under BeOS
220        TCSASOFT        = $10;           { flag - don't alter h.w. state }
221
222
223        TCIFLUSH        = $01;
224        TCOFLUSH        = $02;
225        TCIOFLUSH       = (TCIFLUSH or TCOFLUSH);
226        TCOOFF          = $01;
227        TCOON           = $02;
228        TCIOFF          = $04;
229        TCION           = $08;
230
231{
232#include <sys/cdefs.h>
233
234__BEGIN_DECLS
235speed_t cfgetispeed __P((const struct termios *));
236speed_t cfgetospeed __P((const struct termios *));
237int     cfsetispeed __P((struct termios *, speed_t));
238int     cfsetospeed __P((struct termios *, speed_t));
239int     tcgetattr __P((int, struct termios *));
240int     tcsetattr __P((int, int, const struct termios *));
241int     tcdrain __P((int));
242int     tcflow __P((int, int));
243int     tcflush __P((int, int));
244int     tcsendbreak __P((int, int));
245
246#ifndef _POSIX_SOURCE
247void    cfmakeraw __P((struct termios *));
248int     cfsetspeed __P((struct termios *, speed_t));
249#endif { !_POSIX_SOURCE }
250__END_DECLS
251
252#endif { !_KERNEL }
253
254
255
256struct winsize {
257        unsigned short  ws_row;         { rows, in characters }
258        unsigned short  ws_col;         { columns, in characters }
259        unsigned short  ws_xpixel;      { horizontal size, pixels }
260        unsigned short  ws_ypixel;      { vertical size, pixels }
261};
262
263}
264(*       IOCTLREAD        = $40000000;
265       IOCTLWRITE       = $80000000;
266       IOCTLVOID        = $20000000;
267
268        TIOCMODG        = IOCTLREAD+$47400+ 3;  { get modem control state }
269        TIOCMODS        = IOCTLWRITE+$47400+ 4; { set modem control state }
270                TIOCM_LE        =$0001;         { line enable }
271                TIOCM_DTR       =$0002;         { data terminal ready }
272                TIOCM_RTS       =$0004;         { request to send }
273                TIOCM_ST        =$0010;         { secondary transmit }
274                TIOCM_SR        =$0020;         { secondary receive }
275                TIOCM_CTS       =$0040;         { clear to send }
276                TIOCM_CAR       =$0100;         { carrier detect }
277                TIOCM_CD        =TIOCM_CAR;
278                TIOCM_RNG       =$0200;         { ring }
279                TIOCM_RI        =TIOCM_RNG;
280                TIOCM_DSR       =$0400;         { data set ready }
281                                                { 8-10 compat }
282        TIOCEXCL         =IOCTLVOID+$7400+ 13;          { set exclusive use of tty }
283        TIOCNXCL         =IOCTLVOID+$7400+ 14;          { reset exclusive use of tty }
284*)                                                { 15 unused }
285//        TIOCFLUSH        =IOCTLWRITE+$47400+ 16;        { flush buffers }
286                                                { 17-18 compat }
287//        TIOCGETA         =IOCTLREAD+$2C7400+ 19; { get termios struct }
288//        TIOCSETA         =IOCTLWRITE+$2C7400+ 20; { set termios struct }
289//        TIOCSETAW        =IOCTLWRITE+$2C7400+ 21; { drain output, set }
290//        TIOCSETAF        =IOCTLWRITE+$2C7400+ 22; { drn out, fls in, set }
291//        TIOCGETD         =IOCTLREAD+$47400+ 26; { get line discipline }
292//        TIOCSETD         =IOCTLWRITE+$47400+ 27;        { set line discipline }
293	                                                { 127-124 compat }
294
295// BeOS values
296		TIOCGETA		= $8000;
297		TIOCSETA		= TIOCGETA + 1;
298		TIOCSETAF		= TIOCGETA + 2;
299		TIOCSETAW		= TIOCGETA + 3;
300		TCWAITEVENT		= TIOCGETA + 4;
301		TIOCSBRK		= TIOCGETA + 5;
302		TIOCFLUSH		= TIOCGETA + 6;
303		TCXONC			= TIOCGETA + 7;
304		TCQUERYCONNECTED= TIOCGETA + 8;
305		TCGETBITS		= TIOCGETA + 9;
306		TIOCSDTR		= TIOCGETA + 10;
307		TCSETRTS		= TIOCGETA + 11;
308		TIOCGWINSZ		= TIOCGETA + 12;
309		TIOCSWINSZ		= TIOCGETA + 13;
310		TCVTIME			= TIOCGETA + 14;
311
312
313//		TIOCTIMESTAMP 	= TCVTIME;
314// end BeOS values
315(*
316//        TIOCSBRK         =IOCTLVOID+$7400+ 123;         { set break bit }
317        TIOCCBRK         =IOCTLVOID+$7400+ 122;         { clear break bit }
318//        TIOCSDTR         =IOCTLVOID+$7400+ 121;         { set data terminal ready }
319        TIOCCDTR         =IOCTLVOID+$7400+ 120;         { clear data terminal ready }
320        TIOCGPGRP        =IOCTLREAD+$47400+ 119;        { get pgrp of tty }
321        TIOCSPGRP        =IOCTLWRITE+$47400+ 118;       { set pgrp of tty }
322                                                { 117-116 compat }
323        TIOCOUTQ         =IOCTLREAD+$47400+ 115;        { output queue size }
324        TIOCSTI          =IOCTLWRITE+$17400+ 114;       { simulate terminal input }
325        TIOCNOTTY        =IOCTLVOID+$7400+ 113;         { void tty association }
326        TIOCPKT          =IOCTLWRITE+$47400+ 112;       { pty: set/clear packet mode }
327                TIOCPKT_DATA            =$00;   { data packet }
328                TIOCPKT_FLUSHREAD       =$01;   { flush packet }
329                TIOCPKT_FLUSHWRITE      =$02;   { flush packet }
330                TIOCPKT_STOP            =$04;   { stop output }
331                TIOCPKT_START           =$08;   { start output }
332                TIOCPKT_NOSTOP          =$10;   { no more ^S, ^Q }
333                TIOCPKT_DOSTOP          =$20;   { now do ^S ^Q }
334                TIOCPKT_IOCTL           =$40;   { state change of pty driver }
335        TIOCSTOP         =IOCTLVOID+$7400+ 111;         { stop output, like ^S }
336        TIOCSTART        =IOCTLVOID+$7400+ 110;         { start output, like ^Q }
337        TIOCMSET         =IOCTLWRITE+$47400+ 109;       { set all modem bits }
338        TIOCMBIS         =IOCTLWRITE+$47400+ 108;       { bis modem bits }
339        TIOCMBIC         =IOCTLWRITE+$47400+ 107;       { bic modem bits }
340        TIOCMGET         =IOCTLREAD+$47400+ 106;        { get all modem bits }
341        TIOCREMOTE       =IOCTLWRITE+$47400+ 105;       { remote input editing }
342//        TIOCGWINSZ       =IOCTLREAD+$87400+ 104;        { get window size }
343//        TIOCSWINSZ       =IOCTLWRITE+$87400+ 103;       { set window size }
344        TIOCUCNTL        =IOCTLWRITE+$47400+ 102;       { pty: set/clr usr cntl mode }
345        TIOCSTAT         =IOCTLVOID+$7400+ 101;         { simulate ^T status message }
346  //                       UIOCCMD(n)   _IO('u', n)     { usr cntl op "n" }
347        TIOCCONS         =IOCTLWRITE+$47400+ 98;        { become virtual console }
348        TIOCSCTTY        =IOCTLVOID+$7400+ 97;          { become controlling tty }
349        TIOCEXT          =IOCTLWRITE+$47400+ 96;        { pty: external processing }
350        TIOCSIG          =IOCTLVOID+$7400+ 95;          { pty: generate signal }
351        TIOCDRAIN        =IOCTLVOID+$7400+ 94;          { wait till output drained }
352        TIOCMSDTRWAIT    =IOCTLWRITE+$47400+ 91;        { modem: set wait on close }
353        TIOCMGDTRWAIT    =IOCTLREAD+$47400+ 90; { modem: get wait on close }
354//        TIOCTIMESTAMP    =IOCTLREAD+$87400+ 89;         { enable/get timestamp
355//                                                 * of last input event }
356        TIOCDCDTIMESTAMP =IOCTLREAD+$87400+ 88; { enable/get timestamp
357                                                 * of last DCd rise }
358        TIOCSDRAINWAIT   =IOCTLWRITE+$47400+ 87;        { set ttywait timeout }
359        TIOCGDRAINWAIT   =IOCTLREAD+$47400+ 86; { get ttywait timeout }
360
361        TTYDISC          =0;            { termios tty line discipline }
362        SLIPDISC         =4;            { serial IP discipline }
363        PPPDISC          =5;            { PPP discipline }
364        NETGRAPHDISC     =6;            { Netgraph tty node discipline }
365
366		// OCO 31/10/2005 For compatiblity (defined to compile ShiftState function
367		// in keyboard.pp)
368		// Maybe, it should not work but it compile at least...
369		TIOCLINUX        = $541C;
370
371*)
372{
373 * Defaults on "first" open.
374 }
375        TTYDEF_IFLAG     =(BRKINT       or ICRNL        or IXON or IXANY);
376       TTYDEF_OFLAG      =(OPOST or ONLCR);
377       TTYDEF_LFLAG      =(ECHO or ICANON or ISIG or IEXTEN or ECHOE );
378        TTYDEF_CFLAG     =(CREAD or CS8 or HUPCL);
379       TTYDEF_SPEED      =(B9600);
380
381
382
383{
384 * Control Character Defaults
385 }
386(*        CtrlMask        = $1f;  {\037}
387        CEOF            =chr( ORD('d') and CtrlMask);
388        CEOL            =chr( $ff and CtrlMask);{ XXX avoid _POSIX_VDISABLE }
389        CERASE          =chr( $7F and CtrlMask);
390        CINTR           =chr(ORD('c') and CtrlMask);
391        CSTATUS         =chr(ORD('t') and CtrlMask);
392        CKILL           =chr(ORD('u') and CtrlMask);
393        CMIN            =chr(1);
394        CQUIT           =chr(034  and CtrlMask);        { FS, ^\ }
395        CSUSP           =chr(ORD('z') and CtrlMask);
396        CTIME           =chr(0);
397        CDSUSP          =chr(ORD('y') and CtrlMask);
398        CSTART          =chr(ORD('q') and CtrlMask);
399        CSTOP           =chr(ORD('s') and CtrlMask);
400        CLNEXT          =chr(ORD('v') and CtrlMask);
401        CDISCARD        =chr(ORD('o') and CtrlMask);
402        CWERASE         =chr(ORD('w') and CtrlMask);
403        CREPRINT        =chr(ORD('r') and CtrlMask);
404        CEOT            =CEOF;
405{ compat }
406        CBRK            =CEOL;
407        CRPRNT          =CREPRINT;
408        CFLUSH          =CDISCARD;
409*)
410
411{
412 *        TTYDEFCHARS to include an array of default control characters.
413}
414    ttydefchars : array[0..NCCS-1] OF char =(
415        Chr(VINTR), Chr(VQUIT), Chr(VERASE), Chr(VKILL), Chr(VEOF), Chr(VEOL),
416        Chr(VEOL2), Chr(VSWTCH), Chr(VSTART), Chr(VSTOP), Chr(VSUSP));
417
418{
419  According to posix/sys/ioctl.h
420  /* these currently work only on sockets */
421}
422	FIONBIO  = $be000000;
423	FIONREAD = $be000001;