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 VEOF =0; 26 VEOL =1; 27 VEOL2 =2; 28 VERASE =3; 29 VWERASE =4; 30 VKILL =5; 31 VREPRINT =6; 32{ =7; spare 1 } 33 VINTR =8; 34 VQUIT =9; 35 VSUSP =10; 36 VDSUSP =11; 37 VSTART =12; 38 VSTOP =13; 39 VLNEXT =14; 40 VDISCARD =15; 41 VMIN =16; 42 VTIME =17; 43 VSTATUS =18; 44{ =19 spare 2 } 45 NCCS =20; 46 47Type 48 winsize = packed record 49 ws_row, 50 ws_col, 51 ws_xpixel, 52 ws_ypixel : word; 53 end; 54 TWinSize=winsize; 55 56 57type 58 tcflag_t = cuint; 59 cc_t = cuchar; 60 Termios = record 61 c_iflag, 62 c_oflag, 63 c_cflag, 64 c_lflag : tcflag_t; 65 c_cc : array[0..NCCS-1] of cc_t; 66 c_ispeed, 67 c_ospeed : cint; 68 end; 69 TTermios=Termios; 70 71CONST 72 73 74 POSIX_VDISABLE=Chr($ff); 75{ 76 77#define CCEQ(val, c) ((c) == (val) ? (val) != _POSIX_VDISABLE : 0) 78} 79 80{ * Input flags - software input processing} 81 82 IGNBRK = $1; { ignore BREAK condition } 83 BRKINT = $2; { map BREAK to SIGINTR } 84 IGNPAR = $4; { ignore (discard) parity errors } 85 PARMRK = $8; { mark parity and framing errors } 86 INPCK = $10; { enable checking of parity errors } 87 ISTRIP = $20; { strip 8th bit off chars } 88 INLCR = $40; { map NL into CR } 89 IGNCR = $80; { ignore CR } 90 ICRNL = $100; { map CR to NL (ala CRMOD) } 91 IXON = $200; { enable output flow control } 92 IXOFF = $400; { enable input flow control } 93 IXANY = $800; { any char will restart after stop } 94 IUCLC = $1000; { translate upper to lower case } 95 IMAXBEL = $2000; { ring bell on input queue full } 96 97{ 98 * Output flags - software output processing 99} 100 OPOST = $1; { enable following output processing } 101 ONLCR = $2; { map NL to CR-NL (ala CRMOD) } 102 OXTABS = $4; { expand tabs to spaces } 103 ONOEOT = $8; { discard EOT's (^D) on output) } 104 OCRNL = $10; { map CR to NL } 105 OLCUC = $20; { translate lower case to upper case } 106 ONOCR = $40; { No CR output at column 0 } 107 ONLRET = $80; { NL performs the CR function } 108 109{ 110 * Control flags - hardware control of terminal 111} 112 CIGNORE = $1; { ignore control flags } 113 CSIZE = $300; { character size mask } 114 CS5 = $0; { 5 bits (pseudo) } 115 CS6 = $100; { 6 bits } 116 CS7 = $200; { 7 bits } 117 CS8 = $300; { 8 bits } 118 CSTOPB = $400; { send 2 stop bits } 119 CREAD = $800; { enable receiver } 120 PARENB = $1000; { parity enable } 121 PARODD = $2000; { odd parity, else even } 122 HUPCL = $4000; { hang up on last close } 123 CLOCAL = $8000; { ignore modem status lines } 124 CRTSCTS = $10000; { RTS/CTS full-duplex flow control } 125 CRTS_IFLOW = CRTSCTS; { XXX compat } 126 CCTS_OFLOW = CRTSCTS; { XXX compat } 127 MDMBUF = $100000; { DTR/DCD hardware flow control } 128 CHWFLOW = MDMBUF or CRTSCTS; { all types of hw flow control } 129 130{ 131 * "Local" flags - dumping ground for other state 132 * 133 * Warning: some flags in this structure begin with 134 * the letter "I" and look like they belong in the 135 * input flag. 136 } 137 138 ECHOKE = $1; { visual erase for line kill } 139 ECHOE = $2; { visually erase chars } 140 ECHOK = $4; { echo NL after line kill } 141 ECHO = $8; { enable echoing } 142 ECHONL = $10; { echo NL even if ECHO is off } 143 ECHOPRT = $20; { visual erase mode for hardcopy } 144 ECHOCTL = $40; { echo control chars as ^(Char) } 145 ISIG = $80; { enable signals INTR, QUIT, [D]SUSP } 146 ICANON = $100; { canonicalize input lines } 147 ALTWERASE = $200; { use alternate WERASE algorithm } 148 IEXTEN = $400; { enable DISCARD and LNEXT } 149 EXTPROC = $800; { external processing } 150 TOSTOP = $400000; { stop background jobs from output } 151 FLUSHO = $800000; { output being flushed (state) } 152 XCASE = $1000000; { canonical upper/lower case } 153 NOKERNINFO = $2000000; { no kernel output from VSTATUS } 154 PENDIN =$20000000; { XXX retype pending input (state) } 155 NOFLSH =$80000000; { don't flush after interrupt } 156 157 158 159{ 160 * Commands passed to tcsetattr() for setting the termios structure. 161} 162 163CONST 164 165 TCSANOW =0; { make change immediate } 166 TCSADRAIN =1; { drain output, then change } 167 TCSAFLUSH =2; { drain output, flush input } 168 TCSASOFT =$10; { flag - don't alter h.w. state } 169 170{ 171 * Standard speeds 172} 173 B0 = 0; 174 B50 = 50; 175 B75 = 75; 176 B110 = 110; 177 B134 = 134; 178 B150 = 150; 179 B200 = 200; 180 B300 = 300; 181 B600 = 600; 182 B1200 = 1200; 183 B1800 = 1800; 184 B2400 = 2400; 185 B4800 = 4800; 186 B9600 = 9600; 187 B19200 = 19200; 188 B38400 = 38400; 189 B7200 = 7200; 190 B14400 = 14400; 191 B28800 = 28800; 192 B57600 = 57600; 193 B76800 = 76800; 194 B115200 =115200; 195 B230400 =230400; 196 EXTA = 19200; 197 EXTB = 38400; 198 199 TCIFLUSH =1; 200 TCOFLUSH =2; 201 TCIOFLUSH =3; 202 TCOOFF =1; 203 TCOON =2; 204 TCIOFF =3; 205 TCION =4; 206 207{ 208#include <sys/cdefs.h> 209 210__BEGIN_DECLS 211speed_t cfgetispeed __P((const struct termios *)); 212speed_t cfgetospeed __P((const struct termios *)); 213int cfsetispeed __P((struct termios *, speed_t)); 214int cfsetospeed __P((struct termios *, speed_t)); 215int tcgetattr __P((int, struct termios *)); 216int tcsetattr __P((int, int, const struct termios *)); 217int tcdrain __P((int)); 218int tcflow __P((int, int)); 219int tcflush __P((int, int)); 220int tcsendbreak __P((int, int)); 221 222#ifndef _POSIX_SOURCE 223void cfmakeraw __P((struct termios *)); 224int cfsetspeed __P((struct termios *, speed_t)); 225#endif { !_POSIX_SOURCE } 226__END_DECLS 227 228#endif { !_KERNEL } 229 230 231 232struct winsize { 233 unsigned short ws_row; { rows, in characters } 234 unsigned short ws_col; { columns, in characters } 235 unsigned short ws_xpixel; { horizontal size, pixels } 236 unsigned short ws_ypixel; { vertical size, pixels } 237}; 238 239} 240 IOCTLREAD = $40000000; 241 IOCTLWRITE = $80000000; 242 IOCTLVOID = $20000000; 243 244 TIOCMODG = IOCTLREAD+$47400+ 3; { get modem control state } 245 TIOCMODS = IOCTLWRITE+$47400+ 4; { set modem control state } 246 TIOCM_LE =$0001; { line enable } 247 TIOCM_DTR =$0002; { data terminal ready } 248 TIOCM_RTS =$0004; { request to send } 249 TIOCM_ST =$0010; { secondary transmit } 250 TIOCM_SR =$0020; { secondary receive } 251 TIOCM_CTS =$0040; { clear to send } 252 TIOCM_CAR =$0100; { carrier detect } 253 TIOCM_CD =TIOCM_CAR; 254 TIOCM_RNG =$0200; { ring } 255 TIOCM_RI =TIOCM_RNG; 256 TIOCM_DSR =$0400; { data set ready } 257 { 8-10 compat } 258 TIOCEXCL =IOCTLVOID+$7400+ 13; { set exclusive use of tty } 259 TIOCNXCL =IOCTLVOID+$7400+ 14; { reset exclusive use of tty } 260 { 15 unused } 261 TIOCFLUSH =IOCTLWRITE+$47400+ 16; { flush buffers } 262 { 17-18 compat } 263 TIOCGETA =IOCTLREAD+$2C7400+ 19; { get termios struct } 264 TIOCSETA =IOCTLWRITE+$2C7400+ 20; { set termios struct } 265 TIOCSETAW =IOCTLWRITE+$2C7400+ 21; { drain output, set } 266 TIOCSETAF =IOCTLWRITE+$2C7400+ 22; { drn out, fls in, set } 267 TIOCGETD =IOCTLREAD+$47400+ 26; { get line discipline } 268 TIOCSETD =IOCTLWRITE+$47400+ 27; { set line discipline } 269 { 127-124 compat } 270 TIOCSBRK =IOCTLVOID+$7400+ 123; { set break bit } 271 TIOCCBRK =IOCTLVOID+$7400+ 122; { clear break bit } 272 TIOCSDTR =IOCTLVOID+$7400+ 121; { set data terminal ready } 273 TIOCCDTR =IOCTLVOID+$7400+ 120; { clear data terminal ready } 274 TIOCGPGRP =IOCTLREAD+$47400+ 119; { get pgrp of tty } 275 TIOCSPGRP =IOCTLWRITE+$47400+ 118; { set pgrp of tty } 276 { 117-116 compat } 277 TIOCOUTQ =IOCTLREAD+$47400+ 115; { output queue size } 278 TIOCSTI =IOCTLWRITE+$17400+ 114; { simulate terminal input } 279 TIOCNOTTY =IOCTLVOID+$7400+ 113; { void tty association } 280 TIOCPKT =IOCTLWRITE+$47400+ 112; { pty: set/clear packet mode } 281 TIOCPKT_DATA =$00; { data packet } 282 TIOCPKT_FLUSHREAD =$01; { flush packet } 283 TIOCPKT_FLUSHWRITE =$02; { flush packet } 284 TIOCPKT_STOP =$04; { stop output } 285 TIOCPKT_START =$08; { start output } 286 TIOCPKT_NOSTOP =$10; { no more ^S, ^Q } 287 TIOCPKT_DOSTOP =$20; { now do ^S ^Q } 288 TIOCPKT_IOCTL =$40; { state change of pty driver } 289 TIOCSTOP =IOCTLVOID+$7400+ 111; { stop output, like ^S } 290 TIOCSTART =IOCTLVOID+$7400+ 110; { start output, like ^Q } 291 TIOCMSET =IOCTLWRITE+$47400+ 109; { set all modem bits } 292 TIOCMBIS =IOCTLWRITE+$47400+ 108; { bis modem bits } 293 TIOCMBIC =IOCTLWRITE+$47400+ 107; { bic modem bits } 294 TIOCMGET =IOCTLREAD+$47400+ 106; { get all modem bits } 295 TIOCREMOTE =IOCTLWRITE+$47400+ 105; { remote input editing } 296 TIOCGWINSZ =IOCTLREAD+$87400+ 104; { get window size } 297 TIOCSWINSZ =IOCTLWRITE+$87400+ 103; { set window size } 298 TIOCUCNTL =IOCTLWRITE+$47400+ 102; { pty: set/clr usr cntl mode } 299 TIOCSTAT =IOCTLVOID+$7400+ 101; { simulate ^T status message } 300 // UIOCCMD(n) _IO('u', n) { usr cntl op "n" } 301 TIOCCONS =IOCTLWRITE+$47400+ 98; { become virtual console } 302 TIOCSCTTY =IOCTLVOID+$7400+ 97; { become controlling tty } 303 TIOCEXT =IOCTLWRITE+$47400+ 96; { pty: external processing } 304 TIOCSIG =IOCTLVOID+$7400+ 95; { pty: generate signal } 305 TIOCDRAIN =IOCTLVOID+$7400+ 94; { wait till output drained } 306 TIOCMSDTRWAIT =IOCTLWRITE+$47400+ 91; { modem: set wait on close } 307 TIOCMGDTRWAIT =IOCTLREAD+$47400+ 90; { modem: get wait on close } 308 TIOCTIMESTAMP =IOCTLREAD+$87400+ 89; { enable/get timestamp 309 * of last input event } 310 TIOCDCDTIMESTAMP =IOCTLREAD+$87400+ 88; { enable/get timestamp 311 * of last DCd rise } 312 TIOCSDRAINWAIT =IOCTLWRITE+$47400+ 87; { set ttywait timeout } 313 TIOCGDRAINWAIT =IOCTLREAD+$47400+ 86; { get ttywait timeout } 314 315 TTYDISC = 0; { termios tty line discipline } 316 SLIPDISC = 4; { serial IP discipline } 317 PPPDISC = 5; { PPP discipline } 318 NETGRAPHDISC = 6; { Netgraph tty node discipline } 319 320 FIOCLEX = IOCTLVOID +$6600+ 1; { set close on exec on fd } 321 FIONCLEX = IOCTLVOID +$6600+ 2; { remove close on exec } 322 FIONREAD = IOCTLREAD +$46600+127; { get # bytes to read } 323 FIONBIO = IOCTLWRITE+$46600+126; { set/clear non-blocking i/o } 324 FIOASYNC = IOCTLWRITE+$46600+125; { set/clear async i/o } 325 FIOSETOWN = IOCTLWRITE+$46600+124; { set owner } 326 FIOGETOWN = IOCTLREAD +$46600+123; { get owner } 327 FIODTYPE = IOCTLREAD +$46600+122; { get d_flags type part } 328 FIOGETLBA = IOCTLREAD +$46600+121; { get start blk # } 329 330{ 331 * Defaults on "first" open. 332 } 333 TTYDEF_IFLAG =(BRKINT or ICRNL or IMAXBEL or IXON or IXANY); 334 TTYDEF_OFLAG =(OPOST or ONLCR); 335 TTYDEF_LFLAG =(ECHO or ICANON or ISIG or IEXTEN or ECHOE or ECHOKE or ECHOCTL); 336 TTYDEF_CFLAG =(CREAD or CS8 or HUPCL); 337 TTYDEF_SPEED =(B9600); 338 339 340 341{ 342 * Control Character Defaults 343 } 344 CtrlMask = $1f; {\037} 345 CEOF =chr( ORD('d') and CtrlMask); 346 CEOL =chr( $ff and CtrlMask);{ XXX avoid _POSIX_VDISABLE } 347 CERASE =chr( $7F and CtrlMask); 348 CINTR =chr(ORD('c') and CtrlMask); 349 CSTATUS =chr(ORD('t') and CtrlMask); 350 CKILL =chr(ORD('u') and CtrlMask); 351 CMIN =chr(1); 352 CQUIT =chr(034 and CtrlMask); { FS, ^\ } 353 CSUSP =chr(ORD('z') and CtrlMask); 354 CTIME =chr(0); 355 CDSUSP =chr(ORD('y') and CtrlMask); 356 CSTART =chr(ORD('q') and CtrlMask); 357 CSTOP =chr(ORD('s') and CtrlMask); 358 CLNEXT =chr(ORD('v') and CtrlMask); 359 CDISCARD =chr(ORD('o') and CtrlMask); 360 CWERASE =chr(ORD('w') and CtrlMask); 361 CREPRINT =chr(ORD('r') and CtrlMask); 362 CEOT =CEOF; 363{ compat } 364 CBRK =CEOL; 365 CRPRNT =CREPRINT; 366 CFLUSH =CDISCARD; 367 368 369{ 370 * TTYDEFCHARS to include an array of default control characters. 371} 372 ttydefchars : array[0..NCCS-1] OF char =( 373 CEOF, CEOL, CEOL, CERASE, CWERASE, CKILL, CREPRINT, 374 POSIX_VDISABLE, CINTR, CQUIT, CSUSP, CDSUSP, CSTART, CSTOP, CLNEXT, 375 CDISCARD, CMIN, CTIME, CSTATUS, POSIX_VDISABLE); 376 377