| @node Low-Level Terminal Interface, Syslog, Sockets, Top | 
 | @c %MENU% How to change the characteristics of a terminal device | 
 | @chapter Low-Level Terminal Interface | 
 |  | 
 | This chapter describes functions that are specific to terminal devices. | 
 | You can use these functions to do things like turn off input echoing; | 
 | set serial line characteristics such as line speed and flow control; and | 
 | change which characters are used for end-of-file, command-line editing, | 
 | sending signals, and similar control functions. | 
 |  | 
 | Most of the functions in this chapter operate on file descriptors. | 
 | @xref{Low-Level I/O}, for more information about what a file | 
 | descriptor is and how to open a file descriptor for a terminal device. | 
 |  | 
 | @menu | 
 | * Is It a Terminal::            How to determine if a file is a terminal | 
 | 			         device, and what its name is. | 
 | * I/O Queues::                  About flow control and typeahead. | 
 | * Canonical or Not::            Two basic styles of input processing. | 
 | * Terminal Modes::              How to examine and modify flags controlling | 
 | 			         details of terminal I/O: echoing, | 
 |                                  signals, editing.  Posix. | 
 | * BSD Terminal Modes::          BSD compatible terminal mode setting | 
 | * Line Control::                Sending break sequences, clearing | 
 |                                  terminal buffers @dots{} | 
 | * Noncanon Example::            How to read single characters without echo. | 
 | * Pseudo-Terminals::            How to open a pseudo-terminal. | 
 | @end menu | 
 |  | 
 | @node Is It a Terminal | 
 | @section Identifying Terminals | 
 | @cindex terminal identification | 
 | @cindex identifying terminals | 
 |  | 
 | The functions described in this chapter only work on files that | 
 | correspond to terminal devices.  You can find out whether a file | 
 | descriptor is associated with a terminal by using the @code{isatty} | 
 | function. | 
 |  | 
 | @pindex unistd.h | 
 | Prototypes for the functions in this section are declared in the header | 
 | file @file{unistd.h}. | 
 |  | 
 | @comment unistd.h | 
 | @comment POSIX.1 | 
 | @deftypefun int isatty (int @var{filedes}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c isatty ok | 
 | @c  tcgetattr dup ok | 
 | This function returns @code{1} if @var{filedes} is a file descriptor | 
 | associated with an open terminal device, and @math{0} otherwise. | 
 | @end deftypefun | 
 |  | 
 | If a file descriptor is associated with a terminal, you can get its | 
 | associated file name using the @code{ttyname} function.  See also the | 
 | @code{ctermid} function, described in @ref{Identifying the Terminal}. | 
 |  | 
 | @comment unistd.h | 
 | @comment POSIX.1 | 
 | @deftypefun {char *} ttyname (int @var{filedes}) | 
 | @safety{@prelim{}@mtunsafe{@mtasurace{:ttyname}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} | 
 | @c ttyname @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd | 
 | @c  isatty dup ok | 
 | @c  fstat dup ok | 
 | @c  memcpy dup ok | 
 | @c  getttyname @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd | 
 | @c   opendir @ascuheap @acsmem @acsfd | 
 | @c   readdir ok [protected by exclusive access] | 
 | @c   strcmp dup ok | 
 | @c   free dup @asulock @aculock @acsfd @acsmem | 
 | @c   malloc dup @asulock @aculock @acsfd @acsmem | 
 | @c   closedir @ascuheap @acsmem @acsfd | 
 | @c   mempcpy dup ok | 
 | @c   stat dup ok | 
 | If the file descriptor @var{filedes} is associated with a terminal | 
 | device, the @code{ttyname} function returns a pointer to a | 
 | statically-allocated, null-terminated string containing the file name of | 
 | the terminal file.  The value is a null pointer if the file descriptor | 
 | isn't associated with a terminal, or the file name cannot be determined. | 
 | @end deftypefun | 
 |  | 
 | @comment unistd.h | 
 | @comment POSIX.1 | 
 | @deftypefun int ttyname_r (int @var{filedes}, char *@var{buf}, size_t @var{len}) | 
 | @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} | 
 | @c ttyname_r @ascuheap @acsmem @acsfd | 
 | @c  isatty dup ok | 
 | @c  fstat dup ok | 
 | @c  memcpy dup ok | 
 | @c  getttyname_r @ascuheap @acsmem @acsfd | 
 | @c   opendir @ascuheap @acsmem @acsfd | 
 | @c   readdir ok [protected by exclusive access] | 
 | @c   strcmp dup ok | 
 | @c   closedir @ascuheap @acsmem @acsfd | 
 | @c   stpncpy dup ok | 
 | @c   stat dup ok | 
 | The @code{ttyname_r} function is similar to the @code{ttyname} function | 
 | except that it places its result into the user-specified buffer starting | 
 | at @var{buf} with length @var{len}. | 
 |  | 
 | The normal return value from @code{ttyname_r} is @math{0}.  Otherwise an | 
 | error number is returned to indicate the error.  The following | 
 | @code{errno} error conditions are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} argument is not a valid file descriptor. | 
 |  | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal. | 
 |  | 
 | @item ERANGE | 
 | The buffer length @var{len} is too small to store the string to be | 
 | returned. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 | @node I/O Queues | 
 | @section I/O Queues | 
 |  | 
 | Many of the remaining functions in this section refer to the input and | 
 | output queues of a terminal device.  These queues implement a form of | 
 | buffering @emph{within the kernel} independent of the buffering | 
 | implemented by I/O streams (@pxref{I/O on Streams}). | 
 |  | 
 | @cindex terminal input queue | 
 | @cindex typeahead buffer | 
 | The @dfn{terminal input queue} is also sometimes referred to as its | 
 | @dfn{typeahead buffer}.  It holds the characters that have been received | 
 | from the terminal but not yet read by any process. | 
 |  | 
 | The size of the input queue is described by the @code{MAX_INPUT} and | 
 | @w{@code{_POSIX_MAX_INPUT}} parameters; see @ref{Limits for Files}.  You | 
 | are guaranteed a queue size of at least @code{MAX_INPUT}, but the queue | 
 | might be larger, and might even dynamically change size.  If input flow | 
 | control is enabled by setting the @code{IXOFF} input mode bit | 
 | (@pxref{Input Modes}), the terminal driver transmits STOP and START | 
 | characters to the terminal when necessary to prevent the queue from | 
 | overflowing.  Otherwise, input may be lost if it comes in too fast from | 
 | the terminal.  In canonical mode, all input stays in the queue until a | 
 | newline character is received, so the terminal input queue can fill up | 
 | when you type a very long line.  @xref{Canonical or Not}. | 
 |  | 
 | @cindex terminal output queue | 
 | The @dfn{terminal output queue} is like the input queue, but for output; | 
 | it contains characters that have been written by processes, but not yet | 
 | transmitted to the terminal.  If output flow control is enabled by | 
 | setting the @code{IXON} input mode bit (@pxref{Input Modes}), the | 
 | terminal driver obeys START and STOP characters sent by the terminal to | 
 | stop and restart transmission of output. | 
 |  | 
 | @dfn{Clearing} the terminal input queue means discarding any characters | 
 | that have been received but not yet read.  Similarly, clearing the | 
 | terminal output queue means discarding any characters that have been | 
 | written but not yet transmitted. | 
 |  | 
 | @node Canonical or Not | 
 | @section Two Styles of Input: Canonical or Not | 
 |  | 
 | POSIX systems support two basic modes of input: canonical and | 
 | noncanonical. | 
 |  | 
 | @cindex canonical input processing | 
 | In @dfn{canonical input processing} mode, terminal input is processed in | 
 | lines terminated by newline (@code{'\n'}), EOF, or EOL characters.  No | 
 | input can be read until an entire line has been typed by the user, and | 
 | the @code{read} function (@pxref{I/O Primitives}) returns at most a | 
 | single line of input, no matter how many bytes are requested. | 
 |  | 
 | In canonical input mode, the operating system provides input editing | 
 | facilities: some characters are interpreted specially to perform editing | 
 | operations within the current line of text, such as ERASE and KILL. | 
 | @xref{Editing Characters}. | 
 |  | 
 | The constants @code{_POSIX_MAX_CANON} and @code{MAX_CANON} parameterize | 
 | the maximum number of bytes which may appear in a single line of | 
 | canonical input.  @xref{Limits for Files}.  You are guaranteed a maximum | 
 | line length of at least @code{MAX_CANON} bytes, but the maximum might be | 
 | larger, and might even dynamically change size. | 
 |  | 
 | @cindex noncanonical input processing | 
 | In @dfn{noncanonical input processing} mode, characters are not grouped | 
 | into lines, and ERASE and KILL processing is not performed.  The | 
 | granularity with which bytes are read in noncanonical input mode is | 
 | controlled by the MIN and TIME settings.  @xref{Noncanonical Input}. | 
 |  | 
 | Most programs use canonical input mode, because this gives the user a | 
 | way to edit input line by line.  The usual reason to use noncanonical | 
 | mode is when the program accepts single-character commands or provides | 
 | its own editing facilities. | 
 |  | 
 | The choice of canonical or noncanonical input is controlled by the | 
 | @code{ICANON} flag in the @code{c_lflag} member of @code{struct termios}. | 
 | @xref{Local Modes}. | 
 |  | 
 | @node Terminal Modes | 
 | @section Terminal Modes | 
 |  | 
 | @pindex termios.h | 
 | This section describes the various terminal attributes that control how | 
 | input and output are done.  The functions, data structures, and symbolic | 
 | constants are all declared in the header file @file{termios.h}. | 
 |  | 
 | Don't confuse terminal attributes with file attributes.  A device special | 
 | file which is associated with a terminal has file attributes as described | 
 | in @ref{File Attributes}.  These are unrelated to the attributes of the | 
 | terminal device itself, which are discussed in this section. | 
 |  | 
 | @menu | 
 | * Mode Data Types::             The data type @code{struct termios} and | 
 |                                  related types. | 
 | * Mode Functions::              Functions to read and set the terminal | 
 |                                  attributes. | 
 | * Setting Modes::               The right way to set terminal attributes | 
 |                                  reliably. | 
 | * Input Modes::                 Flags controlling low-level input handling. | 
 | * Output Modes::                Flags controlling low-level output handling. | 
 | * Control Modes::               Flags controlling serial port behavior. | 
 | * Local Modes::                 Flags controlling high-level input handling. | 
 | * Line Speed::                  How to read and set the terminal line speed. | 
 | * Special Characters::          Characters that have special effects, | 
 | 			         and how to change them. | 
 | * Noncanonical Input::          Controlling how long to wait for input. | 
 | @end menu | 
 |  | 
 | @node Mode Data Types | 
 | @subsection Terminal Mode Data Types | 
 | @cindex terminal mode data types | 
 |  | 
 | The entire collection of attributes of a terminal is stored in a | 
 | structure of type @code{struct termios}.  This structure is used | 
 | with the functions @code{tcgetattr} and @code{tcsetattr} to read | 
 | and set the attributes. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftp {Data Type} {struct termios} | 
 | Structure that records all the I/O attributes of a terminal.  The | 
 | structure includes at least the following members: | 
 |  | 
 | @table @code | 
 | @item tcflag_t c_iflag | 
 | A bit mask specifying flags for input modes; see @ref{Input Modes}. | 
 |  | 
 | @item tcflag_t c_oflag | 
 | A bit mask specifying flags for output modes; see @ref{Output Modes}. | 
 |  | 
 | @item tcflag_t c_cflag | 
 | A bit mask specifying flags for control modes; see @ref{Control Modes}. | 
 |  | 
 | @item tcflag_t c_lflag | 
 | A bit mask specifying flags for local modes; see @ref{Local Modes}. | 
 |  | 
 | @item cc_t c_cc[NCCS] | 
 | An array specifying which characters are associated with various | 
 | control functions; see @ref{Special Characters}. | 
 | @end table | 
 |  | 
 | The @code{struct termios} structure also contains members which | 
 | encode input and output transmission speeds, but the representation is | 
 | not specified.  @xref{Line Speed}, for how to examine and store the | 
 | speed values. | 
 | @end deftp | 
 |  | 
 | The following sections describe the details of the members of the | 
 | @code{struct termios} structure. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftp {Data Type} tcflag_t | 
 | This is an unsigned integer type used to represent the various | 
 | bit masks for terminal flags. | 
 | @end deftp | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftp {Data Type} cc_t | 
 | This is an unsigned integer type used to represent characters associated | 
 | with various terminal control functions. | 
 | @end deftp | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int NCCS | 
 | The value of this macro is the number of elements in the @code{c_cc} | 
 | array. | 
 | @end deftypevr | 
 |  | 
 | @node Mode Functions | 
 | @subsection Terminal Mode Functions | 
 | @cindex terminal mode functions | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int tcgetattr (int @var{filedes}, struct termios *@var{termios-p}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Converting the kernel-returned termios data structure to the userland | 
 | @c format does not ensure atomic or consistent writing. | 
 | This function is used to examine the attributes of the terminal | 
 | device with file descriptor @var{filedes}.  The attributes are returned | 
 | in the structure that @var{termios-p} points to. | 
 |  | 
 | If successful, @code{tcgetattr} returns @math{0}.  A return value of @math{-1} | 
 | indicates an error.  The following @code{errno} error conditions are | 
 | defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} argument is not a valid file descriptor. | 
 |  | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int tcsetattr (int @var{filedes}, int @var{when}, const struct termios *@var{termios-p}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Converting the incoming termios data structure to the kernel format | 
 | @c does not ensure atomic or consistent reading. | 
 | This function sets the attributes of the terminal device with file | 
 | descriptor @var{filedes}.  The new attributes are taken from the | 
 | structure that @var{termios-p} points to. | 
 |  | 
 | The @var{when} argument specifies how to deal with input and output | 
 | already queued.  It can be one of the following values: | 
 |  | 
 | @table @code | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @item TCSANOW | 
 | @vindex TCSANOW | 
 | Make the change immediately. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @item TCSADRAIN | 
 | @vindex TCSADRAIN | 
 | Make the change after waiting until all queued output has been written. | 
 | You should usually use this option when changing parameters that affect | 
 | output. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @item TCSAFLUSH | 
 | @vindex TCSAFLUSH | 
 | This is like @code{TCSADRAIN}, but also discards any queued input. | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @item TCSASOFT | 
 | @vindex TCSASOFT | 
 | This is a flag bit that you can add to any of the above alternatives. | 
 | Its meaning is to inhibit alteration of the state of the terminal | 
 | hardware.  It is a BSD extension; it is only supported on BSD systems | 
 | and @gnuhurdsystems{}. | 
 |  | 
 | Using @code{TCSASOFT} is exactly the same as setting the @code{CIGNORE} | 
 | bit in the @code{c_cflag} member of the structure @var{termios-p} points | 
 | to.  @xref{Control Modes}, for a description of @code{CIGNORE}. | 
 | @end table | 
 |  | 
 | If this function is called from a background process on its controlling | 
 | terminal, normally all processes in the process group are sent a | 
 | @code{SIGTTOU} signal, in the same way as if the process were trying to | 
 | write to the terminal.  The exception is if the calling process itself | 
 | is ignoring or blocking @code{SIGTTOU} signals, in which case the | 
 | operation is performed and no signal is sent.  @xref{Job Control}. | 
 |  | 
 | If successful, @code{tcsetattr} returns @math{0}.  A return value of | 
 | @math{-1} indicates an error.  The following @code{errno} error | 
 | conditions are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} argument is not a valid file descriptor. | 
 |  | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal. | 
 |  | 
 | @item EINVAL | 
 | Either the value of the @code{when} argument is not valid, or there is | 
 | something wrong with the data in the @var{termios-p} argument. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 | Although @code{tcgetattr} and @code{tcsetattr} specify the terminal | 
 | device with a file descriptor, the attributes are those of the terminal | 
 | device itself and not of the file descriptor.  This means that the | 
 | effects of changing terminal attributes are persistent; if another | 
 | process opens the terminal file later on, it will see the changed | 
 | attributes even though it doesn't have anything to do with the open file | 
 | descriptor you originally specified in changing the attributes. | 
 |  | 
 | Similarly, if a single process has multiple or duplicated file | 
 | descriptors for the same terminal device, changing the terminal | 
 | attributes affects input and output to all of these file | 
 | descriptors.  This means, for example, that you can't open one file | 
 | descriptor or stream to read from a terminal in the normal | 
 | line-buffered, echoed mode; and simultaneously have another file | 
 | descriptor for the same terminal that you use to read from it in | 
 | single-character, non-echoed mode.  Instead, you have to explicitly | 
 | switch the terminal back and forth between the two modes. | 
 |  | 
 | @node Setting Modes | 
 | @subsection Setting Terminal Modes Properly | 
 |  | 
 | When you set terminal modes, you should call @code{tcgetattr} first to | 
 | get the current modes of the particular terminal device, modify only | 
 | those modes that you are really interested in, and store the result with | 
 | @code{tcsetattr}. | 
 |  | 
 | It's a bad idea to simply initialize a @code{struct termios} structure | 
 | to a chosen set of attributes and pass it directly to @code{tcsetattr}. | 
 | Your program may be run years from now, on systems that support members | 
 | not documented in this manual.  The way to avoid setting these members | 
 | to unreasonable values is to avoid changing them. | 
 |  | 
 | What's more, different terminal devices may require different mode | 
 | settings in order to function properly.  So you should avoid blindly | 
 | copying attributes from one terminal device to another. | 
 |  | 
 | When a member contains a collection of independent flags, as the | 
 | @code{c_iflag}, @code{c_oflag} and @code{c_cflag} members do, even | 
 | setting the entire member is a bad idea, because particular operating | 
 | systems have their own flags.  Instead, you should start with the | 
 | current value of the member and alter only the flags whose values matter | 
 | in your program, leaving any other flags unchanged. | 
 |  | 
 | Here is an example of how to set one flag (@code{ISTRIP}) in the | 
 | @code{struct termios} structure while properly preserving all the other | 
 | data in the structure: | 
 |  | 
 | @smallexample | 
 | @group | 
 | int | 
 | set_istrip (int desc, int value) | 
 | @{ | 
 |   struct termios settings; | 
 |   int result; | 
 | @end group | 
 |  | 
 | @group | 
 |   result = tcgetattr (desc, &settings); | 
 |   if (result < 0) | 
 |     @{ | 
 |       perror ("error in tcgetattr"); | 
 |       return 0; | 
 |     @} | 
 | @end group | 
 | @group | 
 |   settings.c_iflag &= ~ISTRIP; | 
 |   if (value) | 
 |     settings.c_iflag |= ISTRIP; | 
 | @end group | 
 | @group | 
 |   result = tcsetattr (desc, TCSANOW, &settings); | 
 |   if (result < 0) | 
 |     @{ | 
 |       perror ("error in tcsetattr"); | 
 |       return 0; | 
 |    @} | 
 |   return 1; | 
 | @} | 
 | @end group | 
 | @end smallexample | 
 |  | 
 | @node Input Modes | 
 | @subsection Input Modes | 
 |  | 
 | This section describes the terminal attribute flags that control | 
 | fairly low-level aspects of input processing: handling of parity errors, | 
 | break signals, flow control, and @key{RET} and @key{LFD} characters. | 
 |  | 
 | All of these flags are bits in the @code{c_iflag} member of the | 
 | @code{struct termios} structure.  The member is an integer, and you | 
 | change flags using the operators @code{&}, @code{|} and @code{^}.  Don't | 
 | try to specify the entire value for @code{c_iflag}---instead, change | 
 | only specific flags and leave the rest untouched (@pxref{Setting | 
 | Modes}). | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t INPCK | 
 | @cindex parity checking | 
 | If this bit is set, input parity checking is enabled.  If it is not set, | 
 | no checking at all is done for parity errors on input; the | 
 | characters are simply passed through to the application. | 
 |  | 
 | Parity checking on input processing is independent of whether parity | 
 | detection and generation on the underlying terminal hardware is enabled; | 
 | see @ref{Control Modes}.  For example, you could clear the @code{INPCK} | 
 | input mode flag and set the @code{PARENB} control mode flag to ignore | 
 | parity errors on input, but still generate parity on output. | 
 |  | 
 | If this bit is set, what happens when a parity error is detected depends | 
 | on whether the @code{IGNPAR} or @code{PARMRK} bits are set.  If neither | 
 | of these bits are set, a byte with a parity error is passed to the | 
 | application as a @code{'\0'} character. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t IGNPAR | 
 | If this bit is set, any byte with a framing or parity error is ignored. | 
 | This is only useful if @code{INPCK} is also set. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t PARMRK | 
 | If this bit is set, input bytes with parity or framing errors are marked | 
 | when passed to the program.  This bit is meaningful only when | 
 | @code{INPCK} is set and @code{IGNPAR} is not set. | 
 |  | 
 | The way erroneous bytes are marked is with two preceding bytes, | 
 | @code{377} and @code{0}.  Thus, the program actually reads three bytes | 
 | for one erroneous byte received from the terminal. | 
 |  | 
 | If a valid byte has the value @code{0377}, and @code{ISTRIP} (see below) | 
 | is not set, the program might confuse it with the prefix that marks a | 
 | parity error.  So a valid byte @code{0377} is passed to the program as | 
 | two bytes, @code{0377} @code{0377}, in this case. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ISTRIP | 
 | If this bit is set, valid input bytes are stripped to seven bits; | 
 | otherwise, all eight bits are available for programs to read. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t IGNBRK | 
 | If this bit is set, break conditions are ignored. | 
 |  | 
 | @cindex break condition, detecting | 
 | A @dfn{break condition} is defined in the context of asynchronous | 
 | serial data transmission as a series of zero-value bits longer than a | 
 | single byte. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t BRKINT | 
 | If this bit is set and @code{IGNBRK} is not set, a break condition | 
 | clears the terminal input and output queues and raises a @code{SIGINT} | 
 | signal for the foreground process group associated with the terminal. | 
 |  | 
 | If neither @code{BRKINT} nor @code{IGNBRK} are set, a break condition is | 
 | passed to the application as a single @code{'\0'} character if | 
 | @code{PARMRK} is not set, or otherwise as a three-character sequence | 
 | @code{'\377'}, @code{'\0'}, @code{'\0'}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t IGNCR | 
 | If this bit is set, carriage return characters (@code{'\r'}) are | 
 | discarded on input.  Discarding carriage return may be useful on | 
 | terminals that send both carriage return and linefeed when you type the | 
 | @key{RET} key. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ICRNL | 
 | If this bit is set and @code{IGNCR} is not set, carriage return characters | 
 | (@code{'\r'}) received as input are passed to the application as newline | 
 | characters (@code{'\n'}). | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t INLCR | 
 | If this bit is set, newline characters (@code{'\n'}) received as input | 
 | are passed to the application as carriage return characters (@code{'\r'}). | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t IXOFF | 
 | If this bit is set, start/stop control on input is enabled.  In other | 
 | words, the computer sends STOP and START characters as necessary to | 
 | prevent input from coming in faster than programs are reading it.  The | 
 | idea is that the actual terminal hardware that is generating the input | 
 | data responds to a STOP character by suspending transmission, and to a | 
 | START character by resuming transmission.  @xref{Start/Stop Characters}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t IXON | 
 | If this bit is set, start/stop control on output is enabled.  In other | 
 | words, if the computer receives a STOP character, it suspends output | 
 | until a START character is received.  In this case, the STOP and START | 
 | characters are never passed to the application program.  If this bit is | 
 | not set, then START and STOP can be read as ordinary characters. | 
 | @xref{Start/Stop Characters}. | 
 | @c !!! mention this interferes with using C-s and C-q for programs like emacs | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t IXANY | 
 | If this bit is set, any input character restarts output when output has | 
 | been suspended with the STOP character.  Otherwise, only the START | 
 | character restarts output. | 
 |  | 
 | This is a BSD extension; it exists only on BSD systems and | 
 | @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t IMAXBEL | 
 | If this bit is set, then filling up the terminal input buffer sends a | 
 | BEL character (code @code{007}) to the terminal to ring the bell. | 
 |  | 
 | This is a BSD extension. | 
 | @end deftypevr | 
 |  | 
 | @node Output Modes | 
 | @subsection Output Modes | 
 |  | 
 | This section describes the terminal flags and fields that control how | 
 | output characters are translated and padded for display.  All of these | 
 | are contained in the @code{c_oflag} member of the @w{@code{struct termios}} | 
 | structure. | 
 |  | 
 | The @code{c_oflag} member itself is an integer, and you change the flags | 
 | and fields using the operators @code{&}, @code{|}, and @code{^}.  Don't | 
 | try to specify the entire value for @code{c_oflag}---instead, change | 
 | only specific flags and leave the rest untouched (@pxref{Setting | 
 | Modes}). | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t OPOST | 
 | If this bit is set, output data is processed in some unspecified way so | 
 | that it is displayed appropriately on the terminal device.  This | 
 | typically includes mapping newline characters (@code{'\n'}) onto | 
 | carriage return and linefeed pairs. | 
 |  | 
 | If this bit isn't set, the characters are transmitted as-is. | 
 | @end deftypevr | 
 |  | 
 | The following three bits are effective only if @code{OPOST} is set. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ONLCR | 
 | If this bit is set, convert the newline character on output into a pair | 
 | of characters, carriage return followed by linefeed. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h (optional) | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t OXTABS | 
 | If this bit is set, convert tab characters on output into the appropriate | 
 | number of spaces to emulate a tab stop every eight columns.  This bit | 
 | exists only on BSD systems and @gnuhurdsystems{}; on | 
 | @gnulinuxsystems{} it is available as @code{XTABS}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h (optional) | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t ONOEOT | 
 | If this bit is set, discard @kbd{C-d} characters (code @code{004}) on | 
 | output.  These characters cause many dial-up terminals to disconnect. | 
 | This bit exists only on BSD systems and @gnuhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @node Control Modes | 
 | @subsection Control Modes | 
 |  | 
 | This section describes the terminal flags and fields that control | 
 | parameters usually associated with asynchronous serial data | 
 | transmission.  These flags may not make sense for other kinds of | 
 | terminal ports (such as a network connection pseudo-terminal).  All of | 
 | these are contained in the @code{c_cflag} member of the @code{struct | 
 | termios} structure. | 
 |  | 
 | The @code{c_cflag} member itself is an integer, and you change the flags | 
 | and fields using the operators @code{&}, @code{|}, and @code{^}.  Don't | 
 | try to specify the entire value for @code{c_cflag}---instead, change | 
 | only specific flags and leave the rest untouched (@pxref{Setting | 
 | Modes}). | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CLOCAL | 
 | If this bit is set, it indicates that the terminal is connected | 
 | ``locally'' and that the modem status lines (such as carrier detect) | 
 | should be ignored. | 
 | @cindex modem status lines | 
 | @cindex carrier detect | 
 |  | 
 | On many systems if this bit is not set and you call @code{open} without | 
 | the @code{O_NONBLOCK} flag set, @code{open} blocks until a modem | 
 | connection is established. | 
 |  | 
 | If this bit is not set and a modem disconnect is detected, a | 
 | @code{SIGHUP} signal is sent to the controlling process group for the | 
 | terminal (if it has one).  Normally, this causes the process to exit; | 
 | see @ref{Signal Handling}.  Reading from the terminal after a disconnect | 
 | causes an end-of-file condition, and writing causes an @code{EIO} error | 
 | to be returned.  The terminal device must be closed and reopened to | 
 | clear the condition. | 
 | @cindex modem disconnect | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t HUPCL | 
 | If this bit is set, a modem disconnect is generated when all processes | 
 | that have the terminal device open have either closed the file or exited. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CREAD | 
 | If this bit is set, input can be read from the terminal.  Otherwise, | 
 | input is discarded when it arrives. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CSTOPB | 
 | If this bit is set, two stop bits are used.  Otherwise, only one stop bit | 
 | is used. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t PARENB | 
 | If this bit is set, generation and detection of a parity bit are enabled. | 
 | @xref{Input Modes}, for information on how input parity errors are handled. | 
 |  | 
 | If this bit is not set, no parity bit is added to output characters, and | 
 | input characters are not checked for correct parity. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t PARODD | 
 | This bit is only useful if @code{PARENB} is set.  If @code{PARODD} is set, | 
 | odd parity is used, otherwise even parity is used. | 
 | @end deftypevr | 
 |  | 
 | The control mode flags also includes a field for the number of bits per | 
 | character.  You can use the @code{CSIZE} macro as a mask to extract the | 
 | value, like this: @code{settings.c_cflag & CSIZE}. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CSIZE | 
 | This is a mask for the number of bits per character. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CS5 | 
 | This specifies five bits per byte. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CS6 | 
 | This specifies six bits per byte. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CS7 | 
 | This specifies seven bits per byte. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t CS8 | 
 | This specifies eight bits per byte. | 
 | @end deftypevr | 
 |  | 
 | The following four bits are BSD extensions; these exist only on BSD | 
 | systems and @gnuhurdsystems{}. | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t CCTS_OFLOW | 
 | If this bit is set, enable flow control of output based on the CTS wire | 
 | (RS232 protocol). | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t CRTS_IFLOW | 
 | If this bit is set, enable flow control of input based on the RTS wire | 
 | (RS232 protocol). | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t MDMBUF | 
 | If this bit is set, enable carrier-based flow control of output. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t CIGNORE | 
 | If this bit is set, it says to ignore the control modes and line speed | 
 | values entirely.  This is only meaningful in a call to @code{tcsetattr}. | 
 |  | 
 | The @code{c_cflag} member and the line speed values returned by | 
 | @code{cfgetispeed} and @code{cfgetospeed} will be unaffected by the | 
 | call.  @code{CIGNORE} is useful if you want to set all the software | 
 | modes in the other members, but leave the hardware details in | 
 | @code{c_cflag} unchanged.  (This is how the @code{TCSASOFT} flag to | 
 | @code{tcsettattr} works.) | 
 |  | 
 | This bit is never set in the structure filled in by @code{tcgetattr}. | 
 | @end deftypevr | 
 |  | 
 | @node Local Modes | 
 | @subsection Local Modes | 
 |  | 
 | This section describes the flags for the @code{c_lflag} member of the | 
 | @code{struct termios} structure.  These flags generally control | 
 | higher-level aspects of input processing than the input modes flags | 
 | described in @ref{Input Modes}, such as echoing, signals, and the choice | 
 | of canonical or noncanonical input. | 
 |  | 
 | The @code{c_lflag} member itself is an integer, and you change the flags | 
 | and fields using the operators @code{&}, @code{|}, and @code{^}.  Don't | 
 | try to specify the entire value for @code{c_lflag}---instead, change | 
 | only specific flags and leave the rest untouched (@pxref{Setting | 
 | Modes}). | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ICANON | 
 | This bit, if set, enables canonical input processing mode.  Otherwise, | 
 | input is processed in noncanonical mode.  @xref{Canonical or Not}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ECHO | 
 | If this bit is set, echoing of input characters back to the terminal | 
 | is enabled. | 
 | @cindex echo of terminal input | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ECHOE | 
 | If this bit is set, echoing indicates erasure of input with the ERASE | 
 | character by erasing the last character in the current line from the | 
 | screen.  Otherwise, the character erased is re-echoed to show what has | 
 | happened (suitable for a printing terminal). | 
 |  | 
 | This bit only controls the display behavior; the @code{ICANON} bit by | 
 | itself controls actual recognition of the ERASE character and erasure of | 
 | input, without which @code{ECHOE} is simply irrelevant. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t ECHOPRT | 
 | This bit is like @code{ECHOE}, enables display of the ERASE character in | 
 | a way that is geared to a hardcopy terminal.  When you type the ERASE | 
 | character, a @samp{\} character is printed followed by the first | 
 | character erased.  Typing the ERASE character again just prints the next | 
 | character erased.  Then, the next time you type a normal character, a | 
 | @samp{/} character is printed before the character echoes. | 
 |  | 
 | This is a BSD extension, and exists only in BSD systems and | 
 | @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ECHOK | 
 | This bit enables special display of the KILL character by moving to a | 
 | new line after echoing the KILL character normally.  The behavior of | 
 | @code{ECHOKE} (below) is nicer to look at. | 
 |  | 
 | If this bit is not set, the KILL character echoes just as it would if it | 
 | were not the KILL character.  Then it is up to the user to remember that | 
 | the KILL character has erased the preceding input; there is no | 
 | indication of this on the screen. | 
 |  | 
 | This bit only controls the display behavior; the @code{ICANON} bit by | 
 | itself controls actual recognition of the KILL character and erasure of | 
 | input, without which @code{ECHOK} is simply irrelevant. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t ECHOKE | 
 | This bit is similar to @code{ECHOK}.  It enables special display of the | 
 | KILL character by erasing on the screen the entire line that has been | 
 | killed.  This is a BSD extension, and exists only in BSD systems and | 
 | @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ECHONL | 
 | If this bit is set and the @code{ICANON} bit is also set, then the | 
 | newline (@code{'\n'}) character is echoed even if the @code{ECHO} bit | 
 | is not set. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t ECHOCTL | 
 | If this bit is set and the @code{ECHO} bit is also set, echo control | 
 | characters with @samp{^} followed by the corresponding text character. | 
 | Thus, control-A echoes as @samp{^A}.  This is usually the preferred mode | 
 | for interactive input, because echoing a control character back to the | 
 | terminal could have some undesired effect on the terminal. | 
 |  | 
 | This is a BSD extension, and exists only in BSD systems and | 
 | @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t ISIG | 
 | This bit controls whether the INTR, QUIT, and SUSP characters are | 
 | recognized.  The functions associated with these characters are performed | 
 | if and only if this bit is set.  Being in canonical or noncanonical | 
 | input mode has no affect on the interpretation of these characters. | 
 |  | 
 | You should use caution when disabling recognition of these characters. | 
 | Programs that cannot be interrupted interactively are very | 
 | user-unfriendly.  If you clear this bit, your program should provide | 
 | some alternate interface that allows the user to interactively send the | 
 | signals associated with these characters, or to escape from the program. | 
 | @cindex interactive signals, from terminal | 
 |  | 
 | @xref{Signal Characters}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t IEXTEN | 
 | POSIX.1 gives @code{IEXTEN} implementation-defined meaning, | 
 | so you cannot rely on this interpretation on all systems. | 
 |  | 
 | On BSD systems and @gnulinuxhurdsystems{}, it enables the LNEXT and | 
 | DISCARD characters. | 
 | @xref{Other Special}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t NOFLSH | 
 | Normally, the INTR, QUIT, and SUSP characters cause input and output | 
 | queues for the terminal to be cleared.  If this bit is set, the queues | 
 | are not cleared. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro tcflag_t TOSTOP | 
 | If this bit is set and the system supports job control, then | 
 | @code{SIGTTOU} signals are generated by background processes that | 
 | attempt to write to the terminal.  @xref{Access to the Terminal}. | 
 | @end deftypevr | 
 |  | 
 | The following bits are BSD extensions; they exist only on BSD systems | 
 | and @gnuhurdsystems{}. | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t ALTWERASE | 
 | This bit determines how far the WERASE character should erase.  The | 
 | WERASE character erases back to the beginning of a word; the question | 
 | is, where do words begin? | 
 |  | 
 | If this bit is clear, then the beginning of a word is a nonwhitespace | 
 | character following a whitespace character.  If the bit is set, then the | 
 | beginning of a word is an alphanumeric character or underscore following | 
 | a character which is none of those. | 
 |  | 
 | @xref{Editing Characters}, for more information about the WERASE character. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t FLUSHO | 
 | This is the bit that toggles when the user types the DISCARD character. | 
 | While this bit is set, all output is discarded.  @xref{Other Special}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h (optional) | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t NOKERNINFO | 
 | Setting this bit disables handling of the STATUS character. | 
 | @xref{Other Special}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro tcflag_t PENDIN | 
 | If this bit is set, it indicates that there is a line of input that | 
 | needs to be reprinted.  Typing the REPRINT character sets this bit; the | 
 | bit remains set until reprinting is finished.  @xref{Editing Characters}. | 
 | @end deftypevr | 
 |  | 
 | @c EXTPROC is too obscure to document now.  --roland | 
 |  | 
 | @node Line Speed | 
 | @subsection Line Speed | 
 | @cindex line speed | 
 | @cindex baud rate | 
 | @cindex terminal line speed | 
 | @cindex terminal line speed | 
 |  | 
 | The terminal line speed tells the computer how fast to read and write | 
 | data on the terminal. | 
 |  | 
 | If the terminal is connected to a real serial line, the terminal speed | 
 | you specify actually controls the line---if it doesn't match the | 
 | terminal's own idea of the speed, communication does not work.  Real | 
 | serial ports accept only certain standard speeds.  Also, particular | 
 | hardware may not support even all the standard speeds.  Specifying a | 
 | speed of zero hangs up a dialup connection and turns off modem control | 
 | signals. | 
 |  | 
 | If the terminal is not a real serial line (for example, if it is a | 
 | network connection), then the line speed won't really affect data | 
 | transmission speed, but some programs will use it to determine the | 
 | amount of padding needed.  It's best to specify a line speed value that | 
 | matches the actual speed of the actual terminal, but you can safely | 
 | experiment with different values to vary the amount of padding. | 
 |  | 
 | There are actually two line speeds for each terminal, one for input and | 
 | one for output.  You can set them independently, but most often | 
 | terminals use the same speed for both directions. | 
 |  | 
 | The speed values are stored in the @code{struct termios} structure, but | 
 | don't try to access them in the @code{struct termios} structure | 
 | directly.  Instead, you should use the following functions to read and | 
 | store them: | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun speed_t cfgetospeed (const struct termios *@var{termios-p}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Direct access to a single termios field, except on Linux, where | 
 | @c multiple accesses may take place.  No worries either way, callers | 
 | @c must ensure mutual exclusion on such non-opaque types. | 
 | This function returns the output line speed stored in the structure | 
 | @code{*@var{termios-p}}. | 
 | @end deftypefun | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun speed_t cfgetispeed (const struct termios *@var{termios-p}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | This function returns the input line speed stored in the structure | 
 | @code{*@var{termios-p}}. | 
 | @end deftypefun | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int cfsetospeed (struct termios *@var{termios-p}, speed_t @var{speed}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | This function stores @var{speed} in @code{*@var{termios-p}} as the output | 
 | speed.  The normal return value is @math{0}; a value of @math{-1} | 
 | indicates an error.  If @var{speed} is not a speed, @code{cfsetospeed} | 
 | returns @math{-1}. | 
 | @end deftypefun | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int cfsetispeed (struct termios *@var{termios-p}, speed_t @var{speed}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | This function stores @var{speed} in @code{*@var{termios-p}} as the input | 
 | speed.  The normal return value is @math{0}; a value of @math{-1} | 
 | indicates an error.  If @var{speed} is not a speed, @code{cfsetospeed} | 
 | returns @math{-1}. | 
 | @end deftypefun | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypefun int cfsetspeed (struct termios *@var{termios-p}, speed_t @var{speed}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c There's no guarantee that the two calls are atomic, but since this is | 
 | @c not an opaque type, callers ought to ensure mutual exclusion to the | 
 | @c termios object. | 
 |  | 
 | @c cfsetspeed ok | 
 | @c  cfsetispeed ok | 
 | @c  cfsetospeed ok | 
 | This function stores @var{speed} in @code{*@var{termios-p}} as both the | 
 | input and output speeds.  The normal return value is @math{0}; a value | 
 | of @math{-1} indicates an error.  If @var{speed} is not a speed, | 
 | @code{cfsetspeed} returns @math{-1}.  This function is an extension in | 
 | 4.4 BSD. | 
 | @end deftypefun | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftp {Data Type} speed_t | 
 | The @code{speed_t} type is an unsigned integer data type used to | 
 | represent line speeds. | 
 | @end deftp | 
 |  | 
 | The functions @code{cfsetospeed} and @code{cfsetispeed} report errors | 
 | only for speed values that the system simply cannot handle.  If you | 
 | specify a speed value that is basically acceptable, then those functions | 
 | will succeed.  But they do not check that a particular hardware device | 
 | can actually support the specified speeds---in fact, they don't know | 
 | which device you plan to set the speed for.  If you use @code{tcsetattr} | 
 | to set the speed of a particular device to a value that it cannot | 
 | handle, @code{tcsetattr} returns @math{-1}. | 
 |  | 
 | @strong{Portability note:} In @theglibc{}, the functions above | 
 | accept speeds measured in bits per second as input, and return speed | 
 | values measured in bits per second.  Other libraries require speeds to | 
 | be indicated by special codes.  For POSIX.1 portability, you must use | 
 | one of the following symbols to represent the speed; their precise | 
 | numeric values are system-dependent, but each name has a fixed meaning: | 
 | @code{B110} stands for 110 bps, @code{B300} for 300 bps, and so on. | 
 | There is no portable way to represent any speed but these, but these are | 
 | the only speeds that typical serial lines can support. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B0 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B50 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B75 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B110 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B134 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B150 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B200 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B300 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B600 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B1200 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B1800 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B2400 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B4800 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B9600 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B19200 | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @vindex B38400 | 
 | @comment termios.h | 
 | @comment GNU | 
 | @vindex B57600 | 
 | @comment termios.h | 
 | @comment GNU | 
 | @vindex B115200 | 
 | @comment termios.h | 
 | @comment GNU | 
 | @vindex B230400 | 
 | @comment termios.h | 
 | @comment GNU | 
 | @vindex B460800 | 
 | @smallexample | 
 | B0  B50  B75  B110  B134  B150  B200 | 
 | B300  B600  B1200  B1800  B2400  B4800 | 
 | B9600  B19200  B38400  B57600  B115200 | 
 | B230400  B460800 | 
 | @end smallexample | 
 |  | 
 | @vindex EXTA | 
 | @vindex EXTB | 
 | BSD defines two additional speed symbols as aliases: @code{EXTA} is an | 
 | alias for @code{B19200} and @code{EXTB} is an alias for @code{B38400}. | 
 | These aliases are obsolete. | 
 |  | 
 | @node Special Characters | 
 | @subsection Special Characters | 
 |  | 
 | In canonical input, the terminal driver recognizes a number of special | 
 | characters which perform various control functions.  These include the | 
 | ERASE character (usually @key{DEL}) for editing input, and other editing | 
 | characters.  The INTR character (normally @kbd{C-c}) for sending a | 
 | @code{SIGINT} signal, and other signal-raising characters, may be | 
 | available in either canonical or noncanonical input mode.  All these | 
 | characters are described in this section. | 
 |  | 
 | The particular characters used are specified in the @code{c_cc} member | 
 | of the @code{struct termios} structure.  This member is an array; each | 
 | element specifies the character for a particular role.  Each element has | 
 | a symbolic constant that stands for the index of that element---for | 
 | example, @code{VINTR} is the index of the element that specifies the INTR | 
 | character, so storing @code{'='} in @code{@var{termios}.c_cc[VINTR]} | 
 | specifies @samp{=} as the INTR character. | 
 |  | 
 | @vindex _POSIX_VDISABLE | 
 | On some systems, you can disable a particular special character function | 
 | by specifying the value @code{_POSIX_VDISABLE} for that role.  This | 
 | value is unequal to any possible character code.  @xref{Options for | 
 | Files}, for more information about how to tell whether the operating | 
 | system you are using supports @code{_POSIX_VDISABLE}. | 
 |  | 
 | @menu | 
 | * Editing Characters::          Special characters that terminate lines and | 
 |                                   delete text, and other editing functions. | 
 | * Signal Characters::           Special characters that send or raise signals | 
 |                                   to or for certain classes of processes. | 
 | * Start/Stop Characters::       Special characters that suspend or resume | 
 |                                   suspended output. | 
 | * Other Special::		Other special characters for BSD systems: | 
 | 				  they can discard output, and print status. | 
 | @end menu | 
 |  | 
 | @node Editing Characters | 
 | @subsubsection Characters for Input Editing | 
 |  | 
 | These special characters are active only in canonical input mode. | 
 | @xref{Canonical or Not}. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VEOF | 
 | @cindex EOF character | 
 | This is the subscript for the EOF character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VEOF]} holds the character | 
 | itself. | 
 |  | 
 | The EOF character is recognized only in canonical input mode.  It acts | 
 | as a line terminator in the same way as a newline character, but if the | 
 | EOF character is typed at the beginning of a line it causes @code{read} | 
 | to return a byte count of zero, indicating end-of-file.  The EOF | 
 | character itself is discarded. | 
 |  | 
 | Usually, the EOF character is @kbd{C-d}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VEOL | 
 | @cindex EOL character | 
 | This is the subscript for the EOL character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VEOL]} holds the character | 
 | itself. | 
 |  | 
 | The EOL character is recognized only in canonical input mode.  It acts | 
 | as a line terminator, just like a newline character.  The EOL character | 
 | is not discarded; it is read as the last character in the input line. | 
 |  | 
 | @c !!! example: this is set to ESC by 4.3 csh with "set filec" so it can | 
 | @c complete partial lines without using cbreak or raw mode. | 
 |  | 
 | You don't need to use the EOL character to make @key{RET} end a line. | 
 | Just set the ICRNL flag.  In fact, this is the default state of | 
 | affairs. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VEOL2 | 
 | @cindex EOL2 character | 
 | This is the subscript for the EOL2 character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VEOL2]} holds the character | 
 | itself. | 
 |  | 
 | The EOL2 character works just like the EOL character (see above), but it | 
 | can be a different character.  Thus, you can specify two characters to | 
 | terminate an input line, by setting EOL to one of them and EOL2 to the | 
 | other. | 
 |  | 
 | The EOL2 character is a BSD extension; it exists only on BSD systems | 
 | and @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VERASE | 
 | @cindex ERASE character | 
 | This is the subscript for the ERASE character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VERASE]} holds the | 
 | character itself. | 
 |  | 
 | The ERASE character is recognized only in canonical input mode.  When | 
 | the user types the erase character, the previous character typed is | 
 | discarded.  (If the terminal generates multibyte character sequences, | 
 | this may cause more than one byte of input to be discarded.)  This | 
 | cannot be used to erase past the beginning of the current line of text. | 
 | The ERASE character itself is discarded. | 
 | @c !!! mention ECHOE here | 
 |  | 
 | Usually, the ERASE character is @key{DEL}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VWERASE | 
 | @cindex WERASE character | 
 | This is the subscript for the WERASE character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VWERASE]} holds the character | 
 | itself. | 
 |  | 
 | The WERASE character is recognized only in canonical mode.  It erases an | 
 | entire word of prior input, and any whitespace after it; whitespace | 
 | characters before the word are not erased. | 
 |  | 
 | The definition of a ``word'' depends on the setting of the | 
 | @code{ALTWERASE} mode; @pxref{Local Modes}. | 
 |  | 
 | If the @code{ALTWERASE} mode is not set, a word is defined as a sequence | 
 | of any characters except space or tab. | 
 |  | 
 | If the @code{ALTWERASE} mode is set, a word is defined as a sequence of | 
 | characters containing only letters, numbers, and underscores, optionally | 
 | followed by one character that is not a letter, number, or underscore. | 
 |  | 
 | The WERASE character is usually @kbd{C-w}. | 
 |  | 
 | This is a BSD extension. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VKILL | 
 | @cindex KILL character | 
 | This is the subscript for the KILL character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VKILL]} holds the character | 
 | itself. | 
 |  | 
 | The KILL character is recognized only in canonical input mode.  When the | 
 | user types the kill character, the entire contents of the current line | 
 | of input are discarded.  The kill character itself is discarded too. | 
 |  | 
 | The KILL character is usually @kbd{C-u}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VREPRINT | 
 | @cindex REPRINT character | 
 | This is the subscript for the REPRINT character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VREPRINT]} holds the character | 
 | itself. | 
 |  | 
 | The REPRINT character is recognized only in canonical mode.  It reprints | 
 | the current input line.  If some asynchronous output has come while you | 
 | are typing, this lets you see the line you are typing clearly again. | 
 |  | 
 | The REPRINT character is usually @kbd{C-r}. | 
 |  | 
 | This is a BSD extension. | 
 | @end deftypevr | 
 |  | 
 | @node Signal Characters | 
 | @subsubsection Characters that Cause Signals | 
 |  | 
 | These special characters may be active in either canonical or noncanonical | 
 | input mode, but only when the @code{ISIG} flag is set (@pxref{Local | 
 | Modes}). | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VINTR | 
 | @cindex INTR character | 
 | @cindex interrupt character | 
 | This is the subscript for the INTR character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VINTR]} holds the character | 
 | itself. | 
 |  | 
 | The INTR (interrupt) character raises a @code{SIGINT} signal for all | 
 | processes in the foreground job associated with the terminal.  The INTR | 
 | character itself is then discarded.  @xref{Signal Handling}, for more | 
 | information about signals. | 
 |  | 
 | Typically, the INTR character is @kbd{C-c}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VQUIT | 
 | @cindex QUIT character | 
 | This is the subscript for the QUIT character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VQUIT]} holds the character | 
 | itself. | 
 |  | 
 | The QUIT character raises a @code{SIGQUIT} signal for all processes in | 
 | the foreground job associated with the terminal.  The QUIT character | 
 | itself is then discarded.  @xref{Signal Handling}, for more information | 
 | about signals. | 
 |  | 
 | Typically, the QUIT character is @kbd{C-\}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VSUSP | 
 | @cindex SUSP character | 
 | @cindex suspend character | 
 | This is the subscript for the SUSP character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VSUSP]} holds the character | 
 | itself. | 
 |  | 
 | The SUSP (suspend) character is recognized only if the implementation | 
 | supports job control (@pxref{Job Control}).  It causes a @code{SIGTSTP} | 
 | signal to be sent to all processes in the foreground job associated with | 
 | the terminal.  The SUSP character itself is then discarded. | 
 | @xref{Signal Handling}, for more information about signals. | 
 |  | 
 | Typically, the SUSP character is @kbd{C-z}. | 
 | @end deftypevr | 
 |  | 
 | Few applications disable the normal interpretation of the SUSP | 
 | character.  If your program does this, it should provide some other | 
 | mechanism for the user to stop the job.  When the user invokes this | 
 | mechanism, the program should send a @code{SIGTSTP} signal to the | 
 | process group of the process, not just to the process itself. | 
 | @xref{Signaling Another Process}. | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VDSUSP | 
 | @cindex DSUSP character | 
 | @cindex delayed suspend character | 
 | This is the subscript for the DSUSP character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VDSUSP]} holds the character | 
 | itself. | 
 |  | 
 | The DSUSP (suspend) character is recognized only if the implementation | 
 | supports job control (@pxref{Job Control}).  It sends a @code{SIGTSTP} | 
 | signal, like the SUSP character, but not right away---only when the | 
 | program tries to read it as input.  Not all systems with job control | 
 | support DSUSP; only BSD-compatible systems (including @gnuhurdsystems{}). | 
 |  | 
 | @xref{Signal Handling}, for more information about signals. | 
 |  | 
 | Typically, the DSUSP character is @kbd{C-y}. | 
 | @end deftypevr | 
 |  | 
 | @node Start/Stop Characters | 
 | @subsubsection Special Characters for Flow Control | 
 |  | 
 | These special characters may be active in either canonical or noncanonical | 
 | input mode, but their use is controlled by the flags @code{IXON} and | 
 | @code{IXOFF} (@pxref{Input Modes}). | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VSTART | 
 | @cindex START character | 
 | This is the subscript for the START character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VSTART]} holds the | 
 | character itself. | 
 |  | 
 | The START character is used to support the @code{IXON} and @code{IXOFF} | 
 | input modes.  If @code{IXON} is set, receiving a START character resumes | 
 | suspended output; the START character itself is discarded.  If | 
 | @code{IXANY} is set, receiving any character at all resumes suspended | 
 | output; the resuming character is not discarded unless it is the START | 
 | character.  @code{IXOFF} is set, the system may also transmit START | 
 | characters to the terminal. | 
 |  | 
 | The usual value for the START character is @kbd{C-q}.  You may not be | 
 | able to change this value---the hardware may insist on using @kbd{C-q} | 
 | regardless of what you specify. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VSTOP | 
 | @cindex STOP character | 
 | This is the subscript for the STOP character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VSTOP]} holds the character | 
 | itself. | 
 |  | 
 | The STOP character is used to support the @code{IXON} and @code{IXOFF} | 
 | input modes.  If @code{IXON} is set, receiving a STOP character causes | 
 | output to be suspended; the STOP character itself is discarded.  If | 
 | @code{IXOFF} is set, the system may also transmit STOP characters to the | 
 | terminal, to prevent the input queue from overflowing. | 
 |  | 
 | The usual value for the STOP character is @kbd{C-s}.  You may not be | 
 | able to change this value---the hardware may insist on using @kbd{C-s} | 
 | regardless of what you specify. | 
 | @end deftypevr | 
 |  | 
 | @node Other Special | 
 | @subsubsection Other Special Characters | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VLNEXT | 
 | @cindex LNEXT character | 
 | This is the subscript for the LNEXT character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VLNEXT]} holds the character | 
 | itself. | 
 |  | 
 | The LNEXT character is recognized only when @code{IEXTEN} is set, but in | 
 | both canonical and noncanonical mode.  It disables any special | 
 | significance of the next character the user types.  Even if the | 
 | character would normally perform some editing function or generate a | 
 | signal, it is read as a plain character.  This is the analogue of the | 
 | @kbd{C-q} command in Emacs.  ``LNEXT'' stands for ``literal next.'' | 
 |  | 
 | The LNEXT character is usually @kbd{C-v}. | 
 |  | 
 | This character is available on BSD systems and @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VDISCARD | 
 | @cindex DISCARD character | 
 | This is the subscript for the DISCARD character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VDISCARD]} holds the character | 
 | itself. | 
 |  | 
 | The DISCARD character is recognized only when @code{IEXTEN} is set, but | 
 | in both canonical and noncanonical mode.  Its effect is to toggle the | 
 | discard-output flag.  When this flag is set, all program output is | 
 | discarded.  Setting the flag also discards all output currently in the | 
 | output buffer.  Typing any other character resets the flag. | 
 |  | 
 | This character is available on BSD systems and @gnulinuxhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypevr Macro int VSTATUS | 
 | @cindex STATUS character | 
 | This is the subscript for the STATUS character in the special control | 
 | character array.  @code{@var{termios}.c_cc[VSTATUS]} holds the character | 
 | itself. | 
 |  | 
 | The STATUS character's effect is to print out a status message about how | 
 | the current process is running. | 
 |  | 
 | The STATUS character is recognized only in canonical mode, and only if | 
 | @code{NOKERNINFO} is not set. | 
 |  | 
 | This character is available only on BSD systems and @gnuhurdsystems{}. | 
 | @end deftypevr | 
 |  | 
 | @node Noncanonical Input | 
 | @subsection Noncanonical Input | 
 |  | 
 | In noncanonical input mode, the special editing characters such as | 
 | ERASE and KILL are ignored.  The system facilities for the user to edit | 
 | input are disabled in noncanonical mode, so that all input characters | 
 | (unless they are special for signal or flow-control purposes) are passed | 
 | to the application program exactly as typed.  It is up to the | 
 | application program to give the user ways to edit the input, if | 
 | appropriate. | 
 |  | 
 | Noncanonical mode offers special parameters called MIN and TIME for | 
 | controlling whether and how long to wait for input to be available.  You | 
 | can even use them to avoid ever waiting---to return immediately with | 
 | whatever input is available, or with no input. | 
 |  | 
 | The MIN and TIME are stored in elements of the @code{c_cc} array, which | 
 | is a member of the @w{@code{struct termios}} structure.  Each element of | 
 | this array has a particular role, and each element has a symbolic | 
 | constant that stands for the index of that element.  @code{VMIN} and | 
 | @code{VMAX} are the names for the indices in the array of the MIN and | 
 | TIME slots. | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VMIN | 
 | @cindex MIN termios slot | 
 | This is the subscript for the MIN slot in the @code{c_cc} array.  Thus, | 
 | @code{@var{termios}.c_cc[VMIN]} is the value itself. | 
 |  | 
 | The MIN slot is only meaningful in noncanonical input mode; it | 
 | specifies the minimum number of bytes that must be available in the | 
 | input queue in order for @code{read} to return. | 
 | @end deftypevr | 
 |  | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypevr Macro int VTIME | 
 | @cindex TIME termios slot | 
 | This is the subscript for the TIME slot in the @code{c_cc} array.  Thus, | 
 | @code{@var{termios}.c_cc[VTIME]} is the value itself. | 
 |  | 
 | The TIME slot is only meaningful in noncanonical input mode; it | 
 | specifies how long to wait for input before returning, in units of 0.1 | 
 | seconds. | 
 | @end deftypevr | 
 |  | 
 | The MIN and TIME values interact to determine the criterion for when | 
 | @code{read} should return; their precise meanings depend on which of | 
 | them are nonzero.  There are four possible cases: | 
 |  | 
 | @itemize @bullet | 
 | @item | 
 | Both TIME and MIN are nonzero. | 
 |  | 
 | In this case, TIME specifies how long to wait after each input character | 
 | to see if more input arrives.  After the first character received, | 
 | @code{read} keeps waiting until either MIN bytes have arrived in all, or | 
 | TIME elapses with no further input. | 
 |  | 
 | @code{read} always blocks until the first character arrives, even if | 
 | TIME elapses first.  @code{read} can return more than MIN characters if | 
 | more than MIN happen to be in the queue. | 
 |  | 
 | @item | 
 | Both MIN and TIME are zero. | 
 |  | 
 | In this case, @code{read} always returns immediately with as many | 
 | characters as are available in the queue, up to the number requested. | 
 | If no input is immediately available, @code{read} returns a value of | 
 | zero. | 
 |  | 
 | @item | 
 | MIN is zero but TIME has a nonzero value. | 
 |  | 
 | In this case, @code{read} waits for time TIME for input to become | 
 | available; the availability of a single byte is enough to satisfy the | 
 | read request and cause @code{read} to return.  When it returns, it | 
 | returns as many characters as are available, up to the number requested. | 
 | If no input is available before the timer expires, @code{read} returns a | 
 | value of zero. | 
 |  | 
 | @item | 
 | TIME is zero but MIN has a nonzero value. | 
 |  | 
 | In this case, @code{read} waits until at least MIN bytes are available | 
 | in the queue.  At that time, @code{read} returns as many characters as | 
 | are available, up to the number requested.  @code{read} can return more | 
 | than MIN characters if more than MIN happen to be in the queue. | 
 | @end itemize | 
 |  | 
 | What happens if MIN is 50 and you ask to read just 10 bytes? | 
 | Normally, @code{read} waits until there are 50 bytes in the buffer (or, | 
 | more generally, the wait condition described above is satisfied), and | 
 | then reads 10 of them, leaving the other 40 buffered in the operating | 
 | system for a subsequent call to @code{read}. | 
 |  | 
 | @strong{Portability note:} On some systems, the MIN and TIME slots are | 
 | actually the same as the EOF and EOL slots.  This causes no serious | 
 | problem because the MIN and TIME slots are used only in noncanonical | 
 | input and the EOF and EOL slots are used only in canonical input, but it | 
 | isn't very clean.  @Theglibc{} allocates separate slots for these | 
 | uses. | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftypefun void cfmakeraw (struct termios *@var{termios-p}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c There's no guarantee the changes are atomic, but since this is not an | 
 | @c opaque type, callers ought to ensure mutual exclusion to the termios | 
 | @c object. | 
 | This function provides an easy way to set up @code{*@var{termios-p}} for | 
 | what has traditionally been called ``raw mode'' in BSD.  This uses | 
 | noncanonical input, and turns off most processing to give an unmodified | 
 | channel to the terminal. | 
 |  | 
 | It does exactly this: | 
 | @smallexample | 
 |   @var{termios-p}->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP | 
 |                                 |INLCR|IGNCR|ICRNL|IXON); | 
 |   @var{termios-p}->c_oflag &= ~OPOST; | 
 |   @var{termios-p}->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); | 
 |   @var{termios-p}->c_cflag &= ~(CSIZE|PARENB); | 
 |   @var{termios-p}->c_cflag |= CS8; | 
 | @end smallexample | 
 | @end deftypefun | 
 |  | 
 |  | 
 | @node BSD Terminal Modes | 
 | @section BSD Terminal Modes | 
 | @cindex terminal modes, BSD | 
 |  | 
 | The usual way to get and set terminal modes is with the functions described | 
 | in @ref{Terminal Modes}.  However, on some systems you can use the | 
 | BSD-derived functions in this section to do some of the same thing.  On | 
 | many systems, these functions do not exist.  Even with @theglibc{}, | 
 | the functions simply fail with @code{errno} = @code{ENOSYS} with many | 
 | kernels, including Linux. | 
 |  | 
 | The symbols used in this section are declared in @file{sgtty.h}. | 
 |  | 
 | @comment termios.h | 
 | @comment BSD | 
 | @deftp {Data Type} {struct sgttyb} | 
 | This structure is an input or output parameter list for @code{gtty} and | 
 | @code{stty}. | 
 |  | 
 | @table @code | 
 | @item char sg_ispeed | 
 | Line speed for input | 
 | @item char sg_ospeed | 
 | Line speed for output | 
 | @item char sg_erase | 
 | Erase character | 
 | @item char sg_kill | 
 | Kill character | 
 | @item int sg_flags | 
 | Various flags | 
 | @end table | 
 | @end deftp | 
 |  | 
 | @comment sgtty.h | 
 | @comment BSD | 
 | @deftypefun int gtty (int @var{filedes}, struct sgttyb *@var{attributes}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Direct ioctl, BSD only. | 
 | This function gets the attributes of a terminal. | 
 |  | 
 | @code{gtty} sets *@var{attributes} to describe the terminal attributes | 
 | of the terminal which is open with file descriptor @var{filedes}. | 
 | @end deftypefun | 
 |  | 
 | @comment sgtty.h | 
 | @comment BSD | 
 | @deftypefun int stty (int @var{filedes}, const struct sgttyb *@var{attributes}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Direct ioctl, BSD only. | 
 |  | 
 | This function sets the attributes of a terminal. | 
 |  | 
 | @code{stty} sets the terminal attributes of the terminal which is open with | 
 | file descriptor @var{filedes} to those described by *@var{filedes}. | 
 | @end deftypefun | 
 |  | 
 | @node Line Control | 
 | @section Line Control Functions | 
 | @cindex terminal line control functions | 
 |  | 
 | These functions perform miscellaneous control actions on terminal | 
 | devices.  As regards terminal access, they are treated like doing | 
 | output: if any of these functions is used by a background process on its | 
 | controlling terminal, normally all processes in the process group are | 
 | sent a @code{SIGTTOU} signal.  The exception is if the calling process | 
 | itself is ignoring or blocking @code{SIGTTOU} signals, in which case the | 
 | operation is performed and no signal is sent.  @xref{Job Control}. | 
 |  | 
 | @cindex break condition, generating | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int tcsendbreak (int @var{filedes}, int @var{duration}) | 
 | @safety{@prelim{}@mtunsafe{@mtasurace{:tcattr(filedes)/bsd}}@asunsafe{}@acunsafe{@acucorrupt{/bsd}}} | 
 | @c On Linux, this calls just one out of two ioctls; on BSD, it's two | 
 | @c ioctls with a select (for the delay only) in between, the first | 
 | @c setting and the latter clearing the break status.  The BSD | 
 | @c implementation may leave the break enabled if cancelled, and threads | 
 | @c and signals may cause the break to be interrupted before requested. | 
 | This function generates a break condition by transmitting a stream of | 
 | zero bits on the terminal associated with the file descriptor | 
 | @var{filedes}.  The duration of the break is controlled by the | 
 | @var{duration} argument.  If zero, the duration is between 0.25 and 0.5 | 
 | seconds.  The meaning of a nonzero value depends on the operating system. | 
 |  | 
 | This function does nothing if the terminal is not an asynchronous serial | 
 | data port. | 
 |  | 
 | The return value is normally zero.  In the event of an error, a value | 
 | of @math{-1} is returned.  The following @code{errno} error conditions | 
 | are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} is not a valid file descriptor. | 
 |  | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal device. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 |  | 
 | @cindex flushing terminal output queue | 
 | @cindex terminal output queue, flushing | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int tcdrain (int @var{filedes}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Direct ioctl. | 
 | The @code{tcdrain} function waits until all queued | 
 | output to the terminal @var{filedes} has been transmitted. | 
 |  | 
 | This function is a cancellation point in multi-threaded programs.  This | 
 | is a problem if the thread allocates some resources (like memory, file | 
 | descriptors, semaphores or whatever) at the time @code{tcdrain} is | 
 | called.  If the thread gets canceled these resources stay allocated | 
 | until the program ends.  To avoid this calls to @code{tcdrain} should be | 
 | protected using cancellation handlers. | 
 | @c ref pthread_cleanup_push / pthread_cleanup_pop | 
 |  | 
 | The return value is normally zero.  In the event of an error, a value | 
 | of @math{-1} is returned.  The following @code{errno} error conditions | 
 | are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} is not a valid file descriptor. | 
 |  | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal device. | 
 |  | 
 | @item EINTR | 
 | The operation was interrupted by delivery of a signal. | 
 | @xref{Interrupted Primitives}. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 |  | 
 | @cindex clearing terminal input queue | 
 | @cindex terminal input queue, clearing | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int tcflush (int @var{filedes}, int @var{queue}) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | @c Direct ioctl. | 
 | The @code{tcflush} function is used to clear the input and/or output | 
 | queues associated with the terminal file @var{filedes}.  The @var{queue} | 
 | argument specifies which queue(s) to clear, and can be one of the | 
 | following values: | 
 |  | 
 | @c Extra blank lines here make it look better. | 
 | @table @code | 
 | @vindex TCIFLUSH | 
 | @item TCIFLUSH | 
 |  | 
 | Clear any input data received, but not yet read. | 
 |  | 
 | @vindex TCOFLUSH | 
 | @item TCOFLUSH | 
 |  | 
 | Clear any output data written, but not yet transmitted. | 
 |  | 
 | @vindex TCIOFLUSH | 
 | @item TCIOFLUSH | 
 |  | 
 | Clear both queued input and output. | 
 | @end table | 
 |  | 
 | The return value is normally zero.  In the event of an error, a value | 
 | of @math{-1} is returned.  The following @code{errno} error conditions | 
 | are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} is not a valid file descriptor. | 
 |  | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal device. | 
 |  | 
 | @item EINVAL | 
 | A bad value was supplied as the @var{queue} argument. | 
 | @end table | 
 |  | 
 | It is unfortunate that this function is named @code{tcflush}, because | 
 | the term ``flush'' is normally used for quite another operation---waiting | 
 | until all output is transmitted---and using it for discarding input or | 
 | output would be confusing.  Unfortunately, the name @code{tcflush} comes | 
 | from POSIX and we cannot change it. | 
 | @end deftypefun | 
 |  | 
 | @cindex flow control, terminal | 
 | @cindex terminal flow control | 
 | @comment termios.h | 
 | @comment POSIX.1 | 
 | @deftypefun int tcflow (int @var{filedes}, int @var{action}) | 
 | @safety{@prelim{}@mtunsafe{@mtasurace{:tcattr(filedes)/bsd}}@asunsafe{}@acsafe{}} | 
 | @c Direct ioctl on Linux.  On BSD, the TCO* actions are a single ioctl, | 
 | @c whereas the TCI actions first call tcgetattr and then write to the fd | 
 | @c the c_cc character corresponding to the action; there's a window for | 
 | @c another thread to change the xon/xoff characters. | 
 | The @code{tcflow} function is used to perform operations relating to | 
 | XON/XOFF flow control on the terminal file specified by @var{filedes}. | 
 |  | 
 | The @var{action} argument specifies what operation to perform, and can | 
 | be one of the following values: | 
 |  | 
 | @table @code | 
 | @vindex TCOOFF | 
 | @item TCOOFF | 
 | Suspend transmission of output. | 
 |  | 
 | @vindex TCOON | 
 | @item TCOON | 
 | Restart transmission of output. | 
 |  | 
 | @vindex TCIOFF | 
 | @item TCIOFF | 
 | Transmit a STOP character. | 
 |  | 
 | @vindex TCION | 
 | @item TCION | 
 | Transmit a START character. | 
 | @end table | 
 |  | 
 | For more information about the STOP and START characters, see @ref{Special | 
 | Characters}. | 
 |  | 
 | The return value is normally zero.  In the event of an error, a value | 
 | of @math{-1} is returned.  The following @code{errno} error conditions | 
 | are defined for this function: | 
 |  | 
 | @table @code | 
 | @vindex EBADF | 
 | @item EBADF | 
 | The @var{filedes} is not a valid file descriptor. | 
 |  | 
 | @vindex ENOTTY | 
 | @item ENOTTY | 
 | The @var{filedes} is not associated with a terminal device. | 
 |  | 
 | @vindex EINVAL | 
 | @item EINVAL | 
 | A bad value was supplied as the @var{action} argument. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 | @node Noncanon Example | 
 | @section Noncanonical Mode Example | 
 |  | 
 | Here is an example program that shows how you can set up a terminal | 
 | device to read single characters in noncanonical input mode, without | 
 | echo. | 
 |  | 
 | @smallexample | 
 | @include termios.c.texi | 
 | @end smallexample | 
 |  | 
 | This program is careful to restore the original terminal modes before | 
 | exiting or terminating with a signal.  It uses the @code{atexit} | 
 | function (@pxref{Cleanups on Exit}) to make sure this is done | 
 | by @code{exit}. | 
 |  | 
 | @ignore | 
 | @c !!!! the example doesn't handle any signals! | 
 | The signals handled in the example are the ones that typically occur due | 
 | to actions of the user.  It might be desirable to handle other signals | 
 | such as SIGSEGV that can result from bugs in the program. | 
 | @end ignore | 
 |  | 
 | The shell is supposed to take care of resetting the terminal modes when | 
 | a process is stopped or continued; see @ref{Job Control}.  But some | 
 | existing shells do not actually do this, so you may wish to establish | 
 | handlers for job control signals that reset terminal modes.  The above | 
 | example does so. | 
 |  | 
 |  | 
 | @node Pseudo-Terminals | 
 | @section Pseudo-Terminals | 
 | @cindex pseudo-terminals | 
 |  | 
 | A @dfn{pseudo-terminal} is a special interprocess communication channel | 
 | that acts like a terminal.  One end of the channel is called the | 
 | @dfn{master} side or @dfn{master pseudo-terminal device}, the other side | 
 | is called the @dfn{slave} side.  Data written to the master side is | 
 | received by the slave side as if it was the result of a user typing at | 
 | an ordinary terminal, and data written to the slave side is sent to the | 
 | master side as if it was written on an ordinary terminal. | 
 |  | 
 | Pseudo terminals are the way programs like @code{xterm} and @code{emacs} | 
 | implement their terminal emulation functionality. | 
 |  | 
 | @menu | 
 | * Allocation::             Allocating a pseudo terminal. | 
 | * Pseudo-Terminal Pairs::  How to open both sides of a | 
 |                             pseudo-terminal in a single operation. | 
 | @end menu | 
 |  | 
 | @node Allocation | 
 | @subsection Allocating Pseudo-Terminals | 
 | @cindex allocating pseudo-terminals | 
 |  | 
 | @pindex stdlib.h | 
 | This subsection describes functions for allocating a pseudo-terminal, | 
 | and for making this pseudo-terminal available for actual use.  These | 
 | functions are declared in the header file @file{stdlib.h}. | 
 |  | 
 | @comment stdlib.h | 
 | @comment GNU | 
 | @deftypefun int getpt (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} | 
 | @c On BSD, tries to open multiple potential pty names, returning on the | 
 | @c first success.  On Linux, try posix_openpt first, then fallback to | 
 | @c the BSD implementation.  The posix implementation opens the ptmx | 
 | @c device, checks with statfs that /dev/pts is a devpts or that /dev is | 
 | @c a devfs, and returns the fd; static variables devpts_mounted and | 
 | @c have_no_dev_ptmx are safely initialized so as to avoid repeated | 
 | @c tests. | 
 | The @code{getpt} function returns a new file descriptor for the next | 
 | available master pseudo-terminal.  The normal return value from | 
 | @code{getpt} is a non-negative integer file descriptor.  In the case of | 
 | an error, a value of @math{-1} is returned instead.  The following | 
 | @code{errno} conditions are defined for this function: | 
 |  | 
 | @table @code | 
 | @item ENOENT | 
 | There are no free master pseudo-terminals available. | 
 | @end table | 
 |  | 
 | This function is a GNU extension. | 
 | @end deftypefun | 
 |  | 
 | @comment stdlib.h | 
 | @comment SVID, XPG4.2 | 
 | @deftypefun int grantpt (int @var{filedes}) | 
 | @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} | 
 | @c grantpt @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem | 
 | @c  unix/grantpt:pts_name @acsuheap @acsmem | 
 | @c   ptsname_internal dup ok (but this is Linux-only!) | 
 | @c   memchr dup ok | 
 | @c   realloc dup @acsuheap @acsmem | 
 | @c   malloc dup @acsuheap @acsmem | 
 | @c   free dup @acsuheap @acsmem | 
 | @c  fcntl dup ok | 
 | @c  getuid dup ok | 
 | @c  chown dup ok | 
 | @c  sysconf(_SC_GETGR_R_SIZE_MAX) ok | 
 | @c  getgrnam_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem | 
 | @c  getgid dup ok | 
 | @c  chmod dup ok | 
 | @c  fork dup @aculock | 
 | @c  [child] | 
 | @c   setrlimit | 
 | @c   dup2 | 
 | @c   CLOSE_ALL_FDS | 
 | @c   execle | 
 | @c   _exit | 
 | @c  waitpid dup ok | 
 | @c  WIFEXITED dup ok | 
 | @c  WEXITSTATUS dup ok | 
 | @c  free dup @ascuheap @acsmem | 
 | The @code{grantpt} function changes the ownership and access permission | 
 | of the slave pseudo-terminal device corresponding to the master | 
 | pseudo-terminal device associated with the file descriptor | 
 | @var{filedes}.  The owner is set from the real user ID of the calling | 
 | process (@pxref{Process Persona}), and the group is set to a special | 
 | group (typically @dfn{tty}) or from the real group ID of the calling | 
 | process.  The access permission is set such that the file is both | 
 | readable and writable by the owner and only writable by the group. | 
 |  | 
 | On some systems this function is implemented by invoking a special | 
 | @code{setuid} root program (@pxref{How Change Persona}).  As a | 
 | consequence, installing a signal handler for the @code{SIGCHLD} signal | 
 | (@pxref{Job Control Signals}) may interfere with a call to | 
 | @code{grantpt}. | 
 |  | 
 | The normal return value from @code{grantpt} is @math{0}; a value of | 
 | @math{-1} is returned in case of failure.  The following @code{errno} | 
 | error conditions are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} argument is not a valid file descriptor. | 
 |  | 
 | @item EINVAL | 
 | The @var{filedes} argument is not associated with a master pseudo-terminal | 
 | device. | 
 |  | 
 | @item EACCES | 
 | The slave pseudo-terminal device corresponding to the master associated | 
 | with @var{filedes} could not be accessed. | 
 | @end table | 
 |  | 
 | @end deftypefun | 
 |  | 
 | @comment stdlib.h | 
 | @comment SVID, XPG4.2 | 
 | @deftypefun int unlockpt (int @var{filedes}) | 
 | @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} | 
 | @c unlockpt @ascuheap/bsd @acsmem @acsfd | 
 | @c /bsd | 
 | @c  ptsname_r dup @ascuheap @acsmem @acsfd | 
 | @c  revoke ok (syscall) | 
 | @c /linux | 
 | @c  ioctl dup ok | 
 | The @code{unlockpt} function unlocks the slave pseudo-terminal device | 
 | corresponding to the master pseudo-terminal device associated with the | 
 | file descriptor @var{filedes}.  On many systems, the slave can only be | 
 | opened after unlocking, so portable applications should always call | 
 | @code{unlockpt} before trying to open the slave. | 
 |  | 
 | The normal return value from @code{unlockpt} is @math{0}; a value of | 
 | @math{-1} is returned in case of failure.  The following @code{errno} | 
 | error conditions are defined for this function: | 
 |  | 
 | @table @code | 
 | @item EBADF | 
 | The @var{filedes} argument is not a valid file descriptor. | 
 |  | 
 | @item EINVAL | 
 | The @var{filedes} argument is not associated with a master pseudo-terminal | 
 | device. | 
 | @end table | 
 | @end deftypefun | 
 |  | 
 | @comment stdlib.h | 
 | @comment SVID, XPG4.2 | 
 | @deftypefun {char *} ptsname (int @var{filedes}) | 
 | @safety{@prelim{}@mtunsafe{@mtasurace{:ptsname}}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} | 
 | @c ptsname @mtasurace:ptsname @ascuheap/bsd @acsmem @acsfd | 
 | @c  ptsname_r dup @ascuheap/bsd @acsmem @acsfd | 
 | If the file descriptor @var{filedes} is associated with a | 
 | master pseudo-terminal device, the @code{ptsname} function returns a | 
 | pointer to a statically-allocated, null-terminated string containing the | 
 | file name of the associated slave pseudo-terminal file.  This string | 
 | might be overwritten by subsequent calls to @code{ptsname}. | 
 | @end deftypefun | 
 |  | 
 | @comment stdlib.h | 
 | @comment GNU | 
 | @deftypefun int ptsname_r (int @var{filedes}, char *@var{buf}, size_t @var{len}) | 
 | @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} | 
 | @c ptsname_r @ascuheap/bsd @acsmem @acsfd | 
 | @c /hurd | 
 | @c  term_get_peername ok | 
 | @c  strlen dup ok | 
 | @c  memcpy dup ok | 
 | @c /bsd | 
 | @c  isatty dup ok | 
 | @c  strlen dup ok | 
 | @c  ttyname_r dup @ascuheap @acsmem @acsfd | 
 | @c  stat dup ok | 
 | @c /linux | 
 | @c  ptsname_internal ok | 
 | @c   isatty dup ok | 
 | @c   ioctl dup ok | 
 | @c   strlen dup ok | 
 | @c   itoa_word dup ok | 
 | @c   stpcpy dup ok | 
 | @c   memcpy dup ok | 
 | @c   fxstat64 dup ok | 
 | @c   MASTER_P ok | 
 | @c    major ok | 
 | @c     gnu_dev_major ok | 
 | @c    minor ok | 
 | @c     gnu_dev_minor ok | 
 | @c   minor dup ok | 
 | @c   xstat64 dup ok | 
 | @c   S_ISCHR dup ok | 
 | @c   SLAVE_P ok | 
 | @c    major dup ok | 
 | @c    minor dup ok | 
 | The @code{ptsname_r} function is similar to the @code{ptsname} function | 
 | except that it places its result into the user-specified buffer starting | 
 | at @var{buf} with length @var{len}. | 
 |  | 
 | This function is a GNU extension. | 
 | @end deftypefun | 
 |  | 
 | @strong{Portability Note:} On @w{System V} derived systems, the file | 
 | returned by the @code{ptsname} and @code{ptsname_r} functions may be | 
 | STREAMS-based, and therefore require additional processing after opening | 
 | before it actually behaves as a pseudo terminal. | 
 | @c FIXME: xref STREAMS | 
 |  | 
 | Typical usage of these functions is illustrated by the following example: | 
 | @smallexample | 
 | int | 
 | open_pty_pair (int *amaster, int *aslave) | 
 | @{ | 
 |   int master, slave; | 
 |   char *name; | 
 |  | 
 |   master = getpt (); | 
 |   if (master < 0) | 
 |     return 0; | 
 |  | 
 |   if (grantpt (master) < 0 || unlockpt (master) < 0) | 
 |     goto close_master; | 
 |   name = ptsname (master); | 
 |   if (name == NULL) | 
 |     goto close_master; | 
 |  | 
 |   slave = open (name, O_RDWR); | 
 |   if (slave == -1) | 
 |     goto close_master; | 
 |  | 
 |   if (isastream (slave)) | 
 |     @{ | 
 |       if (ioctl (slave, I_PUSH, "ptem") < 0 | 
 |           || ioctl (slave, I_PUSH, "ldterm") < 0) | 
 |         goto close_slave; | 
 |     @} | 
 |  | 
 |   *amaster = master; | 
 |   *aslave = slave; | 
 |   return 1; | 
 |  | 
 | close_slave: | 
 |   close (slave); | 
 |  | 
 | close_master: | 
 |   close (master); | 
 |   return 0; | 
 | @} | 
 | @end smallexample | 
 |  | 
 | @node Pseudo-Terminal Pairs | 
 | @subsection Opening a Pseudo-Terminal Pair | 
 | @cindex opening a pseudo-terminal pair | 
 |  | 
 | These functions, derived from BSD, are available in the separate | 
 | @file{libutil} library, and declared in @file{pty.h}. | 
 |  | 
 | @comment pty.h | 
 | @comment BSD | 
 | @deftypefun int openpty (int *@var{amaster}, int *@var{aslave}, char *@var{name}, const struct termios *@var{termp}, const struct winsize *@var{winp}) | 
 | @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} | 
 | @c openpty @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem | 
 | @c  getpt @acsfd | 
 | @c  grantpt @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem | 
 | @c  unlockpt dup @ascuheap/bsd @acsmem @acsfd | 
 | @c  openpty:pts_name @acsuheap @acsmem @acsfd | 
 | @c   ptsname_r dup @ascuheap/bsd @acsmem @acsfd | 
 | @c   realloc dup @acsuheap @acsmem | 
 | @c   malloc dup @acsuheap @acsmem | 
 | @c   free dup @acsuheap @acsmem | 
 | @c  open dup @acsfd | 
 | @c  free dup @acsuheap @acsmem | 
 | @c  tcsetattr dup ok | 
 | @c  ioctl dup ok | 
 | @c  strcpy dup ok | 
 | @c  close dup @acsfd | 
 | This function allocates and opens a pseudo-terminal pair, returning the | 
 | file descriptor for the master in @var{*amaster}, and the file | 
 | descriptor for the slave in @var{*aslave}.  If the argument @var{name} | 
 | is not a null pointer, the file name of the slave pseudo-terminal | 
 | device is stored in @code{*name}.  If @var{termp} is not a null pointer, | 
 | the terminal attributes of the slave are set to the ones specified in | 
 | the structure that @var{termp} points to (@pxref{Terminal Modes}). | 
 | Likewise, if the @var{winp} is not a null pointer, the screen size of | 
 | the slave is set to the values specified in the structure that | 
 | @var{winp} points to. | 
 |  | 
 | The normal return value from @code{openpty} is @math{0}; a value of | 
 | @math{-1} is returned in case of failure.  The following @code{errno} | 
 | conditions are defined for this function: | 
 |  | 
 | @table @code | 
 | @item ENOENT | 
 | There are no free pseudo-terminal pairs available. | 
 | @end table | 
 |  | 
 | @strong{Warning:} Using the @code{openpty} function with @var{name} not | 
 | set to @code{NULL} is @strong{very dangerous} because it provides no | 
 | protection against overflowing the string @var{name}.  You should use | 
 | the @code{ttyname} function on the file descriptor returned in | 
 | @var{*slave} to find out the file name of the slave pseudo-terminal | 
 | device instead. | 
 | @end deftypefun | 
 |  | 
 | @comment pty.h | 
 | @comment BSD | 
 | @deftypefun int forkpty (int *@var{amaster}, char *@var{name}, const struct termios *@var{termp}, const struct winsize *@var{winp}) | 
 | @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} | 
 | @c forkpty @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem | 
 | @c  openpty dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem | 
 | @c  fork dup @aculock | 
 | @c  close dup @acsfd | 
 | @c  /child | 
 | @c   close dup @acsfd | 
 | @c   login_tty dup @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd | 
 | @c   _exit dup ok | 
 | @c  close dup @acsfd | 
 | This function is similar to the @code{openpty} function, but in | 
 | addition, forks a new process (@pxref{Creating a Process}) and makes the | 
 | newly opened slave pseudo-terminal device the controlling terminal | 
 | (@pxref{Controlling Terminal}) for the child process. | 
 |  | 
 | If the operation is successful, there are then both parent and child | 
 | processes and both see @code{forkpty} return, but with different values: | 
 | it returns a value of @math{0} in the child process and returns the child's | 
 | process ID in the parent process. | 
 |  | 
 | If the allocation of a pseudo-terminal pair or the process creation | 
 | failed, @code{forkpty} returns a value of @math{-1} in the parent | 
 | process. | 
 |  | 
 | @strong{Warning:} The @code{forkpty} function has the same problems with | 
 | respect to the @var{name} argument as @code{openpty}. | 
 | @end deftypefun |