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;