\section{\module{termios} ---
         \POSIX{} style tty control}

\declaremodule{builtin}{termios}
  \platform{Unix}
\modulesynopsis{\POSIX\ style tty control.}

\indexii{\POSIX}{I/O control}
\indexii{tty}{I/O control}


This module provides an interface to the \POSIX{} calls for tty I/O
control.  For a complete description of these calls, see the \POSIX{} or
\UNIX{} manual pages.  It is only available for those \UNIX{} versions
that support \POSIX{} \emph{termios} style tty I/O control (and then
only if configured at installation time).

All functions in this module take a file descriptor \var{fd} as their
first argument.  This can be an integer file descriptor, such as
returned by \code{sys.stdin.fileno()}, or a file object, such as
\code{sys.stdin} itself.

This module also defines all the constants needed to work with the
functions provided here; these have the same name as their
counterparts in C.  Please refer to your system documentation for more
information on using these terminal control interfaces.

The module defines the following functions:

\begin{funcdesc}{tcgetattr}{fd}
Return a list containing the tty attributes for file descriptor
\var{fd}, as follows: \code{[}\var{iflag}, \var{oflag}, \var{cflag},
\var{lflag}, \var{ispeed}, \var{ospeed}, \var{cc}\code{]} where
\var{cc} is a list of the tty special characters (each a string of
length 1, except the items with indices \constant{VMIN} and
\constant{VTIME}, which are integers when these fields are
defined).  The interpretation of the flags and the speeds as well as
the indexing in the \var{cc} array must be done using the symbolic
constants defined in the \module{termios}
module.
\end{funcdesc}

\begin{funcdesc}{tcsetattr}{fd, when, attributes}
Set the tty attributes for file descriptor \var{fd} from the
\var{attributes}, which is a list like the one returned by
\function{tcgetattr()}.  The \var{when} argument determines when the
attributes are changed: \constant{TCSANOW} to change immediately,
\constant{TCSADRAIN} to change after transmitting all queued output,
or \constant{TCSAFLUSH} to change after transmitting all queued
output and discarding all queued input.
\end{funcdesc}

\begin{funcdesc}{tcsendbreak}{fd, duration}
Send a break on file descriptor \var{fd}.  A zero \var{duration} sends
a break for 0.25--0.5 seconds; a nonzero \var{duration} has a system
dependent meaning.
\end{funcdesc}

\begin{funcdesc}{tcdrain}{fd}
Wait until all output written to file descriptor \var{fd} has been
transmitted.
\end{funcdesc}

\begin{funcdesc}{tcflush}{fd, queue}
Discard queued data on file descriptor \var{fd}.  The \var{queue}
selector specifies which queue: \constant{TCIFLUSH} for the input
queue, \constant{TCOFLUSH} for the output queue, or
\constant{TCIOFLUSH} for both queues.
\end{funcdesc}

\begin{funcdesc}{tcflow}{fd, action}
Suspend or resume input or output on file descriptor \var{fd}.  The
\var{action} argument can be \constant{TCOOFF} to suspend output,
\constant{TCOON} to restart output, \constant{TCIOFF} to suspend
input, or \constant{TCION} to restart input.
\end{funcdesc}


\begin{seealso}
  \seemodule{tty}{Convenience functions for common terminal control
                  operations.}
\end{seealso}


\subsection{Example}
\nodename{termios Example}

Here's a function that prompts for a password with echoing turned
off.  Note the technique using a separate \function{tcgetattr()} call
and a \keyword{try} ... \keyword{finally} statement to ensure that the
old tty attributes are restored exactly no matter what happens:

\begin{verbatim}
def raw_input(prompt):
    import sys
    sys.stdout.write(prompt)
    sys.stdout.flush()
    return sys.stdin.readline()

def getpass(prompt = "Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = raw_input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd
\end{verbatim}
