:mod:`!termios` --- POSIX style tty control
===========================================

.. module:: termios
   :platform: Unix
   :synopsis: POSIX style tty control.

.. index::
   pair: POSIX; I/O control
   pair: 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 :manpage:`termios(3)` Unix manual
page.  It is only available for those Unix versions that support POSIX
*termios* style tty I/O control configured during installation.

.. availability:: Unix.

All functions in this module take a file descriptor *fd* as their first
argument.  This can be an integer file descriptor, such as returned by
``sys.stdin.fileno()``, or a :term:`file object`, such as ``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:


.. function:: tcgetattr(fd)

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


.. function:: tcsetattr(fd, when, attributes)

   Set the tty attributes for file descriptor *fd* from the *attributes*, which is
   a list like the one returned by :func:`tcgetattr`.  The *when* argument
   determines when the attributes are changed:

   .. data:: TCSANOW

      Change attributes immediately.

   .. data:: TCSADRAIN

      Change attributes after transmitting all queued output.

   .. data:: TCSAFLUSH

      Change attributes after transmitting all queued output and
      discarding all queued input.


.. function:: tcsendbreak(fd, duration)

   Send a break on file descriptor *fd*.  A zero *duration* sends a break for
   0.25--0.5 seconds; a nonzero *duration* has a system dependent meaning.


.. function:: tcdrain(fd)

   Wait until all output written to file descriptor *fd* has been transmitted.


.. function:: tcflush(fd, queue)

   Discard queued data on file descriptor *fd*.  The *queue* selector specifies
   which queue: :const:`TCIFLUSH` for the input queue, :const:`TCOFLUSH` for the
   output queue, or :const:`TCIOFLUSH` for both queues.


.. function:: tcflow(fd, action)

   Suspend or resume input or output on file descriptor *fd*.  The *action*
   argument can be :const:`TCOOFF` to suspend output, :const:`TCOON` to restart
   output, :const:`TCIOFF` to suspend input, or :const:`TCION` to restart input.


.. function:: tcgetwinsize(fd)

   Return a tuple ``(ws_row, ws_col)`` containing the tty window size for file
   descriptor *fd*. Requires :const:`termios.TIOCGWINSZ` or
   :const:`termios.TIOCGSIZE`.

   .. versionadded:: 3.11


.. function:: tcsetwinsize(fd, winsize)

   Set the tty window size for file descriptor *fd* from *winsize*, which is
   a two-item tuple ``(ws_row, ws_col)`` like the one returned by
   :func:`tcgetwinsize`. Requires at least one of the pairs
   (:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`);
   (:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined.

   .. versionadded:: 3.11


.. seealso::

   Module :mod:`tty`
      Convenience functions for common terminal control operations.


.. _termios-example:

Example
-------

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

   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 = input(prompt)
       finally:
           termios.tcsetattr(fd, termios.TCSADRAIN, old)
       return passwd

