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